# flow-designer **Repository Path**: tangkaijun/flow-designer ## Basic Information - **Project Name**: flow-designer - **Description**: 流程设计器开发实战 https://www.bilibili.com/cheese/play/ss24484 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: https://www.mldong.com/ - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 25 - **Created**: 2026-10-13 - **Last Updated**: 2026-10-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # mldong-flow-designer-plus 本项目包含了作者为B站课堂视频[《工作流设计器开发最佳实践》](https://www.bilibili.com/cheese/play/ss24484)的过程源码。教程中开发的组件也可用于实际生产环境中。以下是和使用文档和课程章节说明。 ## 演示地址 本工程提供两个演示站,分别覆盖库本身和真实业务集成两种形态: ### 流程设计器演示站 [flow-designer.mldong.com](https://flow-designer.mldong.com/) 库本身的演示,包含请假 / 报销 / 会签 / 分支合并 / 自定义节点 5 个真业务场景(`?case=leave|expense|countersign|fork|custom|empty`) ### 业务系统集成演示 [flow-pro.mldong.com](https://flow-pro.mldong.com/) 把本流程设计器集成进真实业务系统后的形态,账号/密码:admin/123456 注:业务后端不开源 ## npm 包 [mldong-flow-designer-plus](https://www.npmjs.com/package/mldong-flow-designer-plus)(双模式包:canvas 拖拽画布 + 钉钉风格树形设计器,mode prop 切换) [mldong-flow-designer-dingtalk](https://www.npmjs.com/package/mldong-flow-designer-dingtalk)(钉钉精简包:仅钉钉风格设计器,零 LogicFlow 依赖,3.1.0 起与双模式包同版本联动发布) 国内用户可走 [淘宝镜像](https://registry.npmmirror.com/mldong-flow-designer-plus) 加速安装。 ## 使用教程 [Vben5快速入门·AntdDesign版](https://www.bilibili.com/cheese/play/ep1382075) [源码地址](https://gitee.com/course666/vue-vben-admin-v2/tree/v5/) ![流程设计器课程目录](assets/README/image.png) ## 使用文档 ### 兼容性注意 * 因Vite 需要 Node.js 版本 18+ 或 20+。当你的包管理器发出警告时,请注意升级你的 Node 版本。 * 本项目是在 Node.js 版本 16+的环境下测试通过。 ### 下载 ```shell git clone https://gitee.com/mldong/flow-designer.git ``` ### 安装 ```shell yarn add mldong-flow-designer-plus --registry=https://registry.npmmirror.com # 或者 npm install mldong-flow-designer-plus --registry=https://registry.npmmirror.com ``` ### 全局注册 ```javascript import { createApp } from 'vue' import FlowDesigner from 'mldong-flow-designer-plus' import 'mldong-flow-designer-plus/lib/style.css' const app = createApp(App) app.use(FlowDesigner) ``` > 3.1.0 起内置 UI(抽屉/弹窗/表单/下拉/提示/JSON 查看器)全部自研(FD 组件族), > **不再依赖 ant-design-vue / element-plus / vue-json-pretty**, > 旧版 `uiLibrary` 安装参数已废弃(传入不报错、不生效)。 > 集成方宿主项目自身的 UI 库不受影响。 > > 3.1.0 三件大事: > 1. **砍掉第三方 UI 框架**:内置 UI 全部自研 FD 组件族,dependencies 仅 `@logicflow/*` + `vue`; > 2. **补全内置工作流属性**:流程级 +8(字段权限/关联业务表/持久化模式/发起时选人/选人接口/抄送人/申请理由/附件)、任务级 +6(候选用户/候选用户组/候选用户处理类/会签类型/会签完成条件/操作按钮),对齐 vben5-wf 二开版,双模式内置表单均可配置; > 3. **钉钉设计器视觉优化**:节点卡片紧凑化、层次强化、分支标题间距优化。 ### 使用样例 #### 编辑模式 ```html ``` #### 只读模式 ```html ``` ### 属性说明 | 属性名 | 类型 | 默认值 | 说明 | 版本 | | --- | --- | --- | --- | --- | | v-model:value | object | - | 流程图数据 | - | | theme | FDThemeConfig | - | 主题配置 | - | | highLight | FDHighLightType | 高亮配置 | - | | initDndPanel | boolean | true | 是否初始化拖拽面板 | - | | dndPanel | FDPatternItem | - | 拖拽面板配置 | - | | initControl | boolean | true | 是否初始化控制面板 | - | | control | FDControlItem | - | 控制面板配置 | - | | blankContextmenu | Function | - | 画布右键事件 | 1.0.16+ | | nodeClick | Function | - | 节点点击事件 | - | | edgeClick | Function | - | 边点击事件 | - | | drawerWidth | String | Number | 600px | 抽屉宽度 | - | | modalWidth | String | Number | 60% | 弹窗宽度 | - | | processForm | FDFormType | - | 流程表单配置 | - | | edgeForm | FDFormType | - | 边表单配置 | - | | defaultEdgeType | string | snaker:transition | 默认边 | - | | typePrefix | string | snaker: | 自定义节点/边类型前缀 | - | | viewer | boolean | false | 是否查看模式 | - | | dagreOptions | Object | - | [自动布局配置](https://site.logic-flow.cn/tutorial/extension/layout#%E5%B8%83%E5%B1%80%E9%85%8D%E7%BD%AE%E9%80%89%E9%A1%B9) | 2.0.8+ | | mode | `'canvas'` \| `'dingtalk'` | `'canvas'` | 渲染模式:canvas 为拖拽画布,dingtalk 为钉钉风格树形设计器 | 3.0.0+ | | locale | `'zh-CN'` \| `'en-US'` \| string | 不传则沿用 `setLocale` 的全局值 | 内置文案语种 | 3.2.0+ | | messages | `Record` | - | 按语种覆盖/追加内置词条,如 `{ 'zh-CN': { 'fd.field.assignee': '办理人' } }` | 3.2.0+ | ### 国际化(v3.2.0+) 内置 zh-CN / en-US 双语,零额外依赖(peerDependencies 仍只有 vue)。语种 API 从包入口导出: ```typescript import Designer, { setLocale, getLocale, t, extendMessages, FD_MESSAGES_ZH } from 'mldong-flow-designer-plus' setLocale('en-US') // 命令式切换 extendMessages('zh-CN', { 'fd.field.assignee': '办理人' }) // 改术语,已渲染的表单会同步更新 t('fd.dnd.task.label') // 取单条文案,支持 {name} 插值 ``` 宿主已有 i18n 时,把宿主当前语种透传到 `locale` prop 即可,无需引入第二套翻译体系: ```vue ``` 约定与边界: - **只有界面文案参与翻译**。节点显示名(`dndPanel.text`、`条件1`/`分支1`、默认流程里的 `text.value`)、 `options[].value`、`defaultValue` 等会写进图数据或流程定义 JSON,任何语种下都保持原值—— 切语言不会改写已保存的流程,新建节点也按创建时的语种取 `label`。 - 缺 key 时回落 zh-CN 并打印一次告警;zh-CN 也没有则原样返回 key。 - 切换语种的生效范围:表单、卡片、抽屉标题、钉钉模式控制条、钉钉模式加号面板默认项等 computed 渲染处即时更新; canvas 模式的 LogicFlow 拖拽面板与右键菜单在插件初始化时求值,需要重挂载设计器组件 (宿主按整页刷新处理语种切换的场景无需额外处理)。 - 表单标签列宽随语种变化(英文更长且标签不换行),值放在词条 `fd.labelWidth.*` 里; 自定义 `processForm` 时如需对齐,一并传 `labelWidth`。 - 内置词条表 `FD_MESSAGES_ZH` / `FD_MESSAGES_EN` 已导出,宿主可直接并入自己的语言包。 - 包同时提供 `lib/`(ESM/UMD)与随包发布的 `packages/` 源码,两者共用同一个语种单例 (挂在 `globalThis`),但请固定一种引入方式,避免两份构建产物各自打进入口。 #### FDThemeConfig ```typescript export declare type FDThemeConfig = { primaryColor?: string; // 主题色 edgePrimaryColor?: string; // 边主题色 activeColor?: string; // 进行时节点颜色 historyColor?: string; // 历史节点/边颜色 backgroundColor ?: string;// 画布背景颜色 } ``` #### FDHighLightType ```typescript export declare type FDHighLightType = { historyNodeNames?: Array; // 历史节点名称 historyEdgeNames?: Array; // 历史边名称 activeNodeNames?: Array; // 活跃节点名称 /** * 节点成员进度(可选,3.0.3+):key=节点 id,value=该节点办理人列表及完成状态 * 任意节点可带(历史节点 done、进行中节点 active);会签节点额外带 type 区分并行/顺序 * 钉钉模式 NodeCard 存在时渲染成员列表回显(✓已完成 / ▶当前轮到 / ·未处理) */ nodeProgress?: { [nodeId: string]: { type?: 'PARALLEL' | 'SEQUENTIAL'; // 会签类型(仅会签节点) members: Array; } } } // 节点成员进度列表项 export declare type FDNodeProgressMember = { id: string; // 用户ID name: string; // 用户姓名(后端组装) done?: boolean; // 是否已完成(历史任务办理人) active?: boolean; // 当前轮到的办理人(进行中任务 / 顺序会签) } ``` #### FDPatternItem ```typescript export declare type FDPatternItem = { type?: string; text?: string; label?: string; icon?: string; className?: string; properties?: object; callback?: () => void; hide?: boolean; // 是否隐藏 sort?: number; // 排序字段 drawerTitle?: string;// 抽屉标题 nodeClick?: (e: any) => void; form?: FDFormType; // 表单配置 }; ``` #### FDControlItem ```typescript export declare type FDControlItem = { key?: string; // 唯一编码 iconClass?: string; // 图标类 title?: string; // 标题 text?: string; // 文本 onClick?: Function // 事件函数 hide?: boolean; // 是否隐藏 sort?: number; // 排序字段 } ``` #### FDFormType和FDFormItemType ```typescript /** * 表单数据类型 */ export declare type FDFormType = { labelWidth?: string; formItems: Array; } /** * 表单项数据类型 */ export declare type FDFormItemType = { name: string; // 表单项名称 label?: string; // 表单项标签 component?: 'Input' | 'Select'; // 表单组件 render?: (args: any) => VNode; componentProps?: any; // 表单组件属性 } ``` ### 事件 | 事件名 | 说明 | 回调参数 | 版本 | | --- | --- | --- | --- | | on-init | 初始化事件 | (lf: any) => void | - | | on-render | 渲染事件 | (lf: any) => void | - | | on-save | 控制面板保存事件 | (graphData: any) => void | - | | node-click | 节点点击事件(两种模式统一暴露,与 nodeClick prop 回调并存) | ({ data, patternItem, lf }) => void | 3.0.0+ | | edge-click | 边点击事件(两种模式统一暴露,与 edgeClick prop 回调并存) | ({ data, patternItem, lf }) => void | 3.0.0+ | ## 钉钉模式(v3.0.0+) 通过 `mode="dingtalk"` 启用钉钉风格树形设计器,替代拖拽画布。适合审批流等线性流程场景。 ### 启用方式 ```html ``` 也可以通过流程定义数据中的 `mode` 字段自动识别: ```json { "mode": "dingtalk", "nodes": [...], "edges": [...] } ``` 优先级:`prop > 数据字段 > 默认 'canvas'` ### API 兼容 钉钉模式暴露 `FDDesignerAPI`(`@on-init` / `@on-render` 回调参数),API 命名与 LogicFlow 实例一致: | 方法 | 说明 | |------|------| | `updateText(id, text)` | 更新节点显示文本 | | `setProperties(id, props)` | 设置节点属性(合并) | | `getProperties(id)` | 读取节点属性 | | `deleteProperty(id, key)` | 删除节点属性 | | `changeNodeId(oldId, newId)` | 修改节点 ID | | `getNodeDataById(id)` | 按 ID 查节点数据 | | `setProcessProperty(key, value)` | 设置流程属性 | | `getGraphData()` | 导出图数据 | | `render(data)` | 重新渲染 | | `graphModel` | Proxy,兼容 `lf.graphModel[key] = value` 写法 | | `eventCenter` | 事件总线 | 业务方原有 vben5 的 `task-drawer` / `process-drawer` 等二次开发代码可在两种模式下复用。 ### 自研组件 钉钉模式内置以下 UI 组件,零外部依赖: - **DingDrawer**:右侧滑出抽屉,class 驱动 slide 动画 - **DingModal**:居中弹窗,zoom + fade 动画 - **DingTooltip**:hover 提示,替代原生 title ### dndPanel 合并策略 业务方自定义的 `dndPanel`(含 `nodeClick` 等配置)会与钉钉模式默认项(审批节点 / 自定义节点 / 子流程)合并,业务方同名 type 优先。 ### 会签角标与成员进度回显(v3.0.3+) - **会签角标**:会签节点(fork/join 或带 countersign 属性)在 NodeCard 右上角渲染角标,区分并行/顺序会签 - **成员进度回显**:`highLight.nodeProgress` 按节点 id 传入办理人列表,NodeCard 渲染成员列表(✓已完成 / ▶当前轮到 / ·未处理),适用于 viewer 只读模式展示审批进度 ### 空流程默认初始化(v3.0.3+) 编辑模式下传入空的流程数据(无 nodes)时,自动初始化默认三节点(开始 → 审批人 → 结束),对齐 jeeflow-spec 发起申请约定;仅首次初始化,不会覆盖已有数据。 ## 钉钉精简包(v3.1.0+) 包名 `mldong-flow-designer-dingtalk`,与双模式包**同一源码、同一版本号联动发布**,仅含钉钉风格树形设计器,**不含 LogicFlow 画布**,零 `@logicflow/*` 依赖,适合纯审批流场景极简引入。 ```shell npm install mldong-flow-designer-dingtalk --registry=https://registry.npmmirror.com ``` ```html ``` - 组件注册名、props/events 契约与双模式包的钉钉模式完全一致,两包可无缝切换 - `@on-init` / `@on-render` 回调参数为 `FDDesignerAPI`(命名与 LogicFlow 实例对齐) - 需要 canvas 画布、存量画布流程兼容或双模式切换时,请使用双模式包 `mldong-flow-designer-plus` - 本地构建精简产物:`npm run build:lib:lite`(输出 `lib-lite/`) ## 课程章节 * 第一章·基础篇 - 搭建Vue3脚手架工程 - 改造成Vue3组件库目录结构 - 集成LogicFlow - 自定义节点初探 - 自定义svg节点 - 自定义html节点 - 自定义vue节点 - 自定义vue节点优化 - 自定义边 - 主题配置 - 拖拽面板 - 控制面板 * 第二章·进阶篇 - 事件监听 - 自定义事件 - 数据转换 Adapter - 自定义插件初探 - 自定义插件属性配置 - svg图标处理(一) - svg图标处理(二) * 第三章·实现篇·组件初探 - 流程设计器组件初步设计 - 流程设计器数据双向绑定实现 - 流程设计器配置数据类型定义 - 流程设计器节点高亮实现 - 流程设计器边高亮实现 - 流程设计器高亮主题配置 - 流程设计器设置高亮属性 - 流程设计器高亮属性配置实现 * 第四章·实现篇·拖拽面板 - 拖拽元素·开始节点 - 拖拽元素·结束节点 - 开始节点和结束节点边连接规则 - 拖拽元素·自定义任务节点 - 拖拽元素·条件判断节点 - 拖拽元素·分支与合并节点 - 拖拽元素·子流程节点 - 拖拽面板组件配置项·初探 - 拖拽面板组件配置项·属性覆盖及隐藏控制 - 拖拽面板组件配置项·节点事件 - 拖拽面板组件配置项·边事件 - 初始化事件注册自定义节点 - 拖拽元素排序 * 第五章·实现篇·UI适配 - UI适配·初探 - UI适配·Button组件(一) - UI适配·Button组件(二) - 增加UI适配器类 - UI适配器优化 - UI适配注意事项 - UI适配·抽屉组件初探 - UI适配·抽屉组件和节点边事件处理 - UI适配·抽屉组件动态标题 - UI适配·抽屉组件动态标题优化 - UI适配·抽屉组件宽度配置 - UI适配·antd表单 - UI适配·element-plus表单 * 第六章·实现篇·元数据表单 - 元数据表单·简单数据结构 - 元数据表单·开始节点和结束节点 - 元数据表单·用户任务节点(一) - 元数据表单·用户任务节点(二) - 元数据表单·labelWidth属性处理 - 元数据表单·其它拖拽节点 - 元数据表单·流程表单和自定义配置 - 元数据表单·自定义渲染函数 - 元数据表单·自定义函数之v-model - 元数据表单·自定义组件实现v-model - 元数据表单·边表单和自定义配置 * 第七章·实现篇·流程图数据 - 流程图数据·节点和边表单赋值 - 流程图数据·流程表单赋值 - 流程图数据·表单数据变化监听处理初探 - 流程图数据·表单数据变化监听处理优化 - 流程图数据·流程表单数据变化监听处理 - 流程图数据·修复上一步下一步bug * 第八章·实现篇·控制面板 - 控制面板·配置化初探 - 控制面板·配置化实现 - 控制面板·自定义图标 - 控制面板·查看流程数据弹窗适配 - 控制面板·查看流程数据 - 控制面板·查看流程数据复制 - 控制面板·导入流程数据弹窗 - 控制面板·导入流程数据逻辑处理 - 控制面板·设置高亮数据 - 控制面板·导入和高亮UI适配 - 控制面板·保存按钮逻辑处理 - 控制面板·清空逻辑处理 * 第九章·打包部署篇 - 打包发布篇·初探 - 打包发布篇·云效流水线(一) - 打包发布篇·云效流水线(三) - 打包发布篇·依赖包安装测试 - 打包发布篇·svg转base64处理 - 打包发布篇·本地包调试 - 打包发布篇·本地包调试错误修复 - 打包发布篇·组件类型推导配置 - 打包发布篇·组件类型推导之代码提示 - 打包发布篇·组件定义类型导出 - 打包发布篇·修复1.0.4版编译失败bug