vue項目中使用bpmn-流程圖預覽篇


內容概述

本系列 “vue項目中使用bpmn-xxxx” 分為七篇,均為自己使用過程中用到的實例,手工原創,目前陸續更新中。主要包括vue項目中bpmn使用實例、應用技巧、基本知識點總結和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下。如果轉載或通過爬蟲直接爬的,格式特別丑,請來原創看:我是作者原文

前情提要

上文已經實現了節點操作的前進、后退、導入。導出等操作,今日來實現“流程圖預覽”,以及視圖的放大縮小,效果如下:

前提:項目安裝過bpmn,安裝可見上篇文章

實現要點

bpmn提供了兩個神器:Modeler 和 Viewer,Modeler帶有左側節點欄和右側屬性欄,點擊節點可進行相應操作,Viewer是“查看”,不能更改節點,兩者相互獨立,可按實際需求按需引入

繪制流程圖:import BpmnModeler from 'bpmn-js/lib/Modeler';

預覽流程圖:import BpmnViewer from 'bpmn-js/lib/Viewer';

直接上代碼:
<template>
    <div class="container">
        <el-button type="primary" @click="previewTemp">預覽</el-button>
        <el-button type="success" @click="handleZoom(1)">放大</el-button>
        <el-button type="warning" @click="handleZoom(-1)">縮小</el-button>
        <div class="chart-preview">
            <div style="clear: both;"></div>
            <div class="view-canvas">
                <div id="container"
                     v-bind:style="{width: 100 * scale + '%',height: 100 * scale + '%'}"
                ></div>
            </div>
        </div>
    </div>
</template>
<script>
  import jquery from 'jquery';
  import BpmnViewer from 'bpmn-js/lib/Viewer';


  export default {
    data() {
      return {
        containerEl: null,
        bpmnModeler: null,
        scale: 1,
       // 此變量為預覽的xml文件數據,由於行數過多,附在了附件中,使用時,將附件整個復值到currentCanvasXml即可
        currentCanvasXml: ''
      };
    },
    methods: {
      handleZoom(flag) {
        if (flag < 0 && this.scale <= 1) {
          return;
        }
        this.scale += flag;
        this.$nextTick(() => {
          this.bpmnModeler.get('canvas').zoom('fit-viewport');
        });
      },
      previewTemp() {
        this.containerEl = document.getElementById('container');
        // 避免緩存,每次清一下
        this.bpmnModeler && this.bpmnModeler.destroy();
        this.scale = 1;
        this.bpmnModeler = new BpmnViewer({container: this.containerEl});
        const viewer = this.bpmnModeler;
        this.bpmnModeler.importXML(this.currentCanvasXml, (err) => {
          if (err) {
            console.error(err);
          } else {
            // 只實現預覽,核心代碼以下兩句足夠 
            const canvas = viewer.get('canvas');
            canvas.zoom('fit-viewport');
            // 以下代碼為:為節點注冊鼠標懸浮事件
            const eventBus = this.bpmnModeler.get('eventBus');
            const overlays = this.bpmnModeler.get('overlays');
            eventBus.on('element.hover', (e) => {
              const $overlayHtml = jquery(` <div class="tipBox">
                    你好,我是懸浮框里的內容
                    </div>`);
              overlays.add(e.element.id, {
                position: {top: e.element.height, left: 0},
                html: $overlayHtml
              });
            });
            eventBus.on('element.out', () => {
              overlays.clear();
            });
          //  注冊懸浮事件結束
          }
        });
      }
    }
  };
</script>
<style lang="scss">
    .container {
        .tipBox {
            width: 200px;
            background: #fff;
            border-radius: 4px;
            border: 1px solid #ebeef5;
            padding: 12px;
        }
    }
</style>
View Code

后續

currentCanvasXml 為預覽的xml文件數據,由於行數過多,附在了附件中(點我!點我!),使用時,將整個賦值到currentCanvasXml,代碼才可以運行,否則報錯!!

想獲取完整源碼或有問題,歡迎大家關注我的公粽號,掃下面二維碼或微信搜“前端便利貼”,即可獲取~

可愛的你可能還需要


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM