# 12.5 代码审查清单 :::tip 概述 Review 按"架构红线 → 安全 → 正确性 → 规范"四层组织。红线项(绕过 dao/反向依赖等)任何一项都应直接打回。 ::: ## 架构红线(一票否决) ```text □ 绕过 dao.Ctx 直连 g.DB() 查业务表 □ 手写 del_flag / tenant_id 条件 □ 租户级新表未登记 hooks.tenantTables □ logic 反向 import internal/task □ middleware 直接 import 业务包(应走 wire.go 函数变量) □ internal/migrate 走 dao/logic(应 gdb 裸连) □ base.go 导出函数超 15 个(应拆子包) □ 整体运行 gf gen service 覆盖手工接口文件 □ 唯一预检范围 ≠ 唯一索引范围(Group 缺失) □ gmeta path 带 /v1 版本段 / public 白名单三处不一致 ``` ## 安全 Review ```text □ 新接口声明了 permission(或评审确认留空=登录即可) □ 权限码符合 sys:{module小驼峰}:{action} □ 入参有 gvalid 校验(required/范围/格式) □ 敏感字段不出接口(password/salt) □ 日志不打印密码/令牌(maskSecret 覆盖) □ SQL 无字符串拼接(全参数化) □ 文件上传走白名单+嗅探链(未自造上传口) □ 富文本处理未破坏 [IMG_URL] 契约 / 未引入外站抓取(SSRF) □ 新缓存键有失效点或短 TTL(对照 4.8 原则) ``` ## 正确性 Review ```text □ 事务边界正确(bcrypt/HTTP/文件 IO 不在事务内) □ 钩子内无 append / 无 IO / 错误上抛 □ 错误处理不吞 err(不 _ = 忽略关键错误) □ 分页走 PageData;空集 [] □ 导出走 applyFilters(导出=所见) □ N+1 查询(循环内查库)→ 批查改造(userExpandNames 模式) □ 并发安全(共享 map 加锁;goroutine 泄漏) □ LastInsertId 回主键(禁雪花) □ 前端三件套对齐(querySchemas/Req/spec) □ 前端按钮 v-permission 对齐 gmeta ``` ## 规范 Review ```text □ 文件命名 snake_case(后端)/ 驼峰(前端) □ 注释按当前功能直述(无比较/来源痕迹) □ json 驼峰(下划线仅登录/令牌例外) □ service 接口同步更新(手维护) □ 日志标题 "{模块中文名}-{动作}"、logType 正确 □ gofmt / go vet / vue-tsc / eslint 通过 □ 文档同步(接口清单/表清单/配置项有变更时) □ 破坏性变更走版本化说明 + 黄金样本更新 ``` ## Review 实践建议 ```text 小 PR(<400 行)优先;大重构拆分提交 先看设计(spec 声明/钩子划分)再看细节 生成器产物看增量 diff(不逐行 review 模板产物) 测试:修复类看是否有回归测试;新功能看冒烟路径 评论给"为什么+建议",不只给"改成什么" ```