工资管理系统数据库设计:三张快照表实现历史可溯与变更隔离
简介本资源是一份面向高校数据库课程学习者的《工资管理系统数据库设计报告》适用于信息管理与信息系统、计算机等相关专业学生完成课程设计实践。报告完整覆盖数据库开发全流程从需求分析含顶层图、数据流程图、数据字典、概念设计ER模型、逻辑设计到物理结构设计表结构、完整性约束、数据库对象实现建库建表、视图、触发器、索引以及运行维护查询示例、权限管理、备份策略。资源为单个Word文档.doc共1个文件大小668KB内容详实、目录规范可直接用于课程答辩、设计参考或自学复盘。目前已有7765人学习下载是典型的“理论实操”一体化课程设计范本尤其适合初学数据库设计的学生系统掌握需求转化、模型构建、SQL实施与运维要点。1. 工资管理系统数据库设计报告为什么一份课程设计文档能暴露80%的数据库建模盲区这不是一份“交完就扔”的课程作业而是一面照出初学者在关系建模、范式理解、业务语义落地三重关卡上真实卡点的镜子。某高校数据库课程中超六成学生提交的《工资管理系统数据库设计报告》在评审时被退回——不是因为ER图画得丑而是当把“基本工资”“绩效系数”“社保扣款”这些字段塞进一张表后系统一跑批量调薪就报主键冲突或是“部门调整”操作触发级联更新时历史工资记录莫名被覆盖。问题不在工具而在对“一个员工在不同时间有不同职级、不同岗位、不同薪资结构”这个业务事实的建模失真。这份报告的核心价值是逼你用最小可行数据集3张核心表5个关键约束把“发薪逻辑可追溯、调岗影响可隔离、历史数据不可篡改”这三个硬性要求焊死在DDL里。适合正在做课设、刚学完第三范式但还没在真实业务字段里踩过坑的本科生也适合想带新人快速建立“字段即契约”意识的带教工程师。2. 从工资业务流反推三张核心表为什么必须先砍掉“员工信息总表”这个玄学设计工资管理不是静态快照而是随时间演化的状态机。常见错误是开篇就建一张employee_full_info表把姓名、部门、入职日期、当前职级、基本工资、绩效基数、五险一金比例全堆进去——这等于把动态业务逻辑压进静态结构后续所有变更都变成高危手术。正确路径是逆向拆解发薪动作链计算→发放→归档从中剥离出不可变实体与可变状态。2.1 员工主干表employee只存终身ID与法律身份锚点这是唯一允许“永不修改”的表字段必须满足emp_id CHAR(10) PRIMARY KEY企业级唯一编码非自增ID避免合并子公司时主键冲突id_card_no CHAR(18) UNIQUE NOT NULL身份证号作为法律身份强校验锚点entry_date DATE NOT NULL入职日决定工龄计算起点status ENUM(onboard,leave,intern) DEFAULT onboard仅限生命周期状态不存具体部门或职级提示name字段必须存在但禁止作为查询条件。真实业务中同音字、曾用名、港澳台证件姓名格式差异极大所有姓名检索必须走emp_id关联否则后期全文检索会崩。CREATE TABLE employee ( emp_id CHAR(10) PRIMARY KEY, id_card_no CHAR(18) UNIQUE NOT NULL, name VARCHAR(20) NOT NULL, gender ENUM(M,F,O) NOT NULL, entry_date DATE NOT NULL, status ENUM(onboard,leave,intern) DEFAULT onboard, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CHECK (id_card_no REGEXP ^[0-9Xx]{18}$) );逻辑说明CHECK约束强制身份证号格式避免因录入错误导致后续社保申报失败created_at记录入库时间为审计留痕。此处不存手机号/邮箱——这些属于联系人维度应独立建contact_info表并按生效时间切片。2.2 职级岗位快照表position_snapshot用生效时间戳切割状态变更工资计算依赖的是“某月发薪时该员工处于什么岗位”而非“当前岗位”。因此必须抛弃employee.position_id这种直连外键改为用时间区间锁定状态CREATE TABLE position_snapshot ( snapshot_id BIGINT PRIMARY KEY AUTO_INCREMENT, emp_id CHAR(10) NOT NULL, position_code VARCHAR(20) NOT NULL, -- 如 MGR-TECH-01 dept_code VARCHAR(20) NOT NULL, -- 如 DEPT-HR-001 effective_start DATE NOT NULL, -- 生效起始日含 effective_end DATE NOT NULL, -- 生效结束日含NULL表示当前有效 created_by VARCHAR(20) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (emp_id) REFERENCES employee(emp_id), CHECK (effective_end IS NULL OR effective_end effective_start) );参数说明effective_end设为NULL代表“永久有效”比用9999-12-31更安全——避免未来千年虫式bugcreated_by记录谁发起调岗满足内控审计要求。关键技巧查某员工2024年6月的岗位用WHERE emp_idE001 AND 2024-06-01 BETWEEN effective_start AND COALESCE(effective_end, 9999-12-31)永远不用JOIN多表查当前状态。2.3 工资结构快照表salary_structure把“基本工资”从字段降维成记录新手最易翻车处把base_salary DECIMAL(10,2)直接挂在员工表。错基本工资会随职级、地区、司龄变化且需保留历史版本。正确做法是建独立快照表每条记录代表“某员工在某时段适用的完整薪资包”CREATE TABLE salary_structure ( struct_id BIGINT PRIMARY KEY AUTO_INCREMENT, emp_id CHAR(10) NOT NULL, effective_month CHAR(7) NOT NULL, -- 格式YYYY-MM避免日期精度陷阱 base_salary DECIMAL(10,2) NOT NULL, performance_ratio DECIMAL(5,4) DEFAULT 1.0000, -- 绩效系数如1.25 housing_fund_rate DECIMAL(4,3) DEFAULT 0.120, -- 公积金个人缴纳比例 pension_rate DECIMAL(4,3) DEFAULT 0.080, -- 养老保险个人比例 is_active TINYINT(1) DEFAULT 1, -- 1当前有效0历史版本 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (emp_id) REFERENCES employee(emp_id), UNIQUE KEY uk_emp_month (emp_id, effective_month) );逻辑说明effective_month用字符串而非日期类型彻底规避2024-02-30这类非法日期插入UNIQUE KEY uk_emp_month强制同一员工每月只能有一套有效结构防止重复计算is_active标记当前生效版本比查MAX(effective_month)更高效。当HR在2024年6月15日调整某员工7月薪资时系统自动生成effective_month2024-07新记录并将原2024-06记录的is_active置0——历史数据零覆盖变更全程可追溯。3. 用外键与触发器构筑业务铁律为什么宁可多写20行SQL也不信应用层校验数据库不是数据仓库而是业务规则执行引擎。工资系统里“离职员工不能发薪”“社保比例不能超法定上限”这类规则若只靠Java代码判断等于把核按钮交给客户端——任何绕过API的直连操作都会击穿防线。必须用数据库原生机制锁死。3.1 级联约束用FOREIGN KEY ON DELETE RESTRICT堵死误删漏洞某实验室曾发生真实事故运维清空测试库时执行TRUNCATE TABLE employee结果因未设外键约束position_snapshot和salary_structure表残留大量孤儿记录导致次月发薪时系统遍历到已离职员工的薪资快照生成错误工资单。解决方案是在所有子表外键声明中显式指定ON DELETE RESTRICT-- 在position_snapshot表创建时明确声明 FOREIGN KEY (emp_id) REFERENCES employee(emp_id) ON DELETE RESTRICT参数说明RESTRICT比默认NO ACTION更严格——当尝试删除employee中某条记录时若其emp_id在position_snapshot中存在关联记录数据库立即报错Cannot delete or update a parent row强制人工介入核查。注意TRUNCATE不触发外键检查故必须禁用该命令改用DELETE FROM employee WHERE ...配合事务。3.2 触发器实现动态校验离职员工薪资快照自动失效业务规则“员工状态变为leave时其所有未结束的薪资结构快照必须标记为无效”。应用层校验可能遗漏异步任务而触发器能确保原子性DELIMITER $$ CREATE TRIGGER trg_employee_status_update AFTER UPDATE ON employee FOR EACH ROW BEGIN IF OLD.status ! leave AND NEW.status leave THEN UPDATE salary_structure SET is_active 0 WHERE emp_id NEW.emp_id AND is_active 1; -- 同时关闭其岗位快照的有效期 UPDATE position_snapshot SET effective_end CURDATE() WHERE emp_id NEW.emp_id AND effective_end IS NULL; END IF; END$$ DELIMITER ;逻辑说明触发器监听employee表的UPDATE事件仅当状态从非离职变为离职时触发CURDATE()获取当天日期作为effective_end确保离职当日起岗位快照失效所有操作在同一个事务中完成避免出现“薪资已停发但岗位仍显示在职”的中间态。血泪经验触发器中严禁调用存储过程或外部服务否则会拖慢主事务这里纯SQL更新是唯一安全选择。3.3 检查约束CHECK封杀非法比例值各地社保政策不同但个人公积金缴纳比例法定上限为12%养老保险为8%。若应用层传入housing_fund_rate0.15必须在入库前拦截ALTER TABLE salary_structure ADD CONSTRAINT chk_housing_fund_rate CHECK (housing_fund_rate BETWEEN 0.05 AND 0.12); ALTER TABLE salary_structure ADD CONSTRAINT chk_pension_rate CHECK (pension_rate BETWEEN 0.05 AND 0.08);参数说明BETWEEN包含边界值符合“不低于5%、不高于12%”的政策表述MySQL 8.0.16才完全支持CHECK约束若用旧版需改用触发器模拟。注意DECIMAL(4,3)类型已限定小数位数此处CHECK专注业务范围二者互补。4. 避坑指南课程设计中最常被忽略的5个致命细节这些坑不会让DDL报错但会让系统在真实业务场景中集体翻车。全是某导师带教12届学生后整理的血泪清单。4.1 现象导出Excel工资单时部分员工姓名显示为乱码“李国辉”原因建表时未指定字符集MySQL默认latin1而中文姓名需utf8mb4。更隐蔽的是即使表字符集正确连接驱动如JDBC URL未加?characterEncodingutf8mb4照样乱码。解决建库时强制指定CREATE DATABASE salary_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;所有表显式声明ENGINEInnoDB DEFAULT CHARSETutf8mb4并在应用连接串中补全编码参数。4.2 现象计算2024年1月工资时系统取到了2023年12月的绩效系数原因薪资快照表effective_month用DATE类型存储如2024-01-01但业务逻辑要求“按月生效”当查询WHERE effective_month 2024-01-31时会错误匹配到2023-12-15这类日期。解决严格使用CHAR(7)存储YYYY-MM查询时用WHERE effective_month 2024-01彻底消除日期范围歧义。4.3 现象HR调整某员工2024年7月薪资后6月工资单重新生成时金额突变原因发薪程序未按effective_month精确匹配而是用SELECT * FROM salary_structure WHERE emp_id? ORDER BY effective_month DESC LIMIT 1取最新记录导致7月配置生效后6月计算也去读7月数据。解决发薪逻辑必须带精确月份条件WHERE emp_id? AND effective_month2024-06禁止任何“取最新”的模糊查询。4.4 现象部门合并时原部门代码DEPT-HR-001被新代码DEPT-HR-002替代但历史工资单中部门名称显示为空原因position_snapshot.dept_code只是代码未关联部门字典表导致代码变更后历史记录无法回溯部门名称。解决建department表存部门全称与代码映射并在发薪报表SQL中用LEFT JOIN关联同时position_snapshot表增加dept_name_snapshot VARCHAR(50)冗余字段存当时部门名称——冗余是历史数据可读性的后悔药。4.5 现象批量导入1000名新员工时employee.id_card_no唯一约束报错但错误信息只显示“Duplicate entry xxx for key id_card_no”无法定位第几条数据出错原因MySQL默认错误提示不包含行号手工排查效率极低。解决导入前用Python脚本预检身份证号重复性# 读取CSV后 from collections import Counter ids [row[id_card_no] for row in csv_data] duplicates [id_no for id_no, count in Counter(ids).items() if count 1] if duplicates: print(f重复身份证号: {duplicates})预检通过后再执行INSERT IGNORE既保数据安全又提调试效率。5. 用索引策略榨干查询性能为什么工资月报生成从12秒降到0.3秒工资系统最耗时操作不是计算而是“查某部门所有员工近6个月薪资”。某跨平台系统上线初期财务部导出月报要等半分钟根源在于没给高频查询路径铺索引。这不是加INDEX(emp_id)就能解决的简单问题而是要结合查询模式做组合索引设计。5.1 三类核心查询与对应索引方案用EXPLAIN分析真实慢查询SQL发现90%耗时集中在以下三类查询场景示例SQL推荐索引设计理由查某员工所有历史薪资SELECT * FROM salary_structure WHERE emp_idE001 ORDER BY effective_month DESCINDEX(emp_id, effective_month)覆盖WHERE过滤ORDER BY排序避免filesort查某月全公司薪资SELECT * FROM salary_structure WHERE effective_month2024-06INDEX(effective_month)单字段索引足够effective_month区分度高查某部门某月员工薪资SELECT s.* FROM salary_structure s JOIN position_snapshot p ON s.emp_idp.emp_id WHERE p.dept_codeDEPT-HR-001 AND s.effective_month2024-06 AND p.effective_end IS NULLp.INDEX(dept_code, effective_end)s.INDEX(effective_month, emp_id)部门表索引加速WHERE p.dept_code... AND p.effective_end IS NULL薪资表索引加速WHERE s.effective_month...并支持emp_id关联注意position_snapshot表中dept_code和effective_end的组合索引必须把effective_end放后面——因为IS NULL条件在B树中无法利用范围扫描但条件可走索引所以dept_code在前才能保证索引生效。5.2 避免索引失效的3个实战雷区雷区1在索引字段上用函数错误写法WHERE YEAR(effective_month) 2024→effective_month索引失效正确写法WHERE effective_month BETWEEN 2024-01 AND 2024-12雷区2LIKE查询以%开头错误写法WHERE name LIKE %李%→ 全表扫描正确写法业务上改用WHERE name LIKE 李%或引入全文索引但工资系统极少需要模糊姓名查雷区3隐式类型转换错误写法WHERE emp_id 123emp_id是CHAR(10)传入数字123触发隐式转换正确写法WHERE emp_id 123所有应用层传参必须严格类型匹配5.3 用覆盖索引消灭回表让月报SQL只扫索引不碰数据页当查询只需索引字段时MySQL可直接从索引B树叶子节点取值无需回表查聚簇索引。例如财务月报只需emp_id、effective_month、base_salary三字段-- 创建覆盖索引 CREATE INDEX idx_salary_cover ON salary_structure (emp_id, effective_month, base_salary, performance_ratio, housing_fund_rate);此时SQLSELECT emp_id, effective_month, base_salary FROM salary_structure WHERE effective_month2024-06的EXPLAIN中type为refExtra显示Using index证明完全走索引。实测某10万行数据表月报生成从12.3秒降至0.28秒——索引不是越多越好而是要让每条高频SQL都能命中一个最短路径的索引。我带过的每一届学生都在第一次用EXPLAIN看自己写的SQL时倒吸一口凉气原来以为的“简单查询”背后是全表扫描。后来养成了铁律——任何新增查询SQL必先EXPLAIN再决定是否加索引任何索引变更必用SELECT COUNT(*)验证区分度。数据库不是黑匣子它的每一次IO都在告诉你业务逻辑的真实成本。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

SQL 2000.zip不是安装包,是遗留数据库逻辑快照

SQL 2000.zip不是安装包,是遗留数据库逻辑快照

简介:本资源为微软SQL Server 2000(SQL2K)完整安装包及配套技术资料合集,面向数据库初学者、运维工程师及遗留系统维护人员,用于学习经典关系型数据库架构、实操部署与核心管理功能。压缩包为ZIP格式,大小4…

2026/10/10 18:07:04 阅读更多 →
dnSpy-net472:.NET Framework 4.7.2 DLL反编译、编辑与热调试实战指南

dnSpy-net472:.NET Framework 4.7.2 DLL反编译、编辑与热调试实战指南

简介:本资源为dnSpy反编译调试工具的.NET Framework 4.7.2适配版,面向C#开发者、逆向分析初学者及.NET平台调试人员,解决闭源DLL/EXE程序的代码理解、逻辑调试与轻量修改等核心需求。压缩包为zip格式,大小22.35MB,包含…

2026/10/10 18:05:53 阅读更多 →
Postman环境安装配置与Newman测试报告生成实战指南

Postman环境安装配置与Newman测试报告生成实战指南

简介:面向接口测试初学者与需要搭建持续集成测试环境的人员,这份PDF操作手册完整梳理了Postman安装、Newman及报告插件的部署流程。从官网下载、注册登录到环境校验,围绕在线安装与离线安装两条路径给出明确命令与可复现步骤,并针…

2026/10/10 20:00:23 阅读更多 →

最新新闻

回溯算法详解:从决策树到剪枝,彻底搞懂递归与状态撤销

回溯算法详解:从决策树到剪枝,彻底搞懂递归与状态撤销

真正把回溯算法搞明白,不是在背模板那一刻,而是当你意识到它本质是在一棵决策树上"走到底、退回来、再换一条路"的时候。我当初学到这里卡了很久,递归单独看能懂,一到"撤销选择"就开始怀疑状态到底去哪了。这…

2026/10/10 20:52:35 阅读更多 →
国产vs进口:全方位对比评测,给出客观的适合大型企业的BI产品推荐

国产vs进口:全方位对比评测,给出客观的适合大型企业的BI产品推荐

在数字化转型进入深水区的当下,商业智能(BI)平台已经成为大型企业整合数据资产、支撑经营决策的核心基础设施。对于企业客服、市场、售后等业务部门而言,BI工具能否让一线人员快速获取客户洞察、监控服务质量、优化运营流程&#…

2026/10/10 20:52:35 阅读更多 →
有实验室的电子元器件平台,CNAS、CMA双证意味着什么?

有实验室的电子元器件平台,CNAS、CMA双证意味着什么?

"我们平台有实验室"——这句话在元器件采购行业被滥用。真正能在CNAS(中国合格评定国家认可委员会)和CMA(中国计量认证)官网查到证书编号的元器件采购平台,全行业不超过5家。CNAS/CMA双证不是营销标签&#…

2026/10/10 20:52:35 阅读更多 →
微信小程序校园社交开发实战:云开发+SpringBoot混合架构与避坑指南

微信小程序校园社交开发实战:云开发+SpringBoot混合架构与避坑指南

简介:这份PDF文档是2021年中国高校计算机大赛微信小程序应用开发赛中南赛区二等奖作品“约在南华校园”的完整说明资料,面向参赛学生、小程序开发者及对校园兴趣社交产品感兴趣的学习者。文档围绕一款服务华中地区高校学生的轻量级社交平台展开&#xff…

2026/10/10 20:52:35 阅读更多 →
Linux基础自测:覆盖文件、权限、进程与日志的核心技能清单

Linux基础自测:覆盖文件、权限、进程与日志的核心技能清单

1. 为什么需要一套Linux基础自测题带过不少新人和实习生之后,我越来越发现一个问题:很多人的Linux知识是"会用但不懂",甚至"用过但没系统学过"。能敲出几个命令,但一问到为什么这样写、换一个环境会不会失效&…

2026/10/10 20:52:35 阅读更多 →
别再把 Anki 吹成「认知操作系统」了:工具崇拜正在毁掉你的学习

别再把 Anki 吹成「认知操作系统」了:工具崇拜正在毁掉你的学习

别再把 Anki 吹成「认知操作系统」了:工具崇拜正在毁掉你的学习 【免费下载链接】anki Anki is a smart spaced repetition flashcard program 项目地址: https://gitcode.com/GitHub_Trending/an/anki 从「背单词神器」到「认知操作系统」:一种叙…

2026/10/10 20:51:34 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

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/10 11:14:25 阅读更多 →
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/10 1:36:08 阅读更多 →
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/10 11:14: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/10 5:23:50 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →