全網最詳bpmn.js教材-基礎篇

LinDaiDai_霖呆呆發表於2019-12-10

前言

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最簡單的一種使用

我們可以直接使用CDNbpmn.js引入到程式碼中使用:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>BPMNJS</title>
    <!--CDN加速-->
    <script src="https://unpkg.com/bpmn-js@6.0.2/dist/bpmn-viewer.development.js"></script>  		 <!--引入一個簡單的xml字串-->
    <script src="./xmlStr.js"></script>
    <style>
        #canvas {
            height: 400px;
        }
    </style>
</head>

<body>
    <div id="canvas"></div>
    <script>
        var bpmnJS = new BpmnJS({
            container: '#canvas'
        });
        bpmnJS.importXML(xmlStr, function(err) {
            if (!err) {
                console.log('success!');
                // 讓圖能自適應螢幕
                var canvas = bpmnJS.get('canvas')
                canvas.zoom('fit-viewport')
            } else {
                console.log('something went wrong:', err);
            }
        });
    </script>
</body>

</html>
複製程式碼

(上面的xmlStr.js以及案例程式碼在這裡LinDaiDai-bpmn-basic-demo)

如上面的案例所示, 我們使用DNS加速直接引入bpmn.js, 然後本地指定一個容器(也就是idcanvas的那個div), 接著用bpmn.js提供的方法importXML就可以解析xml字串生成對應的工作流圖了.

開啟頁面可以看到

img1
img1

使用npm安裝bpmn.js

上面提供的使用方式是一種最基本的方式,僅僅是將圖展示出來,不能自己繪畫也不能操作. 所以在工作中使用更多的還是採用npm安裝到專案中使用. 我們可以使用以下命令進行安裝:

npm install --save bpmn-js
複製程式碼

在應用程式中使用:

import BpmnViewer from 'bpmn-js';
import testDiagram from './test-diagram.bpmn';

var viewer = new BpmnViewer({
  container: '#canvas'
});

viewer.importXML(testDiagram, function(err) {
  if (!err) {
    console.log('success!');
    viewer.get('canvas').zoom('fit-viewport');
  } else {
    console.log('something went wrong:', err);
  }
});
複製程式碼

上面的testDiagram指的是某個bpmn 檔案了,而不是第一個案例中的xml字串.

官方這邊也提供了一個例子, 可以看一下: bpmn-js-example-bunding

vue中使用bpmn.js

vue 中的使用可以分為以下幾個部分:

為了方便講解, 我先建立一個空的vue專案(只安裝了路由):

vue create vue-bpmn-basic
cd vue-bpmn-basic
npm i vue-router --save-D
複製程式碼

注⚠️️

你可以不用本地建立, 此專案地址

LinDaiDai/bpmn-vue-basic

vue中使用bpmn.js-基礎篇

我在專案的components資料夾下建立一個名為basic.vue的檔案, 且配置好路由:

const routes = [
    {
    	path: '/basic',
    	component: () => import('./../components/basic')
    }
]
複製程式碼

專案結構如圖所示:

img5
img5
  1. 安裝相關依賴
npm i bpmn-js --save-D
複製程式碼
  1. 編寫HTML程式碼
// basic.vue
<template>
  <div class="containers">
    <div class="canvas" ref="canvas"></div>
  </div>
</template>
複製程式碼
  1. 編寫JS程式碼
// basic.vue
  <script>
    // 引入相關的依賴
    import BpmnModeler from 'bpmn-js/lib/Modeler'
    import {
      xmlStr
    } from '../mock/xmlStr' // 這裡是直接引用了xml字串
    export default {
      name: '',
      components: {},
      // 生命週期 - 建立完成(可以訪問當前this例項)
      created() { },
      // 生命週期 - 載入後, Vue 例項掛載到實際的 DOM 操作完成,一般在該過程進行 Ajax 互動
      mounted() {
        this.init()
      },
      data() {
        return {
          // bpmn建模器
          bpmnModeler: null,
          container: null,
          canvas: null
        }
      },
      methods: {
        init() {
          // 獲取到屬性ref為“canvas”的dom節點
          const canvas1 = this.$refs.canvas1
          // 建模
          this.bpmnModeler = new BpmnModeler({
            container: canvas
          })
          this.createNewDiagram()
        },
        createNewDiagram() {
          // 將字串轉換成圖顯示出來
          this.bpmnModeler.importXML(xmlStr, (err) => {
            if (err) {
              // console.error(err)
            } else {
              // 這裡是成功之後的回撥, 可以在這裡做一系列事情
              this.success()
            }
          })
        },
        success() {
          // console.log('建立成功!')
        }
      }
    }
  </script>
複製程式碼
  1. 編寫CSS
// basic.vue
<style scoped>
.containers{
	position: absolute;
	background-color: #ffffff;
	width: 100%;
	height: 100%;
}
.canvas{
	width: 100%;
	height: 100%;
}
.panel{
	position: absolute;
	right: 0;
	top: 0;
	width: 300px;
}
</style>
複製程式碼

使用命令npm run start啟動專案, 開啟可以看到:

img2
img2

vue中使用bpmn.js-左側工具欄

左側工具欄作用: 給圖形新增新的節點

如圖所示:

img3
img3

要想使用左側工具欄, 只需要在專案中引用相應的樣式就可以了:

main.js中引用css:
// main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
Vue.config.productionTip = false
// 以下為bpmn工作流繪圖工具的樣式
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,
    render: h => h(App),
}).$mount('#app')
複製程式碼

provider.vue的其他程式碼片段都和basic.vue 相同.

此時開啟頁面就發現多了左側的工具欄, 且可以新增節點.

vue中使用bpmn.js-右側屬性欄

屬性欄的作用: 使用者在點選圖上的節點的時候, 能獲取到該節點的屬性資訊

如圖所示:

img4
img4

想要使用右側的屬性欄就得安裝上一個名為bpmn-js-properties-panel的外掛了.

  1. 安裝外掛
npm i bpmn-js-properties-panel --save-D
複製程式碼
  1. main.js中引入相應樣式:
// main.js
import Vue from 'vue'
...
import 'bpmn-js-properties-panel/dist/assets/bpmn-js-properties-panel.css' // 右邊工具欄樣式
...
複製程式碼
  1. 在頁面中引入propertiesProviderModule和propertiesPanelModule :
// panel.vue
<script>
...
import propertiesPanelModule from 'bpmn-js-properties-panel'
import propertiesProviderModule from 'bpmn-js-properties-panel/lib/provider/camunda'
import camundaModdleDescriptor from 'camunda-bpmn-moddle/resources/camunda'
...
methods: {
  init() {
    // 獲取到屬性ref為“canvas”的dom節點
    const canvas = this.$refs.canvas
    // 建模
    this.bpmnModeler = new BpmnModeler({
      container: canvas,
      //新增控制板
      propertiesPanel: {
        parent: '#js-properties-panel'
      },
      additionalModules: [
        // 右邊的屬性欄
        propertiesProviderModule,
        propertiesPanelModule
      ],
      moddleExtensions: {
        camunda: camundaModdleDescriptor
      }
    })
    this.createNewDiagram()
  }
}
複製程式碼

後語

上述案例專案Git地址 : github.com/LinDaiDai/b… 喜歡的小夥伴請給個Star?呀, 謝謝?

系列全部目錄請檢視此處: 《全網最詳bpmn.js教材》

系列相關推薦:

《全網最詳bpmn.js教材-http請求篇》

《全網最詳bpmn.js教材-事件篇》

《全網最詳bpmn.js教材-renderer篇》

《全網最詳bpmn.js教材-contextPad篇》

《全網最詳bpmn.js教材-編輯、刪除節點篇》

相關文章