8.9 KiB
8.9 KiB
代码编纂工作流规范
版本:V1.0 适用范围:本项目所有代码修改、功能迭代、Bug 修复、重构任务 生效日期:2026-04-19
一、工作流总览
┌─────────────────────────────────────────────────────────────────────┐
│ 0. 记录开始时间戳 │
│ 1. 阅读工程整体分析 + 经验记录 │
│ 2. 需求分析 → 写入 需求分析-{时间}.md → 【用户审核】 │
│ 3. 实现方案 → 写入 实现方案-{时间}.md → 【用户审核】 │
│ 4. 测试方案 → 写入 测试方案-{时间}.md → 【用户审核】 │
│ 5. 执行前再次阅读 经验记录.md(防止踩坑) │
│ 执行修改 │
│ 执行后向 经验记录.md 追加新踩坑记录(四段式) │
│ 6. Git 提交 → Gitea 推送 → 提醒用户 │
│ 7. npm 重新构建 + 部署 │
└─────────────────────────────────────────────────────────────────────┘
二、步骤详解
步骤 0:记录开始时间戳
每次接收到修改需求时,首先获取当前时间,格式为:
{Year}-{Mon}-{Day}-{Hour}-{Min}-{Sec}
示例:2026-04-19-02-00-33
该时间戳贯穿整个工作流,用于命名所有相关文档。
步骤 1:阅读工程分析文档
必做事项:
- 阅读
工程整体分析.md,确认当前架构、技术栈、高风险区域 - 阅读
经验记录.md,回顾与本次需求相关的历史踩坑记录 - 若
工程分析文件夹或上述文档不存在,立即创建
步骤 2:需求分析
输出文件:需求分析-{时间戳}.md
必须包含的内容:
- 需求背景:用户原始需求的转述
- 需求拆解:将大需求拆分为可执行的原子任务
- 影响范围:列出需要修改的文件清单(基于工程整体分析中的高风险区域判断)
- 优先级排序:P0(阻塞)/ P1(重要)/ P2(优化)
- 验收标准:明确"做到什么程度算完成"
流转规则:
- 文档写完后,必须停止执行,等待用户二次人工审核确认
- 用户确认后,方可进入步骤 3
步骤 3:实现方案
输出文件:实现方案-{时间戳}.md
必须包含的内容:
- 方案概述:整体技术思路(1-3 句话)
- 详细步骤:按文件/模块逐条列出修改点,每条包含:
- 目标文件路径
- 具体修改内容(新增/删除/修改的代码逻辑)
- 与现有逻辑的兼容策略(如何处理旧数据、默认值、降级)
- 依赖关系:哪些修改有先后顺序,哪些可以并行
- 风险预案:如果方案失败,回滚策略是什么
流转规则:
- 文档写完后,必须停止执行,等待用户二次人工审核确认
- 用户确认后,方可进入步骤 4
步骤 4:测试方案
输出文件:测试方案-{时间戳}.md
必须包含的内容:
- 测试范围:哪些功能需要验证
- 测试步骤:手动的操作路径(因本项目无自动化测试)
- 预期结果:每一步的正确输出是什么
- 边界场景:异常输入、空值、大数据量、快速切换路由等
- 回滚检查:验证失败后如何恢复到修改前状态
流转规则:
- 文档写完后,必须停止执行,等待用户二次人工审核确认
- 用户确认后,方可进入步骤 5
步骤 5:执行修改 + 经验沉淀
执行前:
- 最后一次阅读
经验记录.md,确认本次修改不会触发已知坑点 - 若发现新的潜在风险,在实现方案文档中补充后再执行
执行中:
- 严格按照实现方案的步骤执行,不擅自扩大修改范围
- 若遇到方案外的意外问题,暂停执行,记录问题,与用户沟通后再继续
执行后:
- 按测试方案逐项验证
- 向
经验记录.md追加新记录(仅当实际遇到问题时),格式如下:
## 记录 N:{问题标题}
**A. 具体问题**
{问题描述}
**B. 产生问题原因**
{根因分析}
**C. 解决问题方案**
{具体修复步骤}
**D. 后续如何避免问题**
{给未来自己的警告}
步骤 6:Git 备份
提交规范:
git add -A
git commit -m "{时间戳} {修改简要描述}"
git push origin main
必须包含的信息:
- 时间戳(与需求分析文档一致)
- 本次修改的简要描述(1-2 句话)
完成后:
- 明确提醒用户已完成 Gitea 备份
步骤 7:重新部署
标准部署脚本:
# 1. 停止旧服务
Stop-Process -Id (Get-NetTCPConnection -LocalPort 4173 -ErrorAction SilentlyContinue).OwningProcess -Force -ErrorAction SilentlyContinue
# 2. 重新构建
npm run build
# 3. 以独立进程启动预览服务(避免后台任务超时杀死)
Start-Process -FilePath "powershell.exe" -ArgumentList "-Command","cd '$PWD'; npm run preview -- --host" -WindowStyle Hidden
# 4. 验证
Start-Sleep -Seconds 3
Invoke-WebRequest -Uri http://127.0.0.1:4173/ -UseBasicParsing -TimeoutSec 5
注意:
- 严禁使用
Shell(run_in_background=true)运行npm run preview,因为任务超时机制(默认 60s)会强制终止 preview 进程,导致服务中断(参见经验记录-21)。 - 必须使用
Start-Process创建独立的 Windows 进程。
三、禁忌清单(严格执行)
| 编号 | 禁忌行为 | 后果 | 正确做法 |
|---|---|---|---|
| 1 | 跳过需求分析文档直接写代码 | 需求理解偏差,返工 | 必须先写文档,等用户确认 |
| 2 | 跳过实现方案文档直接改代码 | 架构混乱,影响范围失控 | 必须先写文档,等用户确认 |
| 3 | 跳过测试方案文档直接上线 | 遗漏边界场景,线上故障 | 必须先写文档,等用户确认 |
| 4 | 使用 Shell(run_in_background=true) 运行 npm run preview |
60s 后服务被强制杀死 | 使用 Start-Process 启动独立进程 |
| 5 | 修改后不更新 经验记录.md |
重复踩坑 | 每次遇到新问题必须追加记录 |
| 6 | contentEditable 插入多行缩进 HTML |
浏览器解析出额外文本节点,破坏排版 | 必须压缩为紧凑单行 HTML |
| 7 | 直接 target.remove() 删除 DOM 节点 |
撤销栈失效,WebKit 误删父级 <p> |
使用 Range.selectNode + execCommand('delete') |
| 8 | 将 useRef 作为自动保存唯一数据源 |
StrictMode 下首次卸载覆盖有效 draft | 自动保存函数从最新 React state 读取 |
| 9 | 异步循环中用 await setTimeout 阻塞 |
抽帧/UI 更新被串行延迟 | 使用裸 setTimeout 推入事件队列 |
| 10 | 用 body { padding } 控制打印边距 |
第二页及后续页边距失效 | 使用 @page { margin } |
四、文档模板
需求分析模板
# 需求分析 — {时间戳}
## 1. 需求背景
{用户原始需求}
## 2. 需求拆解
- [ ] 任务 1:{描述}
- [ ] 任务 2:{描述}
## 3. 影响范围
| 文件 | 修改类型 | 风险等级 |
|------|----------|----------|
| {路径} | 新增/修改/删除 | 高/中/低 |
## 4. 优先级
- P0:{阻塞项}
- P1:{重要项}
- P2:{优化项}
## 5. 验收标准
- {标准 1}
- {标准 2}
实现方案模板
# 实现方案 — {时间戳}
## 1. 方案概述
{整体思路}
## 2. 详细步骤
### 步骤 1:{模块/文件}
**目标文件**:`{路径}`
**修改内容**:{详细描述}
**兼容策略**:{如何处理旧数据/默认值}
### 步骤 2:{模块/文件}
...
## 3. 依赖关系
- {步骤 A} 必须在 {步骤 B} 之前执行
- {步骤 C} 和 {步骤 D} 可并行
## 4. 风险预案
- 若 {某步骤} 失败,回滚方式为 {...}
测试方案模板
# 测试方案 — {时间戳}
## 1. 测试范围
{需要验证的功能点}
## 2. 测试步骤与预期结果
### 场景 1:{正常流程}
1. 操作:{步骤}
预期:{结果}
2. 操作:{步骤}
预期:{结果}
### 场景 2:{边界/异常}
...
## 3. 回滚检查
- 若测试失败,执行 `{命令}` 恢复到修改前状态
五、附录:项目快速参考
- 开发:
npm run dev(端口 3000) - 构建:
npm run build - 预览:
npm run preview -- --host(端口 4173) - 类型检查:
npm run lint - Gitea 仓库:
http://192.168.31.5:5002/admin/Mdeical_Sur_Report.git - 当前分支:
main