Skip to content

Architecture

System Overview

StormFlow 前端是基于 Nuxt 4 的单页应用,采用画布 + 节点编排交互方式。用户通过拖拽连接文本/图片/视频节点构建 AI 内容生产流水线,数据通过后端 HTTP API + WebSocket 实时同步。单仓单应用,无 monorepo。

Layer Diagram

依赖规则(严格单向)

  • L3 不直接调用 L1(不跳过 Store 实例化 Service)
  • L1 不导入任何 Vue / Pinia / Vue Flow
  • L0 不导入任何其他层(Nuxt 框架级强制:shared/ 内禁止导入 Vue / Nitro)

Components / Pages 消费 L3,自身不属于架构层。constants/ 存放 UI 专属配置(节点注册表、选项枚举),可被任意层读取。

Domain Model

See source: shared/types/

领域类型由 Nuxt 自动导入,无需手动 import。

文件导出用途
shared/types/node.tsNodeType, NodeStatus, ContentOrigin, NodeBase, TextNodeData, ImageNodeData, VideoNodeData, NodeData, CanvasNode节点辨别联合类型体系
shared/types/edge.tsCanvasEdge连线类型
shared/types/graph.tsGraph, Viewport画布图结构
shared/types/model.tsModelModality, AiModelInfo, AiModel, ModelAbility, AbilityType, AbilityRulesAI 模型类型

NodeData 使用辨别联合(discriminated union),data.type 作为辨别字段,TypeScript narrowing 自然消除类型断言。CanvasNode 为领域层自有类型,不依赖 Vue Flow,但与 Vue Flow 的 Node<NodeData> 结构兼容。

Data Flow

画布加载

节点/连线操作同步

多端同步(Push 事件)

AI 生成

Ownership Rules

Graph 唯一 mutable owner

flowStore 是 Graph 在前端内存中唯一的可变持有者。

  • canvasStore 仅管理画布元数据(name 等),不持有 graph
  • Vue Flow 的渲染状态由 flowStore 单向驱动

Transport 不直接改 graph

Vue Flow 状态边界

归属内容
flowStore(持久化,同步服务端)nodes、edges、viewport、节点数据
Vue Flow only(临时,不持久化)选中态、hover、drag 预览、connection preview

Store → Composable 事件通道

flowStore 通过事件队列向 L3 传递需要 UI 反馈的信号。Store 不产生 UI 副作用(不调用 toast / router)。L3 负责消费事件并转化为用户可见反馈。

WS 协同状态机

后端契约(前置条件)

契约说明
每次连接/重连后,服务端发送 CONNECT 快照前端以此作为唯一权威 graph 初始化/恢复来源
accept 携带完整 VO 数据前端用于 tmpId → serverId 替换
push 不发送给操作发起者前端不做 echo 去重

Pending Mutations

flowStore 内部维护 pending mutations map(key 为 requestId),跟踪每个已发未确认的 WS command 的回滚函数和临时 ID。

事件处理规则

事件处理
CONNECT服务端快照覆盖本地 graph;所有 pending 回滚并清空
accept以 requestId 匹配 pending;替换 tmpId → serverId;移除 pending
reject以 requestId 匹配 pending;执行 rollback;推送事件;移除 pending
push直接应用(服务端不向发起者推送,无需去重)
重连WsClient / FlowService 持续存在,不重建;服务端主动发 CONNECT

冲突规则:服务端快照永远赢。CONNECT 到来时所有本地乐观状态回滚。

断线行为

WS 状态为 reconnecting 时,flowStore 拒绝所有 graph mutation。画布只读,L3 根据 wsStatus 显示提示。

重试策略

层面行为
连接重试WsClient 自动重连,CONNECT 快照恢复状态
命令重试不自动重发;超时后 rollback;CONNECT 兜底

Session 生命周期

WsClient 和 FlowService 与 canvas 页面同生命周期,跨 reconnect 持续存在。

错误分类

类型处理
业务失败(reject)rollback + 事件队列
连接中断自动重连 + 画布只读
命令超时rollback,不重发,CONNECT 兜底
重连后快照覆盖CONNECT 覆盖 + 警告事件

External Integrations

系统用途接口
StormFlow 后端 API画布 CRUD、工作空间管理、AI 生成触发、模型列表HTTP REST(NUXT_PUBLIC_API_BASE
StormFlow WebSocket节点/连线实时同步、AI 生成结果推送WebSocket(Command/Accept/Reject/Push 协议)
腾讯云 COS用户上传的图片/视频存储STS 凭证 + cos-js-sdk-v5 直传,返回 CDN URL

Module Registry

模块契约主要源码
Workspaceworkspace.mdapp/pages/index.vue, stores/workspaceStore.ts
Canvas Editorcanvas-editor.mdapp/pages/canvas/[id].vue, app/composables/useCanvasEditor.ts
Node Systemnode-system.mdapp/components/nodes/
State Managementstate-management.mdstores/
Servicesservices.mdservices/
Shared Typesshared-types.mdshared/types/, shared/utils/