Java学生成绩管理系统实战:从解压到二次开发全指南
简介这是一套面向Java初学者与课程设计学习者的学生成绩管理系统完整源码基于Java语言开发搭配MySQL数据库适合用于课程设计参考、毕业设计练手或Java GUI与JDBC实战学习。压缩包共104个文件约714KB包含68个class编译文件、29个java源码、2个jar依赖包及project、classpath等工程配置另附1份docx说明文档源码与可运行文件齐全便于直接导入IDE研究。系统功能覆盖学生信息管理、成绩录入与查询、成绩统计分析、选课管理及用户权限区分涉及Swing/JavaFX界面设计与JDBC数据库交互等核心知识点。目前已有600人学习下载读者可借此理解Java桌面应用的分层结构、数据库连接与增删查改实现并参考其代码组织方式提升软件工程实践能力。1. 从一份 Java 学生成绩管理系统压缩包说起它到底能跑通什么如果你手头正躺着一个Java学生成绩管理系统.rar双击解压后看到一堆.java、.sql、.jar和配置文件却不确定它能不能直接跑、数据库怎么接、登录账号在哪改那这篇就是写给你的。这类资源在课程设计、实训交付、二次开发起步阶段出现频率极高核心价值不在于代码多优雅而在于它把「学生信息维护 课程成绩录入 查询统计 权限区分」这条完整链路用 Java MySQL 串了起来能让你在一个下午内看到可交互的界面和真实落库的数据。适合谁适合需要快速搭出可演示原型的学生、需要给非技术同事展示流程的产品岗、以及想拿一个现成 CRUD 骨架改造成自己业务模块的初中级开发者。它不解决高并发也不负责漂亮 UI但作为「能跑起来的第一版」它省掉的是你从零建表、写 JDBC 工具类、调 Swing 布局的那两三天。2. 拆包先看结构Java 源码、SQL 脚本与依赖怎么对上号拿到压缩包别急着导入 IDE先按文件类型分堆。常见做法是根目录下会有src或直接散落的包目录、lib、sql、config这几类。你要做的第一件事是确认「入口类在哪、建表脚本在哪、数据库连接参数写在哪」。这三样对不上后面全是白忙。2.1 识别入口类与包结构解压后优先找带main方法的类通常叫Main、LoginFrame、App或Start。用编辑器全局搜public static void main命中的文件就是启动点。如果项目是 Swing 桌面应用入口往往先拉起登录窗口如果是控制台版入口会直接打印菜单。包名一般是com.xxx.student这种形式别改包名改了要同步改import和配置文件里的类路径。# 在解压目录下快速定位入口类和 SQL 脚本 find . -name *.java | xargs grep -l public static void main find . -name *.sql find . -name *.properties -o -name *.xml -o -name *.ini逻辑说明第一条命令找出所有含main方法的 Java 文件缩小启动范围第二条定位建表脚本第三条找出可能存放数据库账号密码的配置文件。参数上没什么可调的注意 Windows 下如果用find报错换 Git Bash 或 WSL 执行。2.2 数据库脚本与连接配置的对应关系打开sql目录下的脚本先看它建了几个库、几张表。典型结构是student表存学号姓名班级course表存课程名和学分score表存学号、课程号、分数外加一张user表做登录。脚本开头一般有CREATE DATABASE和USE语句记住库名后面改配置要用。连接配置常见三种形态.properties文件、硬编码在DBUtil.java里、或者写在 XML 里。搜jdbc:mysql这个关键字命中的地方就是你要改的。# 典型 db.properties按你本机实际情况改 jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/student_score?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8 jdbc.usernameroot jdbc.password你的密码逻辑说明jdbc.url里的student_score必须和 SQL 脚本里CREATE DATABASE的库名一致serverTimezone不写在高版本 MySQL 驱动下会报时区错误characterEncodingutf8防止中文姓名乱码。参数怎么改端口默认 3306如果你本机 MySQL 改过端口就同步改用户名密码填你本地能登录的那个不要照抄别人的。提示如果配置是硬编码在 Java 文件里改完记得重新编译别只改源码不重新构建。2.3 依赖 jar 包与 JDK 版本匹配lib目录里通常有mysql-connector-java-x.x.x.jar可能还有jcalendar、rs2xml这类辅助包。先确认你的 JDK 版本JDK 8 用mysql-connector-java-5.1.x或8.0.x都能跑JDK 11 以上建议用8.0.x驱动。如果导入 IDE 后满屏红九成是 jar 没加到构建路径而不是代码本身有问题。# 查看当前 JDK 版本 java -version javac -version逻辑说明两条命令分别看运行时和编译器版本两者最好一致。如果java -version是 1.8 而javac是 17说明环境变量混了先统一再谈跑项目。3. 把系统跑起来建库、导数据、改配置、启动四步走这一章是真正动手的部分。我一般按「先库后码」的顺序来数据库没通界面再漂亮也是空壳。下面四步走完你大概率能看到登录窗口。3.1 建库与导入 SQL 脚本用命令行或图形工具都行命令行更可控。先登录 MySQL再执行脚本。# 登录 MySQL密码回车后输入 mysql -u root -p # 在 MySQL 交互界面里执行脚本 source /你的路径/sql/student_score.sql;逻辑说明source后面跟脚本绝对路径Windows 下路径用正斜杠或双反斜杠。执行完用SHOW DATABASES;确认库已创建再USE 库名;后SHOW TABLES;看表是否齐全。如果脚本里没有CREATE DATABASE只有CREATE TABLE你需要先手动建库再执行。常见翻车点脚本编码是 GBK而你的客户端默认 UTF8导入后中文变问号。解决办法是用mysql --default-character-setgbk -u root -p登录后再 source。3.2 修改数据库连接参数并验证连通配置改完后别急着启动整个系统先写一个最小连通测试。很多「启动就报错」其实是数据库根本没连上。// TestConn.java单独跑一次确认驱动和账号没问题 import java.sql.Connection; import java.sql.DriverManager; public class TestConn { public static void main(String[] args) throws Exception { Class.forName(com.mysql.cj.jdbc.Driver); String url jdbc:mysql://localhost:3306/student_score?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8; Connection conn DriverManager.getConnection(url, root, 你的密码); System.out.println(连接成功 conn); conn.close(); } }逻辑说明Class.forName加载驱动高版本驱动不写也能连但建议保留getConnection三个参数分别是 URL、用户名、密码。如果报Access denied是账号密码错报Unknown database是库名不对或没建库报Communications link failure是 MySQL 服务没启动或端口不对。参数上useSSLfalse在本地开发可以关掉省去证书麻烦。3.3 在 IDE 中导入项目并补齐依赖以常见 IDE 为例新建 Java 项目把src下的包整体拷进去再把lib里的 jar 通过「Add as Library」加进构建路径。如果项目根目录有.classpath或pom.xml优先用「Import Existing Project」或「Maven Import」让工具自己解析依赖比手动加快。# 如果你用 Maven 且项目没有 pom可以手动补一个最小 pom cat pom.xml EOF project xmlnshttp://maven.apache.org/POM/4.0.0 modelVersion4.0.0/modelVersion groupIdcom.demo/groupId artifactIdstudent-score/artifactId version1.0/version dependencies dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency /dependencies /project EOF逻辑说明这个 pom 只声明了 MySQL 驱动够跑通数据库部分。版本号8.0.33是常见稳定版你本地已有其他 8.0.x 也可以换。加完 pom 后执行mvn dependency:resolve让依赖落盘再在 IDE 里刷新 Maven 项目。3.4 启动入口类与首次登录入口类右键 Run。如果是 Swing 登录窗默认账号密码通常写在 SQL 脚本的user表插入语句里常见是admin/123456或teacher/000000。登录后先别急着录成绩按「新增学生 → 新增课程 → 录入成绩 → 查询统计」走一遍确认每个环节都落库。-- 查看默认账号别去猜 SELECT * FROM user; -- 查看学生表结构确认字段名和界面是否对应 DESC student;逻辑说明SELECT * FROM user直接看有哪些账号和角色字段DESC student看字段类型和长度如果界面里学号输入框限制 10 位而数据库是varchar(20)说明有冗余空间改界面校验时心里有数。注意首次跑通后先备份一份原始压缩包和 SQL 脚本后面改崩了还能回退这是血泪经验。4. 成绩统计与权限控制核心逻辑改哪里、参数怎么调系统能跑只是及格线真正要拿去交作业或做二次开发你得知道统计逻辑和权限判断写在哪。这一章拆两个最常被改动的模块。4.1 成绩统计 SQL 的写法与常见口径统计功能一般落在ScoreDao或ScoreService里核心是几条聚合 SQL。常见口径有按课程算平均分、按学生算总分、按班级排名。改之前先确认业务要的是「平均分保留几位」「缺考算不算 0 分」。-- 按课程统计平均分、最高分、最低分 SELECT c.course_name, AVG(s.score) AS avg_score, MAX(s.score) AS max_score, MIN(s.score) AS min_score, COUNT(*) AS cnt FROM score s JOIN course c ON s.course_id c.course_id GROUP BY c.course_name; -- 按学生统计总分并排名 SELECT st.student_name, SUM(s.score) AS total, RANK() OVER (ORDER BY SUM(s.score) DESC) AS rk FROM score s JOIN student st ON s.student_id st.student_id GROUP BY st.student_name;逻辑说明第一条用JOIN把成绩和课程名关联GROUP BY按课程聚合第二条用窗口函数RANK()做排名MySQL 8.0 以上才支持5.7 需要用变量模拟。参数上AVG默认忽略 NULL如果缺考存的是 NULL 就不计入平均若业务要求缺考算 0得用IFNULL(s.score,0)包一层。改口径时只动 SQL别去改 Java 里的循环计算否则两处逻辑容易打架。4.2 登录与角色权限的判断链路权限通常分管理员、教师、学生三种角色判断点有两个登录时查user表的role字段进入主界面后根据角色隐藏或禁用某些按钮。改权限别只改界面服务端方法也要拦一道否则懂点技术的用户能绕过界面直接调。// 登录校验与角色分支的典型写法 public User login(String username, String password) { String sql SELECT * FROM user WHERE username? AND password?; // 用 PreparedStatement 防注入别拼字符串 User u queryOne(sql, username, password); if (u null) { throw new RuntimeException(账号或密码错误); } return u; // 调用方根据 u.getRole() 决定进哪个界面 }逻辑说明?占位符配合PreparedStatement是防 SQL 注入的基本功别用字符串拼接。queryOne是封装的查询方法返回 null 表示没查到。角色判断放在调用方比如if (admin.equals(u.getRole()))就打开管理主窗否则打开教师窗。参数上密码如果数据库存的是明文建议至少加一层 MD5 或 BCrypt改的时候同步改注册和登录两处。4.3 界面字段与数据库字段的映射检查改需求时最容易翻车的地方是「界面加了字段数据库没加列」或者反过来。我一般会拉一张对照表把界面控件、Java 实体属性、数据库列名三列对齐改之前先看这张表。界面控件实体属性数据库列类型学号输入框studentIdstudent_idvarchar(20)姓名输入框studentNamestudent_namevarchar(50)班级下拉框classNameclass_namevarchar(50)成绩输入框scorescoredecimal(5,2)逻辑说明这张表不用写进代码但改字段时对着看能省很多调试时间。decimal(5,2)表示总共 5 位、小数 2 位最大 999.99够用如果学校有 150 分制或加分项记得把位数放宽。5. 避坑与排查跑不起来时先查这五条这一章按「现象 → 原因 → 解决」写都是我拆这类包时真实遇到过的。现象一启动报ClassNotFoundException: com.mysql.cj.jdbc.Driver。原因驱动 jar 没加进构建路径或者驱动版本与代码里写的类名不匹配老驱动是com.mysql.jdbc.Driver。 解决确认lib下的 jar 已 Add as Library如果代码写的是老类名而 jar 是 8.0.x把类名改成com.mysql.cj.jdbc.Driver或换回 5.1.x 驱动。现象二登录后中文姓名显示成???。原因数据库连接 URL 没带characterEncodingutf8或者建库时字符集是 latin1。 解决URL 补上characterEncodingutf8已建库的执行ALTER DATABASE 库名 CHARACTER SET utf8mb4;表和列也要改最省事是删库按 utf8mb4 重建再导数据。现象三录入成绩后查询不到但数据库里明明有。原因查询条件用了匹配字符串但两边有空格或者事务没提交。 解决检查 Java 里是否trim()了输入确认连接是否设置了autoCommitfalse而代码里忘了commit()。常见做法是查询前先手动在 MySQL 客户端跑一遍同样的 SQL能定位是 SQL 问题还是代码问题。现象四Swing 界面乱码或按钮文字显示成方块。原因IDE 运行时的默认编码与源码文件编码不一致常见于源码是 GBK 而 IDE 按 UTF8 读。 解决在 IDE 的运行配置里加-Dfile.encodingGBK或-Dfile.encodingUTF-8与源码实际编码对齐实在不行用记事本另存为 UTF-8 再重新编译。现象五换台电脑就报Access denied for user rootlocalhost。原因配置文件里写的是别人机器的密码或者 MySQL 8 的root默认不允许远程/本地密码登录方式差异。 解决改成你本机密码如果本机 MySQL 8 用caching_sha2_password而驱动太老要么升级驱动到 8.0.x要么改用户认证插件。别去改 MySQL 的my.ini跳过权限表那是给自己挖坑。提示排查顺序永远是「先库后码、先配置后逻辑」别一上来就怀疑代码写错了。6. 二次开发起步把现成骨架改成你自己的业务模块跑通之后这份资源最大的价值是当骨架用。我一般会先做三件事把包名和项目名换成自己的、把student表按新业务改名、把登录角色扩展成自己需要的。下面给一个改表名和实体类的具体手法以及验证改完没改崩的方法。6.1 批量替换表名与实体名的安全做法别在 IDE 里全局替换student这个词因为student_id、student_name也会被误伤。正确做法是先改数据库再改实体类最后改 SQL 字符串。-- 先把表改名列名保持不变减少代码改动量 RENAME TABLE student TO t_member; -- 如果业务需要再加新列 ALTER TABLE t_member ADD COLUMN phone VARCHAR(20) DEFAULT NULL;逻辑说明只改表名不改列名Java 里SELECT * FROM student改成SELECT * FROM t_member即可实体属性名不用动。加列时给默认值避免已有数据插入报错。改完在 MySQL 里SELECT * FROM t_member LIMIT 5;确认数据还在。6.2 用最小回归清单验证改动没破坏原功能改完别凭感觉说「应该没问题」跑一遍清单登录 → 新增一条成员 → 查询刚新增的 → 修改它 → 删除它 → 再查确认没了。这五步覆盖了增删改查主链路任何一步报错都能快速定位到是哪层改坏了。# 如果项目有单元测试目录跑一遍没有就手动走清单 mvn test逻辑说明mvn test只在项目是 Maven 结构时有意义非 Maven 项目就手动点界面。手动走的时候开着控制台看异常栈比只看弹窗提示有用得多。6.3 一个我常用的习惯从那以后我每次拿到这类压缩包都先复制一份原始包到备份目录再在副本上改数据库脚本也先mysqldump一份再动结构。改配置只改一处、改表名只改一层、改完必走五步回归。这套习惯让我少熬了很多个「明明只改了一行却全崩了」的夜。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

喂文件、写代码、聊天:三个开源工具打造本地化AI工作流

喂文件、写代码、聊天:三个开源工具打造本地化AI工作流

1. 项目概述:为什么“喂文件、写代码、聊天”这三件事,才是AI真正落地的临界点最近在几个技术社区和产品团队内部做AI工具链调研时,反复听到一句话:“模型能力早就够了,卡在怎么用上。”不是模型不够聪明,而…

2026/10/15 22:55:22 阅读更多 →
AI全链路开发微信小游戏:火山AgentPlan + Cocos + MCP自动化流水线实战(TaoToken统一Key接入版)

AI全链路开发微信小游戏:火山AgentPlan + Cocos + MCP自动化流水线实战(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/15 22:55:22 阅读更多 →
膀胱癌机器学习论文复现全解析:从传统模型到图神经网络

膀胱癌机器学习论文复现全解析:从传统模型到图神经网络

前阵子一位学弟跟我吐槽,他拿某公开肿瘤数据仓库的膀胱癌转录组数据跑了一圈随机森林,训练集AUC超过0.95,换到外部验证集立刻掉到0.6出头,论文投出去直接被秒拒。我听完一点不意外。这几年顶着“机器学习”帽子的肿瘤预后文章越来…

2026/10/15 22:55:22 阅读更多 →

最新新闻

Python工具链Rust化:五个提升开发效率的新库实战指南

Python工具链Rust化:五个提升开发效率的新库实战指南

这两年 Python 生态里的话题,绕不开一个词:Rust 化。从包管理到 lint 再到数据验证,一堆新库选择直接用 Rust 重写底层,把之前 Python 工具链里让人头疼的慢、复杂、配置繁琐的问题挨个收拾了一遍。我最近在几个项目里把工具链切到…

2026/10/15 23:45:00 阅读更多 →
Unity输入与屏幕设置实战笔记:从旧版Input到Input System

Unity输入与屏幕设置实战笔记:从旧版Input到Input System

我不太喜欢写那种截图铺满的入门教程,这篇更偏向我自己反复会翻的备忘录。主题就两个:一是Unity里的按键操作,二是屏幕设置。搞游戏开发或者做工具类应用的人应该都有同感,这两种需求几乎每个项目都会碰上,但每次写都还…

2026/10/15 23:45:00 阅读更多 →
五个Python新库盘点:uv、marimo、FastHTML、instructor、textual

五个Python新库盘点:uv、marimo、FastHTML、instructor、textual

Python 生态这两年的迭代速度,说实话比我刚入行那会儿快太多了。以前盯住一两个框架就能吃很久,现在隔一阵子不刷社区,就会冒出一批名字崭新的库。新库多不稀奇,稀奇的是其中真正值得花时间去跟的,永远是少数。今天这篇…

2026/10/15 23:45:00 阅读更多 →
基于Spring Boot的Web图书管理系统开题报告写作指南

基于Spring Boot的Web图书管理系统开题报告写作指南

写开题报告最怕什么?不是查重太高,而是被指导老师问一句“你这个基于Spring Boot的Web图书管理系统,到底要解决什么问题?”当场愣住。我帮人改过不少开题报告,发现真正写得稳的,往往不是技术最炫的&#xf…

2026/10/15 23:45:00 阅读更多 →
QMUI iOS 深入解读:基于全局配置表与丰富控件的 UI 开发提效方案

QMUI iOS 深入解读:基于全局配置表与丰富控件的 UI 开发提效方案

移动开发UI组件 【免费下载链接】QMUI_iOS QMUI iOS——致力于提高项目 UI 开发效率的解决方案 项目地址: https://gitcode.com/gh_mirrors/qm/QMUI_iOS 点击查看 免费下载 QMUI iOS 是由腾讯出品的开源 iOS UI 解决方案,核心目标是通过「一份全局配置表…

2026/10/15 23:45:00 阅读更多 →
PyTorch深度学习实战:从环境搭建到模型训练与调试的完整指南

PyTorch深度学习实战:从环境搭建到模型训练与调试的完整指南

1. 从零上手PyTorch:为什么它成了深度学习项目的默认起点如果你最近打算认真做点深度学习相关的项目,不管是图像分类、文本生成还是推荐系统,大概率绕不开PyTorch这个名字。我身边不少做算法的朋友,从早期用别的框架折腾静态图&am…

2026/10/15 23:43:59 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/15 9:49:14 阅读更多 →