系统代码审查规则

📅 2026/8/27 10:16:12
系统代码审查规则
--- trigger: always_on --- # 后端代码审查规则 基于项目架构规范、Java编码规范、数据库规范定制适用于 Java / Spring Boot / MyBatis-Plus 后端代码审查。 ## [严重] 判定条件 以下情形必须修复后才能合并 ### 安全与权限 1. **SQL注入风险**Mapper XML 中使用 ${} 拼接用户可控参数应统一使用 #{}或在 Java 代码中拼接 SQL 字符串 2. **SQL书写位置违规**在 Mapper 接口上使用 Select/Update/Insert/Delete 注解写完整SQL在 Service/Store/Bond 层用字符串拼接 SQL用 QueryWrapper.select(...) 写 SQL 字段片段。SQL 必须写在 Mapper XML 文件中 3. **敏感信息泄露**API 响应中返回密码、密钥、Token 等字段日志中打印明文密码、身份证号、银行卡号等敏感数据 4. **生产凭据硬编码**密码、密钥、Token、内部地址明文写入代码或配置文件 ### 数据库安全 7. **数据库高危操作**可能导致死锁、长事务、大表全表扫描或锁表的 SQL线上 DDL 缺少 ALGORITHMINPLACE, LOCKNONE 防锁表参数 8. **SQL关键字违规**SQL 中使用未加反引号的保留字key、desc、order 等作为字段名或表名 9. **超过3表联查**SQL 中超过 3 个表的 JOIN 联查大表关联应在应用层逻辑处理 10. **配置数据插入缺少存在性检查**菜单、按钮权限、字典项、导出字段配置、消息模板等配置类 INSERT 语句未使用 NOT EXISTS 判断是否已存在相同记录SQL 重复执行会产生重复数据 ### 并发与资源 11. **并发安全问题**竞态条件、共享变量未加锁、使用线程不安全的数据结构如 HashMap 做并发共享、SimpleDateFormat 做共享实例 12. **资源泄露**数据库连接、文件流、网络连接等未在 try-with-resources / finally 中安全释放 13. **N1 / 循环调用**在循环内执行 SQL 查询、远程 HTTP 调用、Redis 调用、文件 IO 等应批量查询后在内存中处理 ### 金额与精度 14. **金额计算使用浮点**金额运算使用 float/double 而未采用 BigDecimal金额数据库字段使用 FLOAT/DOUBLE 而非 DECIMAL 15. **精度截断无舍入策略**BigDecimal 除法或比例计算未指定 RoundingMode ### 代码质量严重级 16. **硬编码魔数**用裸数字/裸字符串表示业务状态、类型、编码等含义必须替换为具有业务语义的枚举值或命名常量。错误示例if (status 1)、if (type.equals(2))正确示例if (status OrderStatusEnum.APPROVED.getCode()) 17. **测试代码混入主干**调试日志、硬编码测试账号、被注释的核心业务逻辑、TODO/FIXME 阻塞性逻辑提交到主干分支 18. **事务注解违规**在 Controller 层或 private 方法上使用事务注解使用 Transactional 而非 DSTransactional事务方法命名不含 trans/tx 19. **分层架构破坏**Controller 直接调用 Mapper/Store 绕过 Service 层Controller 中包含业务逻辑处理或数据查询代码 20. **空catch吞异常**catch 块内无任何处理吞掉异常导致问题难以排查 ## [建议] 判定条件 以下情形建议在合并前修正不强制阻断 ### 异常与健壮性 1. **异常处理不完善**过宽的 catch(Exception) 未区分具体异常类型异常未记录上下文参数使用 e.printStackTrace() 代替结构化日志 log.error() 2. **缺少参数校验**Service 层对外接口入参缺少非空、范围、格式等基础校验未使用 ObjectUtil.isEmpty() / StrUtil.isBlank() 等工具做前置检查 3. **空指针风险**对象属性使用前未做空值判断链式调用未做 null 安全处理未使用 Hutool ObjectUtil 工具类 4. **关键业务日志缺失**Controller 层增删改操作无 info 日志异常分支无 error 日志且未包含关键参数 5. **Service 不存在未抛异常**Store 层返回 null 后Service 层未判断并抛出 FebsException导致空指针传递给上层 ### 分层与架构 6. **敏感数据接口权限缺失**仅涉及增删改、批量操作、数据导出等数据操作接口适用该类接口未通过 ComplexPermissions 鉴权保护存在未授权访问风险。注意系统整体权限通过页面菜单/按钮权限控制纯查询展示接口无需强制添加 7. **数据操作接口越权风险**仅涉及增删改操作接口适用接口仅校验资源 ID 存在性未校验当前用户对该资源的归属关系如仅本人/本部门可操作存在水平越权风险 8. **注解使用错误**StoreImpl 使用 Service 而非 ComponentServiceImpl 使用 Component 而非 Service注入方式未统一使用 Autowired 9. **包路径归属错误**Entity/DTO/VO/Mapper 未放在 biz 模块Controller/Service/Agg 未放在 sales 模块 10. **返回值类型不规范**Controller 未统一返回 RestResponseService 分页未返回 PageVOStore 分页未返回 ListVO 11. **Controller方法签名违规**id 参数类型未使用 String分页查询方法声明了 throws FebsException批量操作未接收 JSON 字符串 12. **聚合根(Agg)编码违规**Agg 使用 Data 或 Setter 而非 Getter缺少 create()/modify()/fillingDbId() 方法 ### 命名与方法规范 13. **方法命名违规**查询列表方法未用 query 开头查询单个方法未用 find 开头事务方法未含 trans/tx构建方法未用 build 开头 14. **Entity编码违规**字段未用 TableField 显式指定列名主键未用 TableId(type IdType.AUTO)时间字段未用 LocalDateTime JsonFormat DateTimeFormat 15. **VO/DTO编码违规**QueryDTO 未继承 PageBaseDTOVO/DTO 未实现 Serializable未添加 Data ToString 16. **枚举类规范**状态枚举未使用 Getter code/name 字段模式缺少 toEnum() 静态方法直接使用魔法数字比较状态 ### SQL与查询 17. **Mapper XML 规范违规**使用 resultMap 而非 resultType 直指 VO列别名未用双引号驼峰映射缺少 WHERE t.deleted 0 逻辑删除条件未使用 sql 片段复用 18. **Mapper接口签名违规**分页查询方法未用 Param(data) 绑定参数未继承 MyBatchBaseMapper 19. **查询逻辑未下推至SQL**在 Java 内存中分步查询stream过滤应优先在 SQL 中完成关联和过滤 20. **SQL中做枚举转换**在 SQL 中使用 CASE WHEN 或 JOIN 字典表做字段名称转换应在 Service 层通过枚举类完成 21. **批量操作未分批**大批量插入/更新未分批执行或未使用 insertBatchSomeColumn每批 batchSize 应为 1000 ### 代码质量与设计 22. **方法过长**单方法超过 80 行或圈复杂度过高应拆分为子方法 23. **上帝类**单个 Service/Store/Bond 类承担过多职责应按业务场景拆分 24. **死代码**未引用的 import、未使用的变量、被注释掉的代码段、无用的私有方法应清理 25. **DTO与Entity未分离**Entity 对象直接作为 API 入参或出参返回存在字段过度暴露风险 26. **循环依赖**模块/包/类之间存在 A↔B 循环引用 ### 性能 27. **数据库查询缺少索引**高频查询字段、外键字段、排序字段未建索引 28. **配置硬编码**URL、超时时间、批次大小、阈值等写死在代码中应外部化到配置文件或 Nacos 配置中心 29. **缓存未设过期时间**Redis/本地缓存写入未指定 TTL ### 依赖注入与框架陷阱 30. **事务注解作用域失效**DSTransactional 用于 private 方法或自调用场景导致事务失效事务方法未声明回滚条件 31. **异步任务未配置专用线程池**Async 使用默认 SimpleAsyncTaskExecutor未配置队列、超时与拒绝策略 32. **逻辑删除未过滤**Store 层查询实体时未加 eq(XxxEntity::getDeleted, 0) 条件查出已删除数据 ## [可选] 判定条件 以下情形可在后续迭代中改进不影响合并 1. **命名风格微调**变量、方法、类命名不完全符合项目惯例但含义清晰 2. **注释与文档**公共方法缺少 Javadoc 注释TODO 未关联工单号 3. **代码风格**缩进、空行、import 顺序等可由格式化工具自动修复的问题 4. **微优化**可读性等价写法的偏好性建议如 Stream vs 循环、Hutool 工具 vs 原生写法 5. **工具库选择**未优先使用 Hutool 工具类ObjectUtil、CollUtil、StrUtil使用了 CollectionUtils 等替代 6. **测试覆盖**核心业务逻辑缺少单元测试、边界用例覆盖不足