系统部署手册重构:从Word模板到可执行防翻车文档
简介本资源是一份通用型IT项目系统安装部署手册模板面向运维工程师、实施工程师及初级DevOps人员解决项目交付中部署流程不规范、环境配置易出错、文档缺失等实际问题。文档为单文件Word格式.docx共1个6.44MB的结构化手册内容覆盖引言、硬件环境准备、基础运行环境安装含操作系统、MySQL、Docker等关键组件部署顺序与配置要点、术语定义及参考资料目录层级清晰、模块划分严谨具备开箱即用的工程指导价值。预览显示其包含硬件拓扑图、主机软件规划表、支撑软件清单及详细安装步骤特别强化了多组件协同部署的时序逻辑与配置依赖说明。目前已有325人学习下载可直接用于项目立项初期的部署方案编制、新人培训材料或标准化交付文档参考。1. 这不是Word模板而是IT交付现场的“防翻车 checklist”一份真正能落地的系统安装部署手册该怎么写你手头那份标着“IT项目--系统安装部署手册(模板).docx”的文件大概率正躺在某个共享盘角落被命名为“V1.2_最终版_再改就删”却从没在真实交付中打开过——因为一上生产环境它就暴露出致命缺陷步骤缺前置校验、参数没标注取值范围、权限要求写成“管理员即可”结果运维小哥在客户机房里卡在第7步两小时重启三次后才发现是SELinux没关或者开发说“按手册装好了”测试一跑全报502查日志发现Nginx配置里硬编码了localhost:8080而实际后端服务跑在另一台机器的30001端口。这不是文档不专业而是绝大多数所谓“模板”根本没经历过凌晨三点的线上故障、没被客户IT部门指着鼻子问“你写的‘检查网络连通性’到底check哪几个IP和端口”。这份手册真正的价值不是格式漂亮而是让第一次接触该系统的工程师能在无现场支持前提下30分钟内完成可验证的最小可用部署。它面向的是实施工程师、驻场运维、外包交付人员——这群人最怕的不是技术难而是“文档写了但执行时发现漏了一环又不敢擅自跳过只能干等”。本文不讲排版美学只拆解一个真实交付场景中如何把“模板.docx”变成带校验逻辑、可脚本化、含失败回滚路径、且能被自动化工具直接解析的部署说明书。2. 从Word模板到可执行文档为什么必须重构结构与内容颗粒度2.1 模板失效的根源Word文档天然缺乏“执行态”信息市面上90%的“系统安装部署手册模板”本质是静态知识容器用标题层级组织内容如“3.1 数据库安装”“3.2 中间件配置”但缺失三个关键维度依赖关系显式化步骤A是否必须在步骤B之后执行若跳过步骤C步骤D是否会因端口冲突失败Word无法表达这种有向依赖环境状态断言缺失每一步执行前应明确声明“当前系统需满足什么条件”例如“执行本步骤前确认/opt/app目录不存在且用户对父目录有写权限”而非笼统写“创建安装目录”输出验证不可量化写“启动服务成功”不如写“执行systemctl is-active app-service返回active且curl -s http://localhost:8080/health | jq -r .status输出UP”。提示不要试图在Word里用文字描述这些逻辑。真实交付中我们把手册拆成两层人类可读的流程说明保留Word 机器可解析的执行元数据JSON/YAML。后者才是防翻车的核心。2.2 重构四要素用“部署单元”替代“章节”我们放弃传统“按软件模块分章”的写法改为按部署单元Deployment Unit组织内容。每个单元是一个原子化、可独立验证的闭环操作包含前置断言Pre-condition用Shell命令或Python表达式声明环境状态执行动作Action具体命令、配置片段、二进制文件路径后置验证Post-check返回码、进程状态、端口监听、HTTP响应体校验失败回滚Rollback单条命令撤销变更如rm -rf /opt/app、systemctl stop app-service。以“JDK安装”为例传统模板写“下载jdk-11.0.2_linux-x64_bin.tar.gz解压到/opt/java配置JAVA_HOME”。重构后# unit-jdk.yaml unit_name: jdk-install pre_condition: - cmd: which java expect: exit_code ! 0 # 确保未预装JDK - cmd: test -d /opt/java expect: exit_code ! 0 # 确保目标目录干净 action: - cmd: wget https://example.com/jdk-11.0.2_linux-x64_bin.tar.gz -O /tmp/jdk.tgz - cmd: tar -zxf /tmp/jdk.tgz -C /opt/ - cmd: ln -sf /opt/jdk-11.0.2 /opt/java - cmd: echo export JAVA_HOME/opt/java /etc/profile.d/java.sh post_check: - cmd: source /etc/profile.d/java.sh java -version | grep 11.0.2 expect: exit_code 0 rollback: - cmd: rm -rf /opt/java /opt/jdk-11.0.2 /etc/profile.d/java.sh这个YAML文件可被Ansible、SaltStack或自研部署脚本直接加载执行而Word文档仅作为该YAML的人类注释层——解释为什么选JDK 11.0.2客户OS内核版本兼容性、哪些Linux发行版已验证CentOS 7.9, Ubuntu 20.04、以及/etc/profile.d/java.sh比修改/etc/profile更安全的原因避免污染全局环境变量。2.3 模板字段必须强制填充拒绝“此处填写XXX”的偷懒设计原始模板中常见的“【数据库IP地址】”“【应用端口】”占位符是交付事故高发区。我们要求所有参数字段必须定义类型、约束、默认值、来源说明。例如字段名类型约束默认值来源说明示例值DB_HOSTIPv4地址必填需ping -c1 $DB_HOST通—客户提供数据库服务器内网IP10.20.30.40APP_PORT整数范围8000-65535需netstat -tuln | grep :$APP_PORT无占用8080若客户未指定使用此默认值但需在手册中加粗提示“首次部署前务必确认端口未被占用”8081INSTALL_USER字符串非空需id $INSTALL_USER存在appuser必须为已创建的普通用户禁止root直接运行服务deployer注意Word模板中所有占位符必须替换为带上述元信息的表格。交付前实施工程师需逐项填写并签名确认——这不仅是流程更是责任切割点。当客户说“你们没告诉我端口要自己填”你可以出示签字页“第3.2.1条您确认了APP_PORT8081”。3. 把手册变成“活文档”嵌入校验脚本与自动化钩子3.1 在Word中嵌入可执行校验代码块非纯文本很多人误以为Word不能放代码其实只要启用“开发工具”选项卡插入“代码控件”ActiveX控件或使用“插入对象→文本文件”方式可将校验脚本作为附件嵌入。但更可靠的做法是在Word文档中用等宽字体展示脚本并标注其执行位置与预期输出。例如# 【部署单元数据库连接验证】 # 执行位置部署机非数据库服务器 # 预期输出显示Connection successful且返回码0 mysql -h 10.20.30.40 -u appuser -pAppPass123! -e SELECT 1; 2/dev/null | grep 1 if [ $? -eq 0 ]; then echo Connection successful else echo Connection failed: check DB_HOST, credentials, and firewall exit 1 fi这段代码不是装饰而是交付验收时的必检项。客户IT人员可复制粘贴到终端执行结果必须符合预期。我们在手册中明确写“本步骤由客户方执行实施工程师旁观双方共同确认输出结果”。3.2 用Python生成环境快照替代人工‘检查清单’人工勾选“✓ 已关闭防火墙”“✓ 已禁用SELinux”极易遗漏。我们要求手册附带一个env-snapshot.py脚本部署前运行一次生成JSON报告# env-snapshot.py import subprocess, json, platform def run_cmd(cmd): try: return subprocess.check_output(cmd, shellTrue, stderrsubprocess.STDOUT).decode().strip() except subprocess.CalledProcessError as e: return fERROR: {e.output.decode().strip()} snapshot { os: platform.platform(), firewall_status: run_cmd(systemctl is-active firewalld 2/dev/null || echo inactive), selinux_status: run_cmd(getenforce), disk_free: run_cmd(df -h /opt | awk NR2 {print $4}), port_8080_free: true if run_cmd(lsof -i :8080 | wc -l) 0 else false, java_version: run_cmd(java -version 21 | head -1) } with open(env-snapshot.json, w) as f: json.dump(snapshot, f, indent2) print(Environment snapshot saved to env-snapshot.json)执行后生成的env-snapshot.json需作为交付物附件提交。手册中规定“若firewall_status非inactive则必须在‘网络配置’单元中补充iptables规则白名单若port_8080_free为false则必须在‘应用端口’字段填写其他端口并重新执行所有端口相关验证”。3.3 钩子机制在关键步骤后自动触发验证部署不是线性流程而是“执行→验证→分支决策”。我们在手册中定义三类钩子pre-hook步骤执行前自动运行校验如检查磁盘空间是否≥5GBpost-hook步骤执行后自动验证如启动服务后立即调用健康接口on-fail-hook失败时自动执行回滚日志收集如journalctl -u app-service --since 1 hour ago rollback-debug.log。这些钩子不写在Word里而是存为独立.sh文件手册中仅引用其名称和触发条件。例如【部署单元应用服务启动】...systemctl start app-service触发 post-hook: verify-health.sh若验证失败自动执行on-fail-hook: collect-logs.sh并暂停后续步骤。4. 避坑指南那些让交付延期2天的“小细节”血泪经验4.1 现象部署脚本在测试环境成功生产环境报错“Permission denied”原因测试机用root执行生产机严格遵循最小权限原则但手册中所有chmod 755命令未声明执行用户。例如chmod 755 /opt/app/bin/start.sh在root下成功但appuser用户无权修改该文件权限。解决手册中所有权限变更命令必须绑定用户上下文。正确写法# 以root身份执行仅限此命令 sudo chmod 755 /opt/app/bin/start.sh # 切换至appuser用户验证 sudo -u appuser /opt/app/bin/start.sh --dry-run4.2 现象Nginx配置reload后旧进程仍在监听80端口新配置未生效原因手册写“执行nginx -s reload”但未检查nginx -t语法验证也未确认nginx进程是否由systemd托管systemctl restart nginx才是正确方式。解决将Nginx操作拆分为原子单元nginx -t→ 验证配置语法systemctl daemon-reload→ 重载unit文件若使用systemdsystemctl restart nginx→ 重启服务ss -tuln | grep :80→ 确认新进程监听。手册中必须注明“若客户环境为SysV init请改用service nginx reload但需先确认/etc/init.d/nginx存在”。4.3 现象数据库初始化SQL执行失败报错“Unknown collation: utf8mb4_0900_ai_ci”原因手册要求MySQL 8.0但客户实际安装的是5.7而SQL脚本含8.0特有排序规则。手册未声明MySQL版本校验步骤。解决在“数据库初始化”单元前置断言中加入mysql --version | grep -q 8\.0\. || { echo ERROR: MySQL 8.0 required; exit 1; }同时提供降级方案若客户坚持用5.7则手册附录提供utf8mb4_unicode_ci兼容版SQL脚本并标注“此版本不支持emoji存储”。4.4 现象部署完成后应用日志显示“Failed to connect to Redis at 127.0.0.1:6379”原因手册中Redis连接地址写死为127.0.0.1但客户Redis部署在独立服务器。参数表中REDIS_HOST字段被忽略实施工程师直接复制粘贴了示例值。解决在参数表增加强约束列字段名类型约束默认值来源说明强制校验REDIS_HOSTIPv4地址必填需nc -z $REDIS_HOST 6379 echo ok返回ok—客户Redis服务器内网IP部署前必须执行此校验否则终止部署4.5 现象证书部署后HTTPS访问报“NET::ERR_CERT_INVALID”原因手册要求“将cert.pem和key.pem放入/etc/ssl/certs/”但未说明证书链完整性。客户提供的证书缺少中间CA导致浏览器信任链断裂。解决在“SSL证书配置”单元增加校验命令openssl verify -CAfile /etc/ssl/certs/ca-bundle.crt /etc/ssl/certs/cert.pem修复指引若返回cert.pem: CN example.com后跟error 20 at 0 depth lookup: unable to get local issuer certificate则需合并中间证书cat cert.pem intermediate.crt fullchain.pem浏览器验证手册附二维码指向https://www.sslshopper.com/ssl-checker.html要求输入域名截图上传至交付群。5. 让手册真正“活”起来用Git管理版本CI验证客户侧自助诊断5.1 Git仓库结构把手册变成可追踪的交付资产我们不再维护单个.docx文件而是建立Git仓库结构如下deploy-manual/ ├── docs/ # 人类可读文档Markdown为主导出PDF供客户签字 │ ├── overview.md # 项目概览、适用场景、限制说明 │ ├── units/ # 每个部署单元的详细说明对应YAML │ │ ├── jdk-install.md │ │ └── db-init.md ├── units/ # 机器可执行单元YAML脚本 │ ├── jdk-install.yaml │ ├── db-init.yaml │ └── hooks/ │ ├── verify-health.sh │ └── collect-logs.sh ├── scripts/ │ ├── env-snapshot.py # 环境快照生成 │ └── param-validator.py # 参数表校验检查所有必填字段是否填写 ├── assets/ │ └── ssl-checker-qrcode.png └── README.md # 仓库使用说明、贡献指南每次客户环境变更如OS升级、中间件版本更新我们提交新commit并打tag如v2.3.1-centos8。客户IT人员可git clone并checkout对应tag确保拿到匹配其环境的手册版本。Word文档仅作为docs/目录下Markdown的导出产物源文件永远是Markdown——因为Git能清晰显示谁在何时修改了哪一行参数约束。5.2 CI流水线每次提交自动验证手册完整性我们用GitHub Actions配置CI每次push触发以下检查YAML语法校验yamllint units/*.yaml参数一致性检查python scripts/param-validator.py --units units/ --params docs/params-table.md确保YAML中引用的参数名全部在参数表中定义脚本可执行性测试在Docker容器中模拟CentOS 7环境运行env-snapshot.py并验证输出JSON结构链接有效性检查所有Markdown中的[链接文字](url)是否返回HTTP 200。CI失败则禁止合并强制作者修复。这避免了“手册写着MySQL 8.0但YAML里mysql --version校验命令写成了mysqld --version”这类低级错误。5.3 客户侧自助诊断包把手册能力下沉到客户手中交付时除Word/PDF外我们提供一个diagnose.zip压缩包解压后run-diagnose.sh一键执行所有基础环境检查磁盘、内存、端口、服务状态check-config.py读取客户填写的params.json验证所有必填字段、IP可达性、端口占用health-report.html浏览器打开即显示可视化诊断报告绿色/红色标识各检查项troubleshoot-guide.pdf针对常见失败项如“Redis连接超时”的3步排查法配截图和命令。这个包的设计哲学是不让客户问“哪里错了”而是让他们能回答“第几项检查失败了”。我们曾遇到客户反馈“部署失败”对方发来health-report.html截图一眼看到“Port 8080: ❌ occupied by process PID 1234 (java)”立刻定位到遗留进程2分钟解决——而过去这类问题平均耗时47分钟。6. 我的最后一个习惯在手册末尾留一页“空白故障记录表”我坚持在每份交付手册的最后一页预留一张A4纸大小的表格标题就叫《本次部署故障记录》。它不是模板而是真实交付时手写的时间步骤编号现象描述临时解决方案根本原因是否纳入手册更新2023-10-15 22:174.2.3systemctl start nginx报错“Job for nginx.service failed”注释掉include /etc/nginx/conf.d/*.conf后启动成功客户环境/etc/nginx/conf.d/下存在语法错误的旧配置文件是新增pre-hooknginx -t -c /etc/nginx/nginx.conf这张表必须由实施工程师和客户IT负责人共同签字。它逼着我们直面一个问题手册不是一次写完的终点而是持续迭代的起点。过去三年我们累计在手册中新增了17个pre-hook、9个post-hook、3个on-fail-hook全部源于这张表里的真实故障。当客户下次说“你们上次那个手册真管用”我指的就是这页手写记录——因为它证明我们不是在卖文档而是在卖一种“问题被看见、被解决、被预防”的确定性。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

非齐次方程特解求解:待定系数法与特征根共振修正

非齐次方程特解求解:待定系数法与特征根共振修正

/* 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 17:41:50 阅读更多 →
Python批量下载Sentinel-2遥感数据:新平台CDSE实操与避坑指南

Python批量下载Sentinel-2遥感数据:新平台CDSE实操与避坑指南

/* 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 17:41:50 阅读更多 →
ubuntu进行apt-get时候出现Package xxx is not available, but is referred to by another package 错误

ubuntu进行apt-get时候出现Package xxx is not available, but is referred to by another package 错误

当出现上述问题时 首先更新系统软件源 更新本地软件包索引(获取最新版本信息) sudo apt-get update #升级已安装包 sudo apt-get upgrade 接着再装试一试 sudo apt-get install 如果还不行就要更新软件源 Ubuntu 更新软件源的方法 1、打开终端&#xff…

2026/10/2 17:41:50 阅读更多 →

最新新闻

DeepSeek Harness实战:用Vibe Coding从零构建待办应用

DeepSeek Harness实战:用Vibe Coding从零构建待办应用

最近在技术群和社区里,看到越来越多朋友开始尝试 AI 辅助编程,也就是常说的 Vibe Coding。工具装了一堆,但很多人卡在同一个地方:不知道除了“让 AI 写一段代码”之外,怎么把这类工具真正嵌入到自己的开发流程里。尤其…

2026/10/2 18:18:10 阅读更多 →
MongoDB事务与WiredTiger存储引擎:原理、机制与实战避坑

MongoDB事务与WiredTiger存储引擎:原理、机制与实战避坑

前阵子帮朋友排查一个线上问题:订单服务和库存服务都跑在MongoDB上,用户下单时先后更新订单文档和库存文档,结果两个更新之间服务发生重启,订单创建了、库存没扣掉,用户反复下单把库存刷成了负数。排查到最后&#xff…

2026/10/2 18:18:10 阅读更多 →
基于SpringBoot的在线教学系统开发实战:从权限模型到自动判卷

基于SpringBoot的在线教学系统开发实战:从权限模型到自动判卷

我记得当年选题的时候,看到“基于SpringBoot的计算机基础网络教学系统”这个题目,第一反应是有点普通。计算机基础嘛,感觉就是课程列表加考试页面,能做出什么花?真到动手做的时候才发现,一个真正可交付的毕…

2026/10/2 18:18:10 阅读更多 →
SpringBoot+Vue库存管理系统源码拆包:从建库到联调的完整指南

SpringBoot+Vue库存管理系统源码拆包:从建库到联调的完整指南

简介:这份资源是一套基于SpringBootVue的库存管理系统完整项目包,面向计算机相关专业的毕业设计、课程设计与期末大作业场景,尤其适合需要快速上手Java全栈开发的新手参考。项目采用前后端分离架构,前端使用HTML、JavaScript与Vue…

2026/10/2 18:18:10 阅读更多 →
珠宝图片自动识别与结构化输出:视觉增强服务部署实战

珠宝图片自动识别与结构化输出:视觉增强服务部署实战

这次我们来看珠宝在线编辑里的一个视觉增强能力:ds4flushvison。名字看着像是内部代号,但它在工作流里承担的事情非常具体——收到一张珠宝商品图,返回结构化描述、自动归类、长出可检索的标签,然后把这些结果丢给在线编辑页或后台…

2026/10/2 18:18:10 阅读更多 →
MATLAB卷积神经网络车牌识别:从定位分割到CNN分类实战

MATLAB卷积神经网络车牌识别:从定位分割到CNN分类实战

简介:基于 MATLAB 的卷积神经网络车牌识别工程,面向希望借助深度学习完成图像识别任务的初学者与开发者。项目覆盖车牌定位、字符分割、数据集预处理、CNN 模型训练与部署等完整流程,并配有详细说明文档与教程视频,可引导用户从零…

2026/10/2 18:17:09 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

如何划分训练/验证集: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/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

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

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

2026/10/1 19:41:40 阅读更多 →
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/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/2 5:26:06 阅读更多 →
黑夜航拍船只数据集训练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/2 6:09:11 阅读更多 →