基于Python和MySQL的医院管理系统课设:从数据库设计到事务处理
简介这份资源是面向计算机相关专业在校学生与初学者的医院管理系统完整项目包可作为数据库课程设计、毕业设计或课程大作业的参考实现。项目以Python为开发语言、MySQL为后台数据库围绕医院日常业务场景组织功能模块涵盖数据初始化、数据库连接、数据查询、数据字典维护与数据读写等环节并配套建表、触发器、数据插入与初始化等多份SQL脚本便于理解表结构设计与业务逻辑的对应关系。压缩包共22个文件以py源码、pyc编译文件、sql脚本和xlsx数据表为主整体约43KB体积轻巧、结构清晰方便按模块阅读与二次修改。目前已有557人学习下载说明其在课设与毕设场景中具备一定参考价值。读者可据此快速搭建可运行的系统原型掌握Python与MySQL的交互方式并在此基础上扩展功能或直接用于项目立项演示。1. 从一份课设压缩包说起医院管理系统到底在练什么很多同学拿到「基于Python和MySQL的医院管理系统源码sql数据库」这类课设包第一反应是解压、找main.py、双击运行然后被一堆ModuleNotFoundError和数据库连接报错劝退。这个标题背后真正要练的不是把界面点开而是把「业务表设计—数据访问层—界面交互」这条链路完整走通一遍。它适合正在做数据库课设、想找一个能跑通又看得懂的中小型信息管理系统的同学也适合已经会写Python但没正经设计过关系型数据库的开发者。医院管理这个场景的好处是实体关系清晰科室、医生、患者、挂号、处方、缴费每张表都能对应现实里的一个对象外键和事务也不是硬凑出来的。你把这套东西吃透换成药店、诊所、体检中心改表名和字段就能复用。接下来我按「先立住模型、再动手复现、最后讲坑」的顺序把这份课设从压缩包拆到能讲清楚每一行SQL为什么这么写。2. 先立住数据模型五张核心表怎么切分业务2.1 为什么医院场景适合练关系型数据库医院管理系统的业务边界天然适合做数据库课设因为它同时具备三种典型关系一对多一个科室有多名医生、多对多医生和患者通过挂号记录关联、以及带状态流转的单据挂号从待就诊到已完成。这三种关系覆盖了关系型数据库设计里最常考的范式、外键和事务知识点。如果换成电商订单和库存的并发扣减会引入额外复杂度换成图书管理实体又太少撑不起课设工作量。医院场景刚好卡在「够复杂但不失控」的区间。我一般会把业务拆成五个核心实体科室、医生、患者、挂号记录、处方明细。科室和医生是一对多医生和挂号是一对多患者和挂号是一对多挂号和处方明细是一对多。缴费可以挂在挂号记录上作为状态字段也可以单独拆表课设阶段挂在挂号上更省事。这样切分之后每张表的职责单一写SQL的时候不容易出现一张表既存业务又存统计的混乱情况。2.2 建表SQL与字段类型选择下面这段SQL是整套系统的地基字段类型的选择直接决定了后面Python层好不好写。我把它拆成可独立执行的语句方便你在MySQL客户端里逐条跑。-- 科室表最顶层实体其他表都直接或间接挂在它下面 CREATE TABLE department ( dept_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 科室编号, dept_name VARCHAR(50) NOT NULL UNIQUE COMMENT 科室名称, dept_phone VARCHAR(20) COMMENT 科室电话, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT科室信息表; -- 医生表外键指向科室一个科室多名医生 CREATE TABLE doctor ( doctor_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 医生编号, doctor_name VARCHAR(30) NOT NULL COMMENT 医生姓名, dept_id INT NOT NULL COMMENT 所属科室, title VARCHAR(20) COMMENT 职称, login_name VARCHAR(30) NOT NULL UNIQUE COMMENT 登录账号, login_pwd VARCHAR(64) NOT NULL COMMENT 登录密码, CONSTRAINT fk_doctor_dept FOREIGN KEY (dept_id) REFERENCES department(dept_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT医生信息表; -- 患者表独立实体不依赖科室 CREATE TABLE patient ( patient_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 患者编号, patient_name VARCHAR(30) NOT NULL COMMENT 患者姓名, gender CHAR(1) DEFAULT 男 COMMENT 性别, id_card VARCHAR(18) UNIQUE COMMENT 身份证号, phone VARCHAR(20) COMMENT 联系电话, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 建档时间 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT患者信息表; -- 挂号记录表核心业务表串联医生和患者 CREATE TABLE registration ( reg_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 挂号编号, patient_id INT NOT NULL COMMENT 患者编号, doctor_id INT NOT NULL COMMENT 医生编号, reg_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 挂号时间, reg_fee DECIMAL(8,2) NOT NULL DEFAULT 0.00 COMMENT 挂号费, status TINYINT NOT NULL DEFAULT 0 COMMENT 0待就诊 1已就诊 2已取消, CONSTRAINT fk_reg_patient FOREIGN KEY (patient_id) REFERENCES patient(patient_id), CONSTRAINT fk_reg_doctor FOREIGN KEY (doctor_id) REFERENCES doctor(doctor_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT挂号记录表; -- 处方明细表挂在挂号记录下一条挂号可开多条处方 CREATE TABLE prescription ( pres_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 处方编号, reg_id INT NOT NULL COMMENT 关联挂号编号, medicine VARCHAR(100) NOT NULL COMMENT 药品名称, quantity INT NOT NULL DEFAULT 1 COMMENT 数量, unit_price DECIMAL(8,2) NOT NULL DEFAULT 0.00 COMMENT 单价, CONSTRAINT fk_pres_reg FOREIGN KEY (reg_id) REFERENCES registration(reg_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT处方明细表;这段SQL里有几个参数值得单独说。字符集统一用utf8mb4而不是utf8因为患者姓名里可能出现生僻字utf8在MySQL里实际是三个字节的阉割版存四字节字符会报错。存储引擎用InnoDB因为只有它支持外键和事务MyISAM虽然插入快但课设里用不上这个优势。金额字段用DECIMAL(8,2)而不是FLOAT浮点数在累加挂号费的时候会出现0.10.2不等于0.3的经典问题DECIMAL是精确十进制适合金额。status字段用TINYINT存状态码而不是VARCHAR存中文查询和索引效率都更高中文状态在Python层做映射就行。2.3 外键约束该不该开课设里经常有人问外键到底开不开。我的建议是课设阶段开着生产环境再根据情况决定。开外键的好处是数据一致性由数据库兜底你删科室的时候如果下面还有医生数据库直接拒绝不会出现孤儿记录。坏处是插入顺序被锁死必须先插科室再插医生再插挂号批量导入数据时容易报错。课设的数据量小顺序插入完全可控开着外键能帮你提前发现设计漏洞。如果后面要做批量测试数据生成可以临时SET FOREIGN_KEY_CHECKS0导完再打开。3. 用Python把数据库接起来连接层与DAO怎么写3.1 选pymysql还是mysql-connectorPython连MySQL主流就两个库pymysql和mysql-connector-python。pymysql是纯Python实现安装不需要编译环境pip install pymysql直接能用课设环境里最省事。mysql-connector是官方出品性能略好但安装偶尔会碰到C扩展编译问题。我一般课设用pymysql因为它的API和MySQLdb兼容网上示例多出问题好搜。连接参数里charset必须显式写utf8mb4autocommit建议关掉由代码控制事务边界。# db.py —— 数据库连接封装 import pymysql from pymysql.cursors import DictCursor # 连接配置课设阶段直接写死生产环境应走配置文件 DB_CONFIG { host: 127.0.0.1, port: 3306, user: root, password: your_password, # 改成你自己的密码 database: hospital_db, charset: utf8mb4, cursorclass: DictCursor, # 返回字典而不是元组取值更直观 autocommit: False # 手动控制事务 } def get_conn(): 获取一个数据库连接 return pymysql.connect(**DB_CONFIG) def query_all(sql, argsNone): 通用查询返回列表每个元素是字典 conn get_conn() try: with conn.cursor() as cur: cur.execute(sql, args or ()) return cur.fetchall() finally: conn.close() def execute(sql, argsNone): 通用增删改返回受影响行数异常时回滚 conn get_conn() try: with conn.cursor() as cur: rows cur.execute(sql, args or ()) conn.commit() return rows except Exception as e: conn.rollback() raise e finally: conn.close()这段代码的关键点在DictCursor和autocommit两个参数。DictCursor让查询结果以字典返回字段名直接当key用不用记列的顺序改表结构的时候不容易出错。autocommit设为False之后所有写操作必须显式commit一旦中间某步抛异常就rollback保证挂号扣费和处方插入要么全成功要么全失败。finally里关连接是必须的课设里最常见的翻车就是连接泄漏跑几十次之后MySQL报too many connections。3.2 挂号业务的事务写法挂号是这套系统里唯一需要事务的操作因为它要同时写挂号记录和可能的处方明细。下面这个函数演示了标准的事务边界。# service.py —— 挂号业务逻辑 from db import get_conn def create_registration(patient_id, doctor_id, reg_fee, prescriptionsNone): 创建挂号记录可选同时开处方 prescriptions: [{medicine: 阿莫西林, quantity: 2, unit_price: 15.5}, ...] conn get_conn() try: with conn.cursor() as cur: # 第一步插入挂号记录 cur.execute( INSERT INTO registration(patient_id, doctor_id, reg_fee, status) VALUES(%s, %s, %s, 0), (patient_id, doctor_id, reg_fee) ) reg_id cur.lastrowid # 拿到刚插入的挂号编号 # 第二步如果有处方逐条插入 if prescriptions: for p in prescriptions: cur.execute( INSERT INTO prescription(reg_id, medicine, quantity, unit_price) VALUES(%s, %s, %s, %s), (reg_id, p[medicine], p[quantity], p[unit_price]) ) conn.commit() return reg_id except Exception as e: conn.rollback() raise e finally: conn.close()lastrowid是pymysql提供的属性返回上一条INSERT产生的自增主键用它来关联处方明细避免再查一次数据库。整个操作包在try里任何一步失败都rollback不会出现挂号记录插进去了但处方只插了一半的情况。参数化查询用%s占位符不要用字符串拼接否则患者姓名里带个单引号就能把SQL搞崩这也是课设答辩常被问到的注入问题。4. 避坑与排查课设跑不起来时先看这几条4.1 中文乱码从建库到连接要全链路统一现象是插入中文后查出来是问号或者乱码。原因通常出在三个地方之一建库时没指定字符集、连接时没写charset、或者表字段用了latin1。解决方法是建库语句写成CREATE DATABASE hospital_db DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci连接配置里charset写utf8mb4已经建好的表用ALTER TABLE xxx CONVERT TO CHARACTER SET utf8mb4改过来。三处都对齐之后中文才能正常存取。4.2 外键报错1452插入顺序反了现象是插入医生时报Cannot add or update a child row。原因是医生表的外键dept_id指向的科室在department表里不存在。解决方法是先插科室再插医生或者检查传进来的dept_id是不是写错了。批量导入测试数据时按科室、医生、患者、挂号、处方的顺序导就不会触发这个错。4.3 连接数爆掉忘了关连接现象是程序跑一会儿就报Too many connections。原因是每次query都新建连接但没关或者异常路径下跳过了close。解决方法是用try/finally保证close一定执行或者改用连接池。课设阶段用DBUtils的PooledDB可以省掉手动管理但理解手动关闭的流程对答辩更有帮助。4.4 金额算错用了FLOAT存钱现象是挂号费累加出来是15.299999999。原因是FLOAT是二进制浮点无法精确表示0.1这类十进制小数。解决方法是从建表开始就用DECIMAL(8,2)Python层用decimal.Decimal接收不要用float。如果表已经建好了ALTER TABLE registration MODIFY reg_fee DECIMAL(8,2) NOT NULL DEFAULT 0.00。4.5 密码明文存储课设也要讲基本法现象是数据库里login_pwd字段直接存了123456。原因是图省事没做哈希。解决方法是至少用hashlib加盐做一次SHA256虽然课设不要求安全级别但答辩时被问到密码存储能说出「不存明文、加盐哈希」是加分项。代码上在插入医生时把密码处理一下再存登录时同样处理再比对。5. 让课设从能跑到能讲三个进阶技巧5.1 用视图把多表查询封装成一张虚拟表课设答辩经常被要求现场写一个多表联查如果每次都手写JOIN容易紧张出错。可以提前建一个视图把挂号、患者、医生、科室四张表关联好查询的时候直接SELECT * FROM v_reg_detail清爽很多。CREATE VIEW v_reg_detail AS SELECT r.reg_id, p.patient_name, p.phone, d.doctor_name, d.title, dept.dept_name, r.reg_time, r.reg_fee, CASE r.status WHEN 0 THEN 待就诊 WHEN 1 THEN 已就诊 WHEN 2 THEN 已取消 END AS status_text FROM registration r JOIN patient p ON r.patient_id p.patient_id JOIN doctor d ON r.doctor_id d.doctor_id JOIN department dept ON d.dept_id dept.dept_id;视图的好处是把复杂的JOIN逻辑固化下来Python层只需要一句简单查询。CASE表达式把状态码翻译成中文前端直接展示status_text就行。注意视图不存数据每次查询都会重新执行底层的JOIN数据量大时性能会下降课设的数据量完全不用担心。5.2 用存储过程做统计报表课设通常要求有一个统计功能比如「统计每个科室的挂号人数」。用存储过程实现既能展示数据库编程能力又比在Python里循环查询高效。DELIMITER // CREATE PROCEDURE stat_dept_reg(IN start_date DATETIME, IN end_date DATETIME) BEGIN SELECT dept.dept_name, COUNT(r.reg_id) AS reg_count, IFNULL(SUM(r.reg_fee), 0) AS total_fee FROM department dept LEFT JOIN doctor d ON dept.dept_id d.dept_id LEFT JOIN registration r ON d.doctor_id r.doctor_id AND r.reg_time BETWEEN start_date AND end_date GROUP BY dept.dept_id, dept.dept_name ORDER BY reg_count DESC; END // DELIMITER ;调用的时候用CALL stat_dept_reg(2024-01-01, 2024-12-31)。这里用LEFT JOIN而不是INNER JOIN是为了让没有挂号记录的科室也出现在结果里显示为0。IFNULL处理SUM返回NULL的情况。DELIMITER临时把语句结束符从分号改成//因为存储过程内部有分号不改的话MySQL会提前截断。5.3 索引加在哪看WHERE和JOIN的字段课设数据量小索引的提速效果不明显但答辩时能说清楚加索引的依据是加分项。最常用的两个索引位置registration表的patient_id和doctor_id因为查患者挂号历史和医生排班都靠这两个字段registration表的reg_time因为统计报表按时间范围过滤。加索引用CREATE INDEX idx_reg_patient ON registration(patient_id)不要给每个字段都加索引占空间且拖慢插入。-- 两个高频查询对应的索引 CREATE INDEX idx_reg_patient ON registration(patient_id); CREATE INDEX idx_reg_doctor ON registration(doctor_id); CREATE INDEX idx_reg_time ON registration(reg_time);验证索引用EXPLAIN SELECT ...看type列从ALL变成ref或range就说明生效了。如果type还是ALL检查查询条件是不是对索引字段做了函数运算比如WHERE DATE(reg_time) 2024-01-01会让索引失效改成WHERE reg_time 2024-01-01 AND reg_time 2024-01-02才能用上。我带过几届课设最常见的遗憾不是功能没做完而是做完了讲不清为什么这么设计。表结构为什么拆成五张、外键为什么开着、事务边界为什么划在挂号这一步这些才是答辩老师真正想听的。把这份源码跑通只是起点能对着每一行SQL说出取舍这套课设才算真正变成你自己的东西。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

普通人网上赚钱的两条可行路径:内容分发与轻量服务

普通人网上赚钱的两条可行路径:内容分发与轻量服务

1. 项目概述:拆解“网上免费赚钱”背后的现实逻辑与常见误区“网上免费赚钱的方法?第三个和第四个很多人在做!”——这个标题一出现,几乎立刻触发多数人的条件反射:点开、划屏、快速扫读、三秒后关掉。不是因为内容没价…

2026/10/12 13:20:14 阅读更多 →
R语言lty参数详解:线型取值、底层逻辑与多线图实战

R语言lty参数详解:线型取值、底层逻辑与多线图实战

1. 为什么lty参数值得单独拿出来讲R语言的基础绘图系统里,lty这个参数看起来毫不起眼,但它是我见过被问得最多的细节之一。新手画折线图时经常遇到一个尴尬场景:两条线叠在一起,颜色选了红和蓝,打印出来变成灰度图后完…

2026/10/12 11:46:34 阅读更多 →
C++自定义分配器实战:从std::allocator到池化内存管理

C++自定义分配器实战:从std::allocator到池化内存管理

任何一个写过线上C服务的人,应该都经历过这种时刻:压测到一半内存曲线狂涨,明明没有泄漏却总觉得哪里不对;或者碎片化严重到vector频繁扩容时,整个进程的响应时间跟着抖动。这类问题十有八九根源在默认分配器——std::…

2026/10/11 8:05:37 阅读更多 →

最新新闻

C++中判断汉字:从编码原理到跨平台实现

C++中判断汉字:从编码原理到跨平台实现

1. 从一次文本统计翻车说起:为什么“判断汉字”没那么简单前阵子帮一个做数据清洗的朋友处理一批用户提交的文本,需求听起来特别朴素:把每条记录里的汉字挑出来,统计一下字数,非汉字的字符(标点、数字、字母…

2026/10/12 13:20:31 阅读更多 →
鸿蒙开发实战:从零构建端侧AI阅读应用

鸿蒙开发实战:从零构建端侧AI阅读应用

简介:这份资源面向鸿蒙开发学习者与阅读类应用开发者,聚焦鸿蒙版阅读仓库的完整工程实现,可用于研究鸿蒙OS下阅读APP的页面结构、组件拆分与资源组织方式。压缩包共886个文件,约5.58MB,以ets组件代码为主,配…

2026/10/12 13:20:31 阅读更多 →
CSP-J初赛真题解析:算法直觉、缓存原理与递归栈深度训练

CSP-J初赛真题解析:算法直觉、缓存原理与递归栈深度训练

简介:本资源为2025年CCF CSP-J信息学奥林匹克竞赛初赛(第一轮)官方真题PDF文件,面向全国初中阶段信奥选手、指导教师及算法入门学习者,用于赛前模拟训练、考点梳理与应试能力提升。文件共1个PDF,大小2.72MB…

2026/10/12 13:20:31 阅读更多 →
Ubuntu离线中文语音识别实战:Vosk部署与调优指南

Ubuntu离线中文语音识别实战:Vosk部署与调优指南

1. 为什么要在离线环境里折腾中文语音识别把语音识别跑在本地、断网也能用,这件事听起来像是"洁癖",但真正做过项目的人都知道,它解决的是很实在的问题。我最早接触这个需求,是在一个内网数据处理的项目里:现…

2026/10/12 13:20:31 阅读更多 →
Python机器学习实战:从NumPy数据处理到客户流失预测全流程

Python机器学习实战:从NumPy数据处理到客户流失预测全流程

简介:面向Python机器学习初学者的教学配套资料包,内含《Python机器学习编程与实战》一书的源代码与实验数据,帮助读者从零基础起步,通过动手实操掌握数据处理、建模与评估的全流程。压缩包共77个文件,约82.8MB&#xf…

2026/10/12 13:20:31 阅读更多 →
Scrapy日志系统实战:配置、优化与常见问题排查

Scrapy日志系统实战:配置、优化与常见问题排查

1. 为什么日志系统是爬虫项目的生命线做爬虫的朋友大概都有过这种经历:脚本跑了一整夜,早上起来一看,数据没入库,控制台一片空白,或者满屏都是红色的报错信息,但你根本不知道是哪一步出了问题。更让人头疼的…

2026/10/12 13:19:27 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →