Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 

295 rader
26 KiB

  1. <!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>review-report · 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-与-e2e-报告">更新项目 Code Review 与 E2E 报告</h1>
  2. <p>审查日期:2026-09-05 · 开发环境:<code>E:/work/edit_3d</code> · 状态:审查与验证完成,4 项功能差异和 1 项素材选择待确认</p>
  3. <p>本轮按 <strong>资料 → 产品原型 → 设计 → 开发 → 测试</strong> 审查更新,定位并修复 8 处问题:前端 6 处、后端 1 处、数据库迁移 1 处。修复沿用现有产品和接口合同。另有 4 项资料与现有功能的差异,以及 1 项素材选择,列在本报告末尾待确认。</p>
  4. <p>前端与三个后端服务已启动。页面地址:<a href="http://127.0.0.1:6180/">本机 6180</a>,<a href="http://192.168.31.168:6180/">局域网 6180</a>。审查完成后已按用户授权提交:API <code>53d860b</code>、Web <code>3c7f295</code>。报告与测试脚本在 <code>ute2e</code> 独立提交。</p>
  5. <h2 id="1-更新了什么">1. 更新了什么</h2>
  6. <table>
  7. <thead>
  8. <tr>
  9. <th>仓库与范围</th>
  10. <th>同事本次更新的主要内容</th>
  11. <th>本次重点</th>
  12. </tr>
  13. </thead>
  14. <tbody>
  15. <tr>
  16. <td><code>unreal_tran_api</code>:<code>3307c23..b683bb7</code>,57 个文件</td>
  17. <td>多渠道训练定义;开始/推进/提交/评定命令幂等;步骤运行事实;三个登录身份与教员内容写权限;029–034 SQL</td>
  18. <td>发布快照、权限、重复命令、失败重试、提交门槛、数据库兼容性</td>
  19. </tr>
  20. <tr>
  21. <td><code>unreal_tran_web</code>:<code>0aac918..1576728</code>,29 个文件</td>
  22. <td>虚拟训练切到正式 API 主入口;旧链接重定向;渠道编辑;步骤状态展示;命令追踪;角色、Three 资源及回放内容调整</td>
  23. <td>默认入口可用性、编辑保存一致性、步骤顺序、运行页和重试入口</td>
  24. </tr>
  25. </tbody>
  26. </table>
  27. <h2 id="2-从资料到测试的追溯">2. 从资料到测试的追溯</h2>
  28. <p>已逐页查看《维修训练内容设计.pdf》6 页和《电器控制系统故障维修脚本.pdf》5 页,并保留 <a href="reference-review.html#1-原始资料与阅读证据">11 页资料图像</a>。这些文件没有可提取文本层;维修设计第 6 页下半流程图扫描过淡,未据此臆测执行规则。</p>
  29. <p><code>AGENTS.md</code> 指定的相邻 <code>unreal_tran_demo</code> 当前缺失。本次结合正式前端中移植的原型源码、适配层和 API wiki 追溯,未把废弃原型目录当作最新定稿。完整依据见 <a href="reference-review.html">资料与原型审查</a>。</p>
  30. <table>
  31. <thead>
  32. <tr>
  33. <th>资料要求</th>
  34. <th>原型与设计</th>
  35. <th>开发检查</th>
  36. <th>测试证据</th>
  37. </tr>
  38. </thead>
  39. <tbody>
  40. <tr>
  41. <td>同一任务贯穿不同训练方式</td>
  42. <td>移植训练原型;wiki 19:公共步骤与渠道 profile、固定发布快照</td>
  43. <td>渠道配置读写与默认配置镜像;切换默认渠道;保留其他渠道</td>
  44. <td>浏览器模拟接口回归验证保存载荷与重新打开;Node 执行渠道转换逻辑</td>
  45. </tr>
  46. <tr>
  47. <td>教员编排、学员训练、权限分工</td>
  48. <td>现有角色合同与 wiki 14</td>
  49. <td>三种登录角色;内容写入需有效教员身份</td>
  50. <td>真实登录与教员列表;纯管理员创建内容返回 403;后端权限回归</td>
  51. </tr>
  52. <tr>
  53. <td>逐步骤留痕、失败可重试</td>
  54. <td>电气脚本五阶段;wiki 21 的四种步骤状态</td>
  55. <td>顺序/进度;开始、失败、重试、完成;迟到证据</td>
  56. <td>真实 API/数据库步骤事实、迟到事件 400;浏览器重试按钮与状态变化</td>
  57. </tr>
  58. <tr>
  59. <td>操作不重复记账</td>
  60. <td>wiki 20 的命令号与冻结载荷</td>
  61. <td>同载荷重放、异载荷冲突、运行版本与事务边界</td>
  62. <td>真实 start/progress/review 重放不增加版本,异载荷 409;服务测试</td>
  63. </tr>
  64. <tr>
  65. <td>完成后提交、结果可查询</td>
  66. <td>当前 wiki 21 要求全步骤完成;资料的提前交卷另列确认</td>
  67. <td>提交门槛、评定、刷新后的服务端结果</td>
  68. <td>真实未完成提交 409;8 步完成后 UI 提交;评定后刷新</td>
  69. </tr>
  70. <tr>
  71. <td>训练页面可操作、状态清晰</td>
  72. <td>正式 API 主入口与已有工作台设计</td>
  73. <td>错误考核遮罩、场景尺寸、安全提示对比度</td>
  74. <td>真实场景就绪截图;军工绿/暗色主题尺寸与文字对比测量</td>
  75. </tr>
  76. </tbody>
  77. </table>
  78. <h2 id="3-已修复的-8-处问题">3. 已修复的 8 处问题</h2>
  79. <p>P1 表示阻断目标环境部署;P2 表示功能、状态或界面正确性问题。下列均已修改代码或 DDL,详细复现、修改文件与验证见 <a href="frontend-review.html">前端审查</a>、<a href="backend-review.html">后端审查</a> 和 <a href="database-review.html">数据库审查</a>。</p>
  80. <table>
  81. <thead>
  82. <tr>
  83. <th>编号</th>
  84. <th>级别</th>
  85. <th>触发与原行为</th>
  86. <th>修复后的行为</th>
  87. </tr>
  88. </thead>
  89. <tbody>
  90. <tr>
  91. <td>DB-01</td>
  92. <td>P1</td>
  93. <td>KingbaseES 当前版本不接受 034 中独立 UNIQUE INDEX 作为组合外键目标,步骤事实表迁移失败</td>
  94. <td>新增 035,使用真正 UNIQUE 约束;同步全量 DDL,保留历史 034;开发库执行 033 → 035</td>
  95. </tr>
  96. <tr>
  97. <td>API-01</td>
  98. <td>P2</td>
  99. <td>步骤失败后重试,收到重试开始前的迟到成功/失败事件,可能错误完成当前尝试或增加失败次数</td>
  100. <td>从已有激活事件校验本次尝试开始时间;旧事件返回 400,不改变当前事实</td>
  101. </tr>
  102. <tr>
  103. <td>WEB-01</td>
  104. <td>P2</td>
  105. <td>实装步骤移动、删除或复制后仍保留旧顺序和进度,如 <code>3,2,1</code> / <code>100,67,33</code>,发布可能被拒</td>
  106. <td>按编辑后的顺序重算顺序号(order)和严格递增进度,末步 100%;保留步骤标识和事件扩展字段</td>
  107. </tr>
  108. <tr>
  109. <td>WEB-02</td>
  110. <td>P2</td>
  111. <td>通用编辑器只修改旧 <code>modeConfig</code>,重开被旧渠道 profile 覆盖;切默认渠道字段不一致</td>
  112. <td>同步默认渠道、启用渠道、profile 和兼容镜像;保留其他渠道与历史对抗时长</td>
  113. </tr>
  114. <tr>
  115. <td>WEB-03</td>
  116. <td>P2</td>
  117. <td><code>v-else</code> 绑定到拆卸侧栏条件,普通训练也显示“正式考核执行场景已关闭”</td>
  118. <td>仅正式考核且不在执行中显示关闭态</td>
  119. </tr>
  120. <tr>
  121. <td>WEB-04</td>
  122. <td>P2</td>
  123. <td>当前步骤 FAILED,但运行仍 IN_PROGRESS,学员没有重试入口</td>
  124. <td>补“重试当前步骤”,复用已有 start 和幂等命令;结束状态不出现该按钮</td>
  125. </tr>
  126. <tr>
  127. <td>WEB-05</td>
  128. <td>P2</td>
  129. <td>场景仅占视口上方,安全确认区暗底深字</td>
  130. <td>补运行场景填充定位和已有主题颜色、间距;安全确认规则保持原有语义</td>
  131. </tr>
  132. <tr>
  133. <td>WEB-06</td>
  134. <td>P2</td>
  135. <td>默认离线视频替换为约 32 秒的新素材,但候选、阶段与抓拍仍对应 45 秒旧片;34 秒和 45.2 秒候选无法到达</td>
  136. <td>将默认映射指向仓库保留、哈希与既有验收合同一致的 45 秒视频;新素材保留,重标与切换列 F5 确认</td>
  137. </tr>
  138. </tbody>
  139. </table>
  140. <h2 id="4-测试结果与边界">4. 测试结果与边界</h2>
  141. <table>
  142. <thead>
  143. <tr>
  144. <th>验证</th>
  145. <th>最终结果</th>
  146. <th>证据与范围</th>
  147. </tr>
  148. </thead>
  149. <tbody>
  150. <tr>
  151. <td>后端全量测试</td>
  152. <td>402/402 通过,0 失败、错误、跳过</td>
  153. <td>Gateway 1、Auth 86、Tran 315;含新增迟到事件回归</td>
  154. </tr>
  155. <tr>
  156. <td>后端构建</td>
  157. <td>通过</td>
  158. <td>Java 17 / Maven;三个服务打包完成</td>
  159. </tr>
  160. <tr>
  161. <td>前端 Node 回归</td>
  162. <td>25/25 通过</td>
  163. <td>原 24 项加视频资产、候选与抓拍合同</td>
  164. </tr>
  165. <tr>
  166. <td>前端构建</td>
  167. <td>通过</td>
  168. <td>vue-tsc、Vite、旧模型 iframe 校验</td>
  169. </tr>
  170. <tr>
  171. <td>真实服务 E2E(Edge)</td>
  172. <td>4/4 通过,0 失败/跳过/重试</td>
  173. <td>62.3 秒;开始时间 2026-09-05T03:47:45.212Z(UTC)</td>
  174. </tr>
  175. <tr>
  176. <td>浏览器模拟接口回归</td>
  177. <td>15/15 通过,0 失败/跳过/重试</td>
  178. <td>117.7 秒;编辑保存、状态组合、军工绿/暗色主题</td>
  179. </tr>
  180. <tr>
  181. <td>数据库迁移</td>
  182. <td>通过</td>
  183. <td>033、035;首次、重跑和指定中断点恢复;开发库检查值均为 0</td>
  184. </tr>
  185. <tr>
  186. <td>测试脚本类型检查、Git 空白检查</td>
  187. <td>通过</td>
  188. <td>两份专用 Playwright 测试与配置;API/Web/E2E 仓库</td>
  189. </tr>
  190. </tbody>
  191. </table>
  192. <p>最终通过结果来自各自一次完整运行,未启用自动重试。补入三次完整场景加载与截图后,真实虚拟用例曾超过原 120 秒测试总预算,断言和评定已完成但截图收尾超时;保留 <a href="diagnostics/live-resource-wait-timeout.json">该轮记录</a>,随后将该用例预算调到 240 秒,并在其他浏览器回归结束后重新完整运行。单次资源就绪仍有 60 秒上限。</p>
  193. <p>实装视频新增检查还发现本机 Playwright 自带 Chromium 不支持 H.264(<code>canPlayType</code> 返回空字符串);<a href="diagnostics/live-chromium-h264-unsupported.json">失败轮次</a>与<a href="diagnostics/video-probe-msedge.json">Edge 播放探针</a>保留。最终真实 E2E 使用已安装 Microsoft Edge,模拟接口回归继续使用 Chromium。另独立修复了实际素材与候选配置不匹配的 WEB-06;最终用例验证默认视频可播、片长覆盖末尾候选,并在结尾得到 12 条候选。测试开发阶段的权限夹具、请求拦截范围与 UI 选择器错误已修正,不计为产品缺陷。</p>
  194. <p>真实 E2E 使用本机正在运行的 Web、Gateway、Auth、Tran 与开发数据库,没有拦截 <code>/api</code>。通过专用临时账号和临时任务验证,避免改动现有训练记录。</p>
  195. <p>浏览器回归使用真实前端组件与 Playwright,但对 API 返回进行模拟,以稳定重现排序、多渠道保存、遮罩及失败重试的状态组合。它能验证页面与请求载荷,不能作为后端持久化已通过的证据。</p>
  196. <p>真实虚拟训练用例通过 UI 开始、UI 提交,通过真实 API 逐步推进 8 个步骤并验证服务端事实和重放。它验证了页面、接口与数据库的联通,<strong>没有逐个通过三维鼠标操作完成训练动作</strong>。三维资源加载与场景尺寸单独等待和检查。</p>
  197. <p>实装测试验证的是失败 → 重试 → 拒绝旧证据 → 接受新证据的真实 API/数据库流程。现有实装样例的源项目已回到 DRAFT,因此复制其历史发布快照为隔离测试任务并配置人工事件;未更改原项目。默认实装运行仍是离线回放,现场 AI、硬件、MR、完整电气训练和自动评分不属于本轮通过项。真实并发压力与故障注入恢复未作为完整系统验收执行。</p>
  198. <h2 id="5-截图证据">5. 截图证据</h2>
  199. <p>以下截图来自最终通过轮次。点击图像可查看原尺寸。模拟接口截图的图注明确标注,资料扫描不计入 E2E 截图。</p>
  200. <p>共 27 张最终 E2E 截图。</p>
  201. <h3>真实服务与页面</h3>
  202. <div class="gallery">
  203. <figure><a href="live/screenshots/01-login-three-roles.png"><img loading="lazy" src="live/screenshots/01-login-three-roles.png" alt="真实服务:登录仅展示教员、学员、管理员"></a><figcaption>真实服务:登录仅展示教员、学员、管理员</figcaption></figure>
  204. <figure><a href="live/screenshots/02-virtual-formal-task-center.png"><img loading="lazy" src="live/screenshots/02-virtual-formal-task-center.png" alt="真实服务:正式虚拟任务中心"></a><figcaption>真实服务:正式虚拟任务中心</figcaption></figure>
  205. <figure><a href="live/screenshots/03-virtual-1920.png"><img loading="lazy" src="live/screenshots/03-virtual-1920.png" alt="真实服务:1920 宽度任务中心"></a><figcaption>真实服务:1920 宽度任务中心</figcaption></figure>
  206. <figure><a href="live/screenshots/04-teacher-content.png"><img loading="lazy" src="live/screenshots/04-teacher-content.png" alt="真实服务:教员训练编排列表已加载"></a><figcaption>真实服务:教员训练编排列表已加载</figcaption></figure>
  207. <figure><a href="live/screenshots/05-virtual-started-no-exam-overlay.png"><img loading="lazy" src="live/screenshots/05-virtual-started-no-exam-overlay.png" alt="真实服务:开始训练、模型就绪,无错误考核遮罩"></a><figcaption>真实服务:开始训练、模型就绪,无错误考核遮罩</figcaption></figure>
  208. <figure><a href="live/screenshots/06-virtual-all-steps-completed.png"><img loading="lazy" src="live/screenshots/06-virtual-all-steps-completed.png" alt="真实服务:8/8 步骤完成,真实模型已加载"></a><figcaption>真实服务:8/8 步骤完成,真实模型已加载</figcaption></figure>
  209. <figure><a href="live/screenshots/07-virtual-reviewed.png"><img loading="lazy" src="live/screenshots/07-virtual-reviewed.png" alt="真实服务:提交评定后刷新"></a><figcaption>真实服务:提交评定后刷新</figcaption></figure>
  210. <figure><a href="live/screenshots/08-physical-api-task-list.png"><img loading="lazy" src="live/screenshots/08-physical-api-task-list.png" alt="真实服务:实装任务清单"></a><figcaption>真实服务:实装任务清单</figcaption></figure>
  211. <figure><a href="live/screenshots/09-physical-offline-replay-boundary.png"><img loading="lazy" src="live/screenshots/09-physical-offline-replay-boundary.png" alt="真实页面:离线视频就绪,并标明不推进正式进度、不计分"></a><figcaption>真实页面:离线视频就绪,并标明不推进正式进度、不计分</figcaption></figure>
  212. <figure><a href="live/screenshots/10-physical-twelve-candidates.png"><img loading="lazy" src="live/screenshots/10-physical-twelve-candidates.png" alt="真实页面:匹配视频到达末尾,12 条离线候选可达、等待复核"></a><figcaption>真实页面:匹配视频到达末尾,12 条离线候选可达、等待复核</figcaption></figure>
  213. </div>
  214. <h3>模拟接口浏览器回归</h3>
  215. <div class="gallery">
  216. <figure><a href="frontend-e2e/screenshots/01-saved-step-delete.png"><img loading="lazy" src="frontend-e2e/screenshots/01-saved-step-delete.png" alt="模拟接口:删除步骤后末步进度 100%"></a><figcaption>模拟接口:删除步骤后末步进度 100%</figcaption></figure>
  217. <figure><a href="frontend-e2e/screenshots/01-saved-step-duplicate.png"><img loading="lazy" src="frontend-e2e/screenshots/01-saved-step-duplicate.png" alt="模拟接口:复制步骤后重新编号"></a><figcaption>模拟接口:复制步骤后重新编号</figcaption></figure>
  218. <figure><a href="frontend-e2e/screenshots/01-saved-step-move.png"><img loading="lazy" src="frontend-e2e/screenshots/01-saved-step-move.png" alt="模拟接口:移动已保存步骤后保持正确顺序"></a><figcaption>模拟接口:移动已保存步骤后保持正确顺序</figcaption></figure>
  219. <figure><a href="frontend-e2e/screenshots/02-multichannel-virtual-save.png"><img loading="lazy" src="frontend-e2e/screenshots/02-multichannel-virtual-save.png" alt="模拟接口:虚拟渠道配置保存与重开"></a><figcaption>模拟接口:虚拟渠道配置保存与重开</figcaption></figure>
  220. <figure><a href="frontend-e2e/screenshots/03-multichannel-confrontation-save.png"><img loading="lazy" src="frontend-e2e/screenshots/03-multichannel-confrontation-save.png" alt="模拟接口:对抗渠道配置保存与重开"></a><figcaption>模拟接口:对抗渠道配置保存与重开</figcaption></figure>
  221. <figure><a href="frontend-e2e/screenshots/04-overlay-1-VIRTUAL-IN_PROGRESS.png"><img loading="lazy" src="frontend-e2e/screenshots/04-overlay-1-VIRTUAL-IN_PROGRESS.png" alt="模拟接口:关闭遮罩状态矩阵 1-VIRTUAL-IN_PROGRESS"></a><figcaption>模拟接口:关闭遮罩状态矩阵 1-VIRTUAL-IN_PROGRESS</figcaption></figure>
  222. <figure><a href="frontend-e2e/screenshots/04-overlay-2-PHYSICAL-IN_PROGRESS.png"><img loading="lazy" src="frontend-e2e/screenshots/04-overlay-2-PHYSICAL-IN_PROGRESS.png" alt="模拟接口:关闭遮罩状态矩阵 2-PHYSICAL-IN_PROGRESS"></a><figcaption>模拟接口:关闭遮罩状态矩阵 2-PHYSICAL-IN_PROGRESS</figcaption></figure>
  223. <figure><a href="frontend-e2e/screenshots/04-overlay-3-CONFRONTATION-IN_PROGRESS.png"><img loading="lazy" src="frontend-e2e/screenshots/04-overlay-3-CONFRONTATION-IN_PROGRESS.png" alt="模拟接口:关闭遮罩状态矩阵 3-CONFRONTATION-IN_PROGRESS"></a><figcaption>模拟接口:关闭遮罩状态矩阵 3-CONFRONTATION-IN_PROGRESS</figcaption></figure>
  224. <figure><a href="frontend-e2e/screenshots/04-overlay-4-VIRTUAL-IN_PROGRESS.png"><img loading="lazy" src="frontend-e2e/screenshots/04-overlay-4-VIRTUAL-IN_PROGRESS.png" alt="模拟接口:关闭遮罩状态矩阵 4-VIRTUAL-IN_PROGRESS"></a><figcaption>模拟接口:关闭遮罩状态矩阵 4-VIRTUAL-IN_PROGRESS</figcaption></figure>
  225. <figure><a href="frontend-e2e/screenshots/04-overlay-5-VIRTUAL-ACCEPTED.png"><img loading="lazy" src="frontend-e2e/screenshots/04-overlay-5-VIRTUAL-ACCEPTED.png" alt="模拟接口:关闭遮罩状态矩阵 5-VIRTUAL-ACCEPTED"></a><figcaption>模拟接口:关闭遮罩状态矩阵 5-VIRTUAL-ACCEPTED</figcaption></figure>
  226. <figure><a href="frontend-e2e/screenshots/04-overlay-6-VIRTUAL-SUBMITTED.png"><img loading="lazy" src="frontend-e2e/screenshots/04-overlay-6-VIRTUAL-SUBMITTED.png" alt="模拟接口:关闭遮罩状态矩阵 6-VIRTUAL-SUBMITTED"></a><figcaption>模拟接口:关闭遮罩状态矩阵 6-VIRTUAL-SUBMITTED</figcaption></figure>
  227. <figure><a href="frontend-e2e/screenshots/05-failed-before-retry.png"><img loading="lazy" src="frontend-e2e/screenshots/05-failed-before-retry.png" alt="模拟接口:失败步骤出现重试入口"></a><figcaption>模拟接口:失败步骤出现重试入口</figcaption></figure>
  228. <figure><a href="frontend-e2e/screenshots/06-failed-after-retry.png"><img loading="lazy" src="frontend-e2e/screenshots/06-failed-after-retry.png" alt="模拟接口:重试后尝试 2 次、失败 1 次"></a><figcaption>模拟接口:重试后尝试 2 次、失败 1 次</figcaption></figure>
  229. <figure><a href="frontend-e2e/screenshots/07-no-retry-SUBMITTED.png"><img loading="lazy" src="frontend-e2e/screenshots/07-no-retry-SUBMITTED.png" alt="模拟接口:已提交不出现重试按钮"></a><figcaption>模拟接口:已提交不出现重试按钮</figcaption></figure>
  230. <figure><a href="frontend-e2e/screenshots/07-no-retry-TERMINATED.png"><img loading="lazy" src="frontend-e2e/screenshots/07-no-retry-TERMINATED.png" alt="模拟接口:已终止不出现重试按钮"></a><figcaption>模拟接口:已终止不出现重试按钮</figcaption></figure>
  231. <figure><a href="frontend-e2e/screenshots/08-visual-safety-dark.png"><img loading="lazy" src="frontend-e2e/screenshots/08-visual-safety-dark.png" alt="模拟接口:暗色主题安全区,对比度 15.30"></a><figcaption>模拟接口:暗色主题安全区,对比度 15.30</figcaption></figure>
  232. <figure><a href="frontend-e2e/screenshots/08-visual-safety-military.png"><img loading="lazy" src="frontend-e2e/screenshots/08-visual-safety-military.png" alt="模拟接口:军工绿主题安全区,对比度 12.00"></a><figcaption>模拟接口:军工绿主题安全区,对比度 12.00</figcaption></figure>
  233. </div>
  234. <h2 id="6-数据库运行环境与清理">6. 数据库、运行环境与清理</h2>
  235. <p>目标数据库为开发环境 <code>unreal_tran/public</code>,KingbaseES V008R006C009B0014。迁移前保存四张教学主表原始行、字段和索引信息,恢复快照位于 <code>E:/work/edit_3d/.codex-tmp/review-20260905/database-before.json</code>;该文件含业务数据,未打进报告包。</p>
  236. <p>实际执行 033 与新增 035。029–032 未在本次审查中重新执行,未注入新的前泵课目。035 与全量 DDL 的步骤表、父表约束保持一致;验证了隔离 schema 首次执行、重复执行、中途提交后续跑,所有无效行/孤儿行检查为 0。隔离 schema 已删除。详见 <a href="database-migration.json">迁移执行记录</a>。其他环境部署应先核对现状,按文档执行 <strong>033 → 035</strong>,迁移工具需支持 dollar quote。</p>
  237. <p>最终清理时间:<code>2026-09-05T11:48:55.347416</code>。删除本轮临时任务及关联记录(step_run 12, command_receipt 13, event 19, run_member 2, run 2, member 2, assignment 2),测试账号已停用/软删除,会话已撤销,临时管理员密码文件已移除。四张原始教学表的既有行逐行对照均未变化,剩余活动测试账号为 0。审计与软删除记录按系统机制保留。见 <a href="cleanup.json">最终清理记录</a>;较早轮次见 <code>diagnostics/cleanup-*.json</code>。</p>
  238. <p>环境检查记录见 <a href="environment.json">environment.json</a>。三个服务健康接口及本机、局域网前端访问返回 200。Nacos 与 Redis 保留运行。</p>
  239. <p>构建中的既有资源 URL、包体积和部分 Java 弃用警告未阻断打包;未因此升级依赖版本。报告不包含密码或会话令牌。</p>
  240. <h2 id="7-待你确认的功能差异与素材选择">7. 待你确认的功能差异与素材选择</h2>
  241. <p>这些涉及产品口径或新增接入,未作为本轮 bugfix 擅自扩展。建议逐项确认后安排对应实现与验收。</p>
  242. <table>
  243. <thead>
  244. <tr>
  245. <th>编号</th>
  246. <th>现状与资料差异</th>
  247. <th>需要确认的决定</th>
  248. </tr>
  249. </thead>
  250. <tbody>
  251. <tr>
  252. <td>F1:实装正式训练</td>
  253. <td>电气资料及移植原型为五阶段、15 分钟;默认实装页面当前是约 45 秒离线识别回放,未接入正式步骤与计分</td>
  254. <td>此次交付继续保留回放,还是把电气模板发布为正式内容、接入真实事件/人工证据、提交与评定?</td>
  255. </tr>
  256. <tr>
  257. <td>F2:混合现实归属</td>
  258. <td>资料列虚拟、混合现实、AI 实装;当前渠道为 VIRTUAL、PHYSICAL、CONFRONTATION</td>
  259. <td>MR 作为虚拟渠道的呈现能力/沉浸入口,还是新增渠道?对抗是否属于另一维度的组织形式?</td>
  260. </tr>
  261. <tr>
  262. <td>F3:提前提交规则</td>
  263. <td>资料允许未收尾提交并扣分;当前新运行要求全部步骤 COMPLETED 才能提交</td>
  264. <td>保留全部完成门槛,还是新增提前交卷/放弃结算及未完成、失败、超时计分规则?</td>
  265. </tr>
  266. <tr>
  267. <td>F4:评分与复盘范围</td>
  268. <td>资料包括自动结算、90/80/70 分档、全过程复盘和知识拓展;当前以服务端规则/教员评定为权威</td>
  269. <td>这些是否纳入此次交付?若纳入,需要确认评分规则、等级文案、复盘证据及知识资源来源。</td>
  270. </tr>
  271. <tr>
  272. <td>F5:离线回放素材</td>
  273. <td>新增约 32 秒素材与现有 12 条候选/抓拍不匹配;本轮默认恢复指向已验收的约 45 秒素材</td>
  274. <td>继续使用当前匹配素材,还是采用新片?采用新片需要先重新标注候选、阶段时间与证据抓拍,再整体切换。</td>
  275. </tr>
  276. </tbody>
  277. </table>
  278. <p>各项 PDF 页码、原型和代码依据见 <a href="reference-review.html#4-需要用户确认的功能差异">完整差异说明</a>。</p>
  279. <h2 id="8-报告文件与复跑">8. 报告文件与复跑</h2>
  280. <ul>
  281. <li><a href="live/html/index.html">真实接口 Playwright 报告</a> · <a href="live/results.json">JSON</a> · <a href="live/api-evidence.json">API 断言证据</a></li>
  282. <li><a href="frontend-e2e/html/index.html">前端模拟接口 Playwright 报告</a> · <a href="frontend-e2e/results.json">JSON</a></li>
  283. <li><a href="backend-mvn-test.log">后端测试日志</a> · <a href="backend-package.log">后端打包日志</a></li>
  284. <li><a href="frontend-contract-tests.log">前端回归日志</a> · <a href="frontend-build.log">前端构建日志</a></li>
  285. <li><a href="reference-review.html">资料与原型</a> · <a href="frontend-review.html">前端审查</a> · <a href="backend-review.html">后端审查</a> · <a href="database-review.html">数据库审查</a></li>
  286. </ul>
  287. <p>测试源码位于 <code>ute2e/tests/review-live.spec.ts</code> 和 <code>tests/review-frontend-regressions.spec.ts</code>,配置为 <code>review-live.config.ts</code> / <code>review-frontend.config.ts</code>。回归脚本读取本地配置,不内嵌密码。</p>
  288. <p>已具备开发库表结构时,可在 <code>ute2e</code> 顺序运行:</p>
  289. <pre><code class="language-powershell">python tools/review-db.py test-admin
  290. pnpm exec playwright test --config review-live.config.ts
  291. python tools/review-db.py cleanup
  292. pnpm exec playwright test --config review-frontend.config.ts
  293. </code></pre>
  294. <p>真实测试后即使失败也需执行 cleanup。当前开发库已完成迁移,<code>prepare</code> 会因目标表存在而拒绝重跑。报告 JSON 保留时间、断言和最终结果,可据此核验,测试计数不等同于完整功能覆盖率。</p><footer>2026-09-05 · 开发环境审查 · 图片可点击查看原尺寸</footer></main></body></html>