8 类图手工编辑功能 · 设计稿 + 阶段计划v0.2 · 2026-09-09

8 类图手工编辑功能 设计稿 v0.2

目标:让 arch / flow / sm / erd / archd / flowd / seqd / laned 8 类图具备类似页面(GrapesJS)的手工编辑能力 —— 直接改文字、选中节点/连线、发给 agent 修改。先设计,先讨论,不动代码。


0. 现状摘要(摸底结论,先对齐事实再设计)

现状
8 类图归属建模域(DOMAINS.build)下:arch / flow / sm / erd / archd / flowd / seqd / lanedworkbench-panel.js:2286-2293
arch/flow/sm 渲染diagram.js React 组件直接渲染 SVG(in-proc,非 iframe
erd/archd/flowd/seqd/laned 渲染各自 renderer(mermaid-renderer / flowchart-renderer / swimlane-renderer / tech-arch-renderer 等)生成完整 HTML,落盘到 proto-projects.json.charts[type].htmliframe srcdoc 显示
arch/flow/sm 选中已有 protoSel state + 样式面板(节点/连线 fill/stroke/strokeWidth/rx/dash)+ "对话修改" 按钮(chip 注入到 DSH 输入框)
arch/flow/sm 缺失文字直接编辑(contenteditable)、节点/连线增删、拖拽、撤销栈、纯键盘操作
5 类 ChartView完全无选中、无编辑,只有 hover 高亮 + 工具栏(主题/PNG/SVG/重播)
数据源arch/flow/sm ↔ protoDiagram.modules/relations + stateMachine.states/transitions;5 类 ChartView ↔ buildChartJson 实时从 pages/dataModel/ends/stateMachine 生成 + proto.charts.save 落盘
瞄准 → AI 链路pick.js(页面 GrapesJS iframe 用) → aiInject(msg)findComposer()/setComposerValue() 注入到 DSH 对话输入框。架构图已有同款:选中 → "对话修改"按钮 → setComposerValue(ctx)
数据回流arch/flow/sm 走 proto.setDiagram({diagram, keepMeta:true})workbench-panel.js:6680);5 类 ChartView 走 proto.charts.save
撤销栈没有(页面 GrapesJS 自带,但图完全没)

关键发现:arch/flow/sm 已有"半套"编辑能力(样式 + AI 协作),缺的是文字 + 增删 + 撤销;5 类 ChartView 是"零编辑"。


1. 设计目标

  1. 文字即点即改 —— 单击文字进入编辑态,blur/Enter 提交。
  2. 选中节点/连线显示操作面板 —— 删除、改样式、复制、改文字(已经有样式的补"改名"和"删除")。
  3. 选中后能发给 agent —— 复用现有 aiInject,把"节点上下文 + 用户一句话"塞进 DSH 输入框。
  4. 节点/连线增删 + 拖拽 —— 双击空白新增节点;拖节点改位置(arch);拖连线端点改连接。
  5. 撤销栈 —— Ctrl/Cmd+Z / Shift+Z;最起码每图 50 步。
  6. 数据回流 —— 编辑后写回 proto-projects.json,刷新后保留。

不做的(明确边界)


2. 8 类图的可编辑对象矩阵

为什么分两类:arch/flow/sm 是 in-proc React,erd/archd/flowd/seqd/laned 是 iframe srcdoc —— 编辑实现路径根本不同(一个是改 React props,一个是改 iframe DOM + postMessage 回传)。下文称前者为内核图、后者为渲染图表

2.1 内核图(arch / flow / sm)

节点对象节点编辑连线对象连线编辑特殊
archmodule(业务模块)改名、改 desc、改 relatedPages、删/增relation(跨模块数据流)改 label、删、增(同层关系才画,跨层由 parent 表达)拖动节点改位置(斜向对角线布局 → 自由拖拽后要重新对齐?见难点 1)
flowpage(页面节点)改名、删/增(增会自动跳到页面编辑)data-goto 边改 label、删、增节点 click → 打开页面(已有 onNodeClick)
smstate(状态)改名、删/增、改关联 pageIdtransition(迁移)改 trigger / guard、删、增节点 click → 跳到关联 page(已有)

2.2 渲染图表(erd / archd / flowd / seqd / laned)

节点对象节点编辑连线对象连线编辑特殊
erdtable(含字段行)改 table 名、改字段名、改字段类型、增删字段、改字段注释、删表fk 关系删(FK 由字段自动推导,不能手动增)改字段类型会触发"PK/FK 标记重算"
archdmodule同 arch 的 module 编辑link(跨模块数据流)同 arch数据源是 protoDiagram(同 arch),但渲染走 Archify
flowdnode(业务步骤)改名、kind(process/decision/start/end)、删/增edge改 label、改 style(solid/dashed)、删、增节点 type 已限定(start/end/process/decision)
seqdactor(参与者)改名、删/增message改 label、删、增actors 归一化到 L3(修改会触发重归一)
lanedstep(泳道步骤)改名、改 kind、删/增、跨泳道拖动connection(跨泳道连线)改 label、改 style、删、增跨泳道拖动会触发 lane 归属变化

3. 通用编辑模式(四层叠加)

每一类图的编辑 UI 都由这四层叠加组成,缺哪一层看具体图的复杂度。

┌────────────────────────────────────────────────────────┐
│  L1 直接编辑(文字即点即改)                              │
│    - 单击文字 → contenteditable → blur 提交 → 写回 spec    │
├────────────────────────────────────────────────────────┤
│  L2 选中态(高亮 + 操作面板)                            │
│    - 点节点/连线 → store.protoSel / chartSel             │
│    - 浮动面板:改名/删/改样式/复制/AI 协作                │
├────────────────────────────────────────────────────────┤
│  L3 增删拖拽                                             │
│    - 工具栏按钮 / 右键菜单 / 双击空白                    │
│    - 拖动节点改位置 / 拖连线端点改连接                    │
├────────────────────────────────────────────────────────┤
│  L4 协作回传(chip → AI)                                │
│    - 复用 aiInject → 选中上下文 + 用户一句话进 DSH       │
│    - agent 修改后调 proto.setDiagram / proto.charts.save │
└────────────────────────────────────────────────────────┘

统一交互规则(所有图通用)


4. 内核图(arch / flow / sm)的具体设计

4.1 文字即点即改(L1)

实现思路:双击节点文字 → 把当前 元素切换成 contenteditable ,blur/Enter 提交。问题是 diagram.js 当前用 SVG (不是 HTML),改文字后 SVG 不会自动重新布局。两种处理:

建议:方案 A,更稳。

4.2 选中态面板增强(L2)

当前已有样式面板(fill/stroke/dash),补:

4.3 增删拖拽(L3)

新增节点

新增连线

拖动节点(仅 arch)

删除节点

4.4 撤销栈(L4 撤销/重做)

栈结构:每张图一个 undoStack: Array<{spec, label}> + redoStack: Array<...>,每次写回 store 时推一条,容量 50。

关键决策