Skip to content

模块:Canvas Editor

唯一职责:承载 Vue Flow 画布容器,协调节点创建、连线交互、视口管理、WebSocket 实时同步。

边界

属于本模块:

  • 初始化 Vue Flow 实例并通过 HTTP API 加载画布数据
  • 建立 WebSocket 连接,管理实时同步生命周期
  • 提供节点创建入口(工具栏对话框、浮动菜单)
  • 连线的全部职责(创建、删除、渲染、持久化、验证、连接角色规则)
  • 管理画布视口(平移、缩放)
  • 展示画布 Header(名称编辑)、Toolbar、Footer(缩放控制、网格切换)
  • 预加载模型列表
  • 节点 Quick Look 预览(空格键触发全屏预览、方向键切换)
  • 追踪鼠标悬浮的节点(hoveredNodeId

不属于本模块:

  • 节点内部的编辑逻辑(由 Node System 模块负责)
  • AI 生成调用(由节点组件 → Services 模块负责)
  • 后端 API 通信细节(由 Services 模块负责)

对外接口

Canvas Editor 是页面组件(路由 /canvas/:id),不对外暴露 API。仅通过路由参数 id 访问,无 props / emits。

消费的接口

依赖模块调用的方法/属性用途
canvasStoreloadCanvas(id)HTTP 加载画布详情
canvasStorecurrentCanvas读取画布名称
canvasStorerenameCanvas(id, name)Header 编辑名称
flowStore(CONNECT 快照初始化)初始化 Vue Flow 节点/边
flowStoreaddNode(type, position)创建节点(乐观 + WS Command)
flowStoreaddEdge(edge)创建连线
flowStoreaddBatchEdges(memberIds, targetId, handleType)批量创建连线
flowStorevalidateEdge(edge)连线前验证
modelsStorefetchAllModels()预加载模型列表
useCanvasWsconnect() / disconnect()管理 WS 连接生命周期
useCanvasWsgetFlowService()获取 FlowService 实例注入 flowStore
useCanvasWsstatus显示连接状态

提供的注入

Key类型消费方
CANVAS_ID_KEYInjectionKey<string>所有子组件(节点、工具栏)
IS_CONNECTING_KEYInjectionKey<Ref<boolean>>NodeShell(连线拖拽视觉反馈)
HOVERED_NODE_ID_KEYInjectionKey<Readonly<Ref<string|null>>>Quick Look(预览目标解析)

不变量

  1. 页面加载时,先 HTTP 获取画布数据,再建立 WS 连接
  2. 如果 canvasId 对应的画布不存在,显示错误页面(含返回 Workspace 入口)
  3. 画布中的持久化节点类型只能是 textimagevideogroup 节点为临时节点,不发送到后端)
  4. 连线创建前必须通过 validateEdge 验证
  5. 离开页面时自动断开 WS 连接并释放资源

错误场景

场景模块行为调用方职责
路由参数 id 对应的画布不存在显示错误提示页面,含返回 Workspace 入口无需处理(页面自身兜底)
WS 连接失败或断线自动重连,连接状态可视化反馈无需处理
modelsStore.fetchAllModels() 网络超时或失败模型下拉列表为空,不阻塞画布加载节点层显示"模型加载失败"提示
WS Command 被 RejectflowStore 回滚乐观更新无需处理

实现位置

角色文件路径
页面app/pages/canvas/[id].vue
核心逻辑app/composables/useCanvasEditor.ts
WS 连接管理app/composables/useCanvasWs.ts
Headerapp/components/canvas/CanvasHeader.vue
Toolbarapp/components/canvas/CanvasToolbar.vue
Footerapp/components/canvas/CanvasFooter.vue
节点类型对话框app/components/canvas/NodeTypeDialog.vue
浮动菜单app/components/canvas/FloatingNodeMenu.vue
浮动菜单逻辑app/composables/useFloatingNodeMenu.ts
Group Nodeapp/components/nodes/GroupNode.vue
Group Node 逻辑app/composables/useGroupNode.ts
连线拖拽路由app/composables/useEdgeConnection.ts
自定义边组件app/components/canvas/SoftBeamEdge.vue
Beam 计算工具app/utils/beam.ts
批量连线预览app/components/canvas/GroupConnectionLine.vue
Quick Look 逻辑app/composables/useQuickLook.ts
Quick Look UIapp/components/canvas/QuickLookOverlay.vue