vue+bpmn-js 示例/基础入门/动态创建流程节点

先附一个完整的示例,下面做具体介绍

<template>
    <div class='containers'>
        <el-button @click="saveXml"></el-button>
        <div class="canvas" ref="canvas"></div>
        <div class="properties" id="properties"></div>
    </div>
</template>
<script>
import BpmnModeler from 'bpmn-js/lib/Modeler'
import {xmlStr} from 'xmlStr.js'

import 'bpmn-js/dist/assets/diagram-js.css'
import 'bpmn-js/dist/assets/bpmn-font/css/bpmn.css'
import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css'
import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css'

import {BpmnPropertiesPanelModule,BpmnPropertiesProviderModdule} from 'bpmn-js-properties-panel'
import 'bpmn-js-properties-panel/dist/assets/properties-panel.css'

export default{
    mounted(){
        this.init()
    },
    data(){
        return {
            bpmnModeler:null,
            canvas:null,
            processElement:null,
            modeling:null,
            elementFactory:null,
            elementRegistry:null
        }
    },
    methods:{
        init(){
            let canvas = this.$refs.canvas
            this.bpmnModeler = new BpmnModeler({
                container:canvas,
                propertiesPanel:{
                    parent:'#properties'
                },
                additionalModules:[
                    BpmnPropertiesPanelModule,
                    BpmnPropertiesProviderModdule
                ]
            })
            this.modeling = this.bpmnModeler.get("modeling")
            this.elementFactory = this.bpmnModeler.get("elementFactory")
            this.elementRegistry = this.bpmnModeler.get("elementRegistry")
            
            this.createNewDiagram();
        },
        createNewDiagram(){
            this.bpmnModeler.importXML(xmlStr).then(()=>{
                this.addEventBusListener();
                this.processElement = this.elementRegistry.find(el=>el.type=='bpmn:Process');
                let startEvent = this.dynamicCreateShape({
                    type:'bpmn:StartEvent'
                    name:"开始"
                })
                let userTask = this.dynamicCreateShape({
                    type:'bpmn:Task'
                    name:"模块"
                })
                this.modeling.createShape(startEvent,{x:200,y:200},this.processElement)
                this.modeling.createShape(userTask,{x:350,y:200},this.processElement)
                this.modeling.connect(startEvent,userTask)    
            })
        },
        saveXml(){
            this.bpmnModeler.saveXML({format:true}).then(res=>{
                console.log(res);
            })
        },
        dynamicCreateShape(data){
            let option = Object.assign({
                x:0,
                y:0
            },data)
            let shape = this.elementFactory.createShape(option);
            shape.businessObject.name = data.name || "";
            return shape;
        },
        addEventBusListener(){
            let that = this;
            let eventBus = this.bpmnModeler.get("eventBus");
            let eventTypes = ['element.click','element.changed','element.updateLabel'];
            eventTypes.forEach(function(eventType){
                eventBus.on(eventType,function(e){
                    console.log(e.element.type);
                })
            })
        }
    }
}
</script>

该示例完成的是动态添加流程节点。最终效果如下

如果到这里不是大家想要的结果,那就不用在向下看了。

示例需安装如下依赖

npm i bpmn-js

如里需要用到右侧属性栏,需安装

npm i bpmn-js-properties-panel

默认情况下是不显示左侧工具栏和右侧属性栏的。

显示左侧工具栏只需引入css

import 'bpmn-js/dist/assets/diagram-js.css'
import 'bpmn-js/dist/assets/bpmn-font/css/bpmn.css'
import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css'
import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css'

 显示右侧属性栏则需先安装依赖,然后引入以下部分

import {BpmnPropertiesPanelModule,BpmnPropertiesProviderModdule} from 'bpmn-js-properties-panel'
import 'bpmn-js-properties-panel/dist/assets/properties-panel.css'

同时在实例化BpmnModeler时,配置如下内容

this.bpmnModeler = new BpmnModeler({
                .....
                propertiesPanel:{
                    parent:'#properties'
                },
                additionalModules:[
                    BpmnPropertiesPanelModule,
                    BpmnPropertiesProviderModdule
                ]
            })

"#properties"为显示右侧属性栏的容器 

动态添加流程节点主要通过以下对象

//模型对象

this.modeling = this.bpmnModeler.get("modeling")

//元素对象
this.elementFactory = this.bpmnModeler.get("elementFactory")

//图形注册对象
this.elementRegistry = this.bpmnModeler.get("elementRegistry")

创建节点

this.elementFactory.createShape(option) 

将节点添加到模型中 

this.modeling.createShape(startEvent,{x:200,y:200},this.processElement) 

为两个节点创建连线

this.modeling.connect(startEvent,userTask) 

整体内容介绍就结束了,以下是注意事项:

事项一:

this.processElement  对象需要在importXML或createDiagram方法后获取,之前获取者为undefined,导致节点添加报错

 事项二:

引用右侧属性栏部分代码后报错,确认是否是由于未引入指定loader无法解析。

如【?.】可选链操作符【??】

解决办法思路,vue或react项目引入对应loader。或者修改依赖包文件,去掉该种写法。

 

### Vue3 中使用 BPMN 和 Flowable 的最佳实践 在 Vue3 开发环境中,通过集成 bpmn.js 库可以轻松实现 BPMN 工作流的可视化设计和操作。以下是具体的最佳实践以及示例代码。 #### 1. 安装依赖库 为了在 Vue3 中使用 BPMN 功能,需要安装 `bpmn-js` 和其他必要的工具包: ```bash npm install bpmn-js --save ``` 如果还需要额外的功能(如模型验证或扩展),可以选择安装更多插件。 --- #### 2. 创建 BPMN 渲染组件 创建一个 Vue 组件用于加载并渲染 BPMN 图表文件。 ```vue <template> <div ref="canvas" style="height: 80vh;"></div> </template> <script> import BpmnModeler from 'bpmn-js/lib/Modeler'; import { onMounted, ref } from 'vue'; export default { setup() { const canvas = ref(null); let bpmnModeler; onMounted(() => { bpmnModeler = new BpmnModeler({ container: canvas.value, }); const xmlData = '<?xml version="1.0" encoding="UTF-8"?><definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"></definitions>'; bpmnModeler.importXML(xmlData, (err) => { if (err) { console.error('Failed to import XML', err); } }); }); return { canvas, }; }, }; </script> ``` 此代码片段展示了如何初始化 `BpmnModeler` 并将其绑定到 DOM 节点上[^1]。 --- #### 3. 集成 Flowable 后端服务 Flowable 提供了一套 REST API 来管理和部署流程实例。可以通过 Axios 或 Fetch 请求与后端交互。 以下是一个简单的请求示例: ```javascript async function fetchProcessDefinitions() { try { const response = await axios.get('/flowable-rest/service/repository/process-definition'); console.log(response.data); // 输出所有已部署的流程定义 } catch (error) { console.error('Error fetching process definitions:', error); } } ``` 上述方法调用了 Flowable 的 `/repository/process-definition` 接口来获取可用的流程定义列表[^3]。 --- #### 4. 自定义主题与国际化支持 借助 Ant Design Vue,可以快速构建具有响应式布局的工作流管理系统,并提供多种语言的支持。 配置步骤如下: - 使用 `locale-provider` 设置默认语言环境。 - 利用 CSS-in-JS 技术调整样式变量以适配不同主题需求。 ```vue <template> <a-config-provider :locale="zhCN"> <!-- 主要应用逻辑 --> </a-config-provider> </template> <script> import zhCN from '@ant-design/vue/es/locale/zh_CN'; export default { data() { return { zhCN, }; }, }; </script> ``` 以上实现了中文界面的语言切换功能[^2]。 --- #### 5. 数据持久化与版本控制 当用户完成流程设计后,需保存至数据库以便后续访问。通常会涉及两个主要部分:存储图表 XML 文件及其元数据记录。 SQL 查询语句可用于查询特定版本的数据: ```sql SELECT * FROM flow_dd WHERE flow_key = #{flowKey} AND version = #{version} LIMIT 1; ``` 这段 SQL 片段来源于 JEECG Boot 框架中的 Mapper 映射文件。 --- ### 总结 综上所述,在 Vue3 中利用 bpmn.js 结合 Flowable 构建强大的工作流管理平台是一项高效的技术方案。不仅能够满足复杂业务场景下的定制化需求,还提供了良好的用户体验和支持能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值