# 代码审查流程规范 v2.0 **文档版本**: v2.0 **更新日期**: 2026-04-12 **适用范围**: User Management System (UMS) 项目 **配套标准**: `CODE_REVIEW_STANDARD_V4.md` **配套 Checklist**: `REVIEW_EXECUTION_CHECKLIST.md` --- ## 一、核心原则 ### 1.1 零信任文档原则 > **任何"已完成"的声明,必须附带可重现的命令和输出,否则视为未完成。** 历史教训: - v2.0 时期因依赖文档自述,评分虚高至 9.7/10 - 2026-04-11 发现前端构建实际失败,但文档标注 "PASS" - v4.0 要求:工具证据先于文档断言 ### 1.2 教学优先原则 审查的目的是让代码更好、让开发者成长,不是门卫把关: - 每个问题说明"为什么是问题",而非只说"改掉" - 赞扬好的实践,具体表扬有教学价值 ### 1.3 优先级纪律 | 级别 | 处理规则 | 不遵守的后果 | |------|----------|-------------| | 🔴 P0 | 禁止合并,4h 内修复 | 永久 Block | | 🟠 P1 | 禁止合并,当天修复 | 永久 Block | | 🟡 P2 | 附计划后可合并,本周修复 | 跟踪 Issue | | 🔵 P3 | 可合并,本 Sprint 修复 | 技术债台账 | | 💭 P4 | 可忽略 | - | --- ## 二、角色与职责 | 角色 | 职责 | SLA | |------|------|-----| | **作者** | 自审 → 提 PR → 修复问题 → 更新文档 | 当日响应 | | **审查者** | 执行 Checklist → 标注问题 → 给出建议 → Approve | P0:1h / P1:4h / P2:8h | | **Tech Lead** | SLA 超时升级,争议仲裁,流程优化 | 1个工作日 | ### 2.1 作者自审清单(提 PR 前必须执行) ```powershell # 最小自审(2分钟) cd d:\usersystem go build ./cmd/server # 必须通过 go vet ./... # 必须通过 go test ./... -short -count=1 # 必须通过 cd frontend\admin npm.cmd run lint # 必须通过 npm.cmd run build # 必须通过 ← 重点,历史有谎报 ``` ### 2.2 作者 PR 描述模板 ```markdown ## 变更目的 [1-2句说明:解决什么问题,为什么这样解决] ## 影响范围 - [ ] 后端(Go) - [ ] 前端(React/TypeScript) - [ ] 数据库(schema变更) - [ ] 部署配置 - [ ] 文档 ## 验证命令与结果 ```bash $ go build ./cmd/server # 输出: [粘贴实际输出] $ go test ./... -short # 输出: ok ... [粘贴实际输出] $ npm.cmd run build # 输出: [粘贴实际输出] ``` ## 是否需要 E2E 测试? - [ ] 是 → 已执行 `npm.cmd run e2e:full:win`(粘贴结果) - [ ] 否 → 理由:[说明为何不需要] ## 剩余已知问题(P2及以下) - [问题1] #issue-link ``` --- ## 三、审查执行流程(SOP) ``` ┌─────────────────────────────────────────────────────────────────┐ │ 作者自审 + 提 PR │ │ □ go build / go vet / go test -short 全通过 │ │ □ npm lint / npm build 全通过(无 TS 错误!) │ │ □ PR 描述包含验证命令输出 │ └─────────────────────────┬───────────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 阶段 1:自动化门禁(CI,约5分钟) │ │ □ go build + go vet + go test -race │ │ □ 覆盖率 ≥ 60% │ │ □ govulncheck(无已知CVE) │ │ □ npm lint + npm build + npm test │ │ □ npm audit(high漏洞=0) │ │ │ │ ⚠️ 任一失败 → PR 自动 Block,作者修复后重新触发 │ └─────────────────────────┬───────────────────────────────────────┘ ▼(CI 全通过) ┌─────────────────────────────────────────────────────────────────┐ │ 阶段 2:审查者人工审查(10-20分钟) │ │ │ │ 按优先级审查顺序: │ │ 1. 安全维度(P0 优先)—— 新 API 权限?文件上传?SQL 注入? │ │ 2. API 契约 —— 响应格式统一?HTTP状态码正确? │ │ 3. 前后端集成 —— 路径/字段名/类型一致? │ │ 4. 业务逻辑 —— 功能正确?边界处理? │ │ 5. 测试质量 —— 测试是真实的?非虚假断言? │ │ 6. 运维影响 —— 配置变更?Runbook 需要更新? │ │ │ │ 使用 REVIEW_EXECUTION_CHECKLIST.md 逐项执行 │ └─────────────────────────┬───────────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 阶段 3:问题标注 │ │ 使用标准格式(见第四节) │ │ P0/P1 → 逐项说明问题+原因+建议修复 │ │ P2/P3 → 可集中列表 │ │ 亮点 → 至少指出 1 个好的做法 │ └─────────────────────────┬───────────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 阶段 4:作者修复 │ │ P0/P1 → 修复后回复每条评论,附命令输出证明 │ │ P2 → 修复或创建 Issue 跟踪,评论 Issue 链接 │ │ P3 → 修复或在 PR 评论说明原因 │ └─────────────────────────┬───────────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 阶段 5:E2E 检查(条件触发) │ │ 触发条件(满足任一): │ │ - 认证相关变更 │ │ - 路由守卫变更 │ │ - 导航组件变更 │ │ - Token 管理变更 │ │ 命令:cd frontend/admin && npm.cmd run e2e:full:win │ └─────────────────────────┬───────────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 阶段 6:Approve + 合并 │ │ □ 所有 🔴🟠 问题已修复(有验证命令证明) │ │ □ P2 有 Issue 跟踪计划 │ │ □ 覆盖率未下降 > 5% │ │ □ 文档已同步(API 变更 → Swagger,配置变更 → .env.example) │ │ □ Approve │ └─────────────────────────────────────────────────────────────────┘ ``` --- ## 四、审查评论格式规范 ### 问题标注格式 ```markdown 🔴 **[P0 - 安全] 文件上传缺少 Magic Bytes 校验** 📍 位置:`internal/api/handler/avatar_handler.go:95` **问题描述**: 当前仅校验文件扩展名,攻击者可将 PHP Shell 命名为 `.jpg` 绕过检查。 **风险**: 恶意文件可能被服务端执行,导致 RCE(远程代码执行)。 **建议修复**: ```go src, _ := file.Open() buf := make([]byte, 512) n, _ := src.Read(buf) contentType := http.DetectContentType(buf[:n]) allowedMIME := map[string]bool{ "image/jpeg": true, "image/png": true, } if !allowedMIME[contentType] { c.JSON(400, gin.H{"message": "invalid file content"}) return } src.Seek(0, io.SeekStart) ``` --- 🟡 **[P2 - 可维护性] context.Background() 在请求链路中截断追踪** 📍 位置:`internal/api/middleware/auth.go:131` **问题描述**:缓存查询使用 `context.Background()` 而非请求 context,导致 Trace ID 无法传播。 **建议**:将函数签名改为接收 `ctx context.Context`,传递调用者的 context。 --- ✅ **做得好:Argon2id 密码哈希配置优秀** `internal/auth/password.go` 中 64MB 内存、5次迭代的 Argon2id 配置超越行业基准, 有效防御 GPU 暴力破解。 ``` ### Approve 评论格式 ```markdown ## 审查结论 ✅ **批准合并** **综合评分**:X.X/10 **亮点**: - Argon2id 配置超越行业基准 - 游标分页 P99=53ms,性能优秀 **遗留 P2(已有 Issue 跟踪)**: - #123 OpenAPI 注释完善 - #124 pagination 包测试 **合并后 24h 内请确认**: - 生产监控无异常告警 - 关键业务指标(登录成功率)正常 LGTM 🚀 ``` --- ## 五、审查时效 SLA | PR 优先级 | 首次审查 | 修复后复核 | 最大总周期 | |-----------|----------|------------|-----------| | P0 安全紧急 | **30 分钟** | 15 分钟 | 2 小时 | | P1 重要修复 | **1 小时** | 30 分钟 | 4 小时 | | P2 常规功能 | **4 小时** | 2 小时 | 24 小时 | | P3 重构/文档 | **8 小时** | 4 小时 | 48 小时 | ### 超时处理 ``` 超 SLA 50% → 作者 @审查者 催促 超 SLA 100% → 作者 @Tech Lead 升级 超 3 个工作日无响应 → Tech Lead 仲裁 ``` --- ## 六、特殊场景处理 ### 6.1 大型 PR(>500 行) ``` 优先请求作者拆分,按以下维度拆: - 后端/前端 分开 - 功能/测试 分开 - 重构/新功能 分开 如必须整体审查: 1. 分批审查(核心安全逻辑优先) 2. 明确标记哪些部分已审查 3. 剩余部分安排跟进审查 ``` ### 6.2 生产紧急修复(Hotfix) ``` 流程: 1. Tech Lead 批准先合并(P0 安全问题) 2. 24 小时内完成完整审查 3. 发现问题立即 Hotfix v2 4. 72 小时内完成事后复盘 条件: - 只允许 P0 安全/稳定性问题 - 必须在 Hotfix 分支(hotfix/XXX) - 合并后必须同步更新所有文档 ``` ### 6.3 安全相关变更(额外严格) ``` 触发条件(满足任一): - 认证/授权逻辑 - 密码/Token 处理 - 文件上传 - 外部服务调用(OAuth/SMS/Email) - 数据库 schema(含敏感字段) 额外要求: - Tech Lead 必须参与审查 - 发布前必须运行完整安全扫描(gosec + govulncheck) - 需要额外的攻击场景测试 ``` --- ## 七、争议解决 | 争议类型 | 解决方式 | |----------|----------| | 问题级别分歧 | 参照标准,模糊取高;Tech Lead 终裁 | | 是否必须修复 | 审查者决定,作者提仲裁请求 | | 技术方案选择 | 量化数据支持(性能/复杂度),Tech Lead 仲裁 | | 代码风格偏好 | 参考项目规范,无标准则接受 | --- ## 八、审查记录归档 | 内容 | 位置 | 保存期限 | |------|------|----------| | 全面审查报告 | `docs/code-review/COMPREHENSIVE_REVIEW_YYYY-MM-DD.md` | 永久 | | 专项审查报告 | `docs/code-review/[主题]_REVIEW_YYYY-MM-DD.md` | 永久 | | 问题跟踪 | Gitea Issues | 永久 | | 工具扫描结果 | `docs/evidence/` | 90天 | --- ## 九、持续改进 ### 9.1 回顾周期 | 周期 | 内容 | 负责人 | |------|------|--------| | 每次 Sprint 结束 | 审查效率/质量小结 | Tech Lead | | 每月 | 流程优化讨论(缺陷逃逸率、审查一致性)| Team | | 每季度 | 标准文档更新(CODE_REVIEW_STANDARD_VX.md)| 代码审查专家 | ### 9.2 关键质量指标(目标) | 指标 | 当前 | 目标 | |------|------|------| | 缺陷逃逸率 | 未量化 | < 2个/Sprint | | P0/P1 修复时效 | 未量化 | 100% 在 SLA 内 | | 审查覆盖率 | 100% | 保持 | | 虚假完成率 | 历史有案例 | 0 | --- *文档版本: v2.0* *更新时间: 2026-04-12* *主要变更: 新增零信任文档原则 + SOP 流程图 + E2E 触发条件 + 各维度专项检查要求*