前言
Q: bpmn.js是什么? ???
bpmn.js是一個(gè)BPMN2.0渲染工具包和web建模器, 使得畫流程圖的功能在前端來完成.
Q: 我為什么要寫該系列的教材? ???
因?yàn)楣緲I(yè)務(wù)的需要因而要在項(xiàng)目中使用到bpmn.js
,但是由于bpmn.js
的開發(fā)者是國外友人, 因此國內(nèi)對這方面的教材很少, 也沒有詳細(xì)的文檔. 所以很多使用方式很多坑都得自己去找.在將其琢磨完之后, 決定寫一系列關(guān)于它的教材來幫助更多bpmn.js
的使用者或者是期于找到一種好的繪制流程圖的開發(fā)者. 同時(shí)也是自己對其的一種鞏固.
由于是系列的文章, 所以更新的可能會比較頻繁, 您要是無意間刷到了且不是您所需要的還請諒解??.
不求贊??不求心??. 只希望能對你有一點(diǎn)小小的幫助.
所有教材的github地址: 《bpmn-chinese-document》
bpmn.js基本的使用
這一章節(jié)主要是介紹了bpmn.js
最基本的幾種實(shí)用方式, 適合完全沒有接觸過bpmn.js
的新手或者想要在vue
項(xiàng)目中使用它的開發(fā)者.
通過這一章節(jié)的講解你可以學(xué)習(xí)到:
為了方便大家對后面的講解有一個(gè)大概認(rèn)識, 我們先來看一下使用bpmn.js
畫圖都有哪些內(nèi)容:
bpmn.js最簡單的一種使用
我們可以直接使用CDN
將bpmn.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> <!--引入一個(gè)簡單的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!');
// 讓圖能自適應(yīng)屏幕
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
, 然后本地指定一個(gè)容器(也就是id
為canvas
的那個(gè)div
), 接著用bpmn.js
提供的方法importXML
就可以解析xml
字符串生成對應(yīng)的工作流圖了.
打開頁面可以看到
使用npm安裝bpmn.js
上面提供的使用方式是一種最基本的方式,僅僅是將圖展示出來,不能自己繪畫也不能操作. 所以在工作中使用更多的還是采用npm
安裝到項(xiàng)目中使用. 我們可以使用以下命令進(jìn)行安裝:
npm install --save bpmn-js
在應(yīng)用程序中使用:
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
指的是某個(gè)bpmn
文件了,而不是第一個(gè)案例中的xml
字符串.
官方這邊也提供了一個(gè)例子, 可以看一下: bpmn-js-example-bunding
vue中使用bpmn.js
在vue
中的使用可以分為以下幾個(gè)部分:
為了方便講解, 我先創(chuàng)建一個(gè)空的vue
項(xiàng)目(只安裝了路由):
vue create vue-bpmn-basic
cd vue-bpmn-basic
npm i vue-router --save-D
注???
你可以不用本地創(chuàng)建, 此項(xiàng)目地址
vue中使用bpmn.js-基礎(chǔ)篇
我在項(xiàng)目的components
文件夾下創(chuàng)建一個(gè)名為basic.vue
的文件, 且配置好路由:
const routes = [
{
path: '/basic',
component: () => import('./../components/basic')
}
]
項(xiàng)目結(jié)構(gòu)如圖所示:
- 安裝相關(guān)依賴
npm i bpmn-js --save-D
- 編寫
HTML
代碼
// basic.vue
<template>
<div class="containers">
<div class="canvas" ref="canvas"></div>
</div>
</template>
- 編寫
JS
代碼
// basic.vue
<script>
// 引入相關(guān)的依賴
import BpmnModeler from 'bpmn-js/lib/Modeler'
import {
xmlStr
} from '../mock/xmlStr' // 這里是直接引用了xml字符串
export default {
name: '',
components: {},
// 生命周期 - 創(chuàng)建完成(可以訪問當(dāng)前this實(shí)例)
created() { },
// 生命周期 - 載入后, Vue 實(shí)例掛載到實(shí)際的 DOM 操作完成,一般在該過程進(jìn)行 Ajax 交互
mounted() {
this.init()
},
data() {
return {
// bpmn建模器
bpmnModeler: null,
container: null,
canvas: null
}
},
methods: {
init() {
// 獲取到屬性ref為“canvas”的dom節(jié)點(diǎn)
const canvas1 = this.$refs.canvas1
// 建模
this.bpmnModeler = new BpmnModeler({
container: canvas
})
this.createNewDiagram()
},
createNewDiagram() {
// 將字符串轉(zhuǎn)換成圖顯示出來
this.bpmnModeler.importXML(xmlStr, (err) => {
if (err) {
// console.error(err)
} else {
// 這里是成功之后的回調(diào), 可以在這里做一系列事情
this.success()
}
})
},
success() {
// console.log('創(chuàng)建成功!')
}
}
}
</script>
- 編寫
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
啟動項(xiàng)目, 打開可以看到:
vue中使用bpmn.js-左側(cè)工具欄
左側(cè)工具欄作用: 給圖形添加新的節(jié)點(diǎn)
如圖所示:
要想使用左側(cè)工具欄, 需要在項(xiàng)目中引用相應(yīng)的樣式:
- 在
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' // 左邊工具欄以及編輯節(jié)點(diǎn)的樣式
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')
- 頁面上引入
propertiesProviderModule
:
// provider.vue
<script>
...
import propertiesProviderModule from 'bpmn-js-properties-panel/lib/provider/camunda'
...
methods: {
init () {
// 獲取到屬性ref為“canvas”的dom節(jié)點(diǎn)
const canvas = this.$refs.canvas
// 建模
this.bpmnModeler = new BpmnModeler({
container: canvas,
//添加控制板
propertiesPanel: {
parent: '#js-properties-panel'
},
additionalModules: [
// 左邊工具欄以及節(jié)點(diǎn)
propertiesProviderModule
]
})
this.createNewDiagram()
},
...
}
</script>
provider.vue
的其他代碼片段都和basic.vue
相同.
此時(shí)打開頁面就發(fā)現(xiàn)多了左側(cè)的工具欄, 且可以添加節(jié)點(diǎn).
vue中使用bpmn.js-右側(cè)屬性欄
屬性欄的作用: 用戶在點(diǎn)擊圖上的節(jié)點(diǎn)的時(shí)候, 能獲取到該節(jié)點(diǎn)的屬性信息
如圖所示:
想要使用右側(cè)的屬性欄就得安裝上一個(gè)名為bpmn-js-properties-panel
的插件了.
- 安裝插件
npm i bpmn-js-properties-panel --save-D
- 在
main.js
中引入相應(yīng)樣式:
// main.js
import Vue from 'vue'
...
import 'bpmn-js-properties-panel/dist/assets/bpmn-js-properties-panel.css' // 右邊工具欄樣式
...
- 在頁面中引入
propertiesProviderModule
:
// panel.vue
<script>
...
import propertiesProviderModule from 'bpmn-js-properties-panel/lib/provider/camunda'
...
methods: {
init() {
// 獲取到屬性ref為“canvas”的dom節(jié)點(diǎn)
const canvas = this.$refs.canvas
// 建模
this.bpmnModeler = new BpmnModeler({
container: canvas,
//添加控制板
propertiesPanel: {
parent: '#js-properties-panel'
},
additionalModules: [
// 左邊工具欄以及節(jié)點(diǎn)
propertiesProviderModule,
// 右邊的工具欄
propertiesPanelModule
]
})
this.createNewDiagram()
}
}
后語
上述案例項(xiàng)目Git地址 : https://github.com/LinDaiDai/bpmn-vue-basic 喜歡的小伙伴請給個(gè)Star
??呀, 謝謝??
系列全部目錄請查看此處: 《全網(wǎng)最詳bpmn.js教材》
系列相關(guān)推薦:
《全網(wǎng)最詳bpmn.js教材-renderer篇》