# flow_engine **Repository Path**: fjxylin/flow_engine ## Basic Information - **Project Name**: flow_engine - **Description**: vue3+ts的流程引擎demo - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-06-29 - **Last Updated**: 2025-10-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 流程引擎 (Flow Engine) 基于 Vue3 + TypeScript 开发的流程设计引擎,参考 bpmn.js 的设计思路,支持可视化流程建模。 ## 🚀 功能特性 ### 核心功能 - **拖拽式节点创建**: 从左侧节点库拖拽节点到画布 - **可视化连线**: 点击节点连接点创建连线 - **历史记录系统**: 完整的撤销(Ctrl+Z)/重做(Ctrl+Y)功能,支持50步历史记录 - **节点类型支持**: - 开始节点 (圆形,绿色) - 结束节点 (圆形,红色) - 任务节点 (矩形,蓝色) - 判断节点 (菱形,橙色) - 并行节点 (矩形,灰色) - 合并节点 (矩形,深灰色) ### 交互功能 - **节点操作**: - **网格对齐拖拽**: 节点移动自动吸附到网格点 - 单击选择节点 - **双击编辑节点名称** (内联编辑器) - **右键菜单**: 编辑、删除选项 - **Delete键删除**: 选中后按Delete/Backspace键删除 - **连线操作**: - 点击连接点开始连线 - **直线连接**: 简洁的直线连接,端点自动对齐网格 - **连线实时预览**: 跟随鼠标移动的直线预览 - **右键或ESC键取消连线** (带视觉提示) - **双击编辑连线标签** (内联编辑器) - **右键菜单**: 编辑标签、删除连线 - **Delete键删除**: 选中后按Delete/Backspace键删除 - 设置连线条件和标签 - **画布操作**: - **智能网格**: 20px网格系统,所有元素自动对齐 - 鼠标滚轮缩放 - 中键拖拽平移画布 - 框选多个元素 - **点击空白区域取消选中**: 点击画布空白处取消所有选中状态 ### 工具功能 - **文件操作**: - 保存流程为JSON文件 - 导入流程文件 - 清空画布 - **视图控制**: - 缩放控制 (10% - 300%) - 视图重置 - **属性编辑**: - 节点属性编辑 - 连线条件设置 - 实时属性面板 ## 🛠 技术栈 - **前端框架**: Vue 3 + TypeScript - **状态管理**: Pinia - **UI组件库**: Element Plus - **样式预处理**: SCSS - **构建工具**: Vue CLI - **图形渲染**: SVG + HTML Canvas ## 📦 项目结构 ``` src/ ├── components/ │ └── FlowEngine/ # 流程引擎组件 │ ├── index.vue # 主容器组件 │ ├── FlowCanvas.vue # 画布组件 │ ├── FlowNode.vue # 节点组件 │ ├── FlowEdge.vue # 连线组件 │ └── NodePalette.vue # 节点面板 ├── stores/ │ └── flowStore.ts # 流程状态管理 ├── types/ │ └── flow.ts # 类型定义 └── main.ts # 应用入口 ``` ## 🚀 快速开始 ### 环境要求 - Node.js >= 16 - npm >= 7 ### 安装依赖 ```bash npm install ``` ### 启动开发服务器 ```bash npm run serve ``` ### 构建生产版本 ```bash npm run build ``` ## 📖 使用指南 ### 1. 创建节点 - 从左侧节点库拖拽节点到画布 - **网格对齐**: 节点自动吸附到20px网格点,确保整齐排列 - 节点会自动生成唯一ID - 可通过右侧属性面板编辑节点属性 ### 2. 连接节点 - 将鼠标悬停在节点上显示连接点 - 点击源节点的连接点开始连线 - **直线连接**: 简洁的直线连接,无多余弯曲 - **网格对齐**: 连线端点对齐到网格,线条更整齐 - **实时预览**: 连线跟随鼠标移动,显示直线预览 - **右键点击或按ESC键可以取消连线操作** ✨ - 点击目标节点的连接点完成连线 - 支持设置连线条件和标签 ### 3. 编辑属性 - **快速编辑**: 双击节点或连线可直接编辑名称/标签 - **内联编辑器**: 支持实时编辑,Enter键保存,ESC键取消 - **失焦保存**: 点击其他地方自动保存编辑内容 - **属性面板**: 单击选择节点或连线,在右侧面板编辑详细属性 ### 4. 删除操作 - **键盘删除**: 选中节点或连线后按Delete或Backspace键删除 - **右键删除**: 右键点击节点或连线,选择"删除"选项 - **多选删除**: 可同时选中多个元素后批量删除 - **取消选中**: 点击画布空白区域取消所有选中状态 ### 5. 画布操作 - **缩放**: 鼠标滚轮 - **平移**: 中键拖拽 - **选择**: 左键点击或框选 - **清空**: 工具栏清空按钮 ### 6. 历史记录操作 - **撤销**: Ctrl+Z 或点击工具栏撤销按钮 - **重做**: Ctrl+Y 或 Ctrl+Shift+Z 或点击工具栏重做按钮 - **历史状态**: 工具栏显示当前步骤数和总步骤数 - **智能记录**: 只记录有意义的操作,选择状态变化不会产生历史记录 - **防抖优化**: 拖动过程中不会产生大量历史记录,只在开始和结束时记录 ### 7. 文件操作 - **保存**: 导出为JSON格式流程文件 - **导入**: 支持导入之前保存的流程文件 - **格式**: 标准JSON格式,便于集成 ## 📊 系统架构 ### 操作步骤流程图 以下流程图展示了用户与流程引擎的完整交互流程: ```mermaid flowchart TD A["启动应用"] --> B["初始化FlowStore"] B --> C["初始化历史记录"] C --> D["显示空白画布"] D --> E{"用户操作选择"} E -->|拖拽节点面板| F["创建新节点"] E -->|点击节点/连线| G["选择元素"] E -->|拖拽节点| H["移动节点位置"] E -->|双击元素| I["编辑标签"] E -->|连接点拖拽| J["创建连线"] E -->|右键菜单| K["删除元素"] E -->|Ctrl+Z| L["撤销操作"] E -->|Ctrl+Y| M["重做操作"] E -->|保存按钮| N["导出流程文件"] E -->|导入按钮| O["加载流程文件"] E -->|清空按钮| P["清空画布"] E -->|缩放操作| Q["调整视图"] F --> R["保存到历史记录"] G --> S["更新选择状态"] H --> T["网格吸附
显示辅助线"] I --> U["保存标签更改"] J --> V["验证连接有效性"] K --> W["确认删除对话框"] R --> X["更新画布显示"] S --> X T --> R U --> R V --> R W --> R L --> Y["恢复历史状态"] M --> Y N --> Z["下载JSON文件"] O --> AA["解析并导入数据"] P --> BB["清空所有数据"] Q --> CC["更新视口参数"] X --> E Y --> X Z --> E AA --> X BB --> X CC --> X ``` ### 数据流向架构图 以下流程图展示了数据在整个应用架构中的流动: ```mermaid flowchart TD A["用户界面层
FlowEngine/index.vue"] --> B["工具栏组件"] A --> C["画布容器
FlowCanvas.vue"] A --> D["属性面板"] A --> E["节点面板
NodePalette.vue"] E -->|拖拽事件| F["创建节点数据"] C -->|包含| G["FlowNode组件"] C -->|包含| H["FlowEdge组件"] C -->|包含| I["ContextMenu组件"] G -->|节点操作| J["FlowStore
状态管理中心"] H -->|连线操作| J I -->|菜单操作| J F --> J J --> K["核心状态数据"] K --> L["nodes: FlowNode[]
节点数组"] K --> M["edges: FlowEdge[]
连线数组"] K --> N["selectedNodes: string[]
选中节点ID"] K --> O["selectedEdges: string[]
选中连线ID"] K --> P["viewport: Viewport
视口信息"] K --> Q["history: HistoryState[]
历史记录"] K --> R["guideLines: GuideLine[]
辅助线数据"] J -->|响应式更新| S["计算属性Getters"] S --> T["getSelectedNodes
获取选中节点"] S --> U["getSelectedEdges
获取选中连线"] S --> V["canUndo/canRedo
历史记录状态"] S --> W["historyInfo
历史信息"] J -->|状态变更| X["Actions方法"] X --> Y["addNode/updateNode/deleteNode
节点操作"] X --> Z["addEdge/updateEdge/deleteEdge
连线操作"] X --> AA["saveToHistory
历史记录管理"] X --> BB["undo/redo
撤销重做"] X --> CC["selectNode/selectEdge
选择管理"] J -->|数据持久化| DD["外部存储"] DD --> EE["导出JSON文件
saveFlow()"] DD --> FF["导入JSON文件
loadFlow()"] DD --> GG["浏览器本地存储
(可扩展)"] S -->|数据绑定| A X -->|触发更新| A style J fill:#e1f5fe style K fill:#f3e5f5 style DD fill:#e8f5e8 ``` ### 架构特点 - **🔄 响应式数据流**: Vue3 + Pinia实现的响应式状态管理 - **📝 历史记录系统**: 完整的撤销/重做功能支持,带防抖优化 - **🧩 组件化架构**: 清晰的组件分工和数据传递,高内聚低耦合 - **✨ 用户体验优化**: 网格吸附、辅助线、实时预览等细节优化 - **🎯 TypeScript支持**: 完整的类型安全保障 - **📊 状态管理**: 集中式状态管理,便于维护和调试 ## 🔧 自定义开发 ### 添加新节点类型 1. 在 `types/flow.ts` 中定义新的节点类型 2. 在 `FlowNode.vue` 中添加节点样式和图标 3. 在 `NodePalette.vue` 中添加到节点库 ### 扩展连线功能 1. 在 `FlowEdge.vue` 中修改连线渲染逻辑 2. 在 `flowStore.ts` 中扩展连线数据结构 3. 添加新的连线类型和样式 ### 集成到现有项目 ```javascript // 安装依赖 npm install pinia element-plus uuid // 引入组件 import FlowEngine from './components/FlowEngine/index.vue' import { useFlowStore } from './stores/flowStore' // 使用 ``` ## 🎯 设计理念 本流程引擎参考了 bpmn.js 的设计思路,但从零开始构建,具有以下特点: - **轻量级**: 无重度依赖,核心代码简洁 - **可定制**: 组件化设计,易于扩展 - **现代化**: 基于Vue3 + TypeScript,类型安全 - **响应式**: 良好的移动端适配 - **易集成**: 可独立使用或集成到现有项目 ## 📄 License MIT License