前言

Q: bpmn.js是什么? 🤔️

bpmn.js是一个BPMN2.0渲染工具包和web建模器, 使得画流程图的功能在前端来完成.

Q: 我为什么要写该系列的教材? 🤔️

因为公司业务的需要因而要在项目中使用到bpmn.js,但是由于bpmn.js的开发者是国外友人, 因此国内对这方面的教材很少, 也没有详细的文档. 所以很多使用方式很多坑都得自己去找.在将其琢磨完之后, 决定写一系列关于它的教材来帮助更多bpmn.js的使用者或者是期于找到一种好的绘制流程图的开发者. 同时也是自己对其的一种巩固.

由于是系列的文章, 所以更新的可能会比较频繁, 您要是无意间刷到了且不是您所需要的还请谅解😊.

不求赞👍不求心❤️. 只希望能对你有一点小小的帮助.

bpmn.js基本的使用

这一章节主要是介绍了bpmn.js最基本的几种实用方式, 适合完全没有接触过bpmn.js的新手或者想要在vue项目中使用它的开发者.

通过这一章节的讲解你可以学习到:

为了方便大家对后面的讲解有一个大概认识, 我们先来看一下使用bpmn.js画图都有哪些内容:

bpmn.js 基础篇 - 图1

bpmn.js最简单的一种使用

我们可以直接使用CDNbpmn.js引入到代码中使用:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>BPMNJS</title>
  8. <!--CDN加速-->
  9. <script src="https://unpkg.com/bpmn-js@6.0.2/dist/bpmn-viewer.development.js"></script> <!--引入一个简单的xml字符串-->
  10. <script src="./xmlStr.js"></script>
  11. <style>
  12. #canvas {
  13. height: 400px;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <div id="canvas"></div>
  19. <script>
  20. var bpmnJS = new BpmnJS({
  21. container: '#canvas'
  22. });
  23. bpmnJS.importXML(xmlStr, function(err) {
  24. if (!err) {
  25. console.log('success!');
  26. // 让图能自适应屏幕
  27. var canvas = bpmnJS.get('canvas')
  28. canvas.zoom('fit-viewport')
  29. } else {
  30. console.log('something went wrong:', err);
  31. }
  32. });
  33. </script>
  34. </body>
  35. </html>

(上面的xmlStr.js以及案例代码在这里LinDaiDai-bpmn-basic-demo)

如上面的案例所示, 我们使用CDN加速直接引入bpmn.js, 然后本地指定一个容器(也就是idcanvas的那个div), 接着用bpmn.js提供的方法importXML就可以解析xml字符串生成对应的工作流图了.

打开页面可以看到

img1

使用npm安装bpmn.js

上面提供的使用方式是一种最基本的方式,仅仅是将图展示出来,不能自己绘画也不能操作. 所以在工作中使用更多的还是采用npm安装到项目中使用. 我们可以使用以下命令进行安装:

  1. npm install --save bpmn-js

在应用程序中使用:

  1. import BpmnViewer from 'bpmn-js';
  2. import testDiagram from './test-diagram.bpmn';
  3. var viewer = new BpmnViewer({
  4. container: '#canvas'
  5. });
  6. viewer.importXML(testDiagram, function(err) {
  7. if (!err) {
  8. console.log('success!');
  9. viewer.get('canvas').zoom('fit-viewport');
  10. } else {
  11. console.log('something went wrong:', err);
  12. }
  13. });

上面的testDiagram指的是某个bpmn 文件了,而不是第一个案例中的xml字符串.

官方这边也提供了一个例子, 可以看一下: bpmn-js-example-bunding

vue中使用bpmn.js

vue 中的使用可以分为以下几个部分:

为了方便讲解, 我先创建一个空的vue项目(只安装了路由):

  1. vue create vue-bpmn-basic
  2. cd vue-bpmn-basic
  3. npm i vue-router --save-D

注⚠️️

你可以不用本地创建, 此项目地址

LinDaiDai/bpmn-vue-basic

vue中使用bpmn.js-基础篇

我在项目的components文件夹下创建一个名为basic.vue的文件, 且配置好路由:

  1. const routes = [
  2. {
  3. path: '/basic',
  4. component: () => import('./../components/basic')
  5. }
  6. ]

项目结构如图所示:

img5

  1. 安装相关依赖
  1. npm i bpmn-js --save-D
  1. 编写HTML代码
  1. // basic.vue
  2. <template>
  3. <div class="containers">
  4. <div class="canvas" ref="canvas"></div>
  5. </div>
  6. </template>
  1. 编写JS代码
  1. // basic.vue
  2. <script>
  3. // 引入相关的依赖
  4. import BpmnModeler from 'bpmn-js/lib/Modeler'
  5. import {
  6. xmlStr
  7. } from '../mock/xmlStr' // 这里是直接引用了xml字符串
  8. export default {
  9. name: '',
  10. components: {},
  11. // 生命周期 - 创建完成(可以访问当前this实例)
  12. created() { },
  13. // 生命周期 - 载入后, Vue 实例挂载到实际的 DOM 操作完成,一般在该过程进行 Ajax 交互
  14. mounted() {
  15. this.init()
  16. },
  17. data() {
  18. return {
  19. // bpmn建模器
  20. bpmnModeler: null,
  21. container: null,
  22. canvas: null
  23. }
  24. },
  25. methods: {
  26. init() {
  27. // 获取到属性ref为“canvas”的dom节点
  28. const canvas = this.$refs.canvas
  29. // 建模
  30. this.bpmnModeler = new BpmnModeler({
  31. container: canvas
  32. })
  33. this.createNewDiagram()
  34. },
  35. createNewDiagram() {
  36. // 将字符串转换成图显示出来
  37. this.bpmnModeler.importXML(xmlStr, (err) => {
  38. if (err) {
  39. // console.error(err)
  40. } else {
  41. // 这里是成功之后的回调, 可以在这里做一系列事情
  42. this.success()
  43. }
  44. })
  45. },
  46. success() {
  47. // console.log('创建成功!')
  48. }
  49. }
  50. }
  51. </script>
  1. 编写CSS
  1. // basic.vue
  2. <style scoped>
  3. .containers{
  4. position: absolute;
  5. background-color: #ffffff;
  6. width: 100%;
  7. height: 100%;
  8. }
  9. .canvas{
  10. width: 100%;
  11. height: 100%;
  12. }
  13. .panel{
  14. position: absolute;
  15. right: 0;
  16. top: 0;
  17. width: 300px;
  18. }
  19. </style>

使用命令npm run start启动项目, 打开可以看到:

img2

vue中使用bpmn.js-左侧工具栏

左侧工具栏作用: 给图形添加新的节点

如图所示:

img3

要想使用左侧工具栏, 需要在项目中引用相应的样式:

  1. main.js中引用css:
  1. // main.js
  2. import Vue from 'vue'
  3. import App from './App.vue'
  4. import router from './router'
  5. Vue.config.productionTip = false
  6. // 以下为bpmn工作流绘图工具的样式
  7. import 'bpmn-js/dist/assets/diagram-js.css' // 左边工具栏以及编辑节点的样式
  8. import 'bpmn-js/dist/assets/bpmn-font/css/bpmn.css'
  9. import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css'
  10. import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css'
  11. new Vue({
  12. router,
  13. render: h => h(App),
  14. }).$mount('#app')
  1. 页面上引入propertiesProviderModule:
  1. // provider.vue
  2. <script>
  3. ...
  4. import propertiesProviderModule from 'bpmn-js-properties-panel/lib/provider/camunda'
  5. ...
  6. methods: {
  7. init () {
  8. // 获取到属性ref为“canvas”的dom节点
  9. const canvas = this.$refs.canvas
  10. // 建模
  11. this.bpmnModeler = new BpmnModeler({
  12. container: canvas,
  13. //添加控制板
  14. propertiesPanel: {
  15. parent: '#js-properties-panel'
  16. },
  17. additionalModules: [
  18. // 左边工具栏以及节点
  19. propertiesProviderModule
  20. ]
  21. })
  22. this.createNewDiagram()
  23. },
  24. ...
  25. }
  26. </script>

provider.vue的其他代码片段都和basic.vue 相同.

此时打开页面就发现多了左侧的工具栏, 且可以添加节点.

vue中使用bpmn.js-右侧属性栏

属性栏的作用: 用户在点击图上的节点的时候, 能获取到该节点的属性信息

如图所示:

img4

想要使用右侧的属性栏就得安装上一个名为bpmn-js-properties-panel的插件了.

  1. 安装插件
  1. npm i bpmn-js-properties-panel --save-D
  1. main.js中引入相应样式:
  1. // main.js
  2. import Vue from 'vue'
  3. ...
  4. import 'bpmn-js-properties-panel/dist/assets/bpmn-js-properties-panel.css' // 右边工具栏样式
  5. ...
  1. 在页面中引入propertiesProviderModule:
  1. // panel.vue
  2. <script>
  3. ...
  4. import propertiesProviderModule from 'bpmn-js-properties-panel/lib/provider/camunda'
  5. ...
  6. methods: {
  7. init() {
  8. // 获取到属性ref为“canvas”的dom节点
  9. const canvas = this.$refs.canvas
  10. // 建模
  11. this.bpmnModeler = new BpmnModeler({
  12. container: canvas,
  13. //添加控制板
  14. propertiesPanel: {
  15. parent: '#js-properties-panel'
  16. },
  17. additionalModules: [
  18. // 左边工具栏以及节点
  19. propertiesProviderModule,
  20. // 右边的工具栏
  21. propertiesPanelModule
  22. ]
  23. })
  24. this.createNewDiagram()
  25. }
  26. }

后语

上述案例项目Git地址 : https://github.com/LinDaiDai/bpmn-vue-basic 喜欢的小伙伴请给个Star🌟呀, 谢谢😊

系列全部目录请查看此处: 《全网最详bpmn.js教材目录》

最后, 如果你也对bpmn.js 感兴趣可以进我们的bpmn.js交流群👇👇👇, 共同学习, 共同进步.

关注霖呆呆(LinDaiDai)的公众号, 选择 其它 菜单中的 bpmn.js群 即可😊.

LinDaiDai公众号二维码.jpg