MySQL数据库课程设计:高校图书馆管理系统从E-R建模到事务一致性实战
简介这份数据库课程设计文档面向高校计算机相关专业学生与课程设计指导教师围绕高校图书馆管理系统展开完整的设计与开发论述帮助读者掌握从需求分析到系统落地的全流程方法。资源包共1个doc文件约344KB内容为结构完整的课程设计论文涵盖需求分析、概念设计、逻辑设计、物理设计、数据库设计与系统实现等章节并配有E-R图转换关系模型、数据库模式定义、用户子模式定义等关键设计环节。文档以C/S模式为主线讨论借阅管理、人员管理、图书维护三大功能模块同时涉及安全性、完整性与一致性要求以及关系数据库与面向对象数据库的存储方式选择。已有298人学习浏览适合作为课程设计参考模板、数据库建模练习素材或答辩准备资料读者可据此理解图书借阅信息管理效率提升的设计思路并借鉴其目录结构与论述框架完成自己的课程设计论文。1. 从一份 .doc 需求书到能跑的系统数据库课程设计到底在考什么很多同学拿到「数据库课程设计-高校图书馆管理系统」这个题目时第一反应是打开 Word 写需求分析然后去网上找一份 Java 课程设计案例源码改改交差。我带过几届课设答辩真正翻车的从来不是代码写不出来而是数据库设计这一层没立住表建了十几张字段全是 varchar借阅记录和图书库存对不上答辩老师一句「你这条借阅记录怎么保证不超借」就答不上来。这个题目的本质是用一个业务边界清晰、实体关系规整的场景逼你把「需求 → E-R 模型 → 关系模式 → 约束 → 增删改查 → 事务」这条链路完整走一遍。它适合数据库课程设计、软件工程课程设计的学生也适合想补数据库基本功的转行者。下面我按自己带课设的习惯把 MySQL 版本从建库到事务一致性讲透你照着做就能交出一份经得起追问的作业。2. 需求拆解与 E-R 建模先想清楚图书馆里到底有哪几张表2.1 从借阅流程倒推实体而不是先想字段新手最容易犯的错是打开 Navicat 就开始建表建到一半发现「读者」和「借阅证」到底是一张表还是两张表都说不清。正确顺序是先画业务流程图再抽实体。高校图书馆的核心流程只有一条主线读者凭借阅证进馆 → 检索图书 → 借书 → 归还 → 逾期罚款。围绕这条线实体自然浮现读者、图书、图书副本馆藏册、借阅记录、管理员、罚款记录。这里有个关键区分也是答辩高频追问点图书Book和图书副本BookCopy必须分开。图书是书目信息比如《数据库系统概论》第 5 版ISBN 唯一副本是具体到馆的那一本有条码号、馆藏位置、状态在架/借出/遗失。一个 ISBN 对应多本副本借阅记录关联的是副本而不是书目。很多同学把这两者合成一张表结果「同一本书有 3 本借走 1 本后库存显示还剩 3 本」这就是血泪经验。2.2 E-R 图到关系模式的转换规则E-R 图转关系模式有三条硬规则课设里必须体现联系类型转换方式本系统实例1:1任一方主键作外键读者与借阅证可合并1:NN 方加外键图书与副本、读者与借阅记录M:N独立建表借阅记录读者-副本借阅记录本质是读者和副本之间的 M:N 联系但它带了自己的属性借出日期、应还日期、实还日期、续借次数所以必须独立成表不能靠外键硬塞。2.3 用一张表把实体和主键定下来在动手写 DDL 前先把实体清单和主键策略定死避免后面反复改实体主键策略说明reader 读者reader_id 自增学号另设唯一索引book 书目book_id 自增ISBN 唯一book_copy 副本copy_id 自增barcode 条码唯一borrow 借阅borrow_id 自增关联 reader copyadmin 管理员admin_id 自增角色字段区分权限fine 罚款fine_id 自增关联 borrow主键统一用自增整数而不是业务字段学号、ISBN原因是业务字段会变、长度大、做外键时索引效率低。这是数据库课程设计里老师最爱考的「代理键 vs 自然键」取舍你答「用代理键保证稳定性业务字段加唯一约束」基本满分。3. 建库建表实操MySQL 8 下的完整 DDL 与约束设计3.1 建库与字符集选择先建库字符集用 utf8mb4排序规则 utf8mb4_0900_ai_ciMySQL 8 默认。别用 utf8那个是阉割版存不了 emoji书名里带特殊符号就翻车。-- 创建数据库字符集必须 utf8mb4 CREATE DATABASE library_db DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_0900_ai_ci; USE library_db;参数说明utf8mb4是真正的 4 字节 UTF-8能存所有 Unicode 字符utf8mb4_0900_ai_ci中 ai 表示 accent-insensitive重音不敏感ci 表示 case-insensitive大小写不敏感适合书名检索。如果你的 MySQL 是 5.7排序规则换成utf8mb4_general_ci。3.2 核心表 DDL 与约束下面这段是核心约束写全了答辩才站得住。注意外键、唯一索引、CHECK 约束一个都不能少。-- 读者表 CREATE TABLE reader ( reader_id INT AUTO_INCREMENT PRIMARY KEY, student_no VARCHAR(20) NOT NULL UNIQUE COMMENT 学号, name VARCHAR(50) NOT NULL, dept VARCHAR(50) NOT NULL COMMENT 院系, max_borrow TINYINT NOT NULL DEFAULT 5 COMMENT 最大可借数, status TINYINT NOT NULL DEFAULT 1 COMMENT 1正常 0冻结, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB COMMENT读者; -- 书目表 CREATE TABLE book ( book_id INT AUTO_INCREMENT PRIMARY KEY, isbn VARCHAR(20) NOT NULL UNIQUE, title VARCHAR(200) NOT NULL, author VARCHAR(100), publisher VARCHAR(100), price DECIMAL(8,2) NOT NULL DEFAULT 0.00, INDEX idx_title (title) ) ENGINEInnoDB COMMENT书目; -- 副本表关键一个书目多本副本 CREATE TABLE book_copy ( copy_id INT AUTO_INCREMENT PRIMARY KEY, book_id INT NOT NULL, barcode VARCHAR(30) NOT NULL UNIQUE COMMENT 馆藏条码, location VARCHAR(50) COMMENT 馆藏位置, status TINYINT NOT NULL DEFAULT 1 COMMENT 1在架 2借出 3遗失, CONSTRAINT fk_copy_book FOREIGN KEY (book_id) REFERENCES book(book_id) ON DELETE RESTRICT ) ENGINEInnoDB COMMENT图书副本; -- 借阅表M:N 联系独立成表 CREATE TABLE borrow ( borrow_id INT AUTO_INCREMENT PRIMARY KEY, reader_id INT NOT NULL, copy_id INT NOT NULL, borrow_date DATE NOT NULL DEFAULT (CURRENT_DATE), due_date DATE NOT NULL, return_date DATE DEFAULT NULL, renew_count TINYINT NOT NULL DEFAULT 0, CONSTRAINT fk_borrow_reader FOREIGN KEY (reader_id) REFERENCES reader(reader_id), CONSTRAINT fk_borrow_copy FOREIGN KEY (copy_id) REFERENCES book_copy(copy_id), CONSTRAINT chk_date CHECK (due_date borrow_date) ) ENGINEInnoDB COMMENT借阅记录;逻辑说明book_copy的book_id外键用ON DELETE RESTRICT意思是书目还有副本时不允许删书目防止出现孤儿副本。borrow表用CHECK约束保证应还日期不早于借出日期MySQL 8.0.16 之后才真正生效5.7 会忽略这点答辩要主动说明。borrow_date用DEFAULT (CURRENT_DATE)是 8.0 的表达式默认值语法5.7 不支持低版本改成在应用层传值。3.3 索引设计哪些字段该建索引课设里索引不用多但要建在刀刃上。借阅查询最频繁的两个场景是「查某读者当前借阅」和「查某副本是否在架」对应两个索引-- 加速按读者查借阅记录 CREATE INDEX idx_borrow_reader ON borrow(reader_id, return_date); -- 加速按副本查状态 CREATE INDEX idx_copy_status ON book_copy(book_id, status);idx_borrow_reader是联合索引reader_id在前因为查询条件总是先定位读者return_date放后面用于过滤「未归还」的记录return_date IS NULL。这里有个坑联合索引遵循最左前缀原则如果你只按return_date查这个索引用不上。索引不是越多越好每个索引都会拖慢写入课设里 3 到 5 个足够。4. 增删改查与事务借书还书这两条 SQL 才是评分重点4.1 借书操作一条事务里改两张表借书不是简单插一条记录它要同时做两件事把副本状态改成「借出」插入借阅记录。这两步必须在一个事务里否则副本改了但记录没插或者反过来数据就不一致了。START TRANSACTION; -- 1. 校验副本是否在架用行锁防止并发借同一本 SELECT status FROM book_copy WHERE copy_id 1001 FOR UPDATE; -- 2. 若 status1更新为借出 UPDATE book_copy SET status 2 WHERE copy_id 1001 AND status 1; -- 3. 插入借阅记录应还日期为 30 天后 INSERT INTO borrow (reader_id, copy_id, borrow_date, due_date) VALUES (1, 1001, CURRENT_DATE, DATE_ADD(CURRENT_DATE, INTERVAL 30 DAY)); COMMIT;逻辑说明SELECT ... FOR UPDATE是关键它给这一行加排他锁防止两个事务同时读到「在架」然后都去借。UPDATE的WHERE里再带一次status 1是双保险即使锁没拦住第二次更新影响行数为 0 也能发现异常。参数上借期 30 天是常见设定续借一次加 15 天这些规则写在应用层数据库只存结果。4.2 还书操作与逾期判定还书要更新借阅记录的归还日期同时把副本状态改回在架还要判断是否逾期生成罚款。START TRANSACTION; UPDATE borrow SET return_date CURRENT_DATE WHERE borrow_id 5001 AND return_date IS NULL; UPDATE book_copy SET status 1 WHERE copy_id (SELECT copy_id FROM borrow WHERE borrow_id 5001); -- 逾期则插入罚款每天 0.2 元 INSERT INTO fine (borrow_id, amount, reason) SELECT borrow_id, DATEDIFF(CURRENT_DATE, due_date) * 0.20, 逾期罚款 FROM borrow WHERE borrow_id 5001 AND CURRENT_DATE due_date; COMMIT;逻辑说明return_date IS NULL保证不会重复还书。罚款用DATEDIFF算逾期天数乘日费率INSERT ... SELECT只在逾期时才插入未逾期时子查询无结果插入 0 行天然幂等。注意DATEDIFF返回的是天数差如果当天还书不算逾期条件用而不是。4.3 几个必会的查询答辩常让你现场写查询这几个覆盖了增删改查和聚合-- 查某读者当前未归还的书 SELECT b.title, bc.barcode, br.due_date FROM borrow br JOIN book_copy bc ON br.copy_id bc.copy_id JOIN book b ON bc.book_id b.book_id WHERE br.reader_id 1 AND br.return_date IS NULL; -- 统计每个院系的借阅量按量降序 SELECT r.dept, COUNT(*) AS cnt FROM borrow br JOIN reader r ON br.reader_id r.reader_id GROUP BY r.dept ORDER BY cnt DESC; -- 查超期未还的读者 SELECT r.name, r.student_no, br.due_date FROM borrow br JOIN reader r ON br.reader_id r.reader_id WHERE br.return_date IS NULL AND br.due_date CURRENT_DATE;第一个查询是三表连接注意连接顺序从借阅表出发因为它是事实表。第二个是分组聚合GROUP BY的字段必须出现在SELECT里除非用聚合函数。第三个是典型的超期筛选due_date CURRENT_DATE配合return_date IS NULL。5. 避坑与排查课设答辩前必须自查的 5 个问题5.1 现象借阅记录能插入但库存数量对不上原因把库存当成book表的一个字段去加减而不是实时统计book_copy的状态。并发下两个事务同时读到库存 3各减 1结果库存变 1 但实际借出 2 本。 解决库存不落库用SELECT COUNT(*) FROM book_copy WHERE book_id? AND status1实时算或者用副本状态字段做唯一真相源。5.2 现象删除一本书报外键错误原因book_copy里还有该书的副本外键ON DELETE RESTRICT拦住了。 解决这是设计意图不是 bug。正确做法是先删副本再删书目或者把外键改成ON DELETE CASCADE但课设里不推荐级联删除太危险。答辩时主动解释「RESTRICT 是为了防止误删有馆藏的书目」。5.3 现象CHECK 约束写了但不生效原因MySQL 5.7 及更早版本会解析 CHECK 但直接忽略只有 8.0.16 之后才真正执行。 解决确认版本SELECT VERSION();低版本把校验逻辑放到应用层或触发器里。这个点老师很爱问答出来加分。5.4 现象中文书名插入变成问号原因建库时字符集用了latin1或utf83 字节或者连接串没指定字符集。 解决库、表、连接三处统一utf8mb4。连接串加?characterEncodingutf8mb4JDBC 里用useUnicodetruecharacterEncodingUTF-8。5.5 现象并发借同一本书两个人都借成功了原因没用SELECT ... FOR UPDATE或者用了但隔离级别是 READ COMMITTED 且没锁住。 解决借书事务里先SELECT ... FOR UPDATE锁住副本行再判断状态。InnoDB 默认 REPEATABLE READ配合行锁能解决。这是数据库并发锁的经典考点务必在报告里写清楚。6. 进阶技巧用视图和存储过程把课设做出工程味课设想拿高分光有增删改查不够加一两个视图和存储过程立刻拉开差距。视图把复杂连接封装起来应用层直接查视图代码干净存储过程把借书逻辑收进数据库减少网络往返。-- 视图当前借阅明细应用层直接查 CREATE VIEW v_current_borrow AS SELECT br.borrow_id, r.name AS reader_name, r.student_no, b.title, bc.barcode, br.borrow_date, br.due_date, DATEDIFF(CURRENT_DATE, br.due_date) AS overdue_days FROM borrow br JOIN reader r ON br.reader_id r.reader_id JOIN book_copy bc ON br.copy_id bc.copy_id JOIN book b ON bc.book_id b.book_id WHERE br.return_date IS NULL; -- 存储过程借书把事务和校验封装 DELIMITER // CREATE PROCEDURE sp_borrow(IN p_reader INT, IN p_copy INT, OUT p_msg VARCHAR(50)) BEGIN DECLARE v_status TINYINT; DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SET p_msg 借阅失败已回滚; END; START TRANSACTION; SELECT status INTO v_status FROM book_copy WHERE copy_id p_copy FOR UPDATE; IF v_status 1 THEN UPDATE book_copy SET status 2 WHERE copy_id p_copy; INSERT INTO borrow (reader_id, copy_id, borrow_date, due_date) VALUES (p_reader, p_copy, CURRENT_DATE, DATE_ADD(CURRENT_DATE, INTERVAL 30 DAY)); COMMIT; SET p_msg 借阅成功; ELSE ROLLBACK; SET p_msg 副本不可借; END IF; END // DELIMITER ;调用方式CALL sp_borrow(1, 1001, msg); SELECT msg;。逻辑说明EXIT HANDLER捕获任何 SQL 异常后回滚保证事务原子性OUT参数把结果带回应用层。参数上p_reader和p_copy是入参p_msg是出参。视图和存储过程的好处是业务逻辑集中在数据库应用层换语言也不用重写。验证方法借书前后分别查v_current_borrow和book_copy.status确认状态和记录同步变化故意传一个已借出的copy_id确认返回「副本不可借」且数据没变。我一般还会用两个会话同时CALL sp_borrow借同一本验证行锁是否生效——这是检验并发正确性的土办法比看文档管用。最后说个习惯课设报告里一定要有一节写「设计取舍」比如为什么用代理键、为什么副本独立成表、为什么库存不落库。老师看的不是你功能多全而是你知不知道自己每个决定背后的代价。我当年第一次做课设就是闷头写代码答辩被问「你这张表为什么这么设计」直接卡壳后来才明白数据库设计考的是判断力不是敲键盘的速度。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

一个Key切换大模型:统一模型网关的工程实践与解耦设计

一个Key切换大模型:统一模型网关的工程实践与解耦设计

1. 项目概述:为什么一个 Key 就能切换主流大模型,这件事值得深挖 “在 WorkBuddy 里接入聚梦 API:一个 Key 切换主流大模型”——这个标题乍看像一句产品宣传语,但作为从业十年、亲手落地过二十多个 AI 工具链集成项目的资深从业者…

2026/10/14 10:51:59 阅读更多 →
中国45年积雪深度数据集解析与应用指南

中国45年积雪深度数据集解析与应用指南

1. 数据集背景与价值解析这个雪深数据集记录了我国从改革开放初期到2024年共45年的积雪深度变化情况。作为国内持续时间最长的积雪观测记录之一,它的独特价值在于完整覆盖了我国从传统人工观测到现代遥感监测的技术演进全过程。在气象学和气候研究中,积雪…

2026/10/14 10:51:59 阅读更多 →
数据中心微网鲁棒规划:Matlab实现与能效优化

数据中心微网鲁棒规划:Matlab实现与能效优化

1. 项目背景与核心价值数据中心作为数字经济的核心基础设施,其能耗问题日益突出。据统计,全球数据中心年耗电量已超过2000亿千瓦时,相当于整个意大利的年度用电量。在这种背景下,如何构建高效、可靠、低碳的数据中心供能系统成为行…

2026/10/14 10:50:58 阅读更多 →

最新新闻

写给AI看的文档:Agent技能包设计与工程实践指南

写给AI看的文档:Agent技能包设计与工程实践指南

过去半年,GitHub 上最热闹的方向之一,不是某个新的模型权重,也不是某个推理框架的版本更新,而是一堆名字里带 superpowers、deepseek-harness、awesome-agent-skills 的仓库。这些仓库不写传统意义上的 README,不靠漂亮…

2026/10/14 23:59:43 阅读更多 →
零基础AI漫剧智能量产:从工具选型到批量出片的完整流程

零基础AI漫剧智能量产:从工具选型到批量出片的完整流程

1. 从零起步做AI漫剧:这个创作营到底在教什么第一次看到“零基础 AI 漫剧智能量产创作营”这个标题,我脑子里蹦出来的第一个念头是:又是一个割韭菜的课吧?但仔细拆解了一下“漫剧”“智能量产”“零基础”这三个关键词&#xff0c…

2026/10/14 23:59:43 阅读更多 →
Claude Code模板驱动工作流:工程化AI编程实践指南

Claude Code模板驱动工作流:工程化AI编程实践指南

1. 项目概述:这不是又一个“AI编程插件”,而是一套可即插即用的工程化工作流最近在几个技术社区和内部协作群聊里,反复看到有人发类似截图:“刚用Claude Code模板跑通了自动化日报生成,原来要写两小时的脚本&#xff0…

2026/10/14 23:59:43 阅读更多 →
零基础AI漫剧智能量产:角色一致性与批量生成全流程

零基础AI漫剧智能量产:角色一致性与批量生成全流程

1. 从零起步做AI漫剧:这个训练营到底在教什么第一次看到“AI漫剧智能量产创作营”这个名头,我脑子里蹦出来的第一个念头是:又是一个割韭菜的课吧?毕竟这两年AI绘画、AI写作的课满天飞,真正能落地跑通量产流程的没几个。…

2026/10/14 23:59:43 阅读更多 →
CFO离职后谁来签字?暂代财务负责人的三个月生存指南

CFO离职后谁来签字?暂代财务负责人的三个月生存指南

最近在行业群里看到有人转发一条消息:某头部在线视频平台的CFO辞任,由集团财务高级副总裁暂时接管财务工作。大多数人关注的是“为什么走”“拿了多少补偿”“下一站去哪”,但作为常年和企业财务体系打交道的人,我更在意的是另一组…

2026/10/14 23:59:43 阅读更多 →
Claude Code视频处理Skill盘点:180个开源工具与自动化流水线

Claude Code视频处理Skill盘点:180个开源工具与自动化流水线

1. 从“只会写代码”到“能剪片子”:这个项目到底在折腾什么第一次看到“让 Claude Code 学会做视频”这个说法,我脑子里冒出来的第一个念头是:这不就是把一个文本模型硬往多媒体方向拽吗?但仔细扒了一圈那 180 个开源 Skill 的分…

2026/10/14 23:58:40 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →