全網(wǎng)最詳bpmn.js教材-基礎(chǔ)篇

前言

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)容:

image

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>          <!--引入一個(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è)容器(也就是idcanvas的那個(gè)div), 接著用bpmn.js提供的方法importXML就可以解析xml字符串生成對應(yīng)的工作流圖了.

打開頁面可以看到

img1

使用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)目地址

LinDaiDai/bpmn-vue-basic

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)如圖所示:

img5
  1. 安裝相關(guān)依賴
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>
    // 引入相關(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>
  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啟動項(xiàng)目, 打開可以看到:

img2

vue中使用bpmn.js-左側(cè)工具欄

左側(cè)工具欄作用: 給圖形添加新的節(jié)點(diǎn)

如圖所示:

img3

要想使用左側(cè)工具欄, 需要在項(xiàng)目中引用相應(yīng)的樣式:

  1. 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')

  1. 頁面上引入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)的屬性信息

如圖所示:

img4

想要使用右側(cè)的屬性欄就得安裝上一個(gè)名為bpmn-js-properties-panel的插件了.

  1. 安裝插件
npm i bpmn-js-properties-panel --save-D

  1. main.js中引入相應(yīng)樣式:
// main.js
import Vue from 'vue'
...
import 'bpmn-js-properties-panel/dist/assets/bpmn-js-properties-panel.css' // 右邊工具欄樣式
...

  1. 在頁面中引入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教材-http請求篇》

《全網(wǎng)最詳bpmn.js教材-事件篇》

《全網(wǎng)最詳bpmn.js教材-renderer篇》

《全網(wǎng)最詳bpmn.js教材-contextPad篇》

《全網(wǎng)最詳bpmn.js教材-編輯窝趣、刪除節(jié)點(diǎn)篇》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市筐眷,隨后出現(xiàn)的幾起案子涂臣,更是在濱河造成了極大的恐慌,老刑警劉巖能真,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異胜嗓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)矾屯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門兼蕊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人件蚕,你說我怎么就攤上這事孙技。” “怎么了排作?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵牵啦,是天一觀的道長。 經(jīng)常有香客問我妄痪,道長哈雏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮裳瘪,結(jié)果婚禮上土浸,老公的妹妹穿的比我還像新娘。我一直安慰自己彭羹,他們只是感情好黄伊,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著派殷,像睡著了一般还最。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毡惜,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天拓轻,我揣著相機(jī)與錄音,去河邊找鬼经伙。 笑死扶叉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帕膜。 我是一名探鬼主播辜梳,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泳叠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起茶宵,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤危纫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后乌庶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體种蝶,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年瞒大,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了螃征。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡透敌,死狀恐怖盯滚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酗电,我是刑警寧澤魄藕,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站撵术,受9級特大地震影響背率,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一寝姿、第九天 我趴在偏房一處隱蔽的房頂上張望交排。 院中可真熱鬧,春花似錦饵筑、人聲如沸埃篓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽都许。三九已至,卻和暖如春嫂冻,著一層夾襖步出監(jiān)牢的瞬間胶征,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工桨仿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留睛低,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓服傍,卻偏偏與公主長得像钱雷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子吹零,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容