Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 

9 wiersze
19 KiB

  1. <!doctype html><html lang="zh-CN"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>作业指导正式接口与教学闭环 · 实测报告</title>
  2. <style>*{box-sizing:border-box}body{margin:0;background:#eff5f4;color:#203e42;font:15px/1.7 system-ui,"Microsoft YaHei",sans-serif}main{max-width:1200px;margin:auto;padding:32px 24px}header,section{background:#fff;border:1px solid #d4e4e0;border-radius:12px;padding:24px;margin-bottom:22px}header{border-top:5px solid #10856e}h1{margin:0 0 10px;font-size:28px}h2{font-size:21px;margin:0 0 14px}h3{font-size:17px;margin:22px 0 8px}p{margin:8px 0}a{color:#087b66}nav{display:flex;gap:20px;flex-wrap:wrap;margin-top:15px}.metrics{display:flex;gap:12px;flex-wrap:wrap;margin:20px 0 0}.metric{background:#edf8f4;border-radius:8px;padding:12px 20px}.metric b{font-size:24px;color:#087b66;display:block}.note{background:#fff7e8;border-left:4px solid #e7a337;padding:12px 16px;margin-top:16px}table{width:100%;border-collapse:collapse;font-size:14px}th,td{border:1px solid #dce7e4;text-align:left;padding:10px 12px;vertical-align:top}th{background:#edf6f3}code{overflow-wrap:anywhere}.pass{color:#078064;font-weight:700}.fail{color:#ba3434}.gallery{display:grid;grid-template-columns:1fr 1fr;gap:18px}figure{margin:0;border:1px solid #dce7e4;border-radius:8px;overflow:hidden}figure img{display:block;width:100%;height:auto}figcaption{padding:10px 14px;background:#f4f8f7}.subtle{color:#637b7d;font-size:13px}li{margin:7px 0}@media(max-width:760px){main{padding:16px 10px}.gallery{grid-template-columns:1fr}header,section{padding:16px}table{font-size:12px}th,td{padding:7px}}</style>
  3. <main><header><p class="subtle">开发环境 · 2026-09-10 — 2026-09-11 · 顺序实施与回归</p><h1>作业指导正式接口与教学闭环</h1><p>已完成编辑器接入、教学阅读记录、真实 HTTP 联调三项实施。正式发布工程 412,版本 V3.0.0(版本 ID 472)。</p><div class="metrics"><div class="metric"><b>58/58</b>E2E 检查点通过</div><div class="metric"><b>391</b>后端测试通过</div><div class="metric"><b>17</b>关键截图</div><div class="metric"><b>3</b>保留复核工程</div></div><nav><a href="#scope">实施内容</a><a href="#tests">测试结果</a><a href="#screenshots">截图</a><a href="#delivery">交付与迁移</a><a href="#limits">复核说明</a></nav></header>
  4. <section id="scope"><h2>实施内容</h2><table><tr><th>顺序</th><th>落地结果</th><th>验证方式</th></tr><tr><td>1. 内容、资源、版本</td><td>完整编辑文档写入正式内容服务;上传资源进入受控存储;模板、模型和场景从正式接口加载;保存、发布、历史版本及恢复使用服务端版本。场景资源固定到发布版本,修改草稿不改变已发布教学内容。</td><td>新建、模板生成、保存重开、GLB/图片/视频上传、固定场景引用、修订与发布、OFD 和离线 ZIP 实际下载。</td></tr><tr><td>2. 教学阅读闭环</td><td>教学端消费正式发布文档与受控资源;阅读位置、笔记、收藏按用户和发布版本独立保存;记录开始/完成、反馈与处理,提供授权聚合统计。</td><td>翻页恢复、笔记增改删、收藏取消、动态步骤同步进度、学员权限及数据隔离、反馈回复、完成记录。</td></tr><tr><td>3. 真实 HTTP 联调</td><td>接口页面通过统一 HTTP 客户端调用 Gateway/业务服务,展示真实响应。涵盖内容、资源、版本、教学、个人阅读记录、统计与交付物。</td><td>浏览器实际 GET/PUT;旧版本返回 409;错误方法返回 405;未经授权内容和统计接口返回 403。</td></tr></table><p>接口沿用平台统一登录会话与权限体系。第三方系统需取得平台会话;数字人开放应用 APPID 不用于这组作业指导接口。</p>
  5. <h3>本轮修复</h3><ul><li>完整文档校验及正式资源 URI 保留;教学投影转换为受控下载地址,避免文件存储地址直接暴露或刷新后丢失。</li><li>大 GLB 流式下载被默认 30 秒中断;异步流响应超时调整为可配置的 30 分钟。</li><li>保存与发布并发造成旧版本冲突;发布前等待自动保存队列完成。</li><li>阅读器初始化零页记录、只读目录/动画选择被拦截、动态页进度未同步、笔记删除后编辑框残留。</li><li>离线模型切换后的矩阵与镜头适配错误,导致场景偏出画面。</li><li>图片、视频海报的正式 URI 被过滤;视频完成加载后动态预览未刷新。已验证受控视频实际播放。</li><li>发布弹窗与动态白纸内容的暗色主题文字对比度。</li></ul></section>
  6. <section id="tests"><h2>测试结果</h2><p>浏览器为 Edge / Playwright,主要视口 1920×1080。管理操作使用内部维护账号;教学权限使用临时学员账号,测试后已清理。HTTP 通过 Web 6180 → Gateway 6100 → Tran 6102。</p><p><code>mvn -pl ut_tran -am test package</code>:391 项通过,0 失败、0 错误、0 跳过。<br><code>pnpm run build</code>:类型检查、Vite 构建与模型编辑器发布资源校验通过;保留既有 chunk 大小及运行时资源 URL 警告。</p><h3>正式工程新建 <a class="subtle" href="create.json">JSON 证据</a></h3><table><tr><th>检查点</th><th style="width:80px">结果</th></tr><tr><td>新建请求实际进入内容服务<div class="subtle">真实 HTTP 请求成功;响应内容已脱敏。</div></td><td class="pass">通过</td></tr><tr><td>正式后台可查询新工程</td><td class="pass">通过</td></tr></table><h3>模型资源上传与恢复 <a class="subtle" href="upload.json">JSON 证据</a></h3><table><tr><th>检查点</th><th style="width:80px">结果</th></tr><tr><td>上传 09-Fox.glb<div class="subtle">真实 HTTP 请求成功;响应内容已脱敏。</div></td><td class="pass">通过</td></tr><tr><td>上传 08-CesiumMilkTruck.glb<div class="subtle">真实 HTTP 请求成功;响应内容已脱敏。</div></td><td class="pass">通过</td></tr><tr><td>刷新后受控模型资源恢复显示</td><td class="pass">通过</td></tr></table><h3>固定场景版本与修订 <a class="subtle" href="scenes.json">JSON 证据</a></h3><table><tr><th>检查点</th><th style="width:80px">结果</th></tr><tr><td>新修订保持原发布版本可阅读</td><td class="pass">通过</td></tr><tr><td>狐狸与卡车场景固定版本已保存<div class="subtle">{&quot;old&quot;:&quot;469&quot;,&quot;published&quot;:&quot;469&quot;,&quot;assets&quot;:7,&quot;bindings&quot;:[&quot;160@463&quot;,&quot;159@209&quot;],&quot;version&quot;:12}</div></td><td class="pass">通过</td></tr></table><h3>正式发布与交付物 <a class="subtle" href="publish.json">JSON 证据</a></h3><table><tr><th>检查点</th><th style="width:80px">结果</th></tr><tr><td>正式发布事务完成<div class="subtle">真实 HTTP 请求成功;响应内容已脱敏。</div></td><td class="pass">通过</td></tr><tr><td>教学指导书列表出现正式发布工程</td><td class="pass">通过</td></tr><tr><td>发布版本提供 OFD 与离线 ZIP</td><td class="pass">通过</td></tr><tr><td>下载正式交付物 OFD</td><td class="pass">通过</td></tr><tr><td>下载正式交付物 OFFLINE_HTML</td><td class="pass">通过</td></tr></table><h3>教学阅读及真实 HTTP 查询 <a class="subtle" href="review.json">JSON 证据</a></h3><table><tr><th>检查点</th><th style="width:80px">结果</th></tr><tr><td>发布版本提供两份正式交付物</td><td class="pass">通过</td></tr><tr><td>阅读位置、收藏、笔记真实写入</td><td class="pass">通过</td></tr><tr><td>旧乐观锁版本被拒绝</td><td class="pass">通过</td></tr><tr><td>旧发布版本不能覆盖当前阅读记录</td><td class="pass">通过</td></tr><tr><td>收藏和笔记进入真实统计</td><td class="pass">通过</td></tr><tr><td>浏览器笔记保存请求成功</td><td class="pass">通过</td></tr><tr><td>浏览器翻页位置已同步</td><td class="pass">通过</td></tr><tr><td>教学动态阅读显示三维画布</td><td class="pass">通过</td></tr><tr><td>对外接口面板返回真实工程数据</td><td class="pass">通过</td></tr><tr><td>浏览器无脚本异常</td><td class="pass">通过</td></tr></table><h3>权限、私人记录与反馈 <a class="subtle" href="permissions.json">JSON 证据</a></h3><table><tr><th>检查点</th><th style="width:80px">结果</th></tr><tr><td>学员不能进入内容编辑接口</td><td class="pass">通过</td></tr><tr><td>学员可以阅读正式发布版本</td><td class="pass">通过</td></tr><tr><td>学员投影没有文件存储 URI</td><td class="pass">通过</td></tr><tr><td>学员看不到其他用户的笔记和收藏</td><td class="pass">通过</td></tr><tr><td>学员能保存本人的阅读记录</td><td class="pass">通过</td></tr><tr><td>学员写入不覆盖教员记录</td><td class="pass">通过</td></tr><tr><td>学员不能查看教员聚合统计</td><td class="pass">通过</td></tr><tr><td>开始阅读产生正式记录<div class="subtle">success</div></td><td class="pass">通过</td></tr><tr><td>阅读完成记录成功<div class="subtle">success</div></td><td class="pass">通过</td></tr><tr><td>学员反馈写入正式服务</td><td class="pass">通过</td></tr><tr><td>教员回复并处理反馈<div class="subtle">success</div></td><td class="pass">通过</td></tr><tr><td>学员通过教学接口下载 GLB</td><td class="pass">通过</td></tr><tr><td>临时测试学员已清理<div class="subtle">success</div></td><td class="pass">通过</td></tr></table><h3>阅读、笔记、进度及 HTTP 写入 <a class="subtle" href="final.json">JSON 证据</a></h3><table><tr><th>检查点</th><th style="width:80px">结果</th></tr><tr><td>重新打开恢复上次第三页阅读位置</td><td class="pass">通过</td></tr><tr><td>笔记编辑保存成功</td><td class="pass">通过</td></tr><tr><td>笔记删除成功</td><td class="pass">通过</td></tr><tr><td>取消收藏写回服务器</td><td class="pass">通过</td></tr><tr><td>动态阅读同步第四页和百分百页进度</td><td class="pass">通过</td></tr><tr><td>教学只读模式允许目录定位和选择动画</td><td class="pass">通过</td></tr><tr><td>教学动态版式切换卡车步骤</td><td class="pass">通过</td></tr><tr><td>浏览器完成阅读并更新状态</td><td class="pass">通过</td></tr><tr><td>HTTP 面板实际 PUT 阅读记录</td><td class="pass">通过</td></tr><tr><td>HTTP 面板旧版本返回 409</td><td class="pass">通过</td></tr><tr><td>错误 HTTP 方法明确返回 405</td><td class="pass">通过</td></tr><tr><td>正式模板库可用</td><td class="pass">通过</td></tr><tr><td>无浏览器脚本异常</td><td class="pass">通过</td></tr></table><h3>正式模板新建 <a class="subtle" href="template.json">JSON 证据</a></h3><table><tr><th>检查点</th><th style="width:80px">结果</th></tr><tr><td>模板新建实际进入正式内容服务</td><td class="pass">通过</td></tr><tr><td>模板初稿进入编辑器并保存</td><td class="pass">通过</td></tr><tr><td>模板章节和步骤不丢失</td><td class="pass">通过</td></tr></table><h3>图片、视频及截图引用 <a class="subtle" href="media.json">JSON 证据</a></h3><table><tr><th>检查点</th><th style="width:80px">结果</th></tr><tr><td>图片与视频上传、截图引用保存后重开保持</td><td class="pass">通过</td></tr><tr><td>OFD 预览读取受控图片和截图</td><td class="pass">通过</td></tr><tr><td>正式视频通过受控字节恢复并实际播放</td><td class="pass">通过</td></tr></table><h3>正式离线包运行 <a class="subtle" href="offline-browser.json">JSON 证据</a></h3><table><tr><th>检查点</th><th style="width:80px">结果</th></tr><tr><td>15-offline-fox-scene<div class="subtle">实测场景-狐狸野外训练区-20260905.glb · 186 个网格 · 拖拽旋转 / 滚轮缩放</div></td><td class="pass">通过</td></tr><tr><td>16-offline-truck-scene<div class="subtle">实测场景-牛奶卡车检验区-20260905.glb · 37 个网格 · 拖拽旋转 / 滚轮缩放</div></td><td class="pass">通过</td></tr><tr><td>离线资源不依赖业务服务器或公网</td><td class="pass">通过</td></tr><tr><td>无脚本异常</td><td class="pass">通过</td></tr></table><p class="subtle">检查点来自分阶段脚本,覆盖关键链路,不表示所有边缘输入均已穷举。create/scenes 等早期证据对应创建及 V1→V2 阶段;最新发布、阅读和离线回归对应 V3。</p></section>
  7. <section id="screenshots"><h2>关键截图</h2><p>点击图片查看原图。文件名中的“fox-scene”沿用测试场景名称,不代表该场景当前实际包含狐狸。</p><div class="gallery"><figure><a href="01-formal-created.png" target="_blank"><img src="01-formal-created.png" alt="正式指导书新建,写入内容服务" loading="lazy"></a><figcaption>正式指导书新建,写入内容服务</figcaption></figure><figure><a href="02-formal-assets.png" target="_blank"><img src="02-formal-assets.png" alt="狐狸、牛奶卡车 GLB 上传至正式资源存储" loading="lazy"></a><figcaption>狐狸、牛奶卡车 GLB 上传至正式资源存储</figcaption></figure><figure><a href="03-formal-fox.png" target="_blank"><img src="03-formal-fox.png" alt="刷新后狐狸模型恢复显示" loading="lazy"></a><figcaption>刷新后狐狸模型恢复显示</figcaption></figure><figure><a href="04-formal-published.png" target="_blank"><img src="04-formal-published.png" alt="V3.0.0 正式发布及交付物" loading="lazy"></a><figcaption>V3.0.0 正式发布及交付物</figcaption></figure><figure><a href="05-reader-notes.png" target="_blank"><img src="05-reader-notes.png" alt="教学阅读:笔记与收藏" loading="lazy"></a><figcaption>教学阅读:笔记与收藏</figcaption></figure><figure><a href="06-reader-layout.png" target="_blank"><img src="06-reader-layout.png" alt="教学阅读:OFD 版式" loading="lazy"></a><figcaption>教学阅读:OFD 版式</figcaption></figure><figure><a href="09-reader-model.png" target="_blank"><img src="09-reader-model.png" alt="教学动态阅读:狐狸模型" loading="lazy"></a><figcaption>教学动态阅读:狐狸模型</figcaption></figure><figure><a href="10-two-scene-resources.png" target="_blank"><img src="10-two-scene-resources.png" alt="两个已发布场景固定版本引用" loading="lazy"></a><figcaption>两个已发布场景固定版本引用</figcaption></figure><figure><a href="11-reader-truck.png" target="_blank"><img src="11-reader-truck.png" alt="教学动态阅读:牛奶卡车" loading="lazy"></a><figcaption>教学动态阅读:牛奶卡车</figcaption></figure><figure><a href="12-reading-completed.png" target="_blank"><img src="12-reading-completed.png" alt="完成阅读,进度与统计更新" loading="lazy"></a><figcaption>完成阅读,进度与统计更新</figcaption></figure><figure><a href="08-http-integration.png" target="_blank"><img src="08-http-integration.png" alt="对外接口:真实 HTTP 查询" loading="lazy"></a><figcaption>对外接口:真实 HTTP 查询</figcaption></figure><figure><a href="13-http-conflict.png" target="_blank"><img src="13-http-conflict.png" alt="对外接口:旧版本写入返回 409" loading="lazy"></a><figcaption>对外接口:旧版本写入返回 409</figcaption></figure><figure><a href="14-formal-templates.png" target="_blank"><img src="14-formal-templates.png" alt="正式模板库" loading="lazy"></a><figcaption>正式模板库</figcaption></figure><figure><a href="17-template-editor.png" target="_blank"><img src="17-template-editor.png" alt="模板生成章节与步骤并保存" loading="lazy"></a><figcaption>模板生成章节与步骤并保存</figcaption></figure><figure><a href="15-offline-fox-scene.png" target="_blank"><img src="15-offline-fox-scene.png" alt="离线包:场景 160 当前发布内容(维修车间与装备)" loading="lazy"></a><figcaption>离线包:场景 160 当前发布内容(维修车间与装备)</figcaption></figure><figure><a href="16-offline-truck-scene.png" target="_blank"><img src="16-offline-truck-scene.png" alt="离线包:牛奶卡车场景" loading="lazy"></a><figcaption>离线包:牛奶卡车场景</figcaption></figure><figure><a href="18-formal-video.png" target="_blank"><img src="18-formal-video.png" alt="图片与截图引用保持,视频实际播放" loading="lazy"></a><figcaption>图片与截图引用保持,视频实际播放</figcaption></figure></div></section>
  8. <section id="delivery"><h2>交付与迁移</h2><p><a href="formal.ofd">下载实测正式 OFD</a> · <a href="formal-offline.zip">下载实测正式离线 ZIP(本地文件)</a> · <a href="release.json">发布摘要</a> · <a href="offline.json">ZIP 完整性证据</a></p><p>离线 ZIP:71,380,256 字节;4 个 GLB 文件通过头部与长度检查。从正式 V3 下载后解压并运行,禁止访问业务服务及公网仍能加载两个场景。镜头修复代码已经包含在正式交付包中。</p><p class="subtle">SHA-256:<code>7227683a98f98e48aa31c3839fcb63782572fe6a9d9f7f48949fbae07e64f19b</code></p><table><tr><th>开发环境迁移</th><th>说明</th></tr><tr><td>20260826_017_teaching_guide_reading_closed_loop.sql</td><td>补执行既有阅读与反馈表迁移,先回滚试执行再正式执行。</td></tr><tr><td>20260826_018_content_guide_template_library.sql</td><td>补执行既有正式模板库迁移,保留 4 个模板。</td></tr><tr><td>20260911_001_guide_reader_state.sql</td><td>新增按用户/项目/发布版本隔离的阅读位置、笔记、收藏及进度表;完整 DDL、数据库设计、迁移记录和 Wiki 已同步。</td></tr></table><p>其他环境部署前先检查既有表,避免重复执行。新增流下载配置 <code>UT_CONTENT_STREAM_TIMEOUT</code> 默认 <code>30m</code>。本轮不代表其他环境已完成数据库迁移。</p></section>
  9. <section id="limits"><h2>复核说明与保留数据</h2><ul><li>工程 412:正式闭环-狐狸与卡车指导书-20260910,已发布 V3.0.0 / 472。</li><li>工程 413:正式模板新建回归-20260911,保留草稿。</li><li>工程 414:正式图片视频资源回归-20260911,保留草稿。</li><li>临时学员账号已清理,正式测试阅读及反馈历史保留。阅读页进度与“完成阅读”分别记录,不等同于考核成绩。</li><li>既有内部维护账号头像存在单独的 404,属于原账号头像资源问题;本轮指导书资源、视频及交付下载检查通过。没有将该请求计入“无网络错误”的结论。</li><li>本轮未自动提交或推送 Git。大型测试 ZIP 仅保留在本地报告目录,不纳入 Git。</li></ul><div class="note">需要核对的数据差异:场景 160@463 名为“实测场景-狐狸野外训练区-20260905”,当前发布内容实际是维修车间与装备,不包含狐狸。已按其固定发布版本验证,未修改源场景;狐狸模型在指导书独立步骤中验证通过。牛奶卡车场景使用 159@209。</div><p>三项实施均在本次授权范围内,没有新增待批准的大幅功能调整。旧浏览器本地工程如需迁移,使用显式导入新工程;无法从服务端恢复的本地文件需重新上传。</p></section></main></html>