|
- <!doctype html>
- <html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
- <title>模型截图封面验证报告 · 2026-09-05</title>
- <style>
- :root{color-scheme:light;--ink:#172b34;--muted:#536872;--line:#dce5e7;--accent:#10664e}*{box-sizing:border-box}body{margin:0;background:#f2f6f6;color:var(--ink);font:15px/1.7 system-ui,"Microsoft YaHei",sans-serif}main{max-width:1180px;margin:0 auto;padding:40px 28px 60px}header{padding-bottom:22px;border-bottom:1px solid var(--line)}.eyebrow{font-size:12px;letter-spacing:.14em;color:var(--accent);font-weight:700}h1{font-size:32px;line-height:1.35;margin:8px 0 12px}h2{font-size:23px;margin:32px 0 15px}h3{font-size:17px;margin:0 0 8px}p{margin:8px 0 12px}.muted,figcaption{color:var(--muted)}a{color:var(--accent);text-underline-offset:3px}.stats{display:flex;gap:12px;flex-wrap:wrap;margin:22px 0}.stat{background:white;border:1px solid var(--line);border-radius:10px;padding:12px 18px;min-width:150px}.stat strong{font-size:25px;display:block}.covers,.checks{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px}.card,.check,.panel{background:white;border:1px solid var(--line);border-radius:12px;padding:20px;min-width:0}.cover-meta{display:grid;grid-template-columns:auto 1fr;gap:3px 12px;font-size:13px;margin-top:12px}.cover-meta dt{color:var(--muted)}.cover-meta dd{margin:0;overflow-wrap:anywhere}figure{margin:12px 0 0}figure img{display:block;width:100%;height:auto;border:1px solid var(--line);border-radius:7px;background:#edf1f1}.cover-image img{aspect-ratio:640/346;object-fit:contain}.evidence-images{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.evidence-images.single{grid-template-columns:1fr}figcaption{font-size:12px;margin-top:5px}.badge{display:inline-block;font-size:12px;font-weight:700;padding:1px 9px;border-radius:12px;white-space:nowrap}.pass{background:#e1f3eb;color:#0c6144}.fail{background:#fde8e8;color:#ab2323}.neutral{background:#edf0f4;color:#425566}.check-title{display:flex;gap:10px;align-items:flex-start;justify-content:space-between}details{margin-top:12px}summary{cursor:pointer;color:var(--accent);font-size:13px}pre{margin:10px 0 0;white-space:pre-wrap;overflow-wrap:anywhere;font:12px/1.6 ui-monospace,Consolas,monospace;background:#f4f7f8;padding:12px;border-radius:7px;max-height:360px;overflow:auto}table{width:100%;border-collapse:collapse;font-size:13px}th,td{padding:9px 12px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}th{background:#f4f7f8}td{overflow-wrap:anywhere}ul{padding-left:22px}.command{margin-bottom:12px}.command pre{max-height:280px}footer{margin-top:28px;color:var(--muted);font-size:12px}@media(max-width:760px){main{padding:24px 16px 40px}h1{font-size:26px}.covers,.checks{grid-template-columns:1fr}.stat{flex:1;min-width:100px}.panel,.card,.check{padding:15px}.table-wrap{overflow:auto}}@media print{body{background:white}main{max-width:none;padding:0}details{display:block}pre{max-height:none}.card,.check,figure{break-inside:avoid}a{color:inherit}.checks{display:block}.check{margin-bottom:14px}}
- </style></head><body><main>
- <header><div class="eyebrow">MODEL COVER · IMPLEMENTED</div><h1>模型截图封面验证报告</h1><p>截图封面功能已实施并完成下列真实浏览器验证:视口截图作为受控图片资产与工程关联保存,列表读取真实封面,模型列表按创建时间倒序显示。</p><p class="muted">2026-09-05 · http://127.0.0.1:6180 · Microsoft Edge · 教员</p><a href="report.md">Markdown 报告</a></header>
- <div class="stats"><div class="stat"><strong>14 / 14</strong>证据项通过</div><div class="stat"><strong>0</strong>非 PASS 证据项</div><div class="stat"><strong>15</strong>图片文件已校验</div></div>
- <h2>最终模型封面</h2><div class="covers"><article class="card"><h3>实测模型-牛奶卡车-已验证-20260905</h3><figure class="cover-image"><a href="screenshots/02-truck-new-view.jpg" target="_blank" rel="noopener"><img src="screenshots/02-truck-new-view.jpg" alt="项目 156 最终封面" loading="lazy"></a><figcaption>项目 156 最终封面 · 点击查看原图</figcaption></figure><dl class="cover-meta"><dt>项目 / 最终状态</dt><dd>156 / PUBLISHED</dd><dt>工程版本 / 封面资产</dt><dd>204 / 2055</dd><dt>图片规格</dt><dd>640 × 346 · 17821 字节</dd></dl><details><summary>封面持久化证据</summary><pre>{
- "id": "156",
- "name": "实测模型-牛奶卡车-已验证-20260905",
- "coverUri": "fsvc://unreal-tran/image/2026/09/05/67b2a5d15f9c1fc47a0a760f28fd2e2e.jpg",
- "versionId": "204",
- "projectVersion": 18,
- "coverAssetId": "2055",
- "sha256": "7b7cc4cc75a3a355f26e2ff15ae1d26b5964ad7b370061691a94ce5f6f4b9158",
- "bytes": 17821,
- "width": 640,
- "height": 346,
- "image": "screenshots/02-truck-new-view.jpg",
- "cache": "no-cache, private"
- }</pre></details></article><article class="card"><h3>实测模型-狐狸动画-已验证-20260905</h3><figure class="cover-image"><a href="screenshots/06-fox-restored-cover.jpg" target="_blank" rel="noopener"><img src="screenshots/06-fox-restored-cover.jpg" alt="项目 157 最终封面" loading="lazy"></a><figcaption>项目 157 最终封面 · 点击查看原图</figcaption></figure><dl class="cover-meta"><dt>项目 / 最终状态</dt><dd>157 / DRAFT</dd><dt>工程版本 / 封面资产</dt><dd>202 / 2067</dd><dt>图片规格</dt><dd>640 × 346 · 13163 字节</dd></dl><details><summary>封面持久化证据</summary><pre>{
- "id": "157",
- "name": "实测模型-狐狸动画-已验证-20260905",
- "coverUri": "fsvc://unreal-tran/image/2026/09/05/c09a49efd4423dcf8ccbc46b46d1e209.jpg",
- "versionId": "202",
- "projectVersion": 15,
- "coverAssetId": "2067",
- "sha256": "6ace0cf199626a3e8ecd4b360d62c0a6ec9b39309293554765dca8128a2ec5e9",
- "bytes": 13163,
- "width": 640,
- "height": 346,
- "image": "screenshots/06-fox-restored-cover.jpg",
- "cache": "no-cache, private"
- }</pre></details></article></div>
- <h2>最终列表现场</h2><section class="panel"><figure class=""><a href="screenshots/09-final-two-covers.png" target="_blank" rel="noopener"><img src="screenshots/09-final-two-covers.png" alt="两条保留模型的真实封面与创建时间倒序列表" loading="lazy"></a><figcaption>两条保留模型的真实封面与创建时间倒序列表 · 点击查看原图</figcaption></figure></section>
- <h2>验证记录</h2><p class="muted">通过数只统计 status 为 PASS 的记录;故障注入中预期的 503、401 或 404 不等于用例失败。</p><div class="checks"><article class="check"><div class="check-title"><h3>1. 首次手动保存卡车:截取当前场景并绑定JPEG封面</h3><span class="badge pass">PASS</span></div><details><summary>检查细节</summary><pre>{
- "details": {
- "id": "156",
- "name": "实测模型-牛奶卡车-已验证-20260905",
- "coverUri": "fsvc://unreal-tran/image/2026/09/05/4e12ee526680085650c48934bc0305e1.jpg",
- "versionId": "203",
- "projectVersion": 13,
- "coverAssetId": "2040",
- "sha256": "15caa821e90a70d5b0f8ba1554c0d0d6db332a9b5e53b0d5e94de24d7663533e",
- "bytes": 17889,
- "width": 640,
- "height": 346,
- "image": "screenshots/01-truck-cover.jpg",
- "cache": "no-cache, private"
- },
- "helpersRestored": true
- }</pre></details><div class="evidence-images "><figure class=""><a href="screenshots/01-truck-cover-editor.png" target="_blank" rel="noopener"><img src="screenshots/01-truck-cover-editor.png" alt="浏览器现场" loading="lazy"></a><figcaption>浏览器现场 · 点击查看原图</figcaption></figure><figure class=""><a href="screenshots/01-truck-cover.jpg" target="_blank" rel="noopener"><img src="screenshots/01-truck-cover.jpg" alt="实际生成封面" loading="lazy"></a><figcaption>实际生成封面 · 点击查看原图</figcaption></figure></div></article><article class="check"><div class="check-title"><h3>2. 更换卡车视角再次保存:替换当前封面且辅助控件恢复</h3><span class="badge pass">PASS</span></div><details><summary>检查细节</summary><pre>{
- "details": {
- "id": "156",
- "name": "实测模型-牛奶卡车-已验证-20260905",
- "coverUri": "fsvc://unreal-tran/image/2026/09/05/67b2a5d15f9c1fc47a0a760f28fd2e2e.jpg",
- "versionId": "204",
- "projectVersion": 18,
- "coverAssetId": "2055",
- "sha256": "7b7cc4cc75a3a355f26e2ff15ae1d26b5964ad7b370061691a94ce5f6f4b9158",
- "bytes": 17821,
- "width": 640,
- "height": 346,
- "image": "screenshots/02-truck-new-view.jpg",
- "cache": "no-cache, private"
- },
- "helpersRestored": true
- }</pre></details><div class="evidence-images "><figure class=""><a href="screenshots/02-truck-new-view-editor.png" target="_blank" rel="noopener"><img src="screenshots/02-truck-new-view-editor.png" alt="浏览器现场" loading="lazy"></a><figcaption>浏览器现场 · 点击查看原图</figcaption></figure><figure class=""><a href="screenshots/02-truck-new-view.jpg" target="_blank" rel="noopener"><img src="screenshots/02-truck-new-view.jpg" alt="实际生成封面" loading="lazy"></a><figcaption>实际生成封面 · 点击查看原图</figcaption></figure></div></article><article class="check"><div class="check-title"><h3>3. 更换相机视角更新封面,已发布历史版本保留旧封面</h3><span class="badge pass">PASS</span></div><details><summary>检查细节</summary><pre>{
- "details": {
- "oldVersionId": "203",
- "newVersionId": "204",
- "oldSha256": "15caa821e90a70d5b0f8ba1554c0d0d6db332a9b5e53b0d5e94de24d7663533e",
- "newSha256": "7b7cc4cc75a3a355f26e2ff15ae1d26b5964ad7b370061691a94ce5f6f4b9158"
- }
- }</pre></details><div class="evidence-images single"><figure class=""><a href="screenshots/02-truck-new-view.jpg" target="_blank" rel="noopener"><img src="screenshots/02-truck-new-view.jpg" alt="实际生成封面" loading="lazy"></a><figcaption>实际生成封面 · 点击查看原图</figcaption></figure></div></article><article class="check"><div class="check-title"><h3>4. 手动保存狐狸:生成与卡车不同的真实模型封面</h3><span class="badge pass">PASS</span></div><details><summary>检查细节</summary><pre>{
- "details": {
- "id": "157",
- "name": "实测模型-狐狸动画-已验证-20260905",
- "coverUri": "fsvc://unreal-tran/image/2026/09/05/3d78768edb7ce9b4a89a75c4d68de597.jpg",
- "versionId": "202",
- "projectVersion": 12,
- "coverAssetId": "2058",
- "sha256": "6ace0cf199626a3e8ecd4b360d62c0a6ec9b39309293554765dca8128a2ec5e9",
- "bytes": 13163,
- "width": 640,
- "height": 346,
- "image": "screenshots/03-fox-cover.jpg",
- "cache": "no-cache, private"
- },
- "helpersRestored": true
- }</pre></details><div class="evidence-images "><figure class=""><a href="screenshots/03-fox-cover-editor.png" target="_blank" rel="noopener"><img src="screenshots/03-fox-cover-editor.png" alt="浏览器现场" loading="lazy"></a><figcaption>浏览器现场 · 点击查看原图</figcaption></figure><figure class=""><a href="screenshots/03-fox-cover.jpg" target="_blank" rel="noopener"><img src="screenshots/03-fox-cover.jpg" alt="实际生成封面" loading="lazy"></a><figcaption>实际生成封面 · 点击查看原图</figcaption></figure></div></article><article class="check"><div class="check-title"><h3>5. 注入封面上传503:模型位置保存成功,旧封面保留并提示</h3><span class="badge pass">PASS</span></div><details><summary>检查细节</summary><pre>{
- "details": {
- "httpStatus": 503,
- "contentSaveStatus": 200,
- "originalX": 0.25,
- "savedX": 0.35,
- "coverUnchanged": true
- }
- }</pre></details><div class="evidence-images single"><figure class=""><a href="screenshots/04-upload-failure-content-saved.png" target="_blank" rel="noopener"><img src="screenshots/04-upload-failure-content-saved.png" alt="浏览器现场" loading="lazy"></a><figcaption>浏览器现场 · 点击查看原图</figcaption></figure></div></article><article class="check"><div class="check-title"><h3>6. 实际自动保存周期保存位置变更,不再次上传封面</h3><span class="badge pass">PASS</span></div><details><summary>检查细节</summary><pre>{
- "details": {
- "elapsedMs": 16159,
- "coverUploads": 0,
- "savedX": 0.45,
- "coverUnchanged": true
- }
- }</pre></details><div class="evidence-images single"><figure class=""><a href="screenshots/05-auto-save-no-cover-upload.png" target="_blank" rel="noopener"><img src="screenshots/05-auto-save-no-cover-upload.png" alt="浏览器现场" loading="lazy"></a><figcaption>浏览器现场 · 点击查看原图</figcaption></figure></div></article><article class="check"><div class="check-title"><h3>7. 解除故障并恢复原模型位置:封面再次更新成功</h3><span class="badge pass">PASS</span></div><details><summary>检查细节</summary><pre>{
- "details": {
- "id": "157",
- "name": "实测模型-狐狸动画-已验证-20260905",
- "coverUri": "fsvc://unreal-tran/image/2026/09/05/c09a49efd4423dcf8ccbc46b46d1e209.jpg",
- "versionId": "202",
- "projectVersion": 15,
- "coverAssetId": "2067",
- "sha256": "6ace0cf199626a3e8ecd4b360d62c0a6ec9b39309293554765dca8128a2ec5e9",
- "bytes": 13163,
- "width": 640,
- "height": 346,
- "image": "screenshots/06-fox-restored-cover.jpg",
- "cache": "no-cache, private"
- },
- "helpersRestored": true
- }</pre></details><div class="evidence-images "><figure class=""><a href="screenshots/06-fox-restored-cover-editor.png" target="_blank" rel="noopener"><img src="screenshots/06-fox-restored-cover-editor.png" alt="浏览器现场" loading="lazy"></a><figcaption>浏览器现场 · 点击查看原图</figcaption></figure><figure class=""><a href="screenshots/06-fox-restored-cover.jpg" target="_blank" rel="noopener"><img src="screenshots/06-fox-restored-cover.jpg" alt="实际生成封面" loading="lazy"></a><figcaption>实际生成封面 · 点击查看原图</figcaption></figure></div></article><article class="check"><div class="check-title"><h3>8. 列表显示真实封面;读取失败回退后,同条件搜索可以重试恢复</h3><span class="badge pass">PASS</span></div><details><summary>检查细节</summary><pre>{
- "details": {
- "failedReads": 1,
- "restoredImages": 2,
- "sort": "CREATED_DESC"
- }
- }</pre></details><div class="evidence-images single"><figure class=""><a href="screenshots/07-real-model-covers-list.png" target="_blank" rel="noopener"><img src="screenshots/07-real-model-covers-list.png" alt="浏览器现场" loading="lazy"></a><figcaption>浏览器现场 · 点击查看原图</figcaption></figure></div></article><article class="check"><div class="check-title"><h3>9. 离开缓存列表后取消封面请求并释放Blob URL</h3><span class="badge pass">PASS</span></div><details><summary>检查细节</summary><pre>{
- "details": {
- "releasedUrls": 2
- }
- }</pre></details><div class="evidence-images "></div></article><article class="check"><div class="check-title"><h3>10. 首次导入GLB自动生成封面,模型文件与图片均完成受控绑定</h3><span class="badge pass">PASS</span></div><details><summary>检查细节</summary><pre>{
- "details": {
- "id": "158",
- "source": "01-Box.glb",
- "uploads": [
- {
- "status": 200,
- "type": "MODEL_FILE",
- "code": "MODEL_MTO82QGT_01-BOX"
- },
- {
- "status": 200,
- "type": "IMAGE",
- "code": "MODEL_COVER"
- }
- ],
- "sha256": "6e99933505dfeb91a14d16ef1ddf53df2ea022add1b866de835c08403685b7b6",
- "bytes": 11446,
- "width": 640,
- "height": 346,
- "image": "screenshots/08-import-box-cover.jpg",
- "cache": "no-cache, private"
- }
- }</pre></details><div class="evidence-images "><figure class=""><a href="screenshots/08-import-box-editor.png" target="_blank" rel="noopener"><img src="screenshots/08-import-box-editor.png" alt="浏览器现场" loading="lazy"></a><figcaption>浏览器现场 · 点击查看原图</figcaption></figure><figure class=""><a href="screenshots/08-import-box-cover.jpg" target="_blank" rel="noopener"><img src="screenshots/08-import-box-cover.jpg" alt="实际生成封面" loading="lazy"></a><figcaption>实际生成封面 · 点击查看原图</figcaption></figure></div></article><article class="check"><div class="check-title"><h3>11. 清理首次导入临时模型</h3><span class="badge pass">PASS</span></div><details><summary>检查细节</summary><pre>{
- "details": {
- "id": "158",
- "status": "业务软删除",
- "readAfterDelete": 404
- }
- }</pre></details><div class="evidence-images "></div></article><article class="check"><div class="check-title"><h3>12. 封面读取边界:未登录401、无封面404、图片Range正确</h3><span class="badge pass">PASS</span></div><details><summary>检查细节</summary><pre>{
- "details": {
- "anonymous": 401,
- "missing": 404,
- "range": 206,
- "rangeBytes": 32
- }
- }</pre></details><div class="evidence-images "></div></article><article class="check"><div class="check-title"><h3>13. 最终两条保留模型显示独立封面,创建时间倒序保持</h3><span class="badge pass">PASS</span></div><div class="evidence-images single"><figure class=""><a href="screenshots/09-final-two-covers.png" target="_blank" rel="noopener"><img src="screenshots/09-final-two-covers.png" alt="浏览器现场" loading="lazy"></a><figcaption>浏览器现场 · 点击查看原图</figcaption></figure></div></article><article class="check"><div class="check-title"><h3>14. 全新浏览器会话显示两张持久化封面,重开模型不自动上传图片</h3><span class="badge pass">PASS</span></div><details><summary>检查细节</summary><pre>{
- "details": {
- "projects": [
- {
- "id": "156",
- "status": "PUBLISHED",
- "versionId": "204"
- },
- {
- "id": "157",
- "status": "DRAFT",
- "versionId": "202"
- }
- ],
- "unexpectedUploads": 0
- }
- }</pre></details><div class="evidence-images single"><figure class=""><a href="screenshots/10-fresh-session-covers.png" target="_blank" rel="noopener"><img src="screenshots/10-fresh-session-covers.png" alt="浏览器现场" loading="lazy"></a><figcaption>浏览器现场 · 点击查看原图</figcaption></figure></div></article></div>
- <h2>数据保留与清理</h2><section class="panel"><p>保留156卡车、157狐狸及新封面;卡车恢复已发布,狐狸保留原草稿状态。故障测试位置改动已恢复。158首次导入临时工程已通过业务接口软删除。历史发布版本及封面保留。</p><div class="table-wrap"><table><thead><tr><th>项目</th><th>初始状态</th><th>最终状态</th></tr></thead><tbody><tr><td>156 · 实测模型-牛奶卡车-已验证-20260905</td><td>PUBLISHED</td><td>PUBLISHED</td></tr><tr><td>157 · 实测模型-狐狸动画-已验证-20260905</td><td>DRAFT</td><td>DRAFT</td></tr></tbody></table></div><p>首次导入验证使用的临时项目 158 已通过业务软删除,删除后读取返回 404;报告保留操作证据,不宣称物理文件已删除。</p></section>
- <h2>问题记录</h2><section class="panel"><p>当前证据未登记未解决问题。</p></section>
- <h2>实际命令与结果</h2><section class="panel"><div class="command"><h3>pnpm run build</h3><pre>{
- "status": "PASS",
- "details": "最终web类型检查、Vite构建、10个生成包payload哈希与API桥接/凭据门禁通过;现有Three资源URL与chunk体积警告未阻断构建。"
- }</pre></div><div class="command"><h3>mvn -B -ntp -pl ut_tran -Dtest=ContentProjectServiceTest,ContentAssetServiceTest,ContentControllerRangeTest,ContentAuthorizerTest test</h3><pre>{
- "status": "PASS",
- "details": "Java17,93项通过。"
- }</pre></div><div class="command"><h3>node --test --test-reporter=spec tools/model-cover-capture.test.mjs tools/model-cover-api.test.mjs</h3><pre>{
- "status": "PASS",
- "details": "截图12项+封面事务8项,20/20通过;既有模型API与导入失败保护回归也通过。"
- }</pre></div></section>
- <h2>当前行为与限制</h2><section class="panel"><ul><li>仅手动保存和首次导入模型时生成或更新封面,封面取自当前三维视口。</li><li>自动保存只保存工程变更,不重新截图或上传封面。</li><li>截图或封面上传失败时保留旧封面,并提示失败;工程保存仍按其实际请求结果判断。</li></ul></section>
- <footer>报告由 evidence.json 生成,未修改原始证据。所有引用图片在生成时校验为存在且非空;点击图片可查看原图。</footer>
- </main></body></html>
|