首页
/ 【解放双手】ingenious-flow-designer:零基础开发可视化流程引擎的终极方案

【解放双手】ingenious-flow-designer:零基础开发可视化流程引擎的终极方案

2026-02-04 04:21:39作者:明树来

你是否还在为流程设计工具开发焦头烂额?花费数周搭建基础框架,却在节点拖拽、连线逻辑上反复碰壁?尝试集成第三方库时,又陷入UI组件冲突的泥潭?今天,我们将彻底解决这些痛点——ingenious-flow-designer(流程设计器)作为一款开源可视化流程设计开发利器,让你从零开始1小时内搭建企业级流程设计平台,彻底告别996的重复开发。

为什么选择 ingenious-flow-designer?

传统流程设计开发面临三大困境:

  • 技术门槛高:需掌握Canvas/SVG绘图、拖拽算法、数据序列化等复杂技术
  • 集成成本大:UI组件库适配、表单引擎对接、后端API集成耗时耗力
  • 扩展性受限:自定义节点/边类型、业务规则嵌入困难重重

而ingenious-flow-designer通过三层架构彻底解决这些问题:

flowchart TD
    A[核心层] -->|提供基础能力| A1(LogicFlow内核)
    A --> A2(节点/边模型)
    A --> A3(数据处理)
    
    B[适配层] -->|连接核心与UI| B1(UI适配器)
    B --> B2(表单引擎)
    B --> B3(事件系统)
    
    C[应用层] -->|面向开发者| C1(组件API)
    C --> C2(配置选项)
    C --> C3(示例工程)
    
    A --> B
    B --> C

核心功能速览

1. 开箱即用的可视化设计界面

提供完整的拖拽式设计面板,包含:

  • 丰富的预置节点(开始、结束、任务、判断、子流程等)
  • 智能连线系统(支持直角/曲线连接、自动吸附、交叉避让)
  • 多视图控制(缩放、平移、居中、全屏)

2. 双UI框架无缝支持

完美适配主流UI组件库,一处集成,多处可用:

功能特性 Element Plus支持 Ant Design Vue支持
表单设计器 ✅ 完全支持 ✅ 完全支持
抽屉/弹窗 ✅ 样式统一 ✅ 样式统一
图标系统 ✅ 自动适配 ✅ 自动适配
主题定制 ✅ 全量支持 ✅ 全量支持

3. 强大的自定义扩展能力

通过简单配置即可扩展:

// 自定义请假审批节点示例
import { CustomModel, CustomView } from 'ingenious-flow-designer'

class LeaveApprovalModel extends CustomModel {
  initNodeData(data) {
    super.initNodeData(data)
    this.properties.approvalType = 'manager' // 审批类型默认经理
    this.properties.daysLimit = 3 // 默认3天内审批
  }
}

class LeaveApprovalView extends CustomView {
  getShape() {
    // 自定义节点外观
    return `
      <rect width="120" height="60" fill="#f0f9ff" stroke="#1890ff" rx="4" />
      <text x="60" y="35" text-anchor="middle">请假审批</text>
    `
  }
}

// 注册自定义节点
flowDesigner.registerNode({
  type: 'custom:leave-approval',
  model: LeaveApprovalModel,
  view: LeaveApprovalView,
  form: [
    { name: 'approvalType', label: '审批类型', component: 'Select' },
    { name: 'daysLimit', label: '最大天数', component: 'InputNumber' }
  ]
})

4. 灵活的状态管理与流程可视化

支持流程运行时状态展示,清晰呈现流程流转路径:

stateDiagram-v2
    [*] --> 申请提交
    申请提交 --> 部门经理审批 : 提交申请
    部门经理审批 --> HR审批 : 审批通过
    HR审批 --> 总经理审批 : 超过3天
    HR审批 --> 流程结束 : 3天内
    总经理审批 --> 流程结束 : 最终审批
    部门经理审批 --> 申请驳回 : 审批拒绝
    总经理审批 --> 申请驳回 : 审批拒绝
    申请驳回 --> [*]
    流程结束 --> [*]

快速开始:15分钟上手实战

环境准备

确保你的开发环境满足:

  • Node.js 16.x+
  • npm/yarn/pnpm包管理器
  • Vue 3.2+ 项目环境

安装流程设计器

# 使用国内npm镜像安装
npm install ingenious-flow-designer --registry=https://registry.npmmirror.com

全局注册(Vue项目)

import { createApp } from 'vue'
import App from './App.vue'
import FlowDesigner from 'ingenious-flow-designer'
import 'ingenious-flow-designer/lib/style.css'

// 引入UI库样式 (根据项目使用的UI库选择)
import 'element-plus/dist/index.css'
// 或
// import 'ant-design-vue/dist/reset.css'

const app = createApp(App)

// 注册流程设计器,指定UI库
app.use(FlowDesigner, {
  uiLibrary: 'element-plus'  // 或 'antd'
})

app.mount('#app')

基础使用示例(编辑模式)

<template>
  <div class="flow-container">
    <IngeniousFlowDesigner 
      v-model:value="graphData" 
      :theme="themeConfig"
      @on-save="handleSave"
    />
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

// 流程图数据
const graphData = ref({
  name: 'leave_process',
  display_name: '请假流程',
  nodes: [
    {
      id: 'start',
      type: 'ingenious:start',
      x: 100,
      y: 100,
      text: '开始'
    },
    {
      id: 'approve',
      type: 'ingenious:task',
      x: 300,
      y: 100,
      text: '经理审批',
      properties: {
        assignee: 'manager',
        form: 'leave_approval_form'
      }
    },
    {
      id: 'end',
      type: 'ingenious:end',
      x: 500,
      y: 100,
      text: '结束'
    }
  ],
  edges: [
    {
      sourceNodeId: 'start',
      targetNodeId: 'approve',
      type: 'ingenious:transition',
      text: '提交'
    },
    {
      sourceNodeId: 'approve',
      targetNodeId: 'end',
      type: 'ingenious:transition',
      text: '通过'
    }
  ]
})

// 主题配置
const themeConfig = ref({
  primaryColor: '#1890ff',
  backgroundColor: '#fafafa',
  activeColor: '#52c41a'
})

// 保存流程图数据
const handleSave = (data) => {
  console.log('保存流程图数据:', data)
  // 调用API保存到后端
  // axios.post('/api/process/save', data)
}
</script>

<style scoped>
.flow-container {
  width: 100%;
  height: 600px;
  border: 1px solid #e8e8e8;
}
</style>

查看模式使用

如需在流程运行时展示流程进度,使用查看模式:

<template>
  <IngeniousFlowDesigner 
    :value="runtimeData" 
    :viewer="true" 
    :highLight="highLightConfig"
  />
</template>

<script setup lang="ts">
import { ref } from 'vue'

// 运行时流程数据
const runtimeData = ref({
  // 与编辑模式相同的nodes和edges结构
  // ...
})

// 高亮配置 - 显示当前流程位置
const highLightConfig = ref({
  history_node_names: ['start', 'approve'], // 已走过的节点
  active_node_names: ['hr_approve'], // 当前节点
  history_edge_names: ['start-approve'] // 已走过的边
})
</script>

核心技术架构解析

节点与边模型设计

ingenious-flow-designer采用面向对象的节点设计,每种节点类型包含模型(Model)和视图(View):

classDiagram
    class BaseModel {
        +id: string
        +type: string
        +x: number
        +y: number
        +text: string
        +properties: object
        +initNodeData(data)
        +getProperties()
        +setProperties(props)
    }
    
    class BaseView {
        +model: BaseModel
        +getShape()
        +getText()
        +updateStyle()
    }
    
    class StartModel {
        +isRoot: boolean
    }
    
    class StartView {
        +getShape()
    }
    
    BaseModel <|-- StartModel
    BaseModel <|-- TaskModel
    BaseModel <|-- EndModel
    BaseModel <|-- DecisionModel
    
    BaseView <|-- StartView
    BaseView <|-- TaskView
    BaseView <|-- EndView
    BaseView <|-- DecisionView

UI适配器设计

为支持多UI库,设计器抽象了UI适配器接口:

// UI适配器接口定义
export interface UIAdapter {
  // 创建表单组件
  createFormItem(config: FormItemConfig): VNode
  
  // 显示消息提示
  message(config: MessageConfig): void
  
  // 打开抽屉
  openDrawer(config: DrawerConfig): void
  
  // 打开弹窗
  openModal(config: ModalConfig): void
  
  // 获取图标
  getIcon(iconName: string): VNode
}

// Element Plus适配器实现
export class ElementUIAdapter implements UIAdapter {
  createFormItem(config) {
    // 使用Element Plus组件创建表单
    return h(ElFormItem, config)
  }
  
  // 其他方法实现...
}

// Ant Design适配器实现
export class AntdUIAdapter implements UIAdapter {
  createFormItem(config) {
    // 使用Ant Design组件创建表单
    return h(aFormItem, config)
  }
  
  // 其他方法实现...
}

高级应用场景

1. 自定义业务节点开发

以"费用报销审批"节点为例,实现业务逻辑嵌入:

// 报销审批节点模型
class ReimbursementModel extends TaskModel {
  initNodeData(data) {
    super.initNodeData(data)
    // 默认属性
    this.properties = {
      amountLimit: 1000,
      approverRole: 'finance',
      ...this.properties
    }
  }
  
  // 业务规则验证
  validateAmount(amount) {
    return amount <= this.properties.amountLimit
  }
}

// 注册节点类型
flowDesigner.registerNode({
  type: 'custom:reimbursement',
  model: ReimbursementModel,
  view: ReimbursementView,
  form: [
    {
      name: 'amountLimit',
      label: '审批限额',
      component: 'InputNumber',
      componentProps: {
        min: 100,
        max: 100000,
        step: 100
      }
    },
    {
      name: 'approverRole',
      label: '审批角色',
      component: 'Select',
      componentProps: {
        options: [
          { label: '财务', value: 'finance' },
          { label: '部门经理', value: 'manager' },
          { label: '总经理', value: 'generalManager' }
        ]
      }
    }
  ]
})

2. 流程数据导出与代码生成

将设计的流程图导出为可执行代码:

// 导出为BPMN 2.0 XML
const exportToBpmn = () => {
  const bpmnXML = flowDesigner.exportData('bpmn')
  // 保存XML文件
  saveFile(bpmnXML, 'process.bpmn', 'application/xml')
}

// 导出为Vue组件代码
const exportToVueComponent = () => {
  const componentCode = flowDesigner.exportData('vue-component')
  saveFile(componentCode, 'ProcessDesigner.vue', 'text/plain')
}

3. 流程版本管理集成

结合后端实现流程版本控制:

// 加载历史版本
const loadHistoryVersion = async (versionId) => {
  const res = await axios.get(`/api/process/history/${versionId}`)
  flowDesigner.setValue(res.data)
}

// 比较版本差异
const compareVersions = async (v1, v2) => {
  const diff = await axios.post('/api/process/compare', { v1, v2 })
  flowDesigner.showDiff(diff.data)
}

安装与配置指南

完整安装步骤

# 1. 创建Vue项目(如无现有项目)
npm create vite@latest flow-demo -- --template vue-ts
cd flow-demo

# 2. 安装UI库(选择一个)
# Element Plus
npm install element-plus --save
# 或 Ant Design Vue
npm install ant-design-vue --save

# 3. 安装流程设计器
npm install ingenious-flow-designer --registry=https://registry.npmmirror.com

# 4. 运行项目
npm run dev

全局配置选项

app.use(FlowDesigner, {
  // 基础配置
  uiLibrary: 'element-plus', // UI库类型
  typePrefix: 'custom:', // 自定义类型前缀
  
  // 主题配置
  theme: {
    primaryColor: '#1890ff',
    backgroundColor: '#ffffff',
    edgePrimaryColor: '#888888'
  },
  
  // 默认节点/边类型
  defaultEdgeType: 'custom:transition',
  
  // 表单配置
  form: {
    labelWidth: '120px'
  }
})

常见问题与解决方案

Q1: 自定义节点不显示或无法拖拽?

A: 检查三点:

  1. 自定义节点是否正确注册:flowDesigner.registerNode(...)
  2. 拖拽面板配置是否包含该节点类型
  3. 节点模型是否继承自BaseModel并实现必要方法

Q2: 如何与后端API集成实现数据持久化?

A: 设计器提供完整的数据导入导出API:

// 保存到后端
const saveProcess = async () => {
  const graphData = flowDesigner.getValue()
  try {
    await axios.post('/api/process/save', {
      id: graphData.id,
      name: graphData.name,
      content: JSON.stringify(graphData)
    })
    ElMessage.success('保存成功')
  } catch (e) {
    ElMessage.error('保存失败')
  }
}

// 从后端加载
const loadProcess = async (id) => {
  const res = await axios.get(`/api/process/get/${id}`)
  flowDesigner.setValue(JSON.parse(res.data.content))
}

Q3: 如何实现自定义连线规则?

A: 通过事件拦截实现自定义连线逻辑:

<IngeniousFlowDesigner
  @beforeAddEdge="handleBeforeAddEdge"
/>

const handleBeforeAddEdge = (source, target) => {
  // 禁止从结束节点发出连线
  if (source.type.includes('end')) {
    ElMessage.warning('结束节点不能发出连线')
    return false
  }
  
  // 禁止连接到开始节点
  if (target.type.includes('start')) {
    ElMessage.warning('不能连接到开始节点')
    return false
  }
  
  return true
}

结语:开启流程数字化之旅

ingenious-flow-designer作为一款开源可视化流程设计开发工具,彻底改变了传统流程引擎开发模式。通过其高度抽象的设计思想、灵活的扩展机制和完善的文档支持,让开发者能够聚焦业务逻辑而非技术实现。

无论是OA系统的审批流程、CRM的客户跟进流程,还是工业互联网的设备运维流程,ingenious-flow-designer都能为你提供坚实的技术支撑。立即加入开源社区,体验高效流程设计开发的乐趣!

项目地址:通过git工具获取最新代码 git clone https://gitcode.com/motion-code/flow-designer

开源协议:Apache License 2.0,完全免费商用

登录后查看全文
热门项目推荐
相关项目推荐