ContentProjectsView 的 SCENE 入口。
已验证 · 2026/9/6 18:36:39(北京时间)
112 项功能由本轮浏览器证据验证,7 项由聚焦单元 / 合同证据验证;未验证 0 项。
构建与类型检查:1 / 1 项检查;后端构建与测试:373 / 373 项测试;Node 合同与单元:138 / 138 项测试。
数据清理已验证;临时项目 167 / 167、账号 28 / 28、角色 34 / 34 已清理;原件创作内容、版本、资产与依赖 4 / 4 保持不变。
参考资料中的通用交互要求
沿用前一轮已核对的两份 PDF(共 11 页)。资料中的部件选择、操作步骤、交互反馈和结果追踪,在本轮映射为场景对象摆放、部件能力、稳定资源引用、保存发布及后续训练选用。
维修训练内容设计.pdf · 电器控制系统故障维修脚本.pdf · 前轮场景实测报告(历史参考)
前轮曾把对象树/接口成功误认为狐狸可见,已撤回旧完整通过结论并补视觉验证。本轮要求截图中实际辨认模型,不能仅凭树节点、依赖字段或成功提示判断加载通过。
以当前路由挂载的场景编辑器为准
/content/scenes/:id/edit。
LegacyScenePageView 管理权限、项目、恢复和 FIFO。
demo-src/scene-editor.js 真实 DOM + Three.js。
项目版本、封面、受控资产与发布依赖。
index.ts:123 · 场景制作:列表走真实内容制作 API · LegacyScenePageView.vue:441 · async function mountLegacy · runtime.ts:96 · export function legacySceneRuntimeContext
SceneEditorView → SceneEditorWorkspace 的正式实现仍在源码中,但当前场景路由未挂载。它的额外控件列在“待确认范围”中,不能作为本轮默认入口的已实现/已验证功能。
先约定保存、权限与实例边界
数据闭环
edit3dv4.scene 文档保存对象变换、语义、模型部件覆盖和 rendering;模型以 SCENE_MODEL 固定项目/版本依赖,场景自导入 GLB 使用本项目资产编码。blob 是临时渲染地址。
手动保存同时生成当前视口 JPEG 封面;截图失败保留旧封面并提示,409 不覆盖。800ms 本地恢复缓冲不等于自动写服务器。
权限与生命周期
content.scene 控制页面,create/update/delete/publish 控制实际动作。发布只有权限者可以发布已存版本;编辑后发布必须先完成受 update 保护的保存。
切标签保留编辑状态并暂停渲染;真正离开/关闭/切角色确认未存修改。资源上传、保存和发布均须完整结束或明确阻止离开。
基线风险记录
以下是本轮修复前源码发现,不能代替实际失败复现。已修复时须关联 fixes.json 与新测试,历史风险描述保留追溯。
| 风险 | 基线观察 | 受影响功能 |
|---|---|---|
| 细分权限与旧 runtime 权限码不一致 | 宿主按 content.scene.update,runtime 基线仍含 content.update。 | permission.update、permission.readonly |
| 新建重置当前工程身份 | 基线新建加载当前模板并 reset;需要真实创建 API 与未保存确认。 | project.new |
| 透视与预览写入守卫不完整 | 透视按钮缺实际分支;预览需要同时约束按钮和快捷键。 | view.perspective、preview.lock |
| 异步导入和历史恢复的失败回滚 | 缺失受控资源可能在清空原对象后失败;历史索引需要和真实恢复结果一致。 | json.missing-resource、history.failure |
| 显式资产编码不应静默回退 | 错误 assetCode 回退为首个 READY_MODEL_FILE 可能加载错误模型。 | validation.references、publish.fixed-model |
| 底部日志和绑定状态存在固定文本 | 静态日志不能称实际记录;恒定已绑定不能替代设备字段校验。 | panel.binding、panel.logs |
| 缓存暂停后键盘监听需实际隔离 | 只暂停 RAF 不保证后台编辑器不响应全局键盘。 | lifecycle.cache |
| 原场景 160 的既有模板与对象组合不一致 | 主代理只读核实原件 presetId=workshop-real,objects 仍包含 terrain;这是既往切模板后持久化的旧组合。未推断用户意图改写原件。本轮仅在独立副本通过真实模板替换验证新保存的环境和对象一致。 | project.load、template.switch-cancel、template.workshop-real、template.terrain-1 |
| 来源部件 ID 被多实例共享导致点选串对象 | 本轮双实例验收发现第二实例部件可能复用第一实例 sceneId,选择和覆盖误指向第一实例;修复需按所属根对象隔离身份,同时保留旧单实例兼容与稳定来源标识。 | selection.tree、selection.viewport、part.transform、part.soft-delete |
| 新建选择放弃后创建失败提前丢失 dirty | 最终复核发现放弃旧稿不能在新项目创建前提交,否则POST503会留下旧页面但失去未保存标记和恢复保护。本轮补为创建且导航成功后才提交放弃,并重新加载原缓存内容。 | project.new、recovery.autobuffer、lifecycle.cache |
| 仅以资产 ID 引用时缓存身份不完整 | 最终复核发现省略code和URI、仅提供sourceAssetId/assetId的场景资产可能共用不完整缓存键,导致先前有效结果绕过另一引用校验。补修同时覆盖下载缓存与预检去重。 | validation.references、glb.references |
| 并行 GLB 恢复按完成先后改变对象顺序 | 第二完整轮在保存卡车双实例后重开时复现:各 GLB 加载结束后直接追加根对象,导致同源实例在对象列表中的先后随完成时间变化。修复后等待全部恢复完成,再按原文档顺序提交,拆分数组内部顺序保持;30/1/10ms 延迟合同验证实际完成顺序不同仍能稳定序列化。 | project.load、selection.tree |
默认入口全功能覆盖矩阵
稳定功能 ID · 逐项证据 · 测试分层约定。每项分别说明实现状态、闭环边界与实际证据;各模板与资源单独列明。
工程入口与顶部命令
| 功能 / 执行路径 | 实现 / 对应修复 | 闭环边界 | 证据与验收要求 |
|---|---|---|---|
按真实项目 ID 打开已存场景project.loadLegacyScenePageView.vue:547 · async function loadProject | 本轮修复已完成验证新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。 | 服务端 content 与版本是真值;不得以模板种子覆盖有效旧工程。 | 已验证狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 · browsersuccessful parallel restores retain document order after delayed GLBs and split-object batches finish out of order · unit验收要求独立新会话打开,真实模型可见、固定版本及对象字段一致。 真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
项目或挂载加载失败后重新加载project.retryLegacyScenePageView.vue:76 · mountError | 本轮修复已完成验证前端目录和资源解析同时匹配指定项目、版本、code、id、URI、READY MODEL_FILE;错误引用不回退首文件或本地缓存。仅含 sourceAssetId/assetId 的本项目资源也必须将 ID 纳入缓存/去重键,防止已缓存有效引用掩盖另一个错误ID;失败请求缓存可重试。复制场景保留旧伪 URI 但只读取当前副本资产。 | 错误详情自动消退,保留中性失败状态与重试按钮。 | 已验证加载失败重试与加载互斥:不展示可写半场景、恢复网络后模型完整加载 · browsera failed fixed-version lookup is evicted and the same reference can be retried · unit验收要求注入加载失败;无可写半场景;恢复网络后按钮重试成功。 GET503只留中性失败和重试;延迟受控下载时禁用写入/导出/预览并阻止关闭,释放后真实狐狸加载。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
当前场景名称与项目说明按钮project.titlescene-editor.js:599 · project: () => this.toast | 已有实现已完成验证尚未关联本轮修复记录 | 现有标题显示服务端名称;说明按钮不是重命名输入框。 | 已验证狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 · browser验收要求长名称完整 title 正确;点击说明反映内容 API 管理。 真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。 |
顶部新建独立工程project.newscene-editor.js:575 · new: () => | 本轮修复已完成验证顶部新建委托宿主命名与创建 API,先确认未保存内容。选择放弃也要等创建及导航成功后才清除原 dirty/恢复稿;创建503仍保留原稿。成功后刷新原缓存页,避免再次打开时将已放弃修改冒称已保存。取消、失败不清原场景,成功导航到新项目 ID,并有创建并发守卫。 | 基线代码重置当前模板;本轮由宿主接真实创建 API,必须保留原项目。 | 已验证新建独立场景:取消、失败、保护原工程以及成功新 ID · browser验收要求取消/失败不清原工程;成功新 ID;保存重开与列表对应。 取消命名、创建503保留原工程、创建成功新ID、保存刷新与原工程内容核对。 |
返回场景制作列表并保留场景标签project.backscene-editor.js:598 · back: () => | 已有实现已完成验证尚未关联本轮修复记录 | 平台约定返回列表等同切换标签,保留场景缓存和未存稿,不弹关闭确认;真正关闭标签才询问。 | 已验证发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用 · browser验收要求未存状态返回列表不写服务器、不丢场景;重新点原标签恢复输入和选择。 实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。 |
保存草稿按钮project.savescene-editor.js:1874 · async saveProject() | 本轮修复已完成验证完整 PUT 回写原有相同 SCENE_MODEL 三元组时沿用场景授权边界;新增或改版依赖仍要求来源模型可见及范围权限,不扩大模型页面访问权。 | 只有服务器保存完成才显示成功;本地恢复缓冲不是自动入库。 | 已验证狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 · browser延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突 · browser双标签各自修改场景:保存和明确丢弃当前页均保留另一页真实恢复稿 · browser验收要求编辑后真实 PUT,刷新值一致,version 前进一次。 真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。 延迟真实PUT快照A、重复Ctrl+S不重复请求、期间编辑B仍dirty;再次保存刷新无旧恢复稿误报。 |
Ctrl/Meta+S 保存快捷键project.save-keyscene-editor.js:469 · handleKeyboard(event) | 已有实现已完成验证尚未关联本轮修复记录 | 键盘与按钮走相同保存/权限/忙碌守卫。 | 已验证延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突 · browser牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致 · browser验收要求实际按键触发一次保存;表单内与非表单焦点分别核查。 延迟真实PUT快照A、重复Ctrl+S不重复请求、期间编辑B仍dirty;再次保存刷新无旧恢复稿误报。 实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。 |
保存失败保留修改和恢复稿project.save-failurescene-editor.js:1874 · async saveProject() | 已有实现已完成验证尚未关联本轮修复记录 | 网络失败或业务拒绝不能清 dirty;不弹虚假保存成功。 | 已验证保存失败与封面降级:503 保留草稿,封面上传失败保留旧图,恢复后可重试 · browser验收要求定向 503 后对象/字段保留,恢复后重试与刷新成功。 正文PUT503不清草稿;封面上传503保留旧图但正文可保存;恢复服务后保存刷新。截图异常和409另由聚焦合同验证。 |
409 乐观锁冲突保护project.conflictLegacyScenePageView.vue:432 · function describeSaveError | 已有实现已完成验证尚未关联本轮修复记录 | 服务器最新版本不覆盖;恢复副本可下载/隔离。 | 已验证同版本恢复与 409:真实未保存草稿重载、服务器新版本保护与隔离下载 · browserupload conflict propagates without any content PUT · unit验收要求独立副本制造版本冲突;验证失败提示、旧版本不覆盖与本地稿保留。 真实未存输入产生恢复稿,同版本恢复不自动入库;另一版本先保存后409拒绝覆盖,旧稿隔离下载。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
重复保存与保存中继续编辑project.concurrent-savescene-editor.js:1887 · const saveRevision = this.changeRevision | 本轮修复已完成验证开始保存时取消之前安排的恢复稿定时器,避免它覆盖宿主保存快照 nonce;保存中的后续编辑仍单独保留。 | 提交快照与后续编辑分开;后续修改不能随早先请求完成清掉。 | 已验证延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突 · browser验收要求延迟 PUT、连点保存并继续改值;一次旧提交、新修改仍 dirty。 延迟真实PUT快照A、重复Ctrl+S不重复请求、期间编辑B仍dirty;再次保存刷新无旧恢复稿误报。 |
工程文件与资源导入
| 功能 / 执行路径 | 实现 / 对应修复 | 闭环边界 | 证据与验收要求 |
|---|---|---|---|
导出当前场景 JSONjson.exportscene-editor.js:578 · exportProject() | 已有实现已完成验证尚未关联本轮修复记录 | 导出 edit3dv4.scene、对象/部件覆盖、渲染和稳定资源引用;不冒称自包含 GLB 包。 | 已验证工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返 · browser只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景 · browser验收要求打开下载 JSON 核对内容、结构和无临时 blob 依赖。 真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。 只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。 |
导入有效场景工程 JSONjson.importscene-editor.js:462 · importProject(event) | 本轮修复已完成验证模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。 | 替换当前编辑文档后仍需保存;不得写入另一个项目身份。 | 已验证工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返 · browser验收要求导出后实际文件导入、保存、重开;对象与渲染参数往返一致。 真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。 |
非法 JSON / 错误 schema 拒绝json.invalidscene-editor.js:462 · importProject(event) | 本轮修复已完成验证模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。 | 解析或结构错误不得清空当前场景。 | 已验证工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返 · browser验收要求非法 JSON 与非场景文档各一次,原工程和模型仍可编辑。 真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。 |
JSON 缺失/错误受控引用拒绝与回滚json.missing-resourcescene-editor.js:2016 · async restoreImportedObject | 本轮修复已完成验证模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。;前端目录和资源解析同时匹配指定项目、版本、code、id、URI、READY MODEL_FILE;错误引用不回退首文件或本地缓存。仅含 sourceAssetId/assetId 的本项目资源也必须将 ID 纳入缓存/去重键,防止已缓存有效引用掩盖另一个错误ID;失败请求缓存可重试。复制场景保留旧伪 URI 但只读取当前副本资产。 | 错误资产编码不能回退为另一个模型;恢复失败不半替换。 | 已验证工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返 · browsera failed replacement GLB keeps the previous live scene rather than clearing an unsaved draft · unitan explicit missing code cannot fall back to the first READY asset · unit验收要求导入显式不存在编码/版本;原对象保留或明确阻断,零错误发布。 真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
相机、灯光、雾和环境序列化往返json.renderingscene-editor.js:857 · serializeRendering() | 本轮修复已完成验证透视按钮实际恢复先前观察位置;导入、加载和历史恢复存在已保存相机时不再被车辆自动聚焦覆盖。 | 当前默认 UI 不提供全部渲染编辑器;导入/保存仍须保留其文档参数。 | 已验证工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返 · browserloading and history restoration preserve an authored camera rather than auto-focusing a vehicle · unit验收要求合法带渲染参数文档导入、实际画面比对、保存重开字段一致。 真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
本地 GLB 上传并加入当前场景glb.importscene-editor.js:2122 · async importGLB(event) | 本轮修复已完成验证恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。 | 上传到内容服务,消费票据后解析;对象加入不等于工程已保存。 | 已验证工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返 · browser验收要求真实选择小 GLB,上传/登记/可见/保存重开均完成。 真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。 |
非 GLB / 损坏 GLB / 上传失败处理glb.invalidscene-editor.js:2122 · async importGLB(event) | 已有实现已完成验证尚未关联本轮修复记录 | 上传或解析失败不插入占位对象;原场景应保留,提示可重试。 | 已验证工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返 · browser验收要求错误格式及损坏文件、上传 503;验证对象数/旧资产/后续成功导入。 真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。 |
资源加载/上传期间操作互斥glb.pendingscene-editor.js:1411 · setModelLoading(loading | 已有实现已完成验证尚未关联本轮修复记录 | 加载中的模型不能被半保存、导出或发布;不能离开造成旧请求污染新项目。 | 已验证加载失败重试与加载互斥:不展示可写半场景、恢复网络后模型完整加载 · browserreplacement failure waits for other started loads before restoring the original scene · unitan upload finishing after a project switch cannot register into the new session · unit验收要求延迟下载/上传,操作禁用与待完成状态一致,完成后恢复。 GET503只留中性失败和重试;延迟受控下载时禁用写入/导出/预览并阻止关闭,释放后真实狐狸加载。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
本项目 GLB 稳定资产引用glb.referencesserverAssetStore.ts:113 · async put(blob | 本轮修复已完成验证前端目录和资源解析同时匹配指定项目、版本、code、id、URI、READY MODEL_FILE;错误引用不回退首文件或本地缓存。仅含 sourceAssetId/assetId 的本项目资源也必须将 ID 纳入缓存/去重键,防止已缓存有效引用掩盖另一个错误ID;失败请求缓存可重试。复制场景保留旧伪 URI 但只读取当前副本资产。;新增 SceneResourceReferenceValidator 检查 objects 和递归 splitParts;自有/固定版本资源的所有显式引用必须指向同一 READY 模型文件,错误引用在发布/提交前阻断,保留受控的内置资源和旧引用兼容。 | 自导入使用 content://asset/scene/{projectId}/{assetCode} 和 READY 资产;blob 只供运行。 | 已验证工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返 · browsercopied scene keeps its original pseudo URI but reads its own copied asset by stable code · unit验收要求重新会话受控下载成功,主对象/资产身份一致,无本地缓存依赖。 真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
左侧目录与资源放置
| 功能 / 执行路径 | 实现 / 对应修复 | 闭环边界 | 证据与验收要求 |
|---|---|---|---|
场景大纲 / 资源库 / 场景模板切换panel.left-tabsscene-editor.js:540 · const leftTab = | 已有实现已完成验证尚未关联本轮修复记录 | 切面板不写业务文档;筛选状态行为需一致。 | 已验证模板搜索与未保存切换确认保留和放弃 · e2e验收要求三页签均可达,无 DOM 异常或资源目录中断。 中文/无匹配/清空搜索;真实取消保留对象,真实确认放弃并切换空白模板后保存。 |
对象/部件名称搜索与清空search.treescene-editor.js:627 · renderTree() | 已有实现已完成验证尚未关联本轮修复记录 | 根名与部件名可命中;无匹配状态应清楚,非删除对象。 | 已验证模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开 · e2e验收要求根名/部件名/无结果/清空分别核对行和真实对象数。 API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。 |
资源搜索与异步刷新保留筛选search.assetsscene-editor.js:742 · applyLeftFilter() | 已有实现已完成验证尚未关联本轮修复记录 | 只筛当前目录;异步重绘不复活不匹配卡片。 | 已验证八种基础资源逐项放置、真实拖放、搜索和保存重开 · e2e验收要求命中、无结果、清空,目录重绘后过滤仍正确。 8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。 |
模板搜索与清空search.templatesscene-editor.js:2278 · filterLeft(query) | 已有实现已完成验证尚未关联本轮修复记录 | 模板卡片与同一搜索框联动。 | 已验证模板搜索与未保存切换确认保留和放弃 · e2e验收要求中文模板关键字过滤、无结果和清空。 中文/无匹配/清空搜索;真实取消保留对象,真实确认放弃并切换空白模板后保存。 |
真实已发布模型成果目录assets.catalogcontentApiClient.ts:783 · async listPublishedModels | 本轮修复已完成验证移除 runtime 旧 content.update 门槛,独立计算新建、更新和发布;无模型页面权限时不加载新模型目录,但既有固定依赖仍可按场景授权读取。 | 目录由 API 预加载,当前默认不以 localStorage 发布清单为真值。 | 已验证模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开 · e2e验收要求显示发布模型名称/版本,草稿不冒充已发布,空态可操作。 API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。 |
双击已发布模型放置assets.model-double-clickscene-editor.js:1357 · async placeEditorAsset | 已有实现已完成验证尚未关联本轮修复记录 | 按固定 project/version/assetCode 导入当前实例,继承发布部件和材质。 | 已验证模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开 · e2efresh skinned placement reaches the requested size and floor after authored scale/pose replay · unit验收要求狐狸和卡车分别双击加入、真实可见、保存重开固定版本。 API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
拖入已发布模型放置assets.model-dropscene-editor.js:461 · handleDrop(event) | 已有实现已完成验证尚未关联本轮修复记录 | 拖放实际命中地平面;与双击共用受控资产链路。 | 已验证模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开 · e2efresh skinned placement reaches the requested size and floor after authored scale/pose replay · unit验收要求真实指针拖放到不同位置,坐标/实例数/固定引用准确。 API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
双击基础资源放置assets.basic-double-clickscene-editor.js:429 · onRootDblClick | 本轮修复已完成验证恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。 | 以当前轨道目标落地;每次生成独立对象身份。 | 已验证八种基础资源逐项放置、真实拖放、搜索和保存重开 · e2e验收要求双击生成对象,变换、保存后仍可见。 8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。 |
基础资源拖入与拖放提示assets.basic-dropscene-editor.js:461 · handleDrop(event) | 已有实现已完成验证尚未关联本轮修复记录 | MIME 和 text/plain 回退协议一致;离开视口清提示。 | 已验证八种基础资源逐项放置、真实拖放、搜索和保存重开 · e2e验收要求真实拖放命中位置与 0.5m 吸附、dragleave/drop 提示复位。 8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。 |
打开/返回模型编辑器入口assets.model-linkscene-editor.js:590 · open-model-editor | 本轮修复已完成验证模型来源按钮有来源权限时导航正确项目;无来源页面权限回到可访问列表,不将模型列表误称为来源工程编辑。 | 当前基线只有跳模型列表,来源按钮不得冒称直达正确源项目。 | 已验证model source navigation locates the published owner and falls back without source permission · unit验收要求空资源库和选中模型来源两入口,跳转/未保存保护正确。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
基础资源:液压诊断工位asset.diagnosticscene-editor.js:123 · id: 'diagnostic' | 已有实现已完成验证尚未关联本轮修复记录 | 现有程序化场景资源;名称不代表已连接物理设备或真实人员。 | 已验证八种基础资源逐项放置、真实拖放、搜索和保存重开 · e2e验收要求实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。 8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。 |
基础资源:维修装备主体asset.equipmentscene-editor.js:124 · id: 'equipment' | 已有实现已完成验证尚未关联本轮修复记录 | 现有程序化场景资源;名称不代表已连接物理设备或真实人员。 | 已验证八种基础资源逐项放置、真实拖放、搜索和保存重开 · e2e验收要求实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。 8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。 |
基础资源:检修工作台asset.workbenchscene-editor.js:125 · id: 'workbench' | 已有实现已完成验证尚未关联本轮修复记录 | 现有程序化场景资源;名称不代表已连接物理设备或真实人员。 | 已验证八种基础资源逐项放置、真实拖放、搜索和保存重开 · e2e验收要求实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。 8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。 |
基础资源:器材存放架asset.shelfscene-editor.js:126 · id: 'shelf' | 已有实现已完成验证尚未关联本轮修复记录 | 现有程序化场景资源;名称不代表已连接物理设备或真实人员。 | 已验证八种基础资源逐项放置、真实拖放、搜索和保存重开 · e2e验收要求实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。 8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。 |
基础资源:安全作业区域asset.safety-zonescene-editor.js:127 · id: 'safety-zone' | 已有实现已完成验证尚未关联本轮修复记录 | 现有程序化场景资源;名称不代表已连接物理设备或真实人员。 | 已验证八种基础资源逐项放置、真实拖放、搜索和保存重开 · e2e验收要求实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。 8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。 |
基础资源:视觉采集设备asset.camerascene-editor.js:128 · id: 'camera' | 已有实现已完成验证尚未关联本轮修复记录 | 现有程序化场景资源;名称不代表已连接物理设备或真实人员。 | 已验证八种基础资源逐项放置、真实拖放、搜索和保存重开 · e2e验收要求实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。 8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。 |
基础资源:训练人员占位asset.workerscene-editor.js:129 · id: 'worker' | 已有实现已完成验证尚未关联本轮修复记录 | 现有程序化场景资源;名称不代表已连接物理设备或真实人员。 | 已验证八种基础资源逐项放置、真实拖放、搜索和保存重开 · e2e验收要求实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。 8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。 |
基础资源:区域照明asset.lightscene-editor.js:130 · id: 'light' | 已有实现已完成验证尚未关联本轮修复记录 | 现有程序化场景资源;名称不代表已连接物理设备或真实人员。 | 已验证八种基础资源逐项放置、真实拖放、搜索和保存重开 · e2e验收要求实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。 8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。 |
场地资源:真实装备车库asset.vehicle-depotscene-editor.js:121 · id: 'vehicle-depot' | 已有实现已完成验证尚未关联本轮修复记录 | 整体场地 GLB 与维修车间分开;重复放置按既有规则处理。 | 已验证两种整体场地加载、重复放置阻止与显式删除后替换 · e2e验收要求资源拖放或双击加载、比例/落地正常、重复放置不产生错误重叠。 车库和起伏地形真实加载并分别保存重开;已有整体场地时阻止叠加,显式删除旧场地后才能替换。 |
场地资源:真实野外地形asset.field-terrainscene-editor.js:122 · id: 'field-terrain' | 已有实现已完成验证尚未关联本轮修复记录 | 真实地形资源和指定落地基准;不能以程序地板代替。 | 已验证两种整体场地加载、重复放置阻止与显式删除后替换 · e2e验收要求加载后真实起伏地形可见,保存重开资源、地面高度一致。 车库和起伏地形真实加载并分别保存重开;已有整体场地时阻止叠加,显式删除旧场地后才能替换。 |
全部可达场景模板
| 功能 / 执行路径 | 实现 / 对应修复 | 闭环边界 | 证据与验收要求 |
|---|---|---|---|
真实装备车库template.depot-1scene-editor.js:86 · id: 'depot-1' | 本轮修复已完成验证模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。 | 模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。 | 已验证场景模板实际加载、保存重开:真实装备车库 · e2e验收要求独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。 真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。 |
真实野外训练场template.terrain-1scene-editor.js:87 · id: 'terrain-1' | 本轮修复已完成验证模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。 | 模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。 | 已验证场景模板实际加载、保存重开:真实野外训练场 · e2e验收要求独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。 真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。 |
综合检验车间template.workshop-1scene-editor.js:88 · id: 'workshop-1' | 本轮修复已完成验证模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。 | 模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。 | 已验证场景模板实际加载、保存重开:综合检验车间 · e2e验收要求独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。 真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。 |
演示维修车间(可拆分)template.workshop-realscene-editor.js:89 · id: 'workshop-real' | 本轮修复已完成验证模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。 | 模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。 | 已验证场景模板实际加载、保存重开:演示维修车间(可拆分) · e2e验收要求独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。 真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。 |
总成拆卸车间template.workshop-2scene-editor.js:90 · id: 'workshop-2' | 本轮修复已完成验证模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。 | 模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。 | 已验证场景模板实际加载、保存重开:总成拆卸车间 · e2e验收要求独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。 真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。 |
部件分解车间template.workshop-3scene-editor.js:91 · id: 'workshop-3' | 本轮修复已完成验证模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。 | 模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。 | 已验证场景模板实际加载、保存重开:部件分解车间 · e2e验收要求独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。 真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。 |
清洗检测车间template.workshop-4scene-editor.js:92 · id: 'workshop-4' | 本轮修复已完成验证模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。 | 模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。 | 已验证场景模板实际加载、保存重开:清洗检测车间 · e2e验收要求独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。 真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。 |
复装调试车间template.workshop-5scene-editor.js:93 · id: 'workshop-5' | 本轮修复已完成验证模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。 | 模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。 | 已验证场景模板实际加载、保存重开:复装调试车间 · e2e验收要求独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。 真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。 |
室外综合训练场template.outdoor-1scene-editor.js:94 · id: 'outdoor-1' | 本轮修复已完成验证模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。 | 模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。 | 已验证场景模板实际加载、保存重开:室外综合训练场 · e2e验收要求独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。 真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。 |
未保存模板切换取消template.switch-cancelscene-editor.js:765 · async loadPreset | 本轮修复已完成验证模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。 | 取消保留原场景、选择与 dirty;请求中不能切换半场景。 | 已验证模板搜索与未保存切换确认保留和放弃 · e2e验收要求有未存修改时取消/确认分别验证,取消零对象和服务端变更。 中文/无匹配/清空搜索;真实取消保留对象,真实确认放弃并切换空白模板后保存。 |
三维视口、选择与变换
| 功能 / 执行路径 | 实现 / 对应修复 | 闭环边界 | 证据与验收要求 |
|---|---|---|---|
鼠标旋转相机view.orbitscene-editor.js:379 · new OrbitControls | 已有实现已完成验证尚未关联本轮修复记录 | 相机轨道操作不应误选、拖动物体。 | 已验证真实相机操控、视口拾取、预览禁写和两尺寸主题可读性 · 真实UI+只读投影验收要求实际鼠标拖动,相机变化且对象姿态不变。 |
鼠标平移相机view.panscene-editor.js:379 · new OrbitControls | 已有实现已完成验证尚未关联本轮修复记录 | 轨道目标平移与物体位置分开。 | 已验证真实相机操控、视口拾取、预览禁写和两尺寸主题可读性 · 真实UI+只读投影验收要求实际右键/约定鼠标平移,目标变化且对象数据不变。 |
滚轮缩放相机view.zoomscene-editor.js:379 · new OrbitControls | 已有实现已完成验证尚未关联本轮修复记录 | 改变观察距离,不改对象 scale。 | 已验证真实相机操控、视口拾取、预览禁写和两尺寸主题可读性 · 真实UI+只读投影验收要求滚轮前后模型可见且对象 scale 不变。 |
透视按钮view.perspectivescene-editor.js:259 · data-camera="perspective" | 本轮修复已完成验证透视按钮实际恢复先前观察位置;导入、加载和历史恢复存在已保存相机时不再被车辆自动聚焦覆盖。 | 基线按钮无处理分支;需明确恢复相机视角,不静默无效。 | 已验证真实相机操控、视口拾取、预览禁写和两尺寸主题可读性 · 真实UI+只读投影验收要求顶视切回透视,实际相机位置与激活样式变化。 |
顶视图按钮view.topscene-editor.js:585 · setTopView() | 本轮修复已完成验证透视按钮实际恢复先前观察位置;导入、加载和历史恢复存在已保存相机时不再被车辆自动聚焦覆盖。 | 仍为透视相机顶视位置,不冒称正交投影。 | 已验证真实相机操控、视口拾取、预览禁写和两尺寸主题可读性 · 真实UI+只读投影验收要求实际点击后顶视方向与目标一致。 |
聚焦选中对象view.focusscene-editor.js:586 · focusSelected() | 已有实现已完成验证尚未关联本轮修复记录 | 按对象真实 bounds 调整相机;无选中应提示。 | 已验证真实相机操控、视口拾取、预览禁写和两尺寸主题可读性 · 真实UI+只读投影验收要求狐狸/卡车/环境分别聚焦可见;无选中提示不异常。 |
网格显隐view.gridscene-editor.js:1643 · toggleGrid(button) | 已有实现已完成验证尚未关联本轮修复记录 | 当前视图辅助选项;不默认要求跨重开持久化。 | 已验证真实相机操控、视口拾取、预览禁写和两尺寸主题可读性 · 真实UI+只读投影copies synchronously without bounds, gizmo, grid or selection glow, then restores before JPEG encoding · unit验收要求真实网格出现/消失、状态同步、截图封面不含网格。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
车库外壳完整显示view.enclosure-fullgarage-enclosure.js:377 · createGarageEnclosureControls | 已有实现已完成验证尚未关联本轮修复记录 | 完整显示屋顶/墙体/玻璃;仅车库资源存在时出现控制。 | 已验证牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致 · browser验收要求实际点击、对象材料和显示恢复,状态与画面一致。 实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。 |
车库外壳透明查看view.enclosure-xraygarage-enclosure.js:377 · createGarageEnclosureControls | 已有实现已完成验证尚未关联本轮修复记录 | 车库多种围护材料联动;不等于普通相机透视。 | 已验证牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致 · browser验收要求实际外壳透明且内部模型可辨,材质无串改。 实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。 |
隐藏车库外壳view.enclosure-hiddengarage-enclosure.js:377 · createGarageEnclosureControls | 已有实现已完成验证尚未关联本轮修复记录 | 隐藏围护后保留内部及地面;序列化 enclosureMode 与 dirty 契约须核对。 | 已验证牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致 · browser验收要求隐藏/还原、保存重开和只读浏览行为准确。 实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。 |
点击视口选中根对象/部件selection.viewportscene-editor.js:456 · selectFromViewport(event) | 本轮修复已完成验证新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。 | 只命中真实可选择可见对象;拖相机超过阈值不误选。 | 已验证真实相机操控、视口拾取、预览禁写和两尺寸主题可读性 · 真实UI+只读投影验收要求真实像素点击目标、树/属性/高亮一致,点击空白清选择。 |
大纲根对象与部件选中selection.treescene-editor.js:546 · const treeItem = | 本轮修复已完成验证新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。 | 大纲显示所有可编辑实例和部件;环境锁定提示不是折叠控件。 | 已验证狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 · browsertwo published instances have unique tree part IDs and editing the second persists independently after reopen · unitsuccessful parallel restores retain document order after delayed GLBs and split-object batches finish out of order · unit验收要求树选中与视口高亮/属性联动、筛选后仍可选。 真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
隐藏祖先与软删除部件不可误拾取selection.hiddenscene-selection.js:41 · chooseSceneSelection | 本轮修复已完成验证射线候选逐级检查父级可见性和软删除;删除根对象先恢复高亮材质再释放几何/材质,避免错误拾取及 GPU 资源残留。 | 父隐藏/子隐藏/软删除状态不能被射线重新命中。 | 已验证real Three ray hits on hidden descendants are excluded before selecting a root or part · unit验收要求用重叠模型/部件实测,命中应落可见有效对象。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
选中高亮与恢复原材质selection.highlightscene-editor.js:627 · updateSelectionHighlight() | 本轮修复已完成验证射线候选逐级检查父级可见性和软删除;删除根对象先恢复高亮材质再释放几何/材质,避免错误拾取及 GPU 资源残留。 | 高亮是暂态,不写入模型/场景材质,不进入封面。 | 已验证真实相机操控、视口拾取、预览禁写和两尺寸主题可读性 · 真实UI+只读投影selection highlight cleanup restores source materials and releases its own GPU helper · unitcopies synchronously without bounds, gizmo, grid or selection glow, then restores before JPEG encoding · unit验收要求切换对象/清选择/预览/保存截图后材质原值恢复。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
移动工具及真实 XYZ 手柄transform.translatescene-editor.js:1627 · setTransform(mode) | 已有实现已完成验证尚未关联本轮修复记录 | 对象实例位置;部件按发布能力限制。 | 已验证真实变换手柄移动旋转缩放、吸附与保存重开 · 真实UI手柄+只读几何投影定位验收要求真实拖动平移手柄,属性联动、撤销重做、保存重开一致。 |
旋转工具及真实旋转手柄transform.rotatescene-editor.js:1627 · setTransform(mode) | 已有实现已完成验证尚未关联本轮修复记录 | UI 度数与保存弧度转换;不能仅用脚本改姿态代替拖动。 | 已验证真实变换手柄移动旋转缩放、吸附与保存重开 · 真实UI手柄+只读几何投影定位验收要求实际旋转手柄改变姿态并重开一致。 |
缩放工具及真实缩放手柄transform.scalescene-editor.js:1627 · setTransform(mode) | 本轮修复已完成验证实际手柄跨越枢轴时按既有严格正尺度合同限制,避免产生负或零尺度导致模型翻转或消失;未新增镜像建模功能。 | 归一化模型已有 scale 必须保留,负/零/小值合同明确。 | 已验证真实变换手柄移动旋转缩放、吸附与保存重开 · 真实UI手柄+只读几何投影定位gizmo scaling across its pivot follows the same strictly positive scale contract as inspector edits · unit验收要求真实缩放与属性数值一致;狐狸不突然放成超大或消失。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
W/E/R 快捷键transform.keysscene-editor.js:469 · handleKeyboard(event) | 本轮修复已完成验证预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。 | 键盘焦点在表单时不切工具,失活缓存页不能抢键。 | 已验证真实变换手柄移动旋转缩放、吸附与保存重开 · 真实UI手柄+只读几何投影定位typing undo/redo stays inside text controls and inactive cached editors ignore global shortcuts · unit验收要求视口按键切工具;名称输入包含 w/e/r 正常;只读不改。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
吸附 0.5m 与旋转 15° 开关transform.snapscene-editor.js:581 · toggleSnap() | 已有实现已完成验证尚未关联本轮修复记录 | 开关同时控制拖放/变换吸附;当前视图工具参数与业务值区分。 | 已验证真实变换手柄移动旋转缩放、吸附与保存重开 · 真实UI手柄+只读几何投影定位验收要求开/关实际拖动位置、旋转角度,按钮/页脚状态一致。 |
对象属性、部件与底部面板
| 功能 / 执行路径 | 实现 / 对应修复 | 闭环边界 | 证据与验收要求 |
|---|---|---|---|
显示名称property.namescene-editor.js:437 · handleInput(event) | 本轮修复已完成验证恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。 | 对象/部件 displayName 与项目名称分开。 | 已验证狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 · browser牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致 · browser验收要求修改名称,树/对象条/属性同步,保存重开保留。 真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。 实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。 |
在场景中可见property.visiblescene-editor.js:438 · handleChange(event) | 已有实现已完成验证尚未关联本轮修复记录 | 实例显隐可保存;受保护蒙皮部件不得独立隐藏。 | 已验证狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 · browser模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开 · e2e验收要求开/关可见性、恢复、保存重开,视口与树状态准确。 真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。 API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。 |
可作为实训目标property.operablescene-editor.js:438 · handleChange(event) | 已有实现已完成验证尚未关联本轮修复记录 | operable/capabilities 进入场景定义;不能扩大平台操作权限。 | 已验证狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 · browser验收要求开/关并保存重开,发布数据的目标能力一致。 真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。 |
位置 X/Y/Z 数值property.positionscene-editor.js:437 · handleInput(event) | 已有实现已完成验证尚未关联本轮修复记录 | 三个输入回写局部 position;不使用纯展示假字段。 | 已验证狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 · browser验收要求三个轴独立输入与手柄联动、失焦/history/重开准确。 真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。 |
旋转 X/Y/Z 数值property.rotationscene-editor.js:437 · handleInput(event) | 已有实现已完成验证尚未关联本轮修复记录 | UI 为角度,文档为弧度。 | 已验证狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 · browser验收要求非整角/负角输入、实际姿态与 JSON/重开一致。 真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。 |
缩放 X/Y/Z 数值及有效值property.scalemodelPlacement.ts:36 · parseSceneScale | 本轮修复已完成验证实际手柄跨越枢轴时按既有严格正尺度合同限制,避免产生负或零尺度导致模型翻转或消失;未新增镜像建模功能。 | 支持小数归一化 scale,避免小值格式化成零;非法值不得破坏模型。 | 已验证狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 · browsergizmo scaling across its pivot follows the same strictly positive scale contract as inspector edits · unitscale input accepts real GLTF normalization factors below 0.05 · unit验收要求小正数、负数/零/清空按合同处理,三轴保存往返正常。 真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
设备编号property.device-idscene-editor.js:437 · handleInput(event) | 本轮修复已完成验证恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。 | 根对象绑定字符串;重复/空值由预检与后端核查。 | 已验证狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 · browser验收要求修改后绑定表同步、保存重开,重复值能被阻断。 真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。 |
物模型编号property.model-idscene-editor.js:437 · handleInput(event) | 本轮修复已完成验证恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。 | 与受控 assetCode、来源项目 ID 分开。 | 已验证狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 · browser验收要求修改后只改业务编号,源 GLB 仍加载正确。 真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。 |
语义类型六个选项property.semanticscene-editor.js:438 · handleChange(event) | 已有实现已完成验证尚未关联本轮修复记录 | 实训装备/工位设施/安全区域/采集设备/训练人员/环境设施。 | 已验证狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 · browser验收要求逐项可选且保存重开保留;绑定表显示实际类型。 真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。 |
模型来源与部件权限说明part.sourcescene-editor.js:1520 · renderInspector() | 本轮修复已完成验证模型来源按钮有来源权限时导航正确项目;无来源页面权限回到可访问列表,不将模型列表误称为来源工程编辑。 | 固定模型版本/源节点;蒙皮仅查看高亮,非骨骼独立变换。 | 已验证狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 · browser模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开 · e2e验收要求狐狸蒙皮与卡车刚性部件说明/禁用态准确。 真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。 API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。 |
刚性部件独立变换并保存覆盖part.transformscene-editor.js:1123 · captureModelPartOverrides(root) | 本轮修复已完成验证新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。 | partOverrides 与稳定 interactionId;多个实例互不串改。 | 已验证牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致 · browsertwo published instances have unique tree part IDs and editing the second persists independently after reopen · unitlegacy duplicate instance IDs migrate only later owners in document order despite reversed GLB completion · unit验收要求两卡车实例改单部件,保存重开另一实例不受影响。 实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
部件软删除与恢复part.soft-deletescene-editor.js:588 · deleteSelected() | 本轮修复已完成验证新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。 | 被允许的部件 sceneDeleted/visible 持久化;可撤销恢复。 | 已验证牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致 · browser验收要求实际删除、撤销、保存重开均一致;蒙皮不允许破坏骨架。 实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。 |
删除根对象按钮 / Deleteobject.deletescene-editor.js:588 · deleteSelected() | 本轮修复已完成验证射线候选逐级检查父级可见性和软删除;删除根对象先恢复高亮材质再释放几何/材质,避免错误拾取及 GPU 资源残留。 | 移除当前场景实例,不删除源模型项目/固定发布版本。 | 已验证两种整体场地加载、重复放置阻止与显式删除后替换 · e2edeleting a root disposes its geometry and materials after clearing selection · unit验收要求按钮和键盘各验证;源项目不变,撤销和重开正确。 车库和起伏地形真实加载并分别保存重开;已有整体场地时阻止叠加,显式删除旧场地后才能替换。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
底部对象列表与选中panel.objectsscene-editor.js:1619 · renderBottom(mode | 本轮修复已完成验证设备绑定显示真实语义与未设置;校验按钮进入当前检查面板并随绑定变更刷新;日志记录本次运行实际操作,错误详情保持瞬时提示;摘要超过六项明确完整列表位置。 | 基线显示前 6 个摘要,完整对象仍在大纲;需明确截断。 | 已验证八种基础资源逐项放置、真实拖放、搜索和保存重开 · e2e验收要求大于 6 个对象时列表说明准确,摘要点击选择正确。 8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。 |
设备绑定总表panel.bindingscene-editor.js:1619 · renderBottom(mode | 本轮修复已完成验证设备绑定显示真实语义与未设置;校验按钮进入当前检查面板并随绑定变更刷新;日志记录本次运行实际操作,错误详情保持瞬时提示;摘要超过六项明确完整列表位置。 | 基线语义列恒写已绑定;需要真实类型/缺失/冲突反馈。 | 已验证狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 · browser验收要求编辑字段即时同步,空/重复数据不得假标已绑定。 真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。 |
底部发布检查面板panel.validationscene-editor.js:1619 · renderBottom(mode | 本轮修复已完成验证设备绑定显示真实语义与未设置;校验按钮进入当前检查面板并随绑定变更刷新;日志记录本次运行实际操作,错误详情保持瞬时提示;摘要超过六项明确完整列表位置。 | 显示当前逐项检查,不等于已发布。 | 已验证发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用 · browserverify opens live validation and whitespace binding edits immediately invalidate the active tab · unit验收要求顶部校验/发布失败可定位检查面板,内容随修改更新。 实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
操作日志panel.logsscene-editor.js:1619 · renderBottom(mode | 本轮修复已完成验证设备绑定显示真实语义与未设置;校验按钮进入当前检查面板并随绑定变更刷新;日志记录本次运行实际操作,错误详情保持瞬时提示;摘要超过六项明确完整列表位置。 | 基线为静态示例且误称本地存储;本轮只需真实本次运行日志,不扩展服务端审计。 | 已验证activity log reflects actual session events and keeps API error details transient · unit验收要求实际操作产生对应时间/结果;API 模式不显示本地存储为真值。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
历史与预览
| 功能 / 执行路径 | 实现 / 对应修复 | 闭环边界 | 证据与验收要求 |
|---|---|---|---|
回退按钮 / Ctrl+Zhistory.undoscene-editor.js:2417 · async undo() | 本轮修复已完成验证透视按钮实际恢复先前观察位置;导入、加载和历史恢复存在已保存相机时不再被车辆自动聚焦覆盖。;预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。;文档签名忽略更新时间和对象键顺序;保存后的 undo/redo 根据真实已保存文档判断 dirty;异步恢复失败保留现场并回滚历史索引。 | 输入连续修改合并成合理历史步;恢复对象/模板/选择。 | 已验证牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致 · browsertyping undo/redo stays inside text controls and inactive cached editors ignore global shortcuts · unitloading and history restoration preserve an authored camera rather than auto-focusing a vehicle · unitsave B then undo A stays dirty, and redo B returns to the actual saved baseline · unitdefault history caps at 60 snapshots, stops at either edge and discards redo only after a new branch · unit验收要求属性、添加、删除、模板分别撤销,真实画面与文档一致。 实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
前进按钮 / Ctrl+Y / Ctrl+Shift+Zhistory.redoscene-editor.js:2437 · async redo() | 本轮修复已完成验证预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。;文档签名忽略更新时间和对象键顺序;保存后的 undo/redo 根据真实已保存文档判断 dirty;异步恢复失败保留现场并回滚历史索引。 | 撤销后重做,分叉编辑清 redo。 | 已验证牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致 · browsertyping undo/redo stays inside text controls and inactive cached editors ignore global shortcuts · unitsave B then undo A stays dirty, and redo B returns to the actual saved baseline · unitdefault history caps at 60 snapshots, stops at either edge and discards redo only after a new branch · unit验收要求按钮与两种快捷键各执行;新编辑后旧 redo 不可用。 实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
60 步历史上限与边界history.capacityscene-editor.js:180 · new SceneHistory(60) | 已有实现已完成验证尚未关联本轮修复记录 | 历史属于本次编辑会话;不宣称服务端版本历史。 | 已验证default history caps at 60 snapshots, stops at either edge and discards redo only after a new branch · unit验收要求聚焦测试验证 60 步边界、空 undo/redo 与失焦快照。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
异步历史恢复失败/互斥history.failurescene-editor.js:2328 · async restoreHistoryState | 本轮修复已完成验证文档签名忽略更新时间和对象键顺序;保存后的 undo/redo 根据真实已保存文档判断 dirty;异步恢复失败保留现场并回滚历史索引。 | 失败不能推进索引或丢当前有效场景;忙碌时写操作需一致。 | 已验证failed undo restoration retains live objects and keeps the undo target available for retry · unitreplacement failure waits for other started loads before restoring the original scene · unit验收要求GLB 恢复失败、并发 undo/redo、保存混入均不半提交。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
进入运行预览preview.enterscene-editor.js:583 · togglePreview() | 本轮修复已完成验证预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。 | 当前默认预览只展示场景,未接模型 timeline/blueprint 自动执行。 | 已验证只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景 · browser真实相机操控、视口拾取、预览禁写和两尺寸主题可读性 · 真实UI+只读投影验收要求实际进入,辅助选择/手柄状态正常,模型可见。 只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。 |
按钮 / Escape 退出预览preview.exitscene-editor.js:469 · handleKeyboard(event) | 本轮修复已完成验证预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。 | 退出后恢复编辑选择与状态;不得丢未存变换。 | 已验证只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景 · browser真实相机操控、视口拾取、预览禁写和两尺寸主题可读性 · 真实UI+只读投影preview locks mutation controls and Delete while Escape restores editing · unit验收要求两种退出方式均有效,输入焦点与缓存激活行为正确。 只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
预览中禁止编辑preview.lockscene-editor.js:583 · togglePreview() | 本轮修复已完成验证预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。 | 显示“场景编辑锁定”必须覆盖属性、删除、模板、导入和快捷键。 | 已验证只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景 · browser真实相机操控、视口拾取、预览禁写和两尺寸主题可读性 · 真实UI+只读投影preview locks mutation controls and Delete while Escape restores editing · unit验收要求尝试所有写入口,预览时文档不改变;退出后正常。 只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
保存封面、发布与依赖
| 功能 / 执行路径 | 实现 / 对应修复 | 闭环边界 | 证据与验收要求 |
|---|---|---|---|
保存时截取当前三维场景封面cover.capturesceneCoverCapture.ts:26 · export async function captureSceneCover | 已有实现已完成验证尚未关联本轮修复记录 | JPEG 最大边 640、当前相机;隐藏手柄/网格/高亮且恢复现场。 | 已验证狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 · browsercopies synchronously without bounds, gizmo, grid or selection glow, then restores before JPEG encoding · unit验收要求截图与服务端图片可辨一致,像素实际有模型,UI 状态不被破坏。 真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
封面资产与文档同次保存cover.atomicLegacyScenePageView.vue:47 · saveSceneDocumentWithCover | 已有实现已完成验证尚未关联本轮修复记录 | 封面 upload ticket 与 version 同一次 PUT 消费,不另存过期文档。 | 已验证狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 · browser发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用 · browserscene image ticket, fixed asset replacement, dependencies and coverUri commit in one versioned PUT · unit验收要求检查资产/封面字段/当前版本相同,并真实列表加载图片。 真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。 实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
截图/封面上传失败保留原封面cover.failureLegacyScenePageView.vue:390 · coverFailed | 已有实现已完成验证尚未关联本轮修复记录 | 正文可保存时给真实 warning;409 必须阻断且不得覆盖。 | 已验证保存失败与封面降级:503 保留草稿,封面上传失败保留旧图,恢复后可重试 · browsercapture failure saves content with the previous cover and reports a warning result · unitupload conflict propagates without any content PUT · unit验收要求截图失败、上传503、PUT409各自核对保留/提示/零错误发布。 正文PUT503不清草稿;封面上传503保留旧图但正文可保存;恢复服务后保存刷新。截图异常和409另由聚焦合同验证。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
环境、对象用途、模型加载检查validation.completescene-editor.js:1715 · verifyScene(showToast | 已有实现已完成验证尚未关联本轮修复记录 | 纯环境允许;模型未完成解析必须阻断。 | 已验证发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用 · browser验收要求空地板/纯环境/带模型和加载中分别核对检查结果。 实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。 |
设备/物模型编号完整与唯一validation.bindingsscene-editor.js:1715 · verifyScene(showToast | 本轮修复已完成验证恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。;设备绑定显示真实语义与未设置;校验按钮进入当前检查面板并随绑定变更刷新;日志记录本次运行实际操作,错误详情保持瞬时提示;摘要超过六项明确完整列表位置。 | 空白、重复编号按前后端合同处理,不自动替用户分配新业务身份。 | 已验证发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用 · browsernew resource bindings do not reuse a saved serial after earlier objects were deleted · unitverify opens live validation and whitespace binding edits immediately invalidate the active tab · unit验收要求空、空格、重复与合法编号;错误项可见,发布被阻断。 实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
受控资源引用完整性validation.referencesserverAssetStore.ts:18 · hasReferenceSync | 本轮修复已完成验证前端目录和资源解析同时匹配指定项目、版本、code、id、URI、READY MODEL_FILE;错误引用不回退首文件或本地缓存。仅含 sourceAssetId/assetId 的本项目资源也必须将 ID 纳入缓存/去重键,防止已缓存有效引用掩盖另一个错误ID;失败请求缓存可重试。复制场景保留旧伪 URI 但只读取当前副本资产。;新增 SceneResourceReferenceValidator 检查 objects 和递归 splitParts;自有/固定版本资源的所有显式引用必须指向同一 READY 模型文件,错误引用在发布/提交前阻断,保留受控的内置资源和旧引用兼容。 | project/version/assetCode/sourceAssetId 必须指向实际固定资产,不能只测有字段。 | 已验证工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返 · browseran explicit missing code cannot fall back to the first READY asset · unit验收要求不存在编码/错误资产类型/跨项目引用显式拒绝;正确依赖通过。 真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
发布场景按钮的真实 API 闭环publish.savedscene-editor.js:2213 · async publishScene() | 已有实现已完成验证尚未关联本轮修复记录 | 有编辑权时先保存含封面再发布;两步均成功才显示已发布。 | 已验证发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用 · browser验收要求POST 真正发布当前版本,列表状态与下游目录一致。 实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。 |
只有发布权限时发布已存版本publish.onlyscene-editor.js:335 · if (this.readOnly) | 已有实现已完成验证尚未关联本轮修复记录 | publish-only 不先 PUT、不上传封面、不要求 update;服务器校验真值。 | 已验证仅场景发布权限:浏览器发布已存副本,不发送保存或上传请求 · browser验收要求隔离权限会话发布已存有效版本,零 update/upload 请求。 |
预检/保存/发布失败阻断publish.failurescene-editor.js:2213 · async publishScene() | 本轮修复已完成验证新增 SceneResourceReferenceValidator 检查 objects 和递归 splitParts;自有/固定版本资源的所有显式引用必须指向同一 READY 模型文件,错误引用在发布/提交前阻断,保留受控的内置资源和旧引用兼容。 | 保存失败不 POST 发布;发布失败不假标已发布;保持错误恢复能力。 | 已验证发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用 · browser验收要求预检错误、PUT409/503、POST失败及重试,版本/状态准确。 实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。 |
重复发布与上传/保存队列publish.concurrentLegacyScenePageView.vue:509 · publishDocument: | 已有实现已完成验证尚未关联本轮修复记录 | 整条 POST 完成前仍占 FIFO;重复操作不串版本。 | 已验证role switch waits through validation, save, and the later queued publish after dirty clears · unitproject operation queue serializes upload, save and publish including failures · unit验收要求延迟上传/保存/发布并触发竞争,服务端只有完整合法版本。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
固定 SCENE_MODEL 版本与多个实例publish.fixed-modelcontentApiClient.ts:938 · collectSceneModelDependencies | 本轮修复已完成验证前端目录和资源解析同时匹配指定项目、版本、code、id、URI、READY MODEL_FILE;错误引用不回退首文件或本地缓存。仅含 sourceAssetId/assetId 的本项目资源也必须将 ID 纳入缓存/去重键,防止已缓存有效引用掩盖另一个错误ID;失败请求缓存可重试。复制场景保留旧伪 URI 但只读取当前副本资产。;新增 SceneResourceReferenceValidator 检查 objects 和递归 splitParts;自有/固定版本资源的所有显式引用必须指向同一 READY 模型文件,错误引用在发布/提交前阻断,保留受控的内置资源和旧引用兼容。;完整 PUT 回写原有相同 SCENE_MODEL 三元组时沿用场景授权边界;新增或改版依赖仍要求来源模型可见及范围权限,不扩大模型页面访问权。;新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。 | 去重精确模型版本,不能随模型新发布静默换源版本。 | 已验证发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用 · browser仅场景发布权限:浏览器发布已存副本,不发送保存或上传请求 · browser仅场景编辑权限:固定模型可加载和保存,不能发布或访问模型页面 · browserlegacy duplicate instance IDs migrate only later owners in document order despite reversed GLB completion · unitfixed model reads the exact version and downloads through its visible scene dependency · unitfixed model dependencies are recursively collected, exact and de-duplicated · unit验收要求同模型多实例及另模型新版本,场景重开仍使用所存固定版本。 实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
发布场景供训练选择和静态还原publish.downstreamscene-editor.js:2227 · 场景已发布,训练编排可以引用 | 已有实现已完成验证尚未关联本轮修复记录 | 本轮只验证版本/目标/静态可见性;不承诺模型蓝图或原生动画自动执行。 | 已验证fox:场景发布后在真实训练编排选择、保存并重开静态模型 · browsertruck:场景发布后在真实训练编排选择、保存并重开静态模型 · browser验收要求新场景出现在正式训练目录,绑定后狐狸/卡车可见且目标身份一致。 |
权限、缓存与未保存恢复
| 功能 / 执行路径 | 实现 / 对应修复 | 闭环边界 | 证据与验收要求 |
|---|---|---|---|
场景细分编辑权限permission.updatescene-editor.js:149 · this.readOnly = | 本轮修复已完成验证移除 runtime 旧 content.update 门槛,独立计算新建、更新和发布;无模型页面权限时不加载新模型目录,但既有固定依赖仍可按场景授权读取。;完整 PUT 回写原有相同 SCENE_MODEL 三元组时沿用场景授权边界;新增或改版依赖仍要求来源模型可见及范围权限,不扩大模型页面访问权。 | 只按 content.scene.update;基线残留 content.update 需修,不由角色名推断。 | 已验证只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景 · browser仅场景编辑权限:固定模型可加载和保存,不能发布或访问模型页面 · browserscene granular update permission enables editing without the retired shared code · unitfixed model reads the exact version and downloads through its visible scene dependency · unit验收要求具更新权会话可编辑;无更新权的写入口和接口全部拒绝。 只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
场景细分发布权限permission.publishscene-editor.js:152 · this.canPublish = | 本轮修复已完成验证移除 runtime 旧 content.update 门槛,独立计算新建、更新和发布;无模型页面权限时不加载新模型目录,但既有固定依赖仍可按场景授权读取。 | 页面 content.scene 与 publish 动作分开;更新权不隐含发布。 | 已验证只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景 · browser无场景页面权限:编辑路由和直接内容接口均拒绝访问 · browser仅场景发布权限:浏览器发布已存副本,不发送保存或上传请求 · browser仅场景编辑权限:固定模型可加载和保存,不能发布或访问模型页面 · browser验收要求只更新不能发布;仅发布可发布已存版本;无页面权不可访问。 只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。 |
只读仍可查看、搜索、选中和预览permission.readonlyscene-editor.js:198 · applyAccessMode() | 本轮修复已完成验证移除 runtime 旧 content.update 门槛,独立计算新建、更新和发布;无模型页面权限时不加载新模型目录,但既有固定依赖仍可按场景授权读取。 | 禁写不应误禁观察控件;临时视图不保存到服务器。 | 已验证只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景 · browser后台场景未保存时切换角色:关闭确认保留草稿,保存切换后重建只读权限 · browser验收要求真实键盘搜索、选择、相机、预览,零内容写请求。 只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。 |
800ms 未保存恢复缓冲recovery.autobufferscene-editor.js:654 · markDirty(label | 本轮修复已完成验证顶部新建委托宿主命名与创建 API,先确认未保存内容。选择放弃也要等创建及导航成功后才清除原 dirty/恢复稿;创建503仍保留原稿。成功后刷新原缓存页,避免再次打开时将已放弃修改冒称已保存。取消、失败不清原场景,成功导航到新项目 ID,并有创建并发守卫。;开始保存时取消之前安排的恢复稿定时器,避免它覆盖宿主保存快照 nonce;保存中的后续编辑仍单独保留。 | 仅写隔离浏览器恢复稿,不伪称自动入库。 | 已验证同版本恢复与 409:真实未保存草稿重载、服务器新版本保护与隔离下载 · browser延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突 · browser双标签各自修改场景:保存和明确丢弃当前页均保留另一页真实恢复稿 · browser验收要求实际修改后等待,恢复稿存在但无自动 PUT;手动保存后入库。 真实未存输入产生恢复稿,同版本恢复不自动入库;另一版本先保存后409拒绝覆盖,旧稿隔离下载。 延迟真实PUT快照A、重复Ctrl+S不重复请求、期间编辑B仍dirty;再次保存刷新无旧恢复稿误报。 |
同版本真实未保存恢复recovery.same-versionLegacyScenePageView.vue:46 · sceneRecoveryMatchesProjectVersion | 本轮修复已完成验证文档签名忽略更新时间和对象键顺序;保存后的 undo/redo 根据真实已保存文档判断 dirty;异步恢复失败保留现场并回滚历史索引。;开始保存时取消之前安排的恢复稿定时器,避免它覆盖宿主保存快照 nonce;保存中的后续编辑仍单独保留。 | 先回到视口,须显式保存才入库;相同文档不应产生假恢复。 | 已验证同版本恢复与 409:真实未保存草稿重载、服务器新版本保护与隔离下载 · browser延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突 · browser验收要求真实修改后刷新,恢复/保存/再刷新;无注入假 localStorage 代替。 真实未存输入产生恢复稿,同版本恢复不自动入库;另一版本先保存后409拒绝覆盖,旧稿隔离下载。 延迟真实PUT快照A、重复Ctrl+S不重复请求、期间编辑B仍dirty;再次保存刷新无旧恢复稿误报。 |
不同版本恢复稿隔离recovery.stale-versionLegacyScenePageView.vue:46 · sceneRecoveryMatchesProjectVersion | 已有实现已完成验证尚未关联本轮修复记录 | 旧稿不能自动覆盖新服务器版本;下载供人工合并。 | 已验证同版本恢复与 409:真实未保存草稿重载、服务器新版本保护与隔离下载 · browser验收要求另一会话先保存,新会话面对旧稿只能下载/隔离/明确丢弃。 真实未存输入产生恢复稿,同版本恢复不自动入库;另一版本先保存后409拒绝覆盖,旧稿隔离下载。 |
下载、保留、丢弃恢复稿recovery.discardLegacyScenePageView.vue:223 · async function quarantineRecovery | 已有实现已完成验证尚未关联本轮修复记录 | 关闭/Escape 不算明确丢弃;他会话新写入稿不得被误删。 | 已验证双标签各自修改场景:保存和明确丢弃当前页均保留另一页真实恢复稿 · browserrecovery conflict defaults to preserve and only explicit discard may remove it · unit验收要求按钮逐项核对本地隔离键、下载文件与服务器无意外写入。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
多标签/多会话恢复所有权recovery.multi-sessionLegacyScenePageView.vue:104 · recoveryStoragePrefix | 已有实现已完成验证尚未关联本轮修复记录 | 会话键/nonce/锁避免覆盖别的未存稿;本地缓冲不冒充权限。 | 已验证双标签各自修改场景:保存和明确丢弃当前页均保留另一页真实恢复稿 · browserper-page recovery keys prevent copied tabs from deleting each other checkpoints · unit验收要求两个编辑会话产生不同草稿,保存/丢弃一份不删另一份。 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
关闭场景标签时取消离开leave.cancelLegacyScenePageView.vue:704 · async function confirmLeave | 本轮修复已完成验证关闭单个或批量场景标签先按目标调用缓存守卫;取消或后续保存失败不提交此前放弃决定,全部确认后才关闭并清理。返回列表仍保留缓存,不扩展为强制关闭。 | 关闭确认保留当前 dirty 与恢复副本;返回列表或切普通标签不应提示。 | 已验证后台场景未保存时切换角色:关闭确认保留草稿,保存切换后重建只读权限 · browserclosing one selected scene checks its cached guard, leaves unrelated workspaces alone · unitcancel or failed save in a later tab never commits earlier draft discard · unit验收要求真实关闭确认的关闭/Escape、继续编辑,数据未丢;不把返回列表当关闭。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
保存并离开 / 放弃修改leave.saveLegacyScenePageView.vue:704 · async function confirmLeave | 本轮修复已完成验证关闭单个或批量场景标签先按目标调用缓存守卫;取消或后续保存失败不提交此前放弃决定,全部确认后才关闭并清理。返回列表仍保留缓存,不扩展为强制关闭。 | 等待保存完成并确认最终 dirty;明确放弃只影响当前工程会话。 | 已验证后台场景未保存时切换角色:关闭确认保留草稿,保存切换后重建只读权限 · browsercancel or failed save in a later tab never commits earlier draft discard · unitall successful confirmations commit together and unmounted guards are removed · unit验收要求保存成功才离开;503/409留原页;放弃按确认执行。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
加载/上传/发布途中离开leave.busyLegacyScenePageView.vue:708 · const resourcesBusy = | 已有实现已完成验证尚未关联本轮修复记录 | 资源未就绪阻止离开;进行中的保存/发布须等待最终结果。 | 已验证加载失败重试与加载互斥:不展示可写半场景、恢复网络后模型完整加载 · browserrole switch waits through validation, save, and the later queued publish after dirty clears · unitrole switch rechecks resource uploads started while the save was finishing · unit验收要求延迟资源与提交各验证取消/等待,旧请求不污染新项目。 GET503只留中性失败和重试;延迟受控下载时禁用写入/导出/预览并阻止关闭,释放后真实狐狸加载。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
角色切换覆盖后台场景未存稿leave.role-switchLegacyScenePageView.vue:2 · registerWorkspaceLeaveGuard | 本轮修复已完成验证关闭单个或批量场景标签先按目标调用缓存守卫;取消或后续保存失败不提交此前放弃决定,全部确认后才关闭并清理。返回列表仍保留缓存,不扩展为强制关闭。 | 全体守卫确认后才切角色;后一页取消不能抹掉前页 dirty。 | 已验证后台场景未保存时切换角色:关闭确认保留草稿,保存切换后重建只读权限 · browsercancel or failed save in a later tab never commits earlier draft discard · unitrole switch waits through validation, save, and the later queued publish after dirty clears · unit验收要求含后台场景的切角色确认取消/保存失败/成功后权限重建。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
标签失活 pause / 激活 resumelifecycle.cachescene-editor.js:523 · pause() | 本轮修复已完成验证顶部新建委托宿主命名与创建 API,先确认未保存内容。选择放弃也要等创建及导航成功后才清除原 dirty/恢复稿;创建503仍保留原稿。成功后刷新原缓存页,避免再次打开时将已放弃修改冒称已保存。取消、失败不清原场景,成功导航到新项目 ID,并有创建并发守卫。;预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。;关闭单个或批量场景标签先按目标调用缓存守卫;取消或后续保存失败不提交此前放弃决定,全部确认后才关闭并清理。返回列表仍保留缓存,不扩展为强制关闭。 | 停止后台 RAF、恢复时重算视口;后台实例不能抢当前页键盘。 | 已验证缓存标签暂停键盘、草稿恢复以及关闭取消和保存失败留页 · 真实UI缓存/关闭+浏览器模拟503拒绝写入typing undo/redo stays inside text controls and inactive cached editors ignore global shortcuts · unitclosing one selected scene checks its cached guard, leaves unrelated workspaces alone · unit验收要求两场景标签切换、选择和未存值保留、后台无写/快捷键误动作。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
关闭释放 WebGL/监听/资源lifecycle.destroyscene-editor.js:421 · destroy() | 本轮修复已完成验证射线候选逐级检查父级可见性和软删除;删除根对象先恢复高亮材质再释放几何/材质,避免错误拾取及 GPU 资源残留。;关闭单个或批量场景标签先按目标调用缓存守卫;取消或后续保存失败不提交此前放弃决定,全部确认后才关闭并清理。返回列表仍保留缓存,不扩展为强制关闭。 | 销毁后的异步回调无 DOM 写入,无残留全局事件和资产 URL。 | 已验证deleting a root disposes its geometry and materials after clearing selection · unitselection highlight cleanup restores source materials and releases its own GPU helper · unitall successful confirmations commit together and unmounted guards are removed · unitan upload finishing after a project switch cannot register into the new session · unit验收要求反复打开/关闭、加载中关闭边界,控制台无异常/泄漏事件。 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 实际执行真实方法/纯函数合同,未冒称浏览器操作 |
桌面尺寸与明亮/暗黑可读性lifecycle.resize-themescene-editor.js:414 · resize() | 本轮修复已完成验证原型 CSS 全局重置收敛到场景作用域,降低按钮重置优先级;侧栏、输入、模板、属性和摘要使用正式主题变量,修复白字白底;修复 1440 宽时长工具栏/画布撑开网格覆盖属性栏。 | 继承正式主题;所有可达控件可读、无截断遮挡。 | 已验证真实相机操控、视口拾取、预览禁写和两尺寸主题可读性 · 真实UI+只读投影验收要求1920/1440 下工具栏、属性、模板与弹窗截图,主题切换无低对比。 |
真实浏览器、API、单测分别记录
最终整轮 E2E
首轮记录:32 项通过,1 项失败。关闭保存失败用例的提示定位同时匹配成功和失败消息,已限定目标错误;另补列表搜索遮罩消失后截图的等待条件。此轮记录保留在验证文件中,不计入下列最终整轮结果。
第二轮记录:32 项通过,1 项失败。并行加载同源模型时恢复顺序不稳定;已保留文档对象顺序,并以实例编号验证部件隔离和重开。此轮记录保留在验证文件中,不计入下列最终整轮结果。
| 用例 | 结果 | 耗时 / 证据 |
|---|---|---|
| 加载失败重试与加载互斥:不展示可写半场景、恢复网络后模型完整加载 | 已验证 | 8.7 秒 · 2 个附件 |
| 延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突 | 已验证 | 12.5 秒 · 1 个附件 |
| fox:场景发布后在真实训练编排选择、保存并重开静态模型 | 已验证 | 15.8 秒 · 1 个附件 |
| truck:场景发布后在真实训练编排选择、保存并重开静态模型 | 已验证 | 18.4 秒 · 1 个附件 |
| 仅场景编辑权限:固定模型可加载和保存,不能发布或访问模型页面 | 已验证 | 10.3 秒 · 1 个附件 |
| 仅场景发布权限:浏览器发布已存副本,不发送保存或上传请求 | 已验证 | 7.7 秒 · 1 个附件 |
| 无场景页面权限:编辑路由和直接内容接口均拒绝访问 | 已验证 | 4.8 秒 · 1 个附件 |
| 后台场景未保存时切换角色:关闭确认保留草稿,保存切换后重建只读权限 | 已验证 | 15.1 秒 · 2 个附件 |
| 双标签各自修改场景:保存和明确丢弃当前页均保留另一页真实恢复稿 | 已验证 | 17.4 秒 · 1 个附件 |
| 工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返 | 已验证 | 23.0 秒 · 3 个附件 |
| 保存失败与封面降级:503 保留草稿,封面上传失败保留旧图,恢复后可重试 | 已验证 | 13.8 秒 · 3 个附件 |
| 同版本恢复与 409:真实未保存草稿重载、服务器新版本保护与隔离下载 | 已验证 | 15.9 秒 · 3 个附件 |
| 发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用 | 已验证 | 14.9 秒 · 3 个附件 |
| 场景模板实际加载、保存重开:真实装备车库 | 已验证 | 9.5 秒 · 1 个附件 |
| 场景模板实际加载、保存重开:真实野外训练场 | 已验证 | 10.4 秒 · 1 个附件 |
| 场景模板实际加载、保存重开:综合检验车间 | 已验证 | 8.9 秒 · 1 个附件 |
| 场景模板实际加载、保存重开:演示维修车间(可拆分) | 已验证 | 16.8 秒 · 1 个附件 |
| 场景模板实际加载、保存重开:总成拆卸车间 | 已验证 | 8.8 秒 · 1 个附件 |
| 场景模板实际加载、保存重开:部件分解车间 | 已验证 | 8.8 秒 · 1 个附件 |
| 场景模板实际加载、保存重开:清洗检测车间 | 已验证 | 8.6 秒 · 1 个附件 |
| 场景模板实际加载、保存重开:复装调试车间 | 已验证 | 9.0 秒 · 1 个附件 |
| 场景模板实际加载、保存重开:室外综合训练场 | 已验证 | 8.6 秒 · 1 个附件 |
| 模板搜索与未保存切换确认保留和放弃 | 已验证 | 7.9 秒 · 1 个附件 |
| 八种基础资源逐项放置、真实拖放、搜索和保存重开 | 已验证 | 9.9 秒 · 1 个附件 |
| 两种整体场地加载、重复放置阻止与显式删除后替换 | 已验证 | 14.4 秒 · 2 个附件 |
| 模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开 | 已验证 | 18.8 秒 · 2 个附件 |
| 真实相机操控、视口拾取、预览禁写和两尺寸主题可读性 | 已验证 | 19.0 秒 · 3 个附件 |
| 真实变换手柄移动旋转缩放、吸附与保存重开 | 已验证 | 11.7 秒 · 1 个附件 |
| 缓存标签暂停键盘、草稿恢复以及关闭取消和保存失败留页 | 已验证 | 7.4 秒 · 1 个附件 |
| 狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开 | 已验证 | 11.3 秒 · 2 个附件 |
| 牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致 | 已验证 | 18.2 秒 · 4 个附件 |
| 新建独立场景:取消、失败、保护原工程以及成功新 ID | 已验证 | 25.5 秒 · 2 个附件 |
| 只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景 | 已验证 | 7.1 秒 · 1 个附件 |
Playwright JSON · Playwright HTML。同名旧用例或定向重跑不会覆盖当前完整轮失败。
构建、后端与聚焦单元测试
| 分类 / 检查 | 结果 | 实际数量 | 执行命令 / 说明 |
|---|---|---|---|
| 构建与类型检查 · Web 构建与既有模型产物校验 | 已验证 | 独立检查,不计入测试总数 | pnpm run build |
| 后端构建与测试 · Tran 后端完整构建与测试 | 已验证 | 373 项测试 · 0 失败 | mvn -pl ut_tran -am test package |
| Node 合同与单元 · 场景运行时、资源、关闭守卫与封面合同 | 已验证 | 106 项测试 | 未记录命令 |
| Node 合同与单元 · 场景内容 API 客户端合同 | 已验证 | 32 项测试 | 未记录命令 |
构建与类型检查:1 / 1 项检查;后端构建与测试:373 / 373 项测试;Node 合同与单元:138 / 138 项测试。上述数量分别来自 validation.json,不计入 E2E 数。
数据保留与清理
数据清理已验证;临时项目 167 / 167、账号 28 / 28、角色 34 / 34 已清理;原件创作内容、版本、资产与依赖 4 / 4 保持不变。
测试副本增删会刷新原件引用统计及更新时间;创作内容、版本、资产和依赖未改写,引用数量已恢复,未回填或伪造原更新时间。
| 原始数据 / 版本 | 创作数据比对范围 | 引用数量:测试前 → 清理后 | 更新时间:测试前 → 清理后 | 完整记录 |
|---|---|---|---|---|
| 实测场景-狐狸野外训练区-20260905 · 版本 10 | 创作数据保持不变 全部创作字段、版本、资产、依赖;引用统计与其触发的更新时间单独核对 | 2 → 2 引用数量已恢复 | 2026-09-06T00:28:06 → 2026-09-06T18:24:42 | 存在派生字段差异;详见前后统计 |
| 实测场景-牛奶卡车检验区-20260905 · 版本 7 | 创作数据保持不变 全部创作字段、版本、资产、依赖;引用统计与其触发的更新时间单独核对 | 2 → 2 引用数量已恢复 | 2026-09-05T23:52:35 → 2026-09-06T18:25:00 | 存在派生字段差异;详见前后统计 |
| 实测模型-狐狸动画-已验证-20260905 · 版本 15 | 创作数据保持不变 全部创作字段、版本、资产、依赖;引用统计与其触发的更新时间单独核对 | 1 → 1 引用数量已恢复 | 2026-09-05T22:52:25 → 2026-09-06T18:35:18 | 存在派生字段差异;详见前后统计 |
| 实测模型-牛奶卡车-已验证-20260905 · 版本 20 | 创作数据保持不变 全部创作字段、版本、资产、依赖;引用统计与其触发的更新时间单独核对 | 1 → 1 引用数量已恢复 | 2026-09-05T19:32:28 → 2026-09-06T18:35:18 | 存在派生字段差异;详见前后统计 |
逐项证据索引
最终整轮确认:已完成;最终交付物哈希扫描:通过。
较大调整单列,不纳入本轮通过数
未挂载正式工作区的能力差异
| 能力组 | 当前边界 |
|---|---|
| 正式工作区入口 | SceneEditorView.vue → SceneEditorWorkspace.vue 存在实现;当前场景路由不引用,不能纳入默认入口已通过数。 |
| 对象管理 | 正式工作区有层级折叠、锁定、复制、软删除恢复按钮;默认 legacy 大纲没有对应全部控件。 |
| 变换和相机 | 正式工作区有局部/世界空间、自定义移动吸附、前视/右视、双击与 F 聚焦;默认入口只提供既有 W/E/R、固定吸附、顶视/透视/聚焦。 |
| 材质和阴影 | 正式工作区提供颜色、透明度、投射/接收阴影;默认场景属性没有这些编辑控件,只还原模型发布数据。 |
| 原生动画 | 正式工作区有片段、速度、自动播放、循环和播放按钮;默认 legacy 场景没有这些控件,也未在 animate 中播放模型原生动画。 |
| 运行组件 | 正式工作区有持续旋转/往复/呼吸缩放/热点组件及启用、名称、轴、速度、幅度;默认入口未显示组件页签。 |
| 语义扩展 | 正式工作区有交互标识、标签、能力清单与资源引用详情;默认只有显示名、可见、实训目标、设备/物模型编号和语义类型。 |
| 环境渲染编辑 | 正式工作区有背景/透明背景/曝光/环境强度、半球光/主光、雾范围、车间剖切;默认入口只保存/恢复文档中的渲染参数。 |
| 底部面板 | 正式工作区有真实日志、绑定状态、问题定位、底部折叠;默认入口对应基线有静态信息和六项对象摘要。 |
SceneEditorWorkspace.vue 源码参考。没有可达 UI 的功能不臆造测试、不自动迁入默认入口。
保留的正式工作区额外控件是否迁入默认入口
- 当前行为
- 默认入口为 legacy 场景编辑器。另一份未挂载工作区的额外渲染、组件、动画和布局控件不能计入当前 UI 已闭环。
- 建议确认的范围
- 单独确认所需控件清单和入口迁移范围,优先保留已有场景文档、权限、封面、固定版本与恢复机制。
- 可观察验收
- 所选入口只有一条业务真值链路;既有场景往返不丢字段,权限、导入、保存、发布和截图均完成独立端到端回归。
下游自动执行来源模型时间轴和蓝图
- 当前行为
- 场景当前导入模型几何、部件状态和材质;静态预览不能证明来源模型动作或蓝图在场景和训练中执行。
- 建议确认的范围
- 沿用前轮模型审查的大范围待确认项,单独定义固定版本的运行状态、触发事件、权限、生命周期与训练结果追踪。
- 可观察验收
- 用明确的动作样例验证导入、发布、场景预览、训练运行、停止重置和结果记录;不能只以模型可见或接口引用通过验收。
52 张原图 · 点击放大
失败注入、加载遮罩、环境全景和实际模型可见证据分别写明。故意移动/缩放部件的测试姿态不能误判为加载丢失。

狐狸来源固定模型版本,聚焦后核对真实几何。原场景已有模板标识与地形对象不一致,未擅自推断并改写原件。
01-fox-actual-scene.png
位置、旋转、小数缩放和空绑定保存重开;狐狸蒙皮部件显示只可查看与高亮,独立变换/隐藏禁止。姿态为属性测试值。
02-fox-reopened-skin-protection.png
刚性部件做过独立位移、软删除与撤销恢复;保留的测试姿态不应误判为模型加载损坏,具体值以文档和刷新断言为准。
03-truck-part-history-reopened.png
定向注入创建 POST 503,失败提示为预期分支。用例分别检查保存与选择放弃两种路径;选择放弃也不会在创建失败时清除原 dirty/恢复稿。最终成功创建后,重新打开旧缓存页应显示服务端内容。具体分支以最终断言为准。
04-new-failure-original-preserved.png
新项目具有独立 ID,初始空白模板正常;原项目内容另通过 API 核对保留。
05-new-separate-scene.png
更新、导入、新建、发布等写入口禁用;查看、预览和导出仍可用,直接内容 PUT 返回 403。
06-readonly-scene-permissions.png
实际点击完整模式并核对导出字段;建筑墙体、屋顶与支柱可能遮住内部模型,属于本模式显示范围。
07-garage-full.png
实际点击隐藏外壳,导出后保存并刷新验证模式保留;内部对象不会因为围护隐藏而删除。
07-garage-hidden.png
实际点击透明模式,导出 enclosureMode 同步;透明围护与保留的结构柱区别于模型未加载。
07-garage-xray.png
JSON 明确引用不存在的 assetCode,预期报错;原场景对象仍保留,未回退为其他模型文件。
10-invalid-reference-rolled-back.png
通过文件输入上传测试 Box.glb,受控资产登记后加入场景;与之前故意损坏文件/上传503分支分开验收。
11-small-glb-real-upload.png
有效工程导入后的对象、受控 URI 和渲染参数重开保持。画面相机为测试导入值,不强行套用默认视角。
12-json-glb-reopened.png
注入保存失败,版本未前进且 dirty 保留;红色/警告提示为故障恢复验收的预期画面。
13-save-failure-keeps-draft.png
封面上传被注入503,正文仍可成功保存,真实提示封面降级;不把此步骤记为新封面生成成功。
14-cover-failure-keeps-old-image.png
恢复请求后再次修改并保存、刷新核对内容;先前故障提示若仍处正常消退周期,不改变当前响应和刷新断言。
15-save-retry-success.png
由实际输入产生本地恢复稿,刷新后明确恢复;恢复仅回到当前编辑视口,未自动写入服务器。
16-real-unsaved-recovery.png
另一请求先保存新版本,当前旧会话再保存被拒绝;未存修改保留,不能显示保存成功。
17-conflict-does-not-overwrite.png
旧稿不能直接覆盖最新服务端版本,需明确下载/保留或丢弃;此图用于验证保护提示。
18-stale-recovery-explicit-decision.png
定向注入发布 POST 503;保存和发布为独立结果,项目状态保持 DRAFT,后续恢复才真正发布。
19-publish-failure-stays-draft.png
发布 POST 成功、当前版本与 publishedVersionId 一致;模型来源固定到既有发布版本。
20-scene-published-fixed-version.png
独立副本通过模板按钮加载真实车库,保存后刷新;左侧模板选中状态和画面环境同时核对。
20-template-depot-1.png
返回列表保留编辑器缓存标签;搜索当前项目并验证图片 naturalWidth 大于零,封面来自服务端受控资产。
21-published-scene-cover-in-list.png
真实起伏地形和默认装备、区域、照明种子对象;不把默认装备占位模型误称为狐狸。
21-template-terrain-1.png
此模板设计为锁定地板和零业务对象,空白是正常模板结果;保存刷新后仍为零对象。
22-template-workshop-1.png
通过可拆分模板加载,74 个场景对象保存重开;与整体装备车库为不同资源。
23-template-workshop-real.png
装备主体、工作台和存放架三种种子资源,模板选择、类型和保存刷新一致。
24-template-workshop-2.png
工作台、存放架和视觉采集设备三种种子资源保存重开。
25-template-workshop-3.png
诊断工位、工作台、采集设备和安全区域四种种子资源保存重开。
26-template-workshop-4.png
诊断工位、工作台、照明和人员占位四种种子资源保存重开;占位不代表真实设备接入。
27-template-workshop-5.png
程序化室外场地及三种种子资源,区别于正式起伏地形模板。
28-template-outdoor-1.png
先取消切换确认保留未存对象,再明确放弃并切换;图中空场地是确认后的正常结果。
29-template-confirm-empty.png
8 种资源分别双击并分开摆放,第 9 个工作台通过真实鼠标拖入;保存后核对各对象位置和唯一编号。
30-eight-basic-assets-reopened.png
从空白模板的资源库加载车库并保存重开;已有整体场地时阻止重复叠加。
31-venue-depot-reopened.png
先删除车库,再加入地形;保存刷新确认新场地资产引用与起伏高度,未静默覆盖原场地。
32-venue-terrain-reopened.png
真实资源卡片双击导入当前实例,移动到 X=-3 并聚焦;保留来源项目和已发布固定版本。
33-fox-placed-visible.png
卡车通过鼠标拖入;刚体部件隐藏保存刷新后再恢复可见,取消高亮后展示完整材质。聚焦卡车导致左侧狐狸部分出画,不是狐狸加载丢失。
34-truck-placed-part-restored.png
实际轨道旋转、右键平移、滚轮和点击拾取后检查侧栏、属性和视口;定位钩子只读几何,不修改场景。
40-viewport-dark-1920.png
真实切换主题和浏览器尺寸,检查长工具栏、画布与右侧属性栏不会互相遮挡。
41-viewport-light-1440.png
进入静态场景预览,隐藏选中高亮和手柄并禁止写入;黄色狐狸可见不代表原生动画或蓝图已执行。
42-fox-preview-original-material.png
移动、旋转和单轴缩放后的故意测试姿态;通过真实鼠标命中手柄,只读投影仅用于定位,保存重开再核对数值。
43-real-transform-gizmo.png
切标签保留未存内容、后台快捷键不修改对象;关闭时保存503为预期故障注入,当前场景和未存稿保留。
44-cache-close-save-failure.png
已有固定依赖通过场景授权读取并保存刷新;无模型页面权限,直接来源项目访问和发布接口仍拒绝。
51-scene-update-only-saved.png
真实浏览器仅发送一个发布 POST,没有内容 PUT 或封面上传;发布权限不扩大为编辑权限。
52-scene-publish-only-no-save.png
编辑路由被拦截且直接内容接口返回403;画面不是场景加载成功的证据。
53-scene-route-access-denied.png
关闭未存确认后没有角色 PUT、没有保存请求;返回场景标签仍保留编辑名称和 dirty。
54-scene-role-switch-cancel-keeps-draft.png
明确保存后才切换角色,重新启动拉取新权限;场景名称保存成功,更新和发布入口按新角色禁用。
55-scene-role-switch-saved-readonly.png
A 页保存并明确删除自己的恢复稿,B 页实际输入的未存稿及版本仍保留;未通过伪造 localStorage 构造该分支。
56-scene-other-tab-recovery-preserved.png
项目 GET 503 注入后不展示可写半场景;错误详情由短消息提供,页面仍能重新加载。
60-scene-load-failure-retry.png
真实延迟受控资源下载,视口显示加载状态,保存/导出/发布等操作禁用,关闭被阻止;释放请求后再验证完整加载。
61-model-loading-blocks-partial-save.png
延迟PUT后继续修改名称,先完成的请求只保存A;新修改B保持dirty,重复快捷键不重复提交,随后保存刷新核对B。
62-new-edits-preserved-during-save.png
独立训练副本真实选择新发布场景,保存 TRAINING_SCENE 固定版本并刷新,橙黄色狐狸实际可见;仅验证静态还原。
70-fox-training-scene-reopened.png
独立训练副本绑定新场景固定版本后保存刷新,卡车实际可见;默认车库支柱局部遮挡车身,未将遮挡误认为模型丢失。
70-truck-training-scene-reopened.png