最好用的流程編輯器bpmn-js系列之基本使用

最好用的流程編輯器bpmn-js系列文章

BPMN(Business Process Modeling Notation)是由業務流程管理倡議組織BPMI(The Business Process Management Initiative)開發的一套標準的業務流程建模符號規範。其目的是為用戶提供一套容易理解的標準符號,這些符號作為BPMN的基礎元素,將業務流程建模簡單化、圖形化,將複雜的建模過程視覺化,讓業務建模者、業務實施人員、管理監督人員對BPMN描述的業務流程都有一個更加清晰明了的了解。

BPMN的主要意義在於其作為一個標準,業務相關者都按照這個標準來繪製業務流程圖,能夠減少各方對於流程圖的理解歧義,從而達到高效協作的目的

BPMN包含以下四類基本元素

  • 流對象(Flow Objects):包括事件、活動、網關,是BPMN中的核心元素
  • 連接對象(Connecting Objects):包括順序流、消息流、關聯
  • 泳道(Swimlanes):包括池和道兩種類型
  • 人工信息(Artifacts):包括數據對象、組、注釋

bpmn-js就是基於BPMN標準實現的一套渲染工具包和web建模器,以下系列文章將會介紹我的使用過程

基本使用

bpmn-js的使用非常簡單,我們可以在VUE項目中使用,或者是直接在HTML文件中引入JS/CSS資源文件,就像下邊這樣

<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
  <title>運維咖啡吧 - BPMNJS</title>
    
  <!-- 引入BPMN-JS的CSS文件 -->
  <link rel="stylesheet" href="//unpkg.com/[email protected]/dist/assets/diagram-js.css" />
  <link rel="stylesheet" href="//unpkg.com/[email protected]/dist/assets/bpmn-font/css/bpmn.css" />
</head>

<body>
  <div id="canvas" style="height:80vh;"></div>

  <!-- 引入BPMN-JS的JS文件 -->
  <script src="//unpkg.com/[email protected]/dist/bpmn-modeler.development.js"></script>
  <script>
	var diagramXML = `<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="//www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="//www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="//www.omg.org/spec/DD/20100524/DC" id="sample-diagram" targetNamespace="//bpmn.io/schema/bpmn" xsi:schemaLocation="//www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
<bpmn2:process id="Process_1" isExecutable="false">
  <bpmn2:startEvent id="StartEvent_1" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
  <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
    <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
      <dc:Bounds x="192" y="82" width="36" height="36" />
    </bpmndi:BPMNShape>
  </bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>`

	var bpmnModeler = new BpmnJS({
      container: '#canvas'
    });
		
    bpmnModeler.importXML(diagramXML, function(err) {
	  if (err) {
        return console.error('failed to load diagram', err);
      }
    });
  </script>
</body>

</html>

瀏覽器訪問會出現如下一個流程編輯器,可以在這裡進行流程的編輯

bpmn-js有兩種模式:Modeler模式和Viewer模式,在Modeler模式下可以對流程圖進行編輯,而Viewer模式則不能,僅作為展示用

viewer模式相對簡單,無需引入CSS文件,只需引入一個JS即可

<script src="//unpkg.com/[email protected]/dist/bpmn-viewer.development.js"></script>

通常在流程執行階段的展示用Viewer模式,配合節點顏色設置讓用戶清晰的看到當前流程的執行過程和狀態

VUE中使用

更多的時候我們可能會在VUE項目中使用,為了展示清晰,這裡先通過vue-cli腳手架創建一個vue項目

vue create ops-coffee-bpmn
cd ops-coffee-bpmn

原始的目錄結構大概是這個樣子的

安裝bpmn-js

npm install bpmn-js --save

安裝完成後就可以開始使用bpmn-js了,首先要引入bpmn-js的CSS,修改src/main.js文件

import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";

Vue.config.productionTip = false;

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";

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount("#app");

然後編寫bpmn-modeler.vue文件,文件位於src/views/bpmn-modeler.vue

<template>
  <div class="containers">
    <div class="canvas" ref="canvas"></div>
  </div>
</template>

<script>
import BpmnModeler from "bpmn-js/lib/Modeler";
import { xmlStr } from "../mock/xmlStr";

export default {
  name: "ops-coffee",
  mounted() {
    this.init();
  },
  data() {
    return {
      bpmnModeler: null,
      container: null,
      canvas: null
    };
  },
  methods: {
    init() {
      const canvas = this.$refs.canvas;
      this.bpmnModeler = new BpmnModeler({
        container: canvas
      });

      this.createNewDiagram();
    },
    createNewDiagram() {
      try {
        const result = this.bpmnModeler.importXML(xmlStr);
        const { warnings } = result;
        console.log(warnings);
      } catch (err) {
        console.log(err.message, err.warnings);
      }
    }
  }
};
</script>

<style scoped>
.containers {
  width: 100%;
  height: calc(100vh - 82px);
}
.canvas {
  width: 100%;
  height: 100%;
}
</style>

這裡引入了一個外部變量xmlStr,這個變量主要用來存放BPMN的XML數據,這裡創建對應的src/mock/xmlStr.js文件

export var xmlStr = `<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="//www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="//www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="//www.omg.org/spec/DD/20100524/DC" id="sample-diagram" targetNamespace="//bpmn.io/schema/bpmn" xsi:schemaLocation="//www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
<bpmn2:process id="Process_1" isExecutable="false">
  <bpmn2:startEvent id="StartEvent_1" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
  <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
    <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
      <dc:Bounds x="192" y="82" width="36" height="36" />
    </bpmndi:BPMNShape>
  </bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>`;

最後修改src/router/index.js文件添加路由

const routes = [
  {
    path: "/",
    name: "編輯模式",
    component: () => import("../views/bpmn-modeler.vue")
  },
];

然後訪問頁面,就可看到流程編輯器,進行流程編輯等操作

以上為Modeler模式,如果想用Viewer模式的話,也非常簡單,僅需將引入的Modeler改為Viewer即可

import BpmnViewer from "bpmn-js/lib/Viewer";

概念名詞

在使用bpmn-js的過程中,經常會出現一些名詞,了解他們有利於我們後續的使用和開發

畫布中的元素叫element,element包含連線connection和形狀shape,流程圖是由shape和connection組成的,可以通過拖動左側工具欄Palette來創建元素,點擊元素會出現ContextPad工具箱,不同的元素會出現不同的ContextPad,可以通過ContextPad工具創建shape或connection,也可以修改元素type,添加註解,以及刪除元素等操作

寫在最後

接觸bpmn-js不久,且第一次用VUE,邊學邊寫,文章難免出錯,各位多多包含。想要打造一個好用的適合自己的流程編輯器,需要了解的內容比較多,bpmn-js會分多篇文章來介紹,這是本系列的第一篇,下一篇介紹bpmn-js的數據保存等內容,歡迎關注

部分小夥伴對流程編輯器不了解,或是對BPMN不了解,我搭建了個在線的Demo: //bpmn.ops-coffee.cn,點擊鏈接即可輕鬆體驗,建議PC端打開效果更好