Appearance
模块:State Management
唯一职责:管理全局应用状态(画布编辑状态、工作空间、模型缓存),通过后端 API + WebSocket 同步。
边界
属于本模块:
- 工作空间和画布列表管理(workspaceStore)
- 当前画布元数据状态(canvasStore)
- Vue Flow 节点/边的状态管理与 WS 同步(flowStore)
- 模型列表的异步获取与缓存(modelsStore)
不属于本模块:
- Vue Flow 实例的渲染和交互事件(由 Vue Flow 库 + Canvas Editor 负责)
- HTTP/WS 请求发送(由 Services 模块负责)
- 组件级局部状态
状态同步流
画布加载
节点/连线操作同步
多端同步(Push 事件)
不变量
workspaceStore.fetchWorkspace通过后端 API 获取,workspaceId存入全局状态canvasStore仅持有元数据({ id, name }),不持有 graph 数据flowStore是 Graph 唯一的可变持有者,所有节点/边修改必须通过它flowStore.addEdge/addBatchEdges在添加前必须通过validateEdge,验证失败返回null/ 跳过- 节点增删改通过 WS Command 同步到后端,采用乐观更新 + Accept/Reject 确认
- 节点 ID 由后端生成,创建时先用临时 ID(
nanoid),Accept 后替换为服务端 ID modelsStore.fetchAllModels不重复请求(fetched + loading 防重)modelsStore.getModelInfo(name)返回完整模型信息(含 abilities),供useModelAbilitiescomposable 查询模型能力- Group node(
type === 'group')为临时节点,不发送到后端
错误场景
| 场景 | 模块行为 | 调用方职责 |
|---|---|---|
loadCanvas(id) API 请求失败 | 返回 null,currentCanvas 设为 null | Canvas Editor 显示错误页面 |
fetchWorkspace() 网络请求失败 | error 存储错误信息,isLoading 恢复为 false | 消费方读取 error 展示提示 |
fetchAllModels() 网络请求失败 | error 存储错误信息 | 模型下拉列表为空,显示错误提示 |
| WS Command 被 Reject | flowStore 回滚乐观更新,推送 toast 事件 | 无需额外处理 |
| WS 连接断线 | 自动重连,达上限后提示用户;断线期间画布只读 | Canvas Editor 显示连接状态 |
deleteItem API 失败 | 乐观删除回滚,error 存储信息 | 消费方提示用户 |
实现位置
| 角色 | 文件路径 |
|---|---|
| workspaceStore | stores/workspaceStore.ts |
| canvasStore | stores/canvasStore.ts |
| flowStore | stores/flowStore.ts |
| modelsStore | stores/modelsStore.ts |
| edge-validation | shared/utils/edge-validation.ts |
| 测试 | test/nuxt/flowStore.test.ts |
| 测试 | test/nuxt/canvasStore.test.ts |
| 测试 | test/nuxt/modelsStore.test.ts |