// File: frontend/app/workflow/page.tsx // Description: 工作流编辑器页面,使用 React Flow 'use client'; // React Flow 需要客户端渲染 import React, { useState, useCallback, useMemo } from 'react'; import ReactFlow, { ReactFlowProvider, // Provider 包裹应用 MiniMap, // 小地图 Controls, // 控制按钮 (缩放, 适应视图) Background, // 背景网格 useNodesState, // Hook 管理节点状态 useEdgesState, // Hook 管理边状态 addEdge, // Helper 函数添加边 Node, // 节点类型 Edge, // 边类型 Connection, // 连接类型 Position, // 用于 Handle 定位 MarkerType, // 用于边箭头类型 NodeChange, // 节点变化类型 EdgeChange, // 边变化类型 applyNodeChanges, // 应用节点变化 applyEdgeChanges, BackgroundVariant, // 应用边变化 } from 'reactflow'; // 引入 React Flow 的 CSS 样式 import 'reactflow/dist/style.css'; // --- 初始节点和边数据 (示例) --- const initialNodes: Node[] = [ { id: '1', type: 'input', // React Flow 内建输入类型节点 data: { label: '开始节点' }, position: { x: 250, y: 5 }, sourcePosition: Position.Bottom, // Handle (连接点) 位置 }, { id: '2', // type: 'default', // 默认类型节点 data: { label: '处理节点 A' }, position: { x: 100, y: 100 }, sourcePosition: Position.Bottom, targetPosition: Position.Top, }, { id: '3', type: 'output', // React Flow 内建输出类型节点 data: { label: '结束节点' }, position: { x: 400, y: 100 }, targetPosition: Position.Top, }, { id: '4', type: 'default', // 自定义节点类型后续添加 data: { label: '处理节点 B' }, position: { x: 250, y: 200 }, sourcePosition: Position.Bottom, targetPosition: Position.Top, }, ]; const initialEdges: Edge[] = [ { id: 'e1-2', source: '1', // 源节点 ID target: '2', // 目标节点 ID label: '数据流 1', // 边标签 (可选) markerEnd: { type: MarkerType.ArrowClosed }, // 箭头样式 }, { id: 'e1-3', source: '1', target: '3', label: '数据流 2', markerEnd: { type: MarkerType.ArrowClosed }, }, { id: 'e2-4', source: '2', target: '4', animated: true, // 动画边 (可选) label: '处理 A -> B', markerEnd: { type: MarkerType.ArrowClosed }, }, ]; // --- 工作流页面组件 --- function WorkflowEditor() { // 使用 React Flow 提供的 Hooks 管理节点和边的状态 const [nodes, setNodes] = useState(initialNodes); const [edges, setEdges] = useState(initialEdges); // 当节点拖动、选择等交互发生时,更新节点状态 const onNodesChange = useCallback( (changes: NodeChange[]) => setNodes((nds) => applyNodeChanges(changes, nds)), [setNodes] ); // 当边发生变化(如删除)时,更新边状态 const onEdgesChange = useCallback( (changes: EdgeChange[]) => setEdges((eds) => applyEdgeChanges(changes, eds)), [setEdges] ); // 当用户拖动创建连接时触发 const onConnect = useCallback( (connection: Connection) => { // 创建新边 const newEdge = { ...connection, id: `e-${connection.source}-${connection.target}-${Math.random()}`, // 简单生成 ID markerEnd: { type: MarkerType.ArrowClosed }, // 添加箭头 // animated: true, // 可以给新连接添加动画 }; setEdges((eds) => addEdge(newEdge, eds)); console.log('连接成功:', connection); }, [setEdges] ); // --- (可选) 自定义节点类型 --- // const nodeTypes = useMemo(() => ({ // customInput: CustomInputNode, // 示例 // llmNode: LLMNode, // 示例 // }), []); return (

工作流编辑器

{/* 设置 React Flow 画布容器的高度 */}
{/* 减去标题栏高度 */} {/* 添加控件 */} {/* 使用点状背景 */} {/* TODO: 添加侧边栏用于拖放节点 */} {/*

节点面板

*/}
); } // --- 主页面组件,包含 Provider --- export default function WorkflowPage() { return ( // ReactFlowProvider 需要包裹使用 useReactFlow hook 的组件 // 如果 WorkflowEditor 内部需要使用 useReactFlow,则 Provider 必须在外层 ); }