美文网首页
vue引用bpmn.js封装使用

vue引用bpmn.js封装使用

作者: 清风昙 | 来源:发表于2022-08-22 00:29 被阅读0次

    封装bpmn.js,页面直接传参调用即可实现流程图渲染,避免每个页面都需初始化一遍bpmn的引入。
    前提需安装bpmn.js相关的插件

    npm install --save bpmn-js
    npm install --save bpmn-js-properties-panel
    

    新建utils目录,创建bpmn.js

    import BpmnModeler from "bpmn-js/lib/Modeler";
    
    import propertiesPanelModule from "bpmn-js-properties-panel";
    import propertiesProviderModule from "bpmn-js-properties-panel/lib/provider/camunda";
    
    
    function initBpmn(...rest) { // 通过rest参数获取入参
        // 左边工具栏以及编辑节点的样式
        if (rest[0].isShowTool) {
          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");
        }
        // 右边属性栏样式
        if (rest[0].isShowPanel) {
            import("bpmn-js-properties-panel/dist/assets/bpmn-js-properties-panel.css");
        }
        // 建模
        var bpmnModeler = new BpmnModeler({
          container: rest[0].canvas, // this.$refs.canvas
          //添加控制板
          propertiesPanel: {
            parent: rest[0].isShowPanel ? rest[0].panel : '',  // #js-properties-panel"
          },
          additionalModules: rest[0].isShowPanel ? [
            // 左边工具栏以及节点
            propertiesProviderModule,
            // 右边的工具栏
            propertiesPanelModule,
          ] : '',
        });
        bpmnModeler.importXML(rest[0].bpmnXml, (err) => {
            if (err) {
              console.error('faild:');
            } else {
              console.log('success')
            }
            // 让图能自适应屏幕
            // 让图能自适应屏幕
            if (rest[0].bpmnRef) {
                bpmnModeler.get(rest[0].bpmnRef).zoom("fit-viewport");
            }
          });
      }
    
      export {initBpmn}
    

    bpmn.vue页面引用

    <template>
      <div class="containers">
        <div class="canvas" id="canvas"></div>
        <!-- <div class="canvas" ref="canvas"></div> -->
        <div id="js-properties-panel" class="panel"></div>
      </div>
    </template>
    
    <script>
    import { xmlStr } from "../mock/xmlStr";
    import { initBpmn } from "../utils/bpmn";
    
    export default {
      name: "",
      components: {},
      created() {},
      mounted() {
        this.init();
      },
      data() {
        return {
          xmlUrl: "",
        };
      },
      // 方法集合
      methods: {
        async init() {
          this.$nextTick(() => {
            let obj = {
              canvas: document.getElementById("canvas"), // container容器(id写法)
              //   canvas: this.$refs.canvas, // container容器(ref写法)
              bpmnXml: xmlStr, // bpmn文件字符串
              panel: "#js-properties-panel", // 右侧属性框id
              bpmnRef: "canvas", // ref或id值,让图能自适应屏幕(默认不居中)
              isShowTool: true, // 是否显示左侧工具栏(默认不显示)
              isShowPanel: true, // 是否显示右侧属性栏(默认不显示)
            };
            initBpmn(obj);
          });
        },
      },
      // 计算属性
      computed: {},
    };
    </script>
    
    <style scoped>
    /* bpmn容器大小 */
    .containers {
      background-color: #ffffff;
      width: 100%;
      height: calc(100vh - 52px);
    }
    .canvas {
      width: 100%;
      height: 100%;
    }
    /* 右侧属性框位置 */
    .panel {
      position: absolute;
      right: 0;
      top: 50px;
      width: 300px;
    }
    </style>
    

    效果图如下


    image.png

    相关文章

      网友评论

          本文标题:vue引用bpmn.js封装使用

          本文链接:https://www.haomeiwen.com/subject/rkmwgrtx.html