# 模型截图封面验证报告
截图封面功能已实施并完成下列真实浏览器验证:视口截图作为受控图片资产与工程关联保存,列表读取真实封面,模型列表按创建时间倒序显示。
2026-09-05 · http://127.0.0.1:6180 · Microsoft Edge · 教员
证据通过:**14 / 14**;非 PASS:0;已校验图片:15。
## 最终模型封面
### 实测模型-牛奶卡车-已验证-20260905
项目 156;最终状态:PUBLISHED;工程版本 ID:204;封面资产 ID:2055。
[](screenshots/02-truck-new-view.jpg)
### 实测模型-狐狸动画-已验证-20260905
项目 157;最终状态:DRAFT;工程版本 ID:202;封面资产 ID:2067。
[](screenshots/06-fox-restored-cover.jpg)
## 最终列表现场
[](screenshots/09-final-two-covers.png)
## 验证记录
通过统计只认 status 为 PASS;预期故障响应不视为用例失败。
| 序号 | 检查项 | 结果 | 图片 |
|---|---|---|---|
| 1 | 首次手动保存卡车:截取当前场景并绑定JPEG封面 | PASS | [图片 1](screenshots/01-truck-cover-editor.png) · [图片 2](screenshots/01-truck-cover.jpg) |
| 2 | 更换卡车视角再次保存:替换当前封面且辅助控件恢复 | PASS | [图片 1](screenshots/02-truck-new-view-editor.png) · [图片 2](screenshots/02-truck-new-view.jpg) |
| 3 | 更换相机视角更新封面,已发布历史版本保留旧封面 | PASS | [图片 1](screenshots/02-truck-new-view.jpg) |
| 4 | 手动保存狐狸:生成与卡车不同的真实模型封面 | PASS | [图片 1](screenshots/03-fox-cover-editor.png) · [图片 2](screenshots/03-fox-cover.jpg) |
| 5 | 注入封面上传503:模型位置保存成功,旧封面保留并提示 | PASS | [图片 1](screenshots/04-upload-failure-content-saved.png) |
| 6 | 实际自动保存周期保存位置变更,不再次上传封面 | PASS | [图片 1](screenshots/05-auto-save-no-cover-upload.png) |
| 7 | 解除故障并恢复原模型位置:封面再次更新成功 | PASS | [图片 1](screenshots/06-fox-restored-cover-editor.png) · [图片 2](screenshots/06-fox-restored-cover.jpg) |
| 8 | 列表显示真实封面;读取失败回退后,同条件搜索可以重试恢复 | PASS | [图片 1](screenshots/07-real-model-covers-list.png) |
| 9 | 离开缓存列表后取消封面请求并释放Blob URL | PASS | — |
| 10 | 首次导入GLB自动生成封面,模型文件与图片均完成受控绑定 | PASS | [图片 1](screenshots/08-import-box-editor.png) · [图片 2](screenshots/08-import-box-cover.jpg) |
| 11 | 清理首次导入临时模型 | PASS | — |
| 12 | 封面读取边界:未登录401、无封面404、图片Range正确 | PASS | — |
| 13 | 最终两条保留模型显示独立封面,创建时间倒序保持 | PASS | [图片 1](screenshots/09-final-two-covers.png) |
| 14 | 全新浏览器会话显示两张持久化封面,重开模型不自动上传图片 | PASS | [图片 1](screenshots/10-fresh-session-covers.png) |
首次手动保存卡车:截取当前场景并绑定JPEG封面:检查细节
{
"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"
}
更换卡车视角再次保存:替换当前封面且辅助控件恢复:检查细节
{
"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"
}
更换相机视角更新封面,已发布历史版本保留旧封面:检查细节
{
"oldVersionId": "203",
"newVersionId": "204",
"oldSha256": "15caa821e90a70d5b0f8ba1554c0d0d6db332a9b5e53b0d5e94de24d7663533e",
"newSha256": "7b7cc4cc75a3a355f26e2ff15ae1d26b5964ad7b370061691a94ce5f6f4b9158"
}
手动保存狐狸:生成与卡车不同的真实模型封面:检查细节
{
"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"
}
注入封面上传503:模型位置保存成功,旧封面保留并提示:检查细节
{
"httpStatus": 503,
"contentSaveStatus": 200,
"originalX": 0.25,
"savedX": 0.35,
"coverUnchanged": true
}
实际自动保存周期保存位置变更,不再次上传封面:检查细节
{
"elapsedMs": 16159,
"coverUploads": 0,
"savedX": 0.45,
"coverUnchanged": true
}
解除故障并恢复原模型位置:封面再次更新成功:检查细节
{
"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"
}
列表显示真实封面;读取失败回退后,同条件搜索可以重试恢复:检查细节
{
"failedReads": 1,
"restoredImages": 2,
"sort": "CREATED_DESC"
}
离开缓存列表后取消封面请求并释放Blob URL:检查细节
{
"releasedUrls": 2
}
首次导入GLB自动生成封面,模型文件与图片均完成受控绑定:检查细节
{
"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"
}
清理首次导入临时模型:检查细节
{
"id": "158",
"status": "业务软删除",
"readAfterDelete": 404
}
封面读取边界:未登录401、无封面404、图片Range正确:检查细节
{
"anonymous": 401,
"missing": 404,
"range": 206,
"rangeBytes": 32
}
全新浏览器会话显示两张持久化封面,重开模型不自动上传图片:检查细节
{
"projects": [
{
"id": "156",
"status": "PUBLISHED",
"versionId": "204"
},
{
"id": "157",
"status": "DRAFT",
"versionId": "202"
}
],
"unexpectedUploads": 0
}
{
"status": "PASS",
"details": "最终web类型检查、Vite构建、10个生成包payload哈希与API桥接/凭据门禁通过;现有Three资源URL与chunk体积警告未阻断构建。"
}
**mvn -B -ntp -pl ut_tran -Dtest=ContentProjectServiceTest,ContentAssetServiceTest,ContentControllerRangeTest,ContentAuthorizerTest test**
{
"status": "PASS",
"details": "Java17,93项通过。"
}
**node --test --test-reporter=spec tools/model-cover-capture.test.mjs tools/model-cover-api.test.mjs**
{
"status": "PASS",
"details": "截图12项+封面事务8项,20/20通过;既有模型API与导入失败保护回归也通过。"
}
## 当前行为与限制
- 仅手动保存和首次导入模型时生成或更新封面,封面取自当前三维视口。
- 自动保存只保存工程变更,不重新截图或上传封面。
- 截图或封面上传失败时保留旧封面,并提示失败;工程保存仍按其实际请求结果判断。
报告由 evidence.json 生成,未修改原始证据;图片均已校验存在且非空,点击图片可查看原图。