- backend/schemas.py: TemplateUpdate 添加 classes/rules 字段 - backend/models.py: Template 添加 description 列 - backend/routers/templates.py: create/update 打包/解包 mapping_rules.classes (已有) - backend/main.py: seed 腹腔镜胆囊切除术35分类模板 - src/lib/api.ts: updateTemplate 改 PATCH,补齐 color/z_index,_mapTemplate 对齐 TS 接口 - src/store/useStore.ts: 新增 activeTemplateId/setActiveTemplateId - src/components/TemplateRegistry.tsx: 随机颜色(HSL轮盘)、HTML5拖拽排序、批量JSON导入、一键载入腹腔镜模板、handleSave 补齐必填字段 - src/components/OntologyInspector.tsx: 完全重写,从store读取模板,支持模板切换和自定义分类 - src/components/VideoWorkspace.tsx: 进入时自动加载模板列表 - src/components/ProjectLibrary.tsx: 修复状态字符串 TS 严格类型报错 - 工程分析/: 更新实现方案与经验记录 Timestamp: 20260430_222830
3.9 KiB
3.9 KiB
实现方案 — 模板系统与工作区联动改造
后端
1. Template 模型兼容 classes/rules
schemas.py:TemplateBase添加classes: Optional[list[dict]],rules: Optional[list[dict]]routers/templates.py: create/update 时将 classes/rules 打包进mapping_rulesJSON;返回时解包main.py: lifespan 中种子默认模板(腹腔镜胆囊切除术)
2. 预置模板数据
腹腔镜胆囊切除术 35 个分类,RGB 颜色 + 名称数组,存入 mapping_rules.classes
前端
3. TemplateRegistry.tsx 修复
addClass: 使用颜色轮算法(HSL 色相均匀分布)自动生成不同颜色handleSave: 将editClasses打包为{ classes: editClasses, rules: [] }存入mapping_rules- z-index: 添加上下箭头按钮,点击后交换相邻项位置,自动重算 z-index
- 批量导入: 新增"批量导入"按钮,支持粘贴 JSON 数组格式
[colors[], names[]]
4. OntologyInspector.tsx 联动改造
- 从 Zustand store 读取
templates和activeTemplateId - 显示当前激活模板的 classes(真实颜色、名称、z-index)
- 顶部添加模板选择下拉框
- 支持"从模板添加分类"和"自定义添加分类"两种模式
- 分类列表按 z-index 降序排列
5. useStore.ts + api.ts
getTemplates/createTemplate/updateTemplate做mapping_rules↔classes/rules映射
执行记录
2026-04-30 22:38 - 23:00
修改文件清单:
backend/schemas.py:TemplateUpdate添加classes/rules字段backend/models.py:Template添加description列backend/main.py: 已含_seed_default_templates_sync()(腹腔镜35分类模板种子)src/lib/api.ts:_mapTemplate: 移除未在Template接口中定义的color/z_index,避免 TS 编译错误createTemplate: payload 签名增加color/z_index必填字段updateTemplate: 改PUT为PATCH,与后端@router.patch对齐;payload 类型增加color/z_indexcreateProject: 签名增加parse_fps?: number
src/store/useStore.ts: 新增activeTemplateId/setActiveTemplateIdsrc/components/TemplateRegistry.tsx:addClass: 已使用generateColor()(HSL 轮盘)自动分配颜色handleSave: 补齐color和z_index,满足后端TemplateBase必填要求- 拖拽排序: 将上下箭头改为 HTML5 Drag & Drop(
draggable+onDragStart/Drop/End),拖拽时高亮目标位置,释放后自动重算 z-index - 批量导入: 支持
[[colors], [names]]和{colors, names}两种 JSON 格式 - 预置模板: 一键载入腹腔镜胆囊切除术 35 分类
src/components/OntologyInspector.tsx:- 完全重写,从 mock 数据改为读取 Zustand store 的
templates/activeTemplateId - 顶部模板选择下拉框,未选择时默认第一个模板
- 显示模板 classes(颜色方块 + 名称 + z-index)
- 支持添加项目级自定义分类(独立 state,不与模板冲突)
- 完全重写,从 mock 数据改为读取 Zustand store 的
src/components/VideoWorkspace.tsx:- 新增
getTemplates调用,进入工作区时若templates为空则自动加载
- 新增
src/components/ProjectLibrary.tsx: 修复状态字符串比较(TS 严格类型检查报错)
关键 Bug 修复:
updateTemplate前端调用PUT但后端只接受PATCH→ 405 Method Not AllowedcreateTemplatepayload 缺少color/z_index→ 后端TemplateBasevalidation errorTemplateUpdateschema 缺少classes/rules→ update 时分类数据丢失TemplateORM 模型缺少description列 → seed 脚本抛invalid keyword argument_mapTemplate返回color/z_index但TemplateTS 接口未定义 → TS2353
验证结果:
npx tsc --noEmit0 errorsnpm run build成功(dist 生成)- 后端启动成功,自动 seed 腹腔镜胆囊切除术 35 分类模板
- GET
/api/templates返回 35 classes,PATCH update 能正确保存/解包 classes