图书馆预约系统小程序源码拆解:Java+微信小程序+MySQL三层架构
简介这是一套基于微信小程序的图书馆预约系统毕业设计项目面向计算机相关专业学生适用于毕业设计或课程设计场景。系统采用微信小程序开发工具、MySQL数据库与Java的B/S架构实现完整覆盖管理员、用户、员工三类角色管理员可维护首页公告、自习室类别朗读房、普通房、电脑房、预约信息及留言回复并管理用户信用积分用户能修改个人资料、发起与查看自习室预约员工则负责查看预约情况与信用分并手动解除限制。压缩包共5个文件大小约59.23MB包含两个rar源码工程、一个zip演示及说明包、一个txt运行环境说明和一个sql数据库脚本。除源码外还提供数据库导入脚本、环境说明和演示录像便于快速搭建运行环境并核对功能效果。该资源已有341人学习适合正在完成图书馆预约相关课题的同学参考实现思路与整体结构。1. 图书馆预约系统小程序源码为什么这个毕业设计包值得拆开看你平时在群里看到有人丢出来一个毕业设计压缩包第一反应通常是先怀疑能不能跑通尤其是那种名字里写着“微信小程序 Java MySQL”的包。这次这套图书馆预约系统压缩包里带数据库脚本、Java 后端、小程序前端和演示录像我拆完之后的感受是它不是花架子而是一条完整的技术链路能解决你从零搭一套带管理员、普通用户、员工三种角色的预约系统时最耗时的那部分——表结构设计、权限区分、前后端接口打通。适合三类人用它交毕业设计、拿真实业务练小程序前端和 Java 接口开发或者临时要搭一个自习室预约管理原型。2. 拆包 tsgyy 源码三层结构与运行环境要准备哪些东西2.1 压缩包里到底是什么tsgyy.sql、tsgyy-wx.rar、tsgyy.rar 各负责哪一层这套资源的核心文件是四个tsgyy.sql、tsgyy-wx.rar、tsgyy.rar、运行环境说明.txt。我拿到手的第一步不是急着解压所有压缩包而是先把运行环境说明打开看因为这类毕业设计包最怕的就是开发工具版本不对导致启动即失败。从命名习惯来推断tsgyy-wx.rar里大概率是微信小程序前端工程tsgyy.rar是 Java 后端工程tsgyy.sql是 MySQL 数据库初始化脚本。但你解压前不要直接下结论两个 rar 都解出来先看哪个目录里存在app.json、pages目录哪个目录里存在pom.xml或src/main/java基本就能区分前端和后端。实际项目里经常出现命名倒挂的情况比如tsgyy.rar里装的反而是小程序前端所以“看目录结构”比“看文件名”靠谱得多。数据库脚本是这套系统所有业务的地基。图书馆预约系统的业务表大致包括用户表、管理员表、员工用户表、自习室类别表朗读房/普通房/电脑房、自习室信息表、预约记录表、留言表、信用积分表。tsgyy.sql里建的就是这套结构还带了一些初始数据不然你导入后连一个能登录的管理员账号都没有很多功能根本测不了。2.2 三层技术栈与三种用户角色的权限闭环这个项目走的是典型 B/S 结构微信小程序做展示和交互Java 后端提供接口MySQL 负责存数据。微信小程序端不是 H5 套壳是用原生小程序框架写的页面跳转、wx.request 请求、组件渲染都是小程序那套生态。后端 Java 工程按常见做法是 controller/service/dao 分层前端请求进来之后走 controller 层再到 service 层处理业务最后通过 dao 层访问 MySQL。系统设计了三个角色这个权限闭环是这套源码最有价值的地方。管理员端管的是全局配置小程序首页公告管理、自习室类别管理、自习室信息及预约管理、首页留言管理、用户信用积分管理。这里说的类别管理很有意思自习室被拆成了朗读房、普通房、电脑房三个类别每个类别下再挂具体的自习室信息这比那种“一张房间表走天下”的课程设计要完整得多。普通用户端比较简单登录后进入个人中心可以修改个人资料、查看自己的自习室预约记录、查看信用积分。员工用户端是另一个中间角色图书馆管理人员登录后能查看所有预约情况也能看到不同用户的信用积分还可以手动限制或解除限制。这个“员工手动解除限制”的设计往往是导师答辩时最感兴趣的点因为它体现出了业务逻辑不是死的是有人工干预的。2.3 跑起来之前先把环境清单对齐毕业设计源码项目最忌讳用最新版工具链去跑旧工程。我把这套资源的运行环境按常见做法整理成了一张清单对号入座检验即可工具版本建议作用JDK1.8Java 后端编译运行环境微信开发者工具最新稳定版即可打开小程序前端工程IDEIntelliJ IDEA 或 Eclipse运行 Java 后端MySQL5.7 或 8.0导入 tsgyy.sql 数据库脚本Navicat 或命令行工具不限数据库导入、数据查看Maven3.6 以上后端依赖管理如果用 Maven 构建微信开发者工具里现在新版本默认会启用“不校验合法域名”选项如果你只是本地开发用这个选项能省掉域名备案的麻烦下一章会详细说。MySQL 版本要特别注意8.0 之后默认认证插件改了后端连接驱动和连接参数都需要对应调整否则就会遇到访问数据库报错的问题。这个在排坑章节我会再展开。3. 从 tsgyy.sql 到页面联调把图书馆预约系统在本地跑起来3.1 先导数据库tsgyy.sql 怎么导入 MySQL拿到数据库脚本第一件事不是双击导入而是先在 MySQL 里创建一个空库再把tsgyy.sql导进去。直接导入一个不存在的数据库不同 MySQL 版本的默认行为还不一样建库语句写在脚本里可能没问题但你自己先建库会更可控。用命令行导入的话标准流程是这样mysql -u root -p CREATE DATABASE tsgyy DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; exit; mysql -u root -p tsgyy tsgyy.sql这里的参数含义拆开说-u root指定登录账号-p表示密码交互式输入tsgyy是目标数据库名 tsgyy.sql表示把脚本内容重定向给 mysql 命令执行。字符集用utf8mb4而不是utf8是因为文案里可能有表情符号或者生僻字utf8mb4能存得更全而且和小程序端的字符处理更匹配。如果你习惯用图形化工具Navicat 的操作方式也是一样新建数据库 tsgyy字符集选 utf8mb4然后在“运行 SQL 文件”里选择tsgyy.sql执行。导入完成后对照脚本里的表名清单查一遍确认表数量对得上比如管理员表、用户表、自习室表这些核心表都在。如果发现少了表多半是导入过程中间报错中断了重新导一次就行。3.2 后端配置数据库连接参数与启动方式数据库导入成功后接着做的是后端配置。Java 后端连接 MySQL 的配置文件通常是application.yml或application.properties在 src/main/resources 目录下。你需要把里面的数据库地址、账号、密码改成自己本机的配置。常见application.yml配置是这样的server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/tsgyy?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse username: root password: 123456这里容易踩坑的有两个参数serverTimezone必须设置成Asia/Shanghai否则 MySQL 驱动会报时区错误useSSLfalse是本地开发用的如果你不关掉部分 MySQL 版本会触发 SSL 连接告警。driver-class-name如果是 MySQL 8.0基本就是com.mysql.cj.jdbc.Driver如果是旧版驱动则写成com.mysql.jdbc.Driver。看你本地 MySQL 版本决定不要盲目照抄。改完配置文件后用 IDEA 打开后端工程等 Maven 依赖下载完找到启动类类上通常有SpringBootApplication注解运行 main 方法即可。如果工程不是 Maven 项目而是老的 SSM 结构就需要用 Tomcat 来部署运行环境说明.txt 里一般会写清楚。启动成功后日志里会出现 Tomcat started表示后端已经监听 8080 端口。3.3 小程序端配置wx.request 往哪里发小程序端是所有页面交互的入口它必须知道后端接口地址在哪否则所有列表都是空的。一般来说小程序工程里会有一个封装请求的文件常见命名是utils/request.js或api/index.js里面会定义一个请求函数统一通过wx.request发起网络请求。典型的请求封装长这样const BASE_URL http://localhost:8080 function request(url, method GET, data {}) { return new Promise((resolve, reject) { wx.request({ url: BASE_URL url, method: method, data: data, header: { Content-Type: application/json }, success: (res) { if (res.statusCode 200) { resolve(res.data) } else { reject(res) } }, fail: (err) { reject(err) } }) }) } module.exports { request }这个封装里最关键的是BASE_URL在微信开发者工具模拟器里访问本机后端可以直接用http://localhost:8080但如果要拿到真机上预览就改成电脑在局域网里的 IP比如http://192.168.1.100:8080而且真机必须和电脑连同一个 WiFi。这里有一个隐藏坑你的电脑如果开了防火墙真机可能访问不到 8080 端口需要在防火墙里放行。改完 BASE_URL 之后在开发者工具里重新编译小程序页面里的考场列表、预约记录、个人中心这一系列接口才能打通。还有一个细节微信开发者工具默认会拦截不带合法域名的请求本地联调时在“详情 - 本地设置”里勾选“不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书”这是本地调试的关键开关不勾选的话后台服务能启动但小程序页面永远请求不到数据。3.4 登录授权链路小程序端身份怎么对应到后端用户图书馆预约系统里用户登录后才能进入个人中心查看预约记录和信用积分。小程序端的登录不是简单输入账号密码而是通过微信的授权机制。常见方案是微信登录拿到 code后端再用 code 去微信接口换 openid用 openid 和本地用户表做匹配。如果你包的源码里写的是账号密码登录也别觉得不合适毕业设计里用表单登录更直观导师看起来也更清楚。这背后涉及的搜索热词是“微信小程序登录获取手机号”。现在微信官方更推荐用手机号快速验证组件也就是在页面里放一个button open-typegetPhoneNumber按钮用户同意后可以通过回调拿到加密的手机号数据后端再解密。但这个能力需要小程序是认证的企业主体开发者个人主体的小程序是被限制的。如果你的账号是个人主体老老实实用账号密码登录或者 wx.login 拿 code 换 openid反而省事。调试登录流程时的经验是先不管微信身份直接在后端用测试账号调通接口确认数据库用户表里能查到这个人再去看微信授权那层。这样定位问题会快很多因为“接口没调通”和“微信授权失败”是两类完全不同的坑。4. 排坑记录本地能跑、答辩演示不翻车的五个要点4.1 真机预览连不上本地后端接口现象在微信开发者工具模拟器里页面数据全部正常预约列表能刷新出来。但点击“真机预览”后手机上的小程序页面白屏或报错接口请求状态码一直转圈。原因模拟器里的localhost指向的是你电脑本身所以能访问到本机后端真机上localhost指向的是手机自己手机里根本没有后端服务在跑自然请求失败。解决把请求封装里的BASE_URL从http://localhost:8080改成电脑的局域网 IP比如http://192.168.1.100:8080并在电脑防火墙里放行 8080 端口。然后重新编译预览手机和电脑保持同一 WiFi 即可。4.2 MySQL 8.0 连接报错Public Key Retrieval is not allowed现象后端启动时日志报Public Key Retrieval is not allowed或Unable to load authentication plugin caching_sha2_password。原因MySQL 8.0 默认认证插件是caching_sha2_password部分 MySQL 驱动连接时为了密码传输需要获取公钥默认配置又禁止这个行为所以连不上。解决在 JDBC 连接串里加上allowPublicKeyRetrievaltrue完整 URL 类似jdbc:mysql://localhost:3306/tsgyy?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue。如果加完还报错把驱动换成mysql-connector-java8.0 以上的版本。4.3 页面能打开但列表接口返回 404 或 405现象后端启动没报错小程序首页能显示出来但一旦进入自习室列表页或预约记录页页面数据加载失败接口调试看到返回 404 或 405。原因404 大多是后端接口路径和小程序请求路径对不上比如前端请求的是/room/list后端 mapping 写的是/roomList。405 则是请求方法不一致前端用了 GET后端RequestMapping只接受 POST。解决打开小程序控制台看请求的具体 URL 和状态码回到后端 controller 层核对路径和方法。这个步骤我一般会用 Postman 把后端接口单独过一遍确认接口本身没问题再回来调前端。如果你没有 Postman直接在浏览器地址栏访问 GET 接口也能验证。4.4 数据库导入后中文乱码现象导入tsgyy.sql后页面上显示的自习室名称、公告内容全是问号或者 Navicat 里看表数据是乱码。原因建库语句没有显式指定字符集MySQL 默认用了 latin1 或者表的 character_set 和客户端连接字符集不一致。解决把数据库和表统一改成 utf8mb4。如果已经建库了执行ALTER DATABASE tsgyy CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;再对所有表执行ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;。重新导入前也确认 Navicat 连接的高级设置里编码是 utf8mb4。这个修正务必要在导入后第一时间做如果数据都已经被存成乱码后面改编码也救不回已损坏的数据。4.5 微信开发者工具提示 app.json 找不到页面现象导入小程序工程后编译控制台报错app.json: pages 字段未找到 xxx页面白屏。原因解压出来的小程序工程目录层级不对开发者工具把外层文件夹当成了小程序根目录但实际根目录里还有一层app.json在下一层目录里。解决检查解压后的目录结构确认app.json和pages目录在同一个层级。如果不对在开发者工具里重新选择工程目录指向真正包含app.json的那一层。这个坑很基础但毕业设计季一堆人翻车原因就是打包时把外层文件夹也打进去了。5. 二次开发方向预约规则、信用分逻辑与小屏适配项目跑通之后如果你想把它改出一点自己的东西而不是原封不动拿去做答辩最值得动的三个点是预约时段规则、信用积分增减、小程序导航栏适配。预约时段规则一般在后端 service 层里。常见的实现是自习室表里有开放时间字段预约记录表里有开始时间、结束时间字段。你可以把一小时一个时段改成半小时或者限制每人每天只能预约两个时段。改的时候注意关联表预约记录表外键关联了自习室 ID 和用户 ID修改时段长度只影响新预约历史数据不用动。信用积分逻辑的改动集中在对用户信用积分表的加减操作上。默认逻辑一般是正常履约不加分违约取消预约扣分信用分低于阈值就不能预约。这里我给你留一句提醒加分和扣分不能直接做裸的 UPDATE要放在事务里先查当前分、再计算新分、最后写回避免高并发下出现负分。如果你在开发环境想验证可以将后端日志打印出来查这一条链路。小屏适配上图书馆小程序的自习室列表页通常要自定义导航栏否则顶部标题会和微信胶囊按钮重叠。这是微信小程序顶部导航栏高度问题我的处理方式是动态计算const { statusBarHeight } wx.getSystemInfoSync() const menuButton wx.getMenuButtonBoundingClientRect() Page({ data: { navHeight: menuButton.height (menuButton.top - statusBarHeight) * 2 statusBarHeight, statusBarHeight: statusBarHeight } })statusBarHeight是状态栏高度menuButton是胶囊按钮的位置信息。把导航栏高度设为按钮底部到屏幕顶部的距离这样自定义头部不管在 iPhone 还是 Android 上都对齐。拿到这套源码后你在这个代码后面接上你自己页面的标题导航栏适配问题就彻底解决了。最后说句实在话源码包这个东西拿到手先做的不是改业务而是确认它能跑。我见过太多人一上来就改需求结果连数据库都没导进去。从那以后我每次拿到别人发的源码包都要求自己先把运行环境说明读完、把数据库导入、把后端和小程序联调跑通再开始谈修改。这套图书馆预约系统的代码和 SQL 我按上面的流程走了一遍整体是顺畅的希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Java宿舍管理系统课设源码:从数据库设计到部署排错全解析

Java宿舍管理系统课设源码:从数据库设计到部署排错全解析

简介:这是一套基于Java与数据库的学生宿舍管理系统项目源码,面向高校Java课程设计、数据库实训以及期末作业参考。系统涵盖宿舍信息管理、学生入住登记、费用记录等常见模块,源码包含详细注解,同时附有项目使用说明、数据库配置文…

2026/10/9 10:32:00 阅读更多 →
MySQL Workbench图形化操作指南:从建库到外键约束的设置与避坑

MySQL Workbench图形化操作指南:从建库到外键约束的设置与避坑

简介:MySQL Workbench使用教程是一份面向数据库管理员、开发者和初学者的实操型文档,围绕可视化数据库设计与管理展开,可解决从环境熟悉到库表维护过程中的常见问题。文档先介绍Workbench社区版与商业版的区别,再按操作路径演示SC…

2026/10/9 10:32:00 阅读更多 →
NSL-KDD入侵检测源码解析:从数据清洗到PCA降维与GUI演示

NSL-KDD入侵检测源码解析:从数据清洗到PCA降维与GUI演示

简介:基于NSL-KDD数据集的网络入侵检测完整项目,面向计算机专业毕业设计、课程设计及期末大作业实战需求,由导师指导并获98分高分评价,提供可复现的Python源码、运行说明与配套数据集。包内共27个文件,包含10个csv数据…

2026/10/9 10:32:00 阅读更多 →

最新新闻

MiniMax M Plan全模态额度统一与Claude Code、Cursor免密接入实战

MiniMax M Plan全模态额度统一与Claude Code、Cursor免密接入实战

1. 从 Token Plan 到 M Plan:额度体系到底变了什么MiniMax 把原来的 Token Plan 直接送进历史,换成了全新的 M Plan,这件事在开发者圈子里炸开锅的原因其实很简单——过去那种按 token 分档、按模态拆开计费的模式,用起来太碎了。…

2026/10/9 11:06:55 阅读更多 →
企业级AI网关实战:多模型统一接入与治理

企业级AI网关实战:多模型统一接入与治理

1. 多模型接入的乱局:为什么统一管理不是可选项 我最早接触多模型接入是在两年前,当时团队同时用着三家厂商的模型服务:一家做通用对话,一家做代码补全,还有一家专门跑长文本摘要。每个模型都有自己的控制台、自己的密…

2026/10/9 11:06:55 阅读更多 →
AI-Native组织架构设计:Agent、MCP与模型API网关落地实践

AI-Native组织架构设计:Agent、MCP与模型API网关落地实践

1. 从工具堆砌到组织重构:AI-Native 到底在说什么这两年“AI-Native”这个词被用得很泛,很多团队嘴上说着要做 AI-Native 组织,实际干的事情无非是给每个人开个模型账号、在流程里塞一个聊天窗口,然后对外宣称“我们已经全面拥抱 …

2026/10/9 11:06:55 阅读更多 →
数据库课后答案怎么用?三遍刷题法+SQLite 验证避坑指南

数据库课后答案怎么用?三遍刷题法+SQLite 验证避坑指南

简介:《数据库系统概论(第五版)》(王珊版)课后习题答案文档,专门面向学习数据库原理的本科生、考研复习者及自学者,可对照教材逐章检验理解程度。资源为单个doc文档,大小约588KB&…

2026/10/9 11:06:55 阅读更多 →
台球室预约小程序开发实战:从业务拆解到上线运营指南

台球室预约小程序开发实战:从业务拆解到上线运营指南

春节前一位开台球室的朋友找我,说要做一个台球室预约小程序。他那边35张球桌,高峰期电话不断,手写登记本翻得稀烂,散客到店经常要等一两个小时。我花了两周把整套台球室预约平台搭起来:小程序端给顾客选球台、选时段、…

2026/10/9 11:06:54 阅读更多 →
Agent-Reach:让智能体真正触达外部世界的连接方案

Agent-Reach:让智能体真正触达外部世界的连接方案

这半年我一直在折腾一件事:让AI智能体真正“连出去”。市面上不缺会写诗、会总结、会聊天的Agent,可一旦要让Agent去查报表、发通知、调外部系统,十有八九会卡住——不是模型不够聪明,而是它“够不到”。Agent-Reach这个项目&…

2026/10/9 11:05:53 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/9 6:17:20 阅读更多 →