# 代码审查标准与流程规范 **文档版本**: v1.0 **生成日期**: 2026-03-29 **适用范围**: User Management System (UMS) 项目 --- ## 一、审查目标 本规范旨在建立系统化的代码审查机制,确保代码质量达到生产级标准,同时提升团队成员的技术能力和协作效率。 --- ## 二、审查范围 ### 2.1 技术栈覆盖 | 层级 | 技术 | 审查重点 | |------|------|----------| | 后端 | Go + Gin + Gorm | 安全性、性能、并发安全 | | 前端 | React + TypeScript + Ant Design | 组件质量、类型安全、用户体验 | | 数据库 | PostgreSQL | 索引、查询优化、事务安全 | | 基础设施 | Docker, CI/CD | 部署安全、配置管理 | ### 2.2 代码分类审查要求 | 代码类型 | 审查深度 | 必须审查项 | |----------|----------|------------| | 认证/鉴权 | 深度审查 | 安全漏洞、权限绕过、Token 安全 | | 支付/敏感操作 | 深度审查 | 数据完整性、幂等性、审计日志 | | 数据查询 | 标准审查 | SQL 注入、N+1 查询、索引 | | 业务逻辑 | 标准审查 | 错误处理、边界条件 | | 工具/辅助函数 | 简化审查 | 可测试性、边界情况 | | UI/样式 | 简化审查 | 可访问性、响应式 | --- ## 三、审查标准 ### 3.1 安全标准(🔴 必须通过) | 规则 ID | 规则描述 | 检查方法 | 违规处理 | |---------|----------|----------|----------| | SEC-01 | 禁止 SQL 注入 | 代码扫描 + 参数化查询 | 🔴 阻塞 | | SEC-02 | 禁止 XSS 漏洞 | 输入验证 + 输出编码 | 🔴 阻塞 | | SEC-03 | 认证接口必须有限流 | 检查中间件配置 | 🔴 阻塞 | | SEC-04 | 敏感操作必须二次验证 | 检查 verifySensitiveAction | 🔴 阻塞 | | SEC-05 | Token 必须安全存储 | 检查 HttpOnly + Secure | 🔴 阻塞 | | SEC-06 | 禁止硬编码密钥 | 扫描 secrets/keys | 🔴 阻塞 | | SEC-07 | 禁止明文存储密码/恢复码 | 检查哈希算法 | 🔴 阻塞 | | SEC-08 | 禁止信任客户端输入 | 检查 validation | 🔴 阻塞 | | SEC-09 | 必须使用 crypto/rand 生成密钥 | 检查随机数生成器 | 🔴 阻塞 | | SEC-10 | 禁止忽略随机数生成错误 | 检查 rand.Read 错误处理 | 🔴 阻塞 | | SEC-11 | Webhook URL 必须 SSRF 过滤 | 检查 isSafeURL 调用 | 🔴 阻塞 | ### 3.2 正确性标准(🟡 必须修复) | 规则 ID | 规则描述 | 建议处理 | |---------|----------|----------| | CORR-01 | 错误必须被处理 | 不允许忽略 error | | CORR-02 | 并发访问必须同步 | 检查 goroutine + mutex | | CORR-03 | 资源必须释放 | defer/cleanup 审查 | | CORR-04 | 边界条件必须处理 | nil/empty/zero 审查 | | CORR-05 | 事务边界必须正确 | 检查 Begin/Commit/Rollback | ### 3.3 性能标准(🟡 建议修复) | 规则 ID | 规则描述 | 建议处理 | |---------|----------|----------| | PERF-01 | 禁止 N+1 查询 | 使用批量查询 | | PERF-02 | 禁止循环内数据库操作 | 重构到循环外 | | PERF-03 | 禁止重复编译正则表达式 | 预编译并复用 | | PERF-04 | 大数据必须分页 | 检查 pageSize 限制 | | PERF-05 | 缓存必须设置 TTL | 检查过期策略 | ### 3.4 可维护性标准(💭 建议优化) | 规则 ID | 规则描述 | 建议处理 | |---------|----------|----------| | MAIN-01 | 函数长度不超过 50 行 | 拆分函数 | | MAIN-02 | 禁止重复代码 | 提取公共函数 | | MAIN-03 | 命名必须有意义 | 检查变量/函数名 | | MAIN-04 | 必须添加注释 | 复杂逻辑必须有注释 | | MAIN-05 | 魔法数字必须定义常量 | 替换为具名常量 | --- ## 四、审查流程 ### 4.1 流程图 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 代码提交阶段 │ └───────────────────────────┬─────────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 1. 自审查 (Self Review) │ │ - 开发者对照检查清单进行自检 │ │ - 运行单元测试和 lint 检查 │ └───────────────────────────┬─────────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 2. 代码审查 (Code Review) - 必须 1 人以上 │ │ - 审查者检查安全问题、性能问题 │ │ - 给出修改建议 │ │ - 标记阻塞/建议/挑剔级别 │ └───────────────────────────┬─────────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 3. 问题修复 (Fix Phase) │ │ - 🔴 阻塞问题:必须修复后才能合并 │ │ - 🟡 建议问题:应在本次或近期迭代修复 │ │ - 💭 挑剔问题:鼓励修复,可后续处理 │ └───────────────────────────┬─────────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 4. 审查通过 (Approval) │ │ - 所有 🔴 问题已修复 │ │ - 审查者 approve │ └───────────────────────────┬─────────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 5. 合并 (Merge) │ │ - CI/CD 检查通过 │ │ - 合并到目标分支 │ └─────────────────────────────────────────────────────────────────┘ ``` ### 4.2 审查角色 | 角色 | 职责 | 要求 | |------|------|------| | 作者 (Author) | 自审查、修复问题 | 熟悉代码逻辑 | | 审查者 (Reviewer) | 检查代码、提出建议 | 了解业务和安全要求 | | 仲裁者 (Arbiter) | 解决争议 | 资深开发者/架构师 | ### 4.3 审查工具配置 ```yaml # .golangci.yml (Go 语言) linters: enable: - gosec # 安全扫描 - govet # 代码诊断 - gocyclo # 圈复杂度 - revive # 代码风格 - unused # 未使用代码 # eslint.config.js (前端) rules: security/detect-object-injection: error security/detect-non-literal-regexp: error ``` --- ## 五、审查检查清单 ### 5.1 安全检查清单 - [ ] 所有用户输入都经过验证 - [ ] 敏感操作需要二次验证 - [ ] SQL 查询使用参数化 - [ ] 密码/恢复码已哈希存储 - [ ] Token 存储使用 HttpOnly - [ ] 速率限制已配置 - [ ] 错误消息不泄露敏感信息 - [ ] 日志不记录敏感数据 - [ ] 随机数使用 crypto/rand(非 math/rand) - [ ] rand.Read 错误被正确处理 - [ ] Webhook URL 经过 SSRF 过滤 - [ ] 非测试代码不使用 panic ### 5.2 性能检查清单 - [ ] 无 N+1 查询 - [ ] 循环内无数据库操作 - [ ] 正则表达式已预编译 - [ ] 大数据查询已分页 - [ ] 缓存已设置 TTL - [ ] 无不必要的内存分配 ### 5.3 代码质量检查清单 - [ ] 错误已正确处理 - [ ] 并发访问已同步 - [ ] 资源已正确释放 - [ ] 魔法数字已定义为常量 - [ ] 重复代码已提取 - [ ] 命名有意义 - [ ] 复杂逻辑有注释 --- ## 六、问题分级标准 ### 🔴 阻塞 (Blocker) - 安全漏洞(注入、认证绕过) - 数据丢失/损坏风险 - 编译失败 - 关键功能不可用 ### 🟡 建议 (Major) - 性能问题(N+1 查询) - 错误处理不当 - 代码重复 - 可维护性问题 ### 💭 挑剔 (Minor) - 代码风格不一致 - 命名不够清晰 - 注释不够完善 - 轻微优化空间 --- ## 七、审查评论规范 ### 7.1 格式示例 ```markdown 🔴 **安全:SQL注入风险** 位置: `auth.go:42` **问题**: 用户输入直接拼接到 SQL 查询中。 **原因**: 攻击者可注入 `'; DROP TABLE users; --` 作为 name 参数。 **建议**: 使用参数化查询 ```go db.Query('SELECT * FROM users WHERE name = $1', [name]) ``` ``` ### 7.2 评论原则 1. **具体**:指出具体文件和行号 2. **解释原因**:说明为什么这是个问题 3. **提供建议**:给出修复建议或参考资料 4. **保持尊重**:对事不对人 --- ## 八、持续改进 ### 8.1 审查指标 | 指标 | 目标值 | |------|--------| | 平均审查时间 | < 24 小时 | | 首次审查通过率 | > 60% | | 阻塞问题数量 | < 5 个/版本 | ### 8.2 知识沉淀 - 审查发现的安全问题同步到 `docs/security/` - 性能优化案例同步到 `docs/performance/` - 重大争议同步到 `docs/team/` --- ## 九、附录 ### 9.1 参考资源 - OWASP Top 10: https://owasp.org/www-project-top-ten/ - Go Code Review Comments: https://github.com/golang/go/wiki/CodeReviewComments - Google Engineering Practices: https://google.github.io/eng-practices/ ### 9.2 快速检查命令 ```bash # Go 后端 go vet ./... go build ./cmd/server go test ./... -count=1 # 前端 cd frontend/admin && npm.cmd run lint cd frontend/admin && npm.cmd run build cd frontend/admin && npm.cmd run test # E2E 测试 cd frontend/admin && npm.cmd run e2e:full:win ``` ### 9.3 审查周期建议 | 审查类型 | 频率 | 负责人 | |----------|------|--------| | 代码自审 | 每次提交前 | 开发者 | | 同行审查 | 每个 PR | 团队成员 | | 安全审查 | 每月一次 | 安全负责人 | | 全面审查 | 每季度一次 | 代码审查专家 | ### 9.4 审查报告模板 审查报告应包含以下部分: 1. **执行摘要** - 关键指标和总体评估 2. **问题清单** - 按优先级分类的问题列表 3. **历史问题验证** - 之前发现问题的修复状态 4. **代码质量评估** - 各维度评分 5. **修复建议** - 优先级排序的修复计划 6. **附录** - 参考文档和工具 --- *本文档由代码审查专家 Agent 生成,版本: v1.0*