bpmn-js系列之Viewer

上一篇文章『bpmn-js系列之Modeler、以及流程编辑界面的优化』介绍了bpmn-js的modeler模式下的一些开发配置,这篇文章将会介绍Viewer模式的使用

以下演示代码基于上一节搭建好的vue环境,使用bpmn版本为当前最新版7.3.0

基本使用

Viewer的使用与Modeler并无太大区别,示例代码如下

<template><div class="containers"><div class="canvas" ref="canvas"></div></div>
</template><script>
import BpmnViewer from "bpmn-js/lib/Viewer";
import { xmlStr } from "../mock/xmlStr";export default {name: "ops-coffee",mounted() {this.init();},data() {return {bpmnViewer: null,container: null,canvas: null};},methods: {init() {const canvas = this.$refs.canvas;this.bpmnViewer = new BpmnViewer({container: canvas});this.createNewDiagram();},async createNewDiagram() {try {const result = await this.bpmnViewer.importXML(xmlStr);const { warnings } = result;console.log(warnings);} catch (err) {console.log(err.message, err.warnings);}}}
};
</script>

屏幕自适应

流程图渲染完成后可能会出现集中在画布左侧/右侧等情形,导致整体不够美观,通过zoom可以配置自适应画布,保证渲染图位于画布的中间位置

const canvas = this.bpmnViewer.get("canvas");
canvas.zoom("fit-viewport", "auto");

自定义颜色设置

bpmn-js提供了三种修改颜色的方式,如果你想在Modeler(编辑)模式下修改颜色,推荐使用setColor方式,而Viewer(预览)模式则只能通过另外两种overlayMarker方式来实现,以下为bpmn-js提供的三种修改颜色的方法

overlay

Viewer模式下可用

先添加CSS

.highlight-overlay {background-color: green;opacity: 0.4;pointer-events: none;
}

然后修改节点颜色

var overlays = viewer.get('overlays'),elementRegistry = viewer.get('elementRegistry');var shape = elementRegistry.get('Activity_0djl6l0');var $overlayHtml = $('<div class="highlight-overlay">').css({width: shape.width,height: shape.height});overlays.add('Activity_0djl6l0', {position: {top: 0,left: 0},html: $overlayHtml
});

Marker +

Viewer模式下可用

先添加CSS

.highlight .djs-visual > :nth-child(1) {stroke: green !important;fill: rgba(0, 80, 0, 0.4) !important;
}

然后修改节点颜色

var canvas = viewer.get('canvas');
canvas.addMarker('Activity_0djl6l0', 'highlight');

setColor

Modeler模式下可用

bpmnModeler.importXML(diagramXML, function(err) {var elementRegistry = bpmnModeler.get('elementRegistry');var elementToColor = elementRegistry.get('Flow_1xnf3iv');var modeling = bpmnModeler.get('modeling');modeling.setColor([ elementToColor ], {stroke: 'green',fill: 'rgba(0, 80, 0, 0.4)'});
});

我们的使用示例

Viewer预览模式下,后端传递过来的xml数据里包含了run_state的标记,标识当前节点的状态,需要根据这个状态给节点渲染上对应的颜色

xml文件大概如下,截取了包含run_state的一段

<sequenceFlow id="Flow_1d9q74f" sourceRef="Activity_1eq68tk" targetRef="Activity_0o8b5cf" run_state="3" />
<scriptTask id="Activity_0o8b5cf" name="脚本节点" run_state="5"><incoming>Flow_1d9q74f</incoming><outgoing>Flow_0b23d51</outgoing>
</scriptTask>
<sequenceFlow id="Flow_0b23d51" sourceRef="Activity_0o8b5cf" targetRef="Event_0idqhms" run_state="4" />
<intermediateCatchEvent id="Event_0idqhms" name="定时" run_state="6"><incoming>Flow_0b23d51</incoming><outgoing>Flow_17tttbw</outgoing><timerEventDefinition id="TimerEventDefinition_1w7apdl" />
</intermediateCatchEvent>
<sequenceFlow id="Flow_17tttbw" sourceRef="Event_0idqhms" targetRef="Activity_0qkzn5l" run_state="0" />
<manualTask id="Activity_0qkzn5l" name="手动节点" run_state="7"><incoming>Flow_17tttbw</incoming><outgoing>Flow_0h1ee5i</outgoing>
</manualTask>

在页面加载完xml后,调用setColor的方法来设置颜色

setColor() {// access viewer componentsconst canvas = this.bpmnViewer.get("canvas");// 获取到全部节点const allShapes = this.bpmnViewer.get("elementRegistry").getAll();//循环节点添加颜色allShapes.forEach(element => {const shapeId = element.businessObject.id;const shapeAttrs = element.businessObject.$attrs;// add markerif (element.businessObject.$type != "bpmn:Group") {if (element.businessObject.$type == "bpmn:SequenceFlow") {canvas.addMarker(shapeId, "highlight-2" + shapeAttrs.run_state);} else {canvas.addMarker(shapeId, "highlight-" + shapeAttrs.run_state);}}});
}

设置颜色实际上就是通过addMarker方法给节点设置CSS,因为连线无需设置fill属性,对于连线有特殊的处理,对应的CSS如下

<style>
.highlight-0 .djs-visual > :nth-child(1) {stroke: black !important;
}
.highlight-1 .djs-visual > :nth-child(1) {stroke: black !important;fill: #f8f8f8 !important;
}
.highlight-2 .djs-visual > :nth-child(1) {stroke: black !important;fill: #cff5fa !important;
}
.highlight-3 .djs-visual > :nth-child(1) {stroke: black !important;fill: #d7f6ce !important;
}/* 连线 */
.highlight-20 .djs-visual > :nth-child(1) {stroke: black !important;
}
.highlight-23 .djs-visual > :nth-child(1) {stroke: green !important;
}
.highlight-24 .djs-visual > :nth-child(1) {stroke: red !important;
}
</style>

最后渲染完成的样子如下,未来我们的【开源一站式DevOps平台CODO】的流程图展示或许就长这个样子,期待一下吧

Viewer模式下拖动

当流程图比较复杂,节点众多的时候,单单有屏幕自适应可能是不够的,我们还希望流程图可以拖动,bpmn-js的Viewer模式默认并不支持此功能,但提供了diagram-js插件来实现

使用起来稍微复杂,但根据下边的步骤就能轻松搞定

先在package.json中添加diagram-js,然后运行npm install安装diagram-js

"dependencies": {"bpmn-js": "^7.3.0","diagram-js": "^5.0.0"
},

编写自定义Viewer添加ZoomScrollModuleMoveCanvasModule模块来扩展默认Viewer的功能,自定义Viewer文件位于src/components/customBpmn/index.js下,内容如下

import inherits from "inherits";import Viewer from "bpmn-js/lib/Viewer";import ZoomScrollModule from "diagram-js/lib/navigation/zoomscroll";
import MoveCanvasModule from "diagram-js/lib/navigation/movecanvas";function CustomViewer(options) {Viewer.call(this, options);
}inherits(CustomViewer, Viewer);CustomViewer.prototype._modules = [].concat(Viewer.prototype._modules, [ZoomScrollModule,MoveCanvasModule
]);export { CustomModeler, CustomViewer };

最后在页面中引用自定义Viewer

import { CustomViewer } from "../components/customBpmn";

并将init初始化方法中的BpmnViewer替换为CustomViewer,然后刷新页面就会发现流程图可以拖动啦

写在最后

接触bpmn-js不久,边学边写,文章难免出错,各位多多包含。想要打造一个好用的适合自己的流程编辑器,需要了解的内容比较多,bpmn-js会分多篇文章来介绍,欢迎关注

源码地址:https://github.com/Mrs-Bean/bpmn-src.gitBPMN(Business Process Modeling Notation)是由业务流程管理倡议组织BPMI(The Business Process Management Initiative)开发的一套标准的业务流程建模符号规范。其目的是为用户提供一套容易理解的标准符号,这些符号作为BPMN的基础元素,将业务流程建模简单化、图形化,将复杂的建模过程视觉化,让业务建模者、业务实施人员、管理监督人员对BPMN描述的业务流程都有一个更加清晰明了的了解。 - Mrs-Bean/bpmn-srcicon-default.png?t=N7T8https://github.com/Mrs-Bean/bpmn-src.git

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

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

相关文章

【基础CSS】

本文章属于学习笔记&#xff0c;在https://www.freecodecamp.org/chinese/learn/2022/responsive-web-design/中练习 二、 CSS 样式&#xff0c;新建一个文件.css&#xff0c;该文件不含有style标签 <style>. h1&#xff0c;h2&#xff0c;p{ text-align&#xff1a;ce…

Skywalking(9.7.0) 告警配置

图片被吞&#xff0c;来这里看吧&#xff1a;https://juejin.cn/post/7344567669893021736 过年前一天发版&#xff0c;大家高高兴兴准备回家过年去了。这时候老板说了一句&#xff0c;记得带上电脑&#xff0c;关注用户反馈。有紧急问题在高速上都得给我找个服务区改好。 但是…

C++初阶

1.缺省参数 给缺省参数的时候&#xff0c;不能声明&#xff0c;定义同时给&#xff0c;只能声明的时候给缺省参数&#xff0c;同时给程序报错&#xff1b; 2.函数重载 C语言不允许同名函数的存在&#xff0c;函数名不能相同&#xff0c;C引入函数重载&#xff0c;函数名可以…

IDEA启动时,电脑非常的卡

选择Help -> Change memory Settings 把启动内存调大一点就行了&#xff0c;反正要超过你平时使用IDEA时使用到的内存大小就行。 原因解释&#xff1a; JVM在运行时会回收新生代和老年代的垃圾&#xff0c;新生代无法回收的对象&#xff0c;比如&#xff1a;回收15次都没有…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的农作物害虫检测系统(深度学习模型+UI界面+训练数据集)

摘要&#xff1a;开发农作物害虫检测系统对于提高农业生产效率和作物产量具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个农作物害虫检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5&#xff0…

前端请求到 SpringMVC 的处理流程

1. 发起请求 客户端通过 HTTP 协议向服务器发起请求。 2. 前端控制器&#xff08;DispatcherServlet&#xff09; 这个请求会先到前端控制器 DispatcherServlet&#xff0c;它是整个流程的入口点&#xff0c;负责接收请求并将其分发给相应的处理器。 3. 处理器映射&#xf…

SpringBoot项目中出现不同端口跨域问题,如何解决?

方法一&#xff1a;比较繁琐&#xff0c;适合少量Controller控制器类 方法二 &#xff1a;需要写一个全局的配置文件即可 在如图所示的common目录下新建一个CorsConfig的class文件 具体代码展示&#xff1a; import org.springframework.context.annotation.Bean; import o…

前端Vue列表组件 list组件:实现高效数据展示与交互

前端Vue列表组件 list组件&#xff1a;实现高效数据展示与交互 摘要&#xff1a;在前端开发中&#xff0c;列表组件是展示数据的重要手段。本文将介绍如何使用Vue.js构建一个高效、可复用的列表组件&#xff0c;并探讨其在实际项目中的应用。 效果图如下&#xff1a; 一、引言…

功能测试--APP性能测试

功能测试--APP性能测试 内存数据查看内存测试 CPU数据查看CPU测试 流量和电量的消耗流量测试流量优化方法电量测试电量测试场景&#xff08;大&#xff09; 获取启动时间启动测试--安卓 流畅度流畅度测试 稳定性稳定性测试 内存数据查看 内存泄露:内存的曲线持续增长(增的远比减…

git上拉下来的web项目,只有一个.git路径解决

代码拉下来的时候&#xff0c;web项目路径只有一个.git&#xff0c;可能指没有致命分支&#xff1a; 用idea打开web项目&#xff1b;切换到对应的分支即可

基于Ambari搭建大数据分析平台

一、部署工具简介 1. Hadoop生态系统 Hadoop big data ecosystem in Apache stack 2. Hadoop的发行版本 Hadoop的发行版除了Apache的开源版本之外&#xff0c;国外比较流行的还有&#xff1a;Cloudera发行版(CDH)、Hortonworks发行版&#xff08;HDP&#xff09;、MapR等&am…

代理IP是否会导致网络连接变慢?

目录 一、代理IP的工作原理及其在网络中的作用 二、代理IP可能导致网络连接变慢的因素 三、案例分析 四、优化代理IP使用的建议 五、总结 在网络世界中&#xff0c;代理IP的使用非常普遍&#xff0c;尤其是在需要隐藏真实IP地址、访问受限资源或进行网络爬虫等场景下。然而…

如何查看mnist数据集的图片

import numpy as np import matplotlib.pyplot as pltdef read_mnist_images(filename):with open(filename, rb) as f:# 读取魔术数字、图像数量、行数、列数magic_number int.from_bytes(f.read(4), big)number_of_images int.from_bytes(f.read(4), big)rows int.from_by…

UE4案例记录

UE4案例记录&#xff08;制作3D角色显示在UI中&#xff09; 制作3D角色显示在UI中 转载自youtube视频 https://www.youtube.com/channel/UCC8f6SxKJElVvaRb7nF4Axg 新建项目 创建一个Actor 场景组件->摄像机组件->场景捕获组件2D&#xff0c;之后添加一个骨骼网格体…

CLion 配置 Qt 开发环境

文章目录 CLion 配置 Qt 开发环境环境说明基本配置1. 创建Qt项目2. 设置CLion工具链3. 配置外部工具 一些问题的补充 CLion 配置 Qt 开发环境 环境说明 操作系统&#xff1a;Windows 10 CLion版本&#xff1a;2023.3.4 CMake版本&#xff1a;3.27.7 Qt6版本&#xff1a;6.6…

Java特性之设计模式【组合模式】

一、组合模式 概述 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设计模式属于结构型模式&#x…

AHU 汇编 实验一

一、实验名称&#xff1a;实验1 实验1 用Debug命令查看寄存器和内存中的内容 实验目的:求掌握使用Debug命令查看寄存器和内存的方法。 通过第2章两个简单实例认识汇编语言程序&#xff0c;初步了解程序格式&#xff1b;段定义&#xff1b;标号&#xff1b;DOS系统功能&#xf…

基于恒功率PQ控制的三电平并网逆变器MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 三相 T 型三电平逆变器电路如图所示&#xff0c;逆变器主回路由三个单相 T 型逆变器组成。 直流侧输入电压为 UPV&#xff0c;直流侧中点电位 O 设为零电位&#xff0c;交流侧输出侧是三相三线制连…

如何深度学习

信息爆炸时代&#xff0c;诞生了很多新的学习方式&#xff0c;非常轻松就能掌握知识&#xff0c;比如&#xff0c;每天听一本书&#xff0c;半个小时就能学习一本书的精华&#xff0c;比如订阅名家专栏或者课程&#xff0c;在不长的时间内内就能学到很多知识。 很多人认为这样…

【数据结构取经之路】快速排序的非递归实现

概述 递归实现快速排序在一些场景下有栈溢出的风险&#xff0c;下面就谈谈如何用非递归的方法实现快速排序。 非递归实现的思想 递归实现与非递归实现快速排序的本质是一致的&#xff0c;效率并不会因为用了非递归实现而有所提升。递归实现快速排序的本质就在于通过递归&…