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

news2024/9/25 7:19:42

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

<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。或者修改依赖包文件,去掉该种写法。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/127587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLO系列中Anchor Based和Anchor Free的相爱相杀

前言 我们都知道按照是否出现RPN可将目标检测算法分为two-stage和one-stage&#xff0c;其中one-stage的一个主要代表便是YOLO系列&#xff0c;而根据是否存在先验锚框的定义我们也可以将其分为Anchor based和Anchor free两类&#xff0c;关于这两种也是各有优劣&#xff0c;但…

物联网终端的防护体系

针对漏洞的恶意行为分析 我们共捕获到 4 种针对 UPnP 漏洞的利用行为 1&#xff0c;如表 4.7 所示。从中可以看出&#xff0c;这些漏洞均为远程 命令执行类漏洞。另外我们也发现&#xff0c;当漏洞出现在特定端口时&#xff0c;攻击者一般不会经过 UPnP 的发现阶段&#xff0c…

携手用友低代码开发,德鑫物联将RFID融入企业服务大生态

如今&#xff0c;消费者凭借一部手机就可以轻松鉴别名酒的真伪&#xff1a;一些名酒在瓶盖的封膜下已经植入了RFID芯片&#xff0c;消费者用带有NFC功能的手机并安装相应的APP&#xff0c;只需靠近RFID芯片&#xff0c;即可获取产品品名、规格、生产日期等验证信息。 不只是名…

论文阅读:人机情绪的趋同、循环与溢出——基于 Twitter 涉中议题的数据分析

论文链接&#xff1a;https://shimo.im/files/vVqRVZGEXgcZbRqy/ 《人机情绪的趋同、循环与溢出...tter涉中议题的数据分析_黄阳坤.pdf》&#xff0c;可复制链接后用石墨文档 App 打开 摘要&#xff1a; 在传播研究情感转向的背景下&#xff0c;社交媒体上人机用户间的情绪互动…

【操作系统】抖动、缺页中断率、页面置换算法

文章目录缺页中断率影响缺页中断率的因素抖动&#xff08;颠簸&#xff09;页面置换算法1、最佳页面淘汰算法&#xff08;OPT&#xff09;2、先进先出页面淘汰算法&#xff08;FIFO&#xff09;3、最近最久未使用页面淘汰算法&#xff08;LRU&#xff09;缺页中断率 对于进程P…

【Linux】pidstat命令

作用&#xff1a;Report statistics for Linux tasks. 人话&#xff1a;进程级别的统计报告&#xff0c;用于分析进程的各种维度的指标&#xff08;CPU、内存、I/O、中断、上下文切换等等&#xff09; 这是一个综合型的命令&#xff0c;非常有用。 参数总结&#xff1a; -p: …

python处理Jenkins Job配置文件config.xml

文章目录一、准备config.xml文件二、增加字符串参数代码confix.xml文件会增加如下内容&#xff1a;创建的jenkins项目test1三、增加extendedChoice复选框参数代码config.xml会增加如下内容创建的jenkins项目参考文章一、准备config.xml文件 <flow-definition plugin"w…

【标准】要点整理-软件服务商交付能力评估标准

导读&#xff1a;中 国 软 件 行 业 协 会 团 体 标 准&#xff0c;软件服务商交付能力评估标准&#xff08;Evaluation Criteria Of Delivery Capability On Software Service Provider&#xff09;通过该标准可以对标所在公司交付能力情况&#xff0c;寻找差距。其中标注红色…

钟摆小游戏的开发过程

框架 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, initi…

K8S 快速入门(五)网络通信原理:Pod网络

一、Pod网络 1. Pod结构 Pod的特点&#xff1a;容器 1、有自己的IP地址 2、有自己的hostname 3、有自己的端口 Pod实际上可以理解为就是k8s云平台中的虚拟机&#xff0c;而这个pod内部封装的是由docker引擎所创建的容器&#xff0c;也可以理解为pod就是一个虚拟化分组&#xf…

微信小程序后台交互-个人中心06

目录 1.获取用户昵称和头像 2.登录过程 3.登录-小程序 4.后台 1.获取用户昵称和头像 小程序登录https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 登录过程&#xff1a; 说明 调用 wx.login() 获取 临时登录凭证code &#xff0c;并…

Java文件解析:Excel解析

文章目录一、前言二、POI 和 easyExcel1.1概念1.2xls和xlsx区别1.3文档1.4Excel概念二、常用场景三、内存问题四、POI的使用4.1创建一个空项目4.2引入pom依赖4.3workbook的三个实现类4.4写的实现4.4读的实现4.5POI常用的包五、EasyExcel的使用5.1创建一个空项目5.2引入pom依赖5…

智慧城市物联网介绍

智慧城市物联网介绍 智慧城市是一个有机结合的大系统&#xff0c;涵盖了更透切的感知、更全面的互连&#xff0c;更深入的智能。物联网是智慧城市中非常重要的元素&#xff0c;它侧重于底层感知信息的采集与传输&#xff0c;城市范围内泛在网方面的建设。 通过智慧城市物联网支…

探索Feign

目录 1. 简介 2. 原理 2.1. 动态代理 动态代理 动态代理 2.2. 懒加载负载均衡器的问题与解决 2.3. 主要类 3. 使用举例 4. 参数配置 1. 简介 Feign&#xff0c;一种声明式的web service client&#xff0c;可以很容易的创建http apis client。创建一个interface并添加注…

Cubase11/12 Windows 音乐创作工具

前言 Cubase是一款专业级的高级音乐创作软件&#xff0c;凭借其无与伦比的灵活工具&#xff0c;您可以快速和直观地创造任何类型的音&#xff0c;充满了各种各样的虚拟仪器、效果和数千种声音。 下载 官网:Cubase Cubase12 12详细教程 Cubase11教程 管理员身份运行 右击…

python初级教程四 发送邮件

SMTP发送邮件 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则&#xff0c;由它来控制信件的中转方式。 python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。 …

实力认证!中睿天下荣获“创客北京2022”软件与信息技术产业项目十强

近日&#xff0c;第七届“创客中国”北京市中小企业创新创业大赛暨“创客北京2022”创新创业大赛北京区域赛在决赛阶段按照八个产业对参赛项目进行评选&#xff0c;产生了各产业的十强项目&#xff0c;《中睿天下实战对抗攻击溯源项目》从数百个项目中脱颖而出&#xff0c;荣获…

MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《2》

上一篇文章 是对这个模型做个测试&#xff0c;效果很不错&#xff0c;然后这节&#xff0c;我们来关注下论文中的一些知识点 原论文&#xff1a;Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 本文不是按照原论文的顺序一路下来讲解&…

Python基础语法(三)

Python基础语法&#xff08;三&#xff09; 列表和元组 列表是什么, 元组是什么 编程中, 经常需要使用变量, 来保存/表示数据. 如果代码中需要表示的数据个数比较少, 我们直接创建多个变量即可 num1 10 num2 20 num3 30 ......但是有的时候, 代码中需要表示的数据特别多…

小程序:后台交互-个人中心

目录 获取用户昵称头像和昵称 wx.getUserProfile bindgetuserinfo oa-mini 登录过程 登录-小程序 wx.checkSession wx.login wx.request 后台 准备数据表 反向生成工具生成 准备封装前端传过来的数据 小程序服器配置 导入微信小程序SDK application.yml WxPro…