人力资源管理系统UML设计:从用例图到类图时序图的完整实战指南
简介这份文档资料面向软件工程、信息管理专业的学生及系统设计初学者围绕《基于UML的人力资源管理系统设计》展开帮助读者理解如何用统一建模语言梳理复杂业务逻辑。内容涵盖组织机构、职位、绩效考评、招聘、培训、薪资、福利等十大功能模块的需求分析并以招聘管理为例完整演示从需求计划制定、人员供需预测到筛选录用、试用转正的建模过程同时涉及B/S体系结构与PowerDesigner建模工具的应用。资源包共1个doc文件大小约1.85MB便于直接查阅与二次编辑。目前已有183人学习浏览适合用作课程设计、毕业设计或系统分析报告的参考范本读者可从中获取模块划分思路、UML图形表达方式以及业务建模的完整推演路径为实际项目设计提供可借鉴的框架。1. 人力资源管理系统UML设计一份文档如何撑起整个开发流程很多团队做人力资源管理系统HRMS时需求评审开了一轮又一轮开发拿到手的却还是一堆零散的聊天记录和截图。等到上线才发现考勤模块和薪酬模块对“月度工时”的定义根本不一致返工成本高得离谱。这个问题的根源往往不在技术而在于缺少一份能把业务语言翻译成技术语言的中间产物——UML设计文档。人力资源管理系统UML设计本质上就是用标准化的图形语言把组织架构、员工生命周期、薪酬核算、考勤规则这些核心业务在写代码之前先“画”清楚。它解决的不是“怎么开发”而是“开发什么、谁来用、数据怎么流”。适合谁看正在做iHRM类系统的产品经理、后端开发、测试工程师以及需要向非技术方解释系统结构的架构师。一份好的UML文档能让需求评审少吵三小时让新人接手代码时少翻三天聊天记录。2. 从业务到模型人力资源管理系统的UML视图选型2.1 为什么用例图是HRMS设计的第一张图人力资源管理系统涉及的角色远比一般业务系统复杂普通员工、部门主管、HR专员、薪酬专员、系统管理员每个角色对“员工信息”的读写权限完全不同。用例图的价值在于它能在项目启动阶段就把“谁可以做什么”钉死避免后期出现“主管能不能直接改下属薪资”这类扯皮。画用例图时我一般先列角色清单再列每个角色的核心诉求。以iHRM系统为例普通员工的用例包括“查看个人档案”“提交请假申请”“查询薪资条”部门主管多出“审批请假”“查看团队考勤汇总”HR专员则拥有“录入新员工”“维护组织架构”“导出人事报表”。注意用例图不表达执行顺序只表达“系统为角色提供什么价值”。一个常见的翻车点是把“登录系统”画成用例。登录是技术动作不是业务价值。正确的做法是把“身份认证”作为所有用例的前置约束而不是单独一个气泡。另一个坑是角色粒度太粗比如只写“管理员”结果开发时发现薪酬管理员和系统管理员的权限差异巨大不得不返工。提示用例图评审时让每个角色的实际使用者到场确认比事后补签字有效得多。2.2 类图与ER图的分工别把数据库设计当成业务建模很多从后端转过来的工程师习惯一上来就画ER图把“员工表”“部门表”“薪资表”的外键关系标得清清楚楚。这没错但ER图是数据存储视角类图才是业务对象视角。两者的关键区别在于类图可以包含方法ER图只描述字段。在HRMS中一个典型的类图会包含Employee、Department、Position、SalaryRecord、AttendanceRecord等核心类。Employee类不仅有属性工号、姓名、入职日期还有方法如calculateMonthlySalary()、getAttendanceSummary()。这些方法在ER图里是看不到的但它们恰恰是业务逻辑的载体。我通常的做法是先用类图梳理业务对象及其行为再把类图“降维”成ER图作为数据库设计的输入。这样做的额外好处是当业务规则变化时比如薪资计算方式从“月薪制”改为“时薪制”你只需要修改类图中的方法定义而不是去翻几十张表的外键约束。对比维度类图ER图视角业务对象数据存储核心元素类、属性、方法、关系实体、字段、主外键适用阶段需求分析、详细设计数据库设计变更影响业务逻辑调整表结构迁移2.3 时序图把“审批流”这种玄学问题变成可验证的步骤请假审批、薪资调整、转正流程——这些涉及多角色协作的场景是HRMS中最容易出bug的地方。时序图的作用是把“员工提交申请→主管审批→HR备案→系统更新考勤”这条链路按时间顺序展开明确每个步骤的调用方、被调用方和返回结果。画时序图时我坚持一个原则每条消息都必须有明确的触发条件和异常分支。比如“主管审批”这一步如果主管超过48小时未处理系统是自动通过还是自动驳回这个规则如果不画出来开发大概率会按自己的理解实现测试也测不到。一个实操技巧时序图的生命线不要超过5条。如果超过说明这个流程该拆了。HRMS中常见的“入职办理”流程如果从“候选人接受offer”一直画到“第一个月薪资发放”生命线会拉到七八条这时候应该拆成“入职准备”“账号开通”“首月薪酬核算”三个独立时序图。3. 动手画人力资源管理系统UML设计的可复现步骤3.1 工具选型与项目初始化UML设计工具没有绝对的好坏关键看团队协作方式。如果团队已经在用IDE写代码PlantUML是首选因为它用文本描述图形可以跟代码一起提交到Gitdiff清晰。如果产品经理和业务方需要频繁参与评审draw.io或ProcessOn的拖拽式操作更友好。我一般会推荐组合方案核心模型用PlantUML维护评审时导出PNG给业务方看。这样既保证了版本可控又降低了非技术方的参与门槛。下面是一个PlantUML用例图的初始化示例startuml left to right direction skinparam packageStyle rectangle actor 普通员工 as emp actor 部门主管 as mgr actor HR专员 as hr actor 薪酬专员 as pay rectangle 人力资源管理系统 { usecase 查看个人档案 as UC1 usecase 提交请假申请 as UC2 usecase 审批请假 as UC3 usecase 维护组织架构 as UC4 usecase 核算月度薪资 as UC5 usecase 导出人事报表 as UC6 } emp -- UC1 emp -- UC2 mgr -- UC3 mgr -- UC1 hr -- UC4 hr -- UC6 pay -- UC5 enduml这段代码定义了一个最简化的HRMS用例模型。left to right direction让图形横向展开便于阅读。skinparam packageStyle rectangle把系统边界画成矩形比默认的圆角更正式。四个actor分别对应四类使用者六个usecase覆盖了核心业务。注意mgr -- UC1这条线主管也需要查看自己的档案所以同一个用例可以被多个角色连接。参数说明actor后面的字符串是显示名称as后面是代码中引用的别名。rectangle块内的usecase定义系统提供的功能。箭头方向表示角色主动发起用例反过来如果系统主动通知角色比如“发送薪资到账提醒”应该用反向箭头或note标注。3.2 核心类图的属性与方法定义类图是HRMS设计文档中最厚的一部分。我通常按“人-事-钱”三条线来组织人的线包括Employee、Department、Position事的线包括AttendanceRecord、LeaveRequest、ApprovalFlow钱的线包括SalaryStructure、SalaryRecord、BonusRecord。下面是一个精简但可运行的类图定义聚焦员工和薪资两个核心类startuml class Employee { - employeeId: String - name: String - hireDate: Date - status: EmployeeStatus calculateMonthlySalary(): SalaryRecord getAttendanceSummary(month: int): AttendanceSummary requestLeave(start: Date, end: Date): LeaveRequest } class SalaryRecord { - recordId: String - month: String - baseSalary: BigDecimal - bonus: BigDecimal - deductions: BigDecimal getNetPay(): BigDecimal } class Department { - deptId: String - deptName: String - parentDept: Department getTotalHeadcount(): int getMonthlyCost(): BigDecimal } Employee 1 -- * SalaryRecord : 拥有 Employee * -- 1 Department : 隶属于 Department 0..1 -- * Department : 下级部门 endumlEmployee类中的-表示私有属性表示公开方法。calculateMonthlySalary()返回一个SalaryRecord对象这个设计把“薪资计算”和“薪资记录”解耦了计算逻辑在员工类存储结构在记录类。getAttendanceSummary(month: int)带参数说明考勤汇总是按月维度查询的。Department类的自关联parentDept: Department和Department 0..1 -- * Department表达了组织架构的树形结构。0..1表示一个部门最多有一个上级部门根部门没有上级*表示一个部门可以有多个下级部门。这个设计支持无限层级的组织架构但实际业务中我建议限制在5层以内否则权限继承会变得难以维护。参数说明BigDecimal用于金额字段避免浮点精度问题。EmployeeStatus是一个枚举类型通常包含PROBATION、ACTIVE、RESIGNED等值。getNetPay()方法在SalaryRecord中实现计算逻辑是baseSalary bonus - deductions但实际项目中个税和社保扣除会更复杂建议单独抽一个TaxCalculator类。3.3 请假审批时序图的完整画法请假审批是HRMS中使用频率最高的流程之一也是最容易出问题的环节。下面这张时序图覆盖了正常审批和超时自动处理两个分支startuml actor 员工 as emp participant 前端应用 as ui participant 请假服务 as leave participant 审批服务 as approve participant 考勤服务 as att database 数据库 as db emp - ui: 填写请假单 ui - leave: submitLeaveRequest(empId, start, end, type) leave - db: 校验假期余额 db -- leave: 余额充足 leave - approve: createApprovalTask(leaveId, managerId) approve - db: 保存审批任务 approve -- ui: 返回“待审批” alt 主管48小时内审批 approve - approve: 主管点击“通过” approve - leave: updateLeaveStatus(leaveId, APPROVED) leave - att: syncAttendance(empId, start, end) att - db: 更新考勤记录 leave -- ui: 通知员工审批通过 else 超时未处理 approve - approve: 定时任务扫描超时任务 approve - leave: updateLeaveStatus(leaveId, AUTO_REJECTED) leave -- ui: 通知员工审批超时 end enduml这张图的关键在于alt分支。很多团队画时序图只画正常流程结果开发时遇到超时场景就临时拍脑袋决定测试也覆盖不到。alt块明确了两条路径主管主动审批和系统定时任务处理。syncAttendance这一步容易被遗漏但它决定了请假数据能否正确反映到考勤汇总中。参数说明submitLeaveRequest的四个参数分别对应员工ID、开始日期、结束日期、请假类型年假/病假/事假。createApprovalTask的managerId通常从员工所属部门的Department对象中获取如果部门主管空缺应该向上级部门查找这个逻辑建议在ApprovalService中单独实现。注意定时任务的扫描频率不要设得太高5分钟一次足够。频率过高会给数据库带来不必要的压力频率过低则用户体验差。4. 避坑指南HRMS UML设计中最容易翻车的五个地方4.1 用例图把“登录”画成用例现象评审时业务方问“为什么登录要单独画一个气泡”开发解释“因为所有功能都需要登录”。结果用例图看起来有七八个用例实际上六个都是技术动作。原因混淆了业务用例和技术前置条件。登录、鉴权、日志记录这些是所有业务功能的公共约束不是独立的业务价值。解决把登录作为系统边界外的约束条件在用例图下方用注释说明“所有用例均需通过身份认证”。如果一定要表达用一个include关系指向一个“身份认证”用例但不要给它连角色。4.2 类图中把数据库字段当属性现象Employee类里出现了dept_id、created_at、updated_by这类字段类图看起来像一张表结构图。原因直接从ER图“翻译”成类图没有做业务抽象。dept_id是存储层的概念业务层应该用Department对象引用。解决类图中的属性只保留业务含义明确的字段。created_at和updated_by属于审计字段可以抽一个Auditable基类让需要审计的类继承它。dept_id改为department: Department在代码中通过ORM映射自动处理外键。4.3 时序图缺少异常分支现象开发按正常流程写完代码测试时发现“主管离职了审批任务没人处理”“员工在审批期间撤回了申请”这些场景全部报错。原因时序图只画了happy path没有考虑中断、超时、撤回、转交等异常情况。解决每张时序图至少包含一个alt块覆盖“成功”和“失败/超时”两条路径。对于审批类流程额外考虑“转交”“加签”“撤回”三个动作。如果画不下说明流程太复杂应该拆成子流程。4.4 组织架构的层级关系设计过深现象系统上线后HR反馈“查一个员工的上级主管要等好几秒”日志显示递归查询了十几层。原因Department的自关联没有限制层级实际数据中出现了“集团-事业部-大区-城市-片区-门店-组”七层结构每次权限校验都要递归到根节点。解决在业务层限制组织架构的最大深度建议5层超过部分用“虚拟部门”扁平化。数据库查询时使用物化路径materialized path或闭包表closure table优化递归性能。UML类图中可以用{maxDepth5}约束标注。4.5 薪资计算的类职责过重现象Employee类膨胀到几千行calculateMonthlySalary()方法里塞了基本工资、绩效、社保、个税、补贴、扣款等所有逻辑改一个税率要动整个类。原因把“薪资计算”这个复杂业务逻辑全部压在员工类上违反了单一职责原则。解决拆分为SalaryCalculator计算引擎、TaxStrategy个税策略、SocialInsuranceStrategy社保策略、SalaryRecord结果存储。Employee类只保留getSalaryComponents()方法返回计算所需的基础数据。UML类图中用依赖关系表示SalaryCalculator依赖TaxStrategy接口具体策略用实现类。5. 进阶技巧让UML文档从“交付物”变成“活文档”5.1 用PlantUML的include机制管理公共元素当HRMS的UML文档超过20张图时角色定义、枚举类型、公共类会大量重复。PlantUML支持!include指令可以把公共定义抽到单独文件!include common/actors.puml !include common/enums.puml startuml actor 员工 as emp actor 主管 as mgr emp -- (提交请假) mgr -- (审批请假) endumlactors.puml中定义所有角色enums.puml中定义EmployeeStatus、LeaveType等枚举。这样修改角色名称时只需要改一个文件所有图自动更新。我一般把公共文件放在uml/common/目录下跟业务图分开管理。5.2 从UML到代码的映射检查清单UML文档画完后怎么验证它跟代码是一致的我习惯用一份检查清单做交叉验证UML元素代码对应物检查方法类图中的类实体类/领域对象类名和属性名是否一致类图中的方法Service层方法方法签名和返回值是否匹配时序图中的消息方法调用链调用顺序和参数是否一致用例图中的用例Controller接口接口路径和权限注解是否覆盖状态图中的状态枚举值状态流转是否与业务规则一致这份清单不需要每次全量检查但在迭代评审前跑一遍能发现80%的模型与代码脱节问题。特别是状态图很多团队画完就忘了结果代码里的状态枚举跟设计文档对不上排查线上问题时一脸懵。5.3 版本管理与评审节奏UML文档最大的敌人是“画完就锁进文件夹”。我的做法是UML源文件跟代码放在同一个仓库每次需求变更时先改UML再改代码PR中同时包含.puml文件和.java文件的diff。评审时先看UML变更确认业务逻辑无误后再看代码实现。评审节奏上我坚持“小步快跑”每个迭代只评审本次变更涉及的图不搞全量评审。全量评审看起来全面实际上没人认真看最后变成走过场。变更评审时重点看三个东西新增的用例是否有角色覆盖、修改的类是否影响其他模块、时序图的异常分支是否完整。说一个我自己的血泪教训早期做HRMS时我觉得UML文档就是给领导看的随便画了几张图交差。结果项目中期需求变更开发问“请假和调休的优先级怎么算”我翻遍文档找不到答案只能临时拉会讨论白白浪费两天。从那以后我养成了一个习惯每张UML图下面必须写一段“业务规则说明”把图上表达不了的约束条件用文字补上。比如时序图下面写“请假优先级年假 调休 事假 病假同一天内不可重复申请”。这些文字看起来不起眼但关键时刻能省下大量沟通成本。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

用规则设定与提示词工程治住AI写代码的“自作聪明”

用规则设定与提示词工程治住AI写代码的“自作聪明”

我做了快十年后端,这两年用AI写代码的时间比手写多。但有个事始终让我头疼:这玩意儿太爱“自作聪明”。你让它改一个变量名,它顺带把你整个函数重写了;你问它一个bug可能出在哪,它直接给你开新分支改完代码&#xff0c…

2026/10/3 11:05:00 阅读更多 →
SecureCRT自动化脚本实战:从SSH重复操作到批量巡检提效

SecureCRT自动化脚本实战:从SSH重复操作到批量巡检提效

如果2025年你还在用SecureCRT,那大概率不是因为它长得好看,而是因为你每天都在跟交换机、路由器、跳板机、Linux服务器的SSH窗口打交道——重复敲命令敲到条件反射。SecureCRT自动化脚本开发这件事,网上的教程大多停在“能跑就行”的阶段&…

2026/10/3 11:05:00 阅读更多 →
轴承选型计算实操:用SKF SimPro Quick 4.8.1做寿命验证与方案优化的经验

轴承选型计算实操:用SKF SimPro Quick 4.8.1做寿命验证与方案优化的经验

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

2026/10/3 11:04:59 阅读更多 →

最新新闻

Superpowers实战:从开发环境自动化到AI编码协作的完整指南

Superpowers实战:从开发环境自动化到AI编码协作的完整指南

每次拿到一台新电脑,我的第一反应不是装 IDE,而是先跑一遍 superpowers 。为什么?因为我不想过那种“装完系统还得手动配 Java 环境、翻来覆去改 .zshrc、敲一堆重复命令”的日子。Superpowers 这个名字听起来有点中二,但它做的…

2026/10/3 11:35:31 阅读更多 →
Mid360激光雷达+Fast-LIO实现无人机实时避障感知

Mid360激光雷达+Fast-LIO实现无人机实时避障感知

1. 项目概述:为什么用Mid360跑Fast-LIO是当前无人机避障感知的务实选择 最近三个月,我手上连续接到三类咨询:一类是高校实验室想快速验证动态环境下的实时建图能力,一类是工业巡检团队抱怨现有视觉方案在弱纹理走廊里频繁丢帧&…

2026/10/3 11:35:31 阅读更多 →
AI Engineering from Scratch:构建可演进的AI系统工程骨架

AI Engineering from Scratch:构建可演进的AI系统工程骨架

1. 这不是“搭积木”,而是亲手锻造AI系统的完整工程链“AI Engineering from Scratch”——这个标题乍看像一句技术口号,实则藏着一套被严重低估的硬核实践逻辑。它不指代“用现成框架跑通一个模型”,更不是“调参调出个高分结果”的速成课&a…

2026/10/3 11:35:31 阅读更多 →
AI Skills 全指南:从安装、编写到管理的实战手册

AI Skills 全指南:从安装、编写到管理的实战手册

前几天有位读者在后台问我:Claude Code 怎么手动安装 GitHub 上的 skills?那一刻我突然意识到,“skills” 已经从一个模糊的概念,变成了 AI 编程圈里实实在在的基础设施。如果你这几个月也在刷各类 AI 编程工具的更新日志&#xf…

2026/10/3 11:35:31 阅读更多 →
开源铝型材模拟驾驶舱openrig:从设计到搭建完全指南

开源铝型材模拟驾驶舱openrig:从设计到搭建完全指南

玩模拟赛车的朋友应该都体会过这种纠结:看中一款成品驾驶舱,样子帅气、刚度也不错,但一看价格七八千起步,再算上运费和安装,钱包当场流汗;退一步买入门折叠架,又总觉得方向盘和踏板固定得不够稳…

2026/10/3 11:35:30 阅读更多 →
063红黑树 (Red-Black Tree)

063红黑树 (Red-Black Tree)

红黑树 (Red-Black Tree) — 5W1H故事与需求定义 063金发姑娘的平衡:揭秘红黑树Who(谁) 设计者:Rudolf Bayer(1972年提出"对称二叉B树"),由 Leonidas Guibas 和 Robert Sedgewick 于…

2026/10/3 11:34:30 阅读更多 →

日新闻

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南 【免费下载链接】ex-skill 前任 skill 项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill 前任.skill 是一个运行在 Claude Code 上的开源 Skill:导入微信、iMessage、短信、…

2026/10/3 0:00:27 阅读更多 →
45个经典Linux面试题:从命令到网络排障的完整考点解析

45个经典Linux面试题:从命令到网络排障的完整考点解析

刚开始带应届生的时候,我最头疼的就是他们拿着一摞Linux面试题背得滚瓜烂熟,一上机全露馅。后来自己从被面的人变成面别人的人,才慢慢摸清楚:Linux面试题考的根本不是答案本身,而是你面对一个不确定的系统问题时&#…

2026/10/3 0:01:28 阅读更多 →
SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

简介:本资源是一份面向SAP ABAP开发人员、生产计划专员及ERP实施顾问的实操型操作指南,聚焦SAP生产预留核心业务场景,系统解决物料预留创建、查询、校验与批量处理等高频问题。文档以结构化方式覆盖预留背景原理、OMC2编码规则、工厂级参数配…

2026/10/3 0:01:28 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/3 9:14:33 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 9:47:50 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/3 9:42:31 阅读更多 →

月新闻

我发现了一个新思路:用 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/2 10:36:31 阅读更多 →
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/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练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/3 9:42:36 阅读更多 →