后端增量 Code Review
日期:2026-09-05。仓库:unreal_tran_api;基线:3307c23 → b683bb7,57 个文件。审查开始时后端工作树干净;审查完成后按用户授权提交为 53d860b。
资料 → 原型 → 设计 → 开发 → 测试
资料和原型追溯见同目录 reference-review.md。本轮沿用既有“三渠道共享训练定义、失败可以重试、全过程留痕”的设计,未扩展评分、提前提交或渠道分类。
后端对照以下正式设计审查:wiki/19-训练定义渠道合同.md、wiki/20-教学命令幂等.md、wiki/21-教学步骤运行事实.md,并交叉核对 wiki/14-教学实施模块.md、接口总览、033/034 增量和完整 DDL。审查覆盖多渠道发布预检与固定快照、教员内容写权限、三个登录身份、四类命令回执、逐步推进/失败/重试/提交门槛、历史无事实兼容、正式考核和学员访问隔离。
已修复:旧尝试的迟到证据错误完成重试
严重度:P2。位置:TeachingStepRunService.validateEvidenceTime。
重现顺序:步骤首次开始时间为 100,失败时间为 110,重新开始时间为 120;重试后补报发生于 115 的成功事件。旧实现只与首次 startedAt 和最近 failedAt 比较,因此把重试开始前的证据计入第二次尝试,错误将步骤变为 COMPLETED。同类迟到失败事件也可错误增加当前尝试失败次数。
先添加回归用例并在旧实现运行,测试失败,错误为“预期抛出 BusinessException,但没有抛出”。证据:backend-repro.log。
修复使用已有 last_event_id 指向的重试激活事件,比较其发生时间;旧尝试的 MATCHED/UNMATCHED 返回 HTTP 400。首次开始时间仍保留,同秒或重试之后的有效事件仍可推进。缺失或跨运行的激活证据拒绝处理。没有新增字段、接口或训练步骤,也没有回填历史事实。
新增测试同时验证迟到成功、迟到失败都不改变当前状态/尝试数/失败数/最近证据;重试同秒的有效成功可以完成,并保留首次开始时间。另更新四个服务测试中的依赖装配,并同步 wiki 01/14/21。
其他审查结论
- 多渠道配置由发布预检验证全部启用渠道;任务按渠道固化选中的 profile,运行读取固定快照。未发现需要改变产品行为的问题。
- 内容写操作增加有效教员身份检查,并保留页面权限、动作权限和数据范围校验;纯管理员身份不能绕过教员要求。
- 命令回执在运行锁内检查,同载荷回放先于旧版本校验;首次执行的运行、事件、步骤和回执共享事务。模拟服务回归覆盖重放与冲突;真实并发和回滚以主 E2E/数据库报告为准。
- 新运行按发布步骤初始化,最后一步目标进度为 100%;历史无步骤行仅兼容读取/旧提交,不在 GET 中补写。
- 学员越权、正式考核当前步骤投影、未完成提交、撤回时不删除执行事实均有现有测试覆盖。
- 主审查在隔离 KingBase schema 发现 034 的独立唯一索引不能作为该目标版本的组合外键目标,由主审查负责新增 035 和完整 DDL 向前修复;数据库执行、恢复点与复跑证据由主报告记录。本后端子任务未连接或执行数据库。
实际验证
环境为 Temurin Java 17.0.20、Maven 3.9.14。
| 验证 | 结果 | 证据 |
|---|---|---|
修改前 mvn test -B -ntp |
401 项通过:Gateway 1、Auth 86、Tran 314 | Maven 退出码 0,完成时间 11:19:45 |
| 新增回归用例运行于旧实现 | 1 项失败,成功复现缺陷 | backend-repro.log |
| 四个相关服务类定向测试 | 23 项通过 | backend-targeted.log |
修改后全量 mvn test -B -ntp |
402 项通过:Gateway 1、Auth 86、Tran 315;0 失败、0 错误、0 跳过 | backend-mvn-test.log,11:24:52 完成 |
mvn -DskipTests package -B -ntp |
三个服务打包成功,退出码 0 | backend-package.log,11:25:19 完成 |
git diff --check |
通过,无空白错误 | 仅出现既有 CRLF 归一化提示 |
测试为本地单元/服务装配验证。名称含 IntegrationTest 的相关测试仍使用 Mockito mapper;不能把它们作为真实数据库并发、设备接入或浏览器 E2E 已通过的证据。带截图的浏览器验证和真实 API/数据库检查由同目录主报告汇总。
已观察到的非阻断警告:JVM 类共享提示、现有弃用/unchecked 编译警告、测试刻意模拟 Redis 失败后的数据库回源警告。没有据此修改依赖版本。
功能确认边界
本后端修复没有功能扩展;资料与现有产品的四项差异统一列于 reference-review.md,随主测试报告交用户确认。未放宽“全部步骤完成才可提交”,未引入自动评分或新渠道。