6.3 KiB
6.3 KiB
这是一个非常果断且正确的决策。“重构代码”往往比“重写代码”更痛苦,尤其是当核心架构理念(如从“纯前端逻辑”转向“服务端驱动 UI”)发生根本性转变时。
直接制定一份V2 架构规范白皮书,然后让 Copilot 作为一个“执行者”去填空,是最高效的路径。
这份文档将作为你和 AI 协作的最高宪法。所有后续的代码生成都必须通过这份文档的校验。
🏗️ TraceStudio V2 架构规范白皮书 (The Blueprint)
核心哲学:服务端定义一切,前端只负责渲染。 架构模式:Server-Driven UI + MVVM (Model-View-ViewModel)
1. 顶层设计原则
- Single Source of Truth (SSOT):节点的定义(输入、输出、参数类型、UI 控件类型)完全由后端 Python 代码决定。前端不许硬编码任何节点逻辑。
- Logic/UI Separation:
- Core (逻辑层):纯 TypeScript,无 React 依赖。负责数据模型、API 通信、图算法。
- View (视图层):纯 React。只负责根据 Model 渲染界面,不处理业务逻辑。
- Protocol First:前后端通过标准化的 JSON Schema 通信。
3. 前端目录结构规范 (The Clean Architecture)
基于 V1 的结构进行破坏性重组。严格区分 core 和 components。
web/src/
├── core/ # [逻辑内核] 禁止引入 React
│ ├── model/ # 领域模型 (OOP)
│ │ ├── GraphModel.ts # 图数据结构、连接验证
│ │ ├── NodeModel.ts # 单个节点的行为与状态
│ │ └── PortModel.ts # 端口定义
│ ├── services/ # 基础设施
│ │ ├── ApiService.ts # Axios 封装
│ │ ├── SchemaService.ts # 拉取并缓存后端节点定义
│ │ └── ExecutionService.ts # 负责图执行与 WebSocket 监听
│ ├── store/ # 状态管理 (Zustand)
│ │ ├── graphStore.ts # ViewModel: 持有 GraphModel 实例
│ │ └── uiStore.ts # 界面状态 (侧边栏显隐等)
│ └── registry/ # 注册表
│ └── WidgetRegistry.ts # 映射:Schema Type -> React Component
│
├── components/ # [视图层] 纯 UI
│ ├── _layouts/ # 布局容器 (AppShell, Panel)
│ ├── canvas/ # 画布相关
│ │ ├── GraphCanvas.tsx # ReactFlow 包装器 (只读 props)
│ │ └── controls/ # MiniMap, Zoom
│ ├── nodes/ # 节点渲染
│ │ ├── UniversalNode.tsx # 通用节点外壳 (Header, Ports)
│ │ └── NodeStatus.tsx # 运行状态灯
│ ├── panels/ # 功能面板
│ │ ├── Inspector/ # 属性面板 (重灾区,需严格模块化)
│ │ │ ├── Inspector.tsx # 遍历 NodeModel.params 渲染 Widget
│ │ │ └── widgets/ # 原子控件库 (Slider, ColorPicker)
│ │ └── Library/ # 节点库
│ └── shared/ # 通用原子组件 (Button, Input)
│
└── main.tsx
4. 关键模块实现规范
4.1 通用节点 (UniversalNode)
前端不再为每个节点写组件。
- 输入:接收
NodeModel实例。 - 职责:
- 渲染标题(
model.title)。 - 根据
model.inputs/model.outputs循环渲染<Handle />。 - 渲染状态指示灯(运行中/成功/失败)。 注意:节点本体不渲染参数控件,参数控件只在 Inspector 中显示。
4.2 属性面板 (Inspector) & 控件注册表
这是实现 Server-Driven UI 的核心。
逻辑流程:
- 用户点击节点 ->
uiStore记录activeNodeId。 Inspector组件从 store 获取activeNode(NodeModel)。Inspector读取activeNode.schema.parameters。Inspector遍历参数列表,调用WidgetRegistry.render(param.widgetType, props)。
WidgetRegistry 伪代码:
const registry = {
"TimeSlider": (props) => <Slider min={props.min} max={props.max} ... />,
"Toggle": (props) => <Switch ... />,
"CodeEditor": (props) => <MonacoEditor ... />
};
5. Copilot 执行计划 (Phases)
要求 Copilot 严格按照以下顺序“搭建积木”,切勿跳跃。
✅ Phase 1: 协议与后端基础 (The Foundation)
- 搭建 Python 后端基础框架(FastAPI)。
- 实现
Node基类和@register_node装饰器。 - 实现
/api/schema接口,确保能输出 JSON 定义。 - 目标:不写任何前端代码,仅通过 Postman 验证 Schema 输出。
✅ Phase 2: 前端内核 (The Core)
- 初始化 React + Vite + TypeScript 项目。
- 创建
src/core/model目录,实现GraphModel和NodeModel类。 - 实现
SchemaService,从后端拉取定义并实例化NodeModel。 - 目标:在控制台 (
console.log) 能看到完整的图对象结构,无 UI。
✅ Phase 3: 基础渲染 (The Renderer)
- 集成 React Flow。
- 实现
UniversalNode组件,绑定NodeModel数据。 - 实现
GraphCanvas,能够从graphStore渲染出节点。 - 目标:能看到一个个只有标题和端口的“空盒子”节点,能连线。
✅ Phase 4: 交互与参数 (The Interaction)
- 建立
WidgetRegistry和基础控件(String, Number, Bool)。 - 实现
Inspector面板,点击节点显示动态表单。 - 实现参数修改的双向绑定(UI -> NodeModel)。
- 目标:点击节点,右侧面板根据后端定义自动生成控件,且能修改值。
✅ Phase 5: 执行流 (The Execution)
- 实现前端
ExecutionService,将图序列化发送给后端。 - 实现后端
GraphExecutor,解析拓扑并按顺序调用 Python 节点的execute方法。 - 目标:点击“运行”,后端打印日志,前端节点状态变绿。
下一步指令
如果你同意这份规范,你可以直接向我发送以下指令,我将作为 Phase 1 的开始:
"Gemini,请根据 V2 架构规范,为我生成 Phase 1 (后端基础) 的核心代码。我需要
node_system.py(包含基类和装饰器)以及main.py(FastAPI 入口和 Schema 导出接口)。"