2026-05-13-REQ-USR-001.md
3.22 KB
req_id: REQ-USR-001 date: 2026-05-13 round: 1 reviewer: superpower-code-reviewer
verdict: approve
Review: REQ-USR-001 — round 1
结论
approve
Must-fix
(无)
Nice-to-have
-
backend/src/main/java/com/xly/test4/common/exception/GlobalExceptionHandler.java:19-56— 为BusinessException/DuplicateKeyException显式声明@ResponseStatus(HttpStatus.OK),避免依赖默认 200 行为 -
backend/src/main/java/com/xly/test4/common/response/Result.java:1-27— 后续可补traceId字段以对齐 docs/04 § 1.3 -
backend/src/main/java/com/xly/test4/module/usr/service/impl/UserServiceImpl.java:98-109—tUserPermission循环 insert,后续若 permissionIds 体量增长可改saveBatch -
backend/src/main/java/com/xly/test4/module/usr/service/impl/UserServiceImpl.java:59-66— 两次selectCount可合并为单查询(本 REQ 不必,spec § B-001 明确要求 Service 层预检) -
backend/src/main/java/com/xly/test4/common/security/JwtTokenProvider.java:45-65—claims.get("auth", List.class)强转List<String>缺类型守护,可加instanceof检查 -
backend/src/main/java/com/xly/test4/module/usr/entity/User.java:33,35,37— 匈牙利前缀字段(i/s/t) 语义建议在 entity 顶部加注释 -
backend/src/main/java/com/xly/test4/module/usr/converter/UserConverter.java:17-35— JavaBeans 大写化 property 名(IIncrement/SUserCode等)文件头注释已说明,可再强化"禁止改成小写"提示 -
sql/migrations/V2__seed_admin_and_permissions.sql:23— 种子 admin 密码哈希文件头补一行"生产部署后必须立刻改密"提示 -
backend/src/test/java/com/xly/test4/module/usr/controller/UserControllerIT.java:29-32—@TestMethodOrder让 8 个测试方法共享 DB 状态,链式依赖较脆弱;下个 REQ 加更多 IT 时建议改为每测试独立 setup/teardown
反例 / 测试覆盖缺口
-
事务回滚端到端未真测:
spec § B-005+§ 验收 6要求"permissionIds 含非法项 → tUser 也不写入(整体回滚)"。当前实现是"预检在前,实际无回滚机会",形式正确但未对@Transactional真正的回滚语义做端到端证明。建议后续补一个集成测试:让 tUser.insert 成功 → tUserPermission.insert 抛 DataIntegrityViolation → 断言 tUser 行最终不存在 -
日志泄露断言未补:
spec § 验收 15"应用日志中不出现明文 password 字段值" 当前无测试覆盖。可用 LogCaptor 或 Spring TestLogger 监听com.xly.test4包做断言 -
错误响应裸度断言不完整:
spec § 验收 19"错误响应不含 stacktrace/class name/SQL 文本",GlobalExceptionHandlerTest#handleGenericException_returns50000_noStackInResponse只覆盖通用兜底分支;DuplicateKeyException分支虽硬编码 message 安全,但可补一个 cause message 含 'SELECT * FROM tUser ...' 的样本断言Result.message不泄露 SQL - sId 全局 ID 策略:spec § B-004 写"暂置 NULL",实现正确;建议 docs/03 § 种子数据 节后补一条说明,等全局 ID 生成器落地后回填
- 多租户隔离一致性:spec 未要求 service 校验 employeeId/permissionIds 是否同租户;当前实现允许跨租户关联。建议在 REQ-USR-002/003 spec 中显式声明多租户 filter 策略