You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

67 line
8.1 KiB

  1. <!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>backend-review · Code Review</title><style>*{box-sizing:border-box}body{margin:0;background:#edf2f7;color:#203248;font:16px/1.75 "Microsoft YaHei","Segoe UI",sans-serif}header{background:#0c2b47;color:white;padding:22px max(24px,calc((100vw - 1160px)/2))}header a{color:#c1e6ff;margin-right:24px}main{max-width:1200px;margin:24px auto 60px;padding:36px;background:white;border-radius:12px;box-shadow:0 6px 24px #1028400c}h1{font-size:30px;line-height:1.4;margin-top:0}h2{font-size:22px;margin:36px 0 14px;border-bottom:2px solid #dbe8f2;padding-bottom:8px}h3{font-size:18px}p{margin:13px 0}a{color:#126fba;text-decoration:none}a:hover{text-decoration:underline}table{border-collapse:collapse;width:100%;margin:18px 0;font-size:14px;table-layout:auto}th,td{padding:11px 13px;border:1px solid #dce5ed;text-align:left;vertical-align:top;overflow-wrap:anywhere}th{background:#edf5fc}tr:nth-child(even){background:#f9fbfd}code{font:13px/1.5 Consolas,monospace;background:#edf2f7;padding:2px 5px;border-radius:4px;overflow-wrap:anywhere}pre{padding:18px;overflow:auto;background:#edf2f7;border-radius:8px}pre code{padding:0}img{max-width:100%;height:auto}details{padding:12px;background:#f7f9fc;margin:12px 0}.gallery{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}figure{margin:0;border:1px solid #dce5ed;border-radius:8px;overflow:hidden;background:#f8fafc}figure img{display:block;width:100%;height:300px;object-fit:contain;background:#e8eef3}figcaption{padding:12px;font-size:14px;color:#37526b}footer{color:#657c91;font-size:13px;margin-top:36px}li{margin:8px 0}@media(max-width:760px){main{margin:0;padding:20px;border-radius:0}.gallery{grid-template-columns:1fr}table{display:block;overflow:auto}h1{font-size:25px}header{padding:16px}}@media print{body{background:white}main{margin:0;box-shadow:none;max-width:none}header{display:none}figure{break-inside:avoid}h2{break-after:avoid}}</style></head><body><header><a href="index.html">审查总报告</a><a href="live/html/index.html">真实 E2E</a><a href="frontend-e2e/html/index.html">模拟接口回归</a></header><main><h1 id="后端增量-code-review">后端增量 Code Review</h1>
  2. <p>日期:2026-09-05。仓库:<code>unreal_tran_api</code>;基线:<code>3307c23 → b683bb7</code>,57 个文件。审查开始时后端工作树干净;审查完成后按用户授权提交为 <code>53d860b</code>。</p>
  3. <h2 id="资料-原型-设计-开发-测试">资料 → 原型 → 设计 → 开发 → 测试</h2>
  4. <p>资料和原型追溯见同目录 <a href="reference-review.html">reference-review.md</a>。本轮沿用既有“三渠道共享训练定义、失败可以重试、全过程留痕”的设计,未扩展评分、提前提交或渠道分类。</p>
  5. <p>后端对照以下正式设计审查:<code>wiki/19-训练定义渠道合同.md</code>、<code>wiki/20-教学命令幂等.md</code>、<code>wiki/21-教学步骤运行事实.md</code>,并交叉核对 <code>wiki/14-教学实施模块.md</code>、接口总览、033/034 增量和完整 DDL。审查覆盖多渠道发布预检与固定快照、教员内容写权限、三个登录身份、四类命令回执、逐步推进/失败/重试/提交门槛、历史无事实兼容、正式考核和学员访问隔离。</p>
  6. <h2 id="已修复旧尝试的迟到证据错误完成重试">已修复:旧尝试的迟到证据错误完成重试</h2>
  7. <p>严重度:P2。位置:<code>TeachingStepRunService.validateEvidenceTime</code>。</p>
  8. <p>重现顺序:步骤首次开始时间为 100,失败时间为 110,重新开始时间为 120;重试后补报发生于 115 的成功事件。旧实现只与首次 <code>startedAt</code> 和最近 <code>failedAt</code> 比较,因此把重试开始前的证据计入第二次尝试,错误将步骤变为 <code>COMPLETED</code>。同类迟到失败事件也可错误增加当前尝试失败次数。</p>
  9. <p>先添加回归用例并在旧实现运行,测试失败,错误为“预期抛出 BusinessException,但没有抛出”。证据:<a href="backend-repro.log">backend-repro.log</a>。</p>
  10. <p>修复使用已有 <code>last_event_id</code> 指向的重试激活事件,比较其发生时间;旧尝试的 <code>MATCHED/UNMATCHED</code> 返回 HTTP 400。首次开始时间仍保留,同秒或重试之后的有效事件仍可推进。缺失或跨运行的激活证据拒绝处理。没有新增字段、接口或训练步骤,也没有回填历史事实。</p>
  11. <p>新增测试同时验证迟到成功、迟到失败都不改变当前状态/尝试数/失败数/最近证据;重试同秒的有效成功可以完成,并保留首次开始时间。另更新四个服务测试中的依赖装配,并同步 wiki 01/14/21。</p>
  12. <h2 id="其他审查结论">其他审查结论</h2>
  13. <ul>
  14. <li>多渠道配置由发布预检验证全部启用渠道;任务按渠道固化选中的 profile,运行读取固定快照。未发现需要改变产品行为的问题。</li>
  15. <li>内容写操作增加有效教员身份检查,并保留页面权限、动作权限和数据范围校验;纯管理员身份不能绕过教员要求。</li>
  16. <li>命令回执在运行锁内检查,同载荷回放先于旧版本校验;首次执行的运行、事件、步骤和回执共享事务。模拟服务回归覆盖重放与冲突;真实并发和回滚以主 E2E/数据库报告为准。</li>
  17. <li>新运行按发布步骤初始化,最后一步目标进度为 100%;历史无步骤行仅兼容读取/旧提交,不在 GET 中补写。</li>
  18. <li>学员越权、正式考核当前步骤投影、未完成提交、撤回时不删除执行事实均有现有测试覆盖。</li>
  19. <li>主审查在隔离 KingBase schema 发现 034 的独立唯一索引不能作为该目标版本的组合外键目标,由主审查负责新增 035 和完整 DDL 向前修复;数据库执行、恢复点与复跑证据由主报告记录。本后端子任务未连接或执行数据库。</li>
  20. </ul>
  21. <h2 id="实际验证">实际验证</h2>
  22. <p>环境为 Temurin Java 17.0.20、Maven 3.9.14。</p>
  23. <table>
  24. <thead>
  25. <tr>
  26. <th>验证</th>
  27. <th>结果</th>
  28. <th>证据</th>
  29. </tr>
  30. </thead>
  31. <tbody>
  32. <tr>
  33. <td>修改前 <code>mvn test -B -ntp</code></td>
  34. <td>401 项通过:Gateway 1、Auth 86、Tran 314</td>
  35. <td>Maven 退出码 0,完成时间 11:19:45</td>
  36. </tr>
  37. <tr>
  38. <td>新增回归用例运行于旧实现</td>
  39. <td>1 项失败,成功复现缺陷</td>
  40. <td><a href="backend-repro.log">backend-repro.log</a></td>
  41. </tr>
  42. <tr>
  43. <td>四个相关服务类定向测试</td>
  44. <td>23 项通过</td>
  45. <td><a href="backend-targeted.log">backend-targeted.log</a></td>
  46. </tr>
  47. <tr>
  48. <td>修改后全量 <code>mvn test -B -ntp</code></td>
  49. <td>402 项通过:Gateway 1、Auth 86、Tran 315;0 失败、0 错误、0 跳过</td>
  50. <td><a href="backend-mvn-test.log">backend-mvn-test.log</a>,11:24:52 完成</td>
  51. </tr>
  52. <tr>
  53. <td><code>mvn -DskipTests package -B -ntp</code></td>
  54. <td>三个服务打包成功,退出码 0</td>
  55. <td><a href="backend-package.log">backend-package.log</a>,11:25:19 完成</td>
  56. </tr>
  57. <tr>
  58. <td><code>git diff --check</code></td>
  59. <td>通过,无空白错误</td>
  60. <td>仅出现既有 CRLF 归一化提示</td>
  61. </tr>
  62. </tbody>
  63. </table>
  64. <p>测试为本地单元/服务装配验证。名称含 <code>IntegrationTest</code> 的相关测试仍使用 Mockito mapper;不能把它们作为真实数据库并发、设备接入或浏览器 E2E 已通过的证据。带截图的浏览器验证和真实 API/数据库检查由同目录主报告汇总。</p>
  65. <p>已观察到的非阻断警告:JVM 类共享提示、现有弃用/unchecked 编译警告、测试刻意模拟 Redis 失败后的数据库回源警告。没有据此修改依赖版本。</p>
  66. <h2 id="功能确认边界">功能确认边界</h2>
  67. <p>本后端修复没有功能扩展;资料与现有产品的四项差异统一列于 <a href="reference-review.html">reference-review.md</a>,随主测试报告交用户确认。未放宽“全部步骤完成才可提交”,未引入自动评分或新渠道。</p><footer>2026-09-05 · 开发环境审查 · 图片可点击查看原尺寸</footer></main></body></html>