美文网首页Vuevue_bpmn建模bpmn 工作流
在vue中使用bpmn-js(二)

在vue中使用bpmn-js(二)

作者: Lia代码猪崽 | 来源:发表于2017-11-24 11:44 被阅读822次

    2.新建空的图,功能要求:

    ① 空的,能自己画;
    ② 以SVG image格式、BPMN diagram格式下载在本地;
    ③ 画完能提交给服务器;

    参考链接:(其实就是理解它的思路,把jQuery转化成vue)
    https://github.com/bpmn-io/bpmn-js-examples/blob/master/properties-panel/app/index.html
    https://github.com/bpmn-io/bpmn-js-examples/blob/master/properties-panel/app/index.js

    PS:由于项目需求,当进入页面,需要先输入定义流程图的名字,才能开始画图。(如果没这个需求可以省略到相关的代码)

    html:

    <template>
      <div class="containers" ref="content">
        <div class="canvas" ref="canvas"></div>
        <div id="js-properties-panel" class="panel"></div>
        <ul class="buttons">
          <li>下载</li>
          <li>
            <a ref="saveDiagram" href="javascript:;" title="download BPMN diagram">BPMN diagram</a>
          </li>
          <li>
            <a ref="saveSvg" href="javascript:;" title="download as SVG image">SVG image</a>
          </li>
        </ul>
        <el-button class="save" type="primary" @click="save" :disabled="!xmlStr">新增保存</el-button>
      </div>
    </template>
    

    js:

    <script>
      // 引入保存要用的API接口
      import {saveBpmnData} from '../../api/modeler'
      
      export default {
        data(){
          return {
            id: null,
            bpmnModeler: null,
            container: null,
            canvas: null,
            xmlStr: null,
            processName: '',
          }
        },
        methods:{
          createNewDiagram() {
            // 定义空的图的模型,这里我们根据用户输入,利用字符串的拼接,定义了这个流程图的名字,不需要的就把字符串的拼接去掉。
            // 把 <bpmn2:process id=\"Process_1\" name=\"" + this.processName + "\" isExecutable=\"false\"> 改成 <bpmn2:process id=\"Process_1\" isExecutable=\"false\"> 就好
            const newDiagramXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"sample-diagram\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\r\n  <bpmn2:process id=\"Process_1\" name=\"" + this.processName + "\" isExecutable=\"false\">\r\n    <bpmn2:startEvent id=\"StartEvent_1\"/>\r\n  </bpmn2:process>\r\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\r\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\r\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\r\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"412.0\" y=\"240.0\"/>\r\n      </bpmndi:BPMNShape>\r\n    </bpmndi:BPMNPlane>\r\n  </bpmndi:BPMNDiagram>\r\n</bpmn2:definitions>";
            this.bpmnModeler.importXML(newDiagramXML, function(err) {
              if (err) {
                console.error(err);
              }
            });
          },
    
         // 下载为SVG格式,done是个函数,调用的时候传入的 
          saveSVG(done) {
           // 把传入的done再传给bpmn原型的saveSVG函数调用
            this.bpmnModeler.saveSVG(done);
          },
          // 下载为SVG格式,done是个函数,调用的时候传入的 
          saveDiagram(done) {
            // 把传入的done再传给bpmn原型的saveXML函数调用
            this.bpmnModeler.saveXML({ format: true }, function(err, xml) {
              done(err, xml);
            });
          },
          // 当图发生改变的时候会调用这个函数,这个data就是图的xml
          setEncoded(link, name, data) {
            // 把xml转换为URI,下载要用到的
            var encodedData = encodeURIComponent(data);
            // 获取到图的xml,保存就是把这个xml提交给后台
            this.xmlStr = data;
            // 下载图的具体操作,改变a的属性,className令a标签可点击,href令能下载,download是下载的文件的名字
            if (data) {
              link.className = 'active'
              link.href = 'data:application/bpmn20-xml;charset=UTF-8,' + encodedData;
              link.download = name;
            } else {
            }
          },
    
          // 保存修改操作
          save() {
            // 传给后台的参数 
            let params = {
              id: this.id,
              bpmnXml: this.xmlStr
            }
           // 调用API接口
            saveBpmnData(params).then(res => {
    //          console.log(res)
    //          console.log(this.xmlStr)
             })
          },
    
          // 从用户输入获取流程名称
          getProcessName() {
            this.$prompt('请输入流程名称', '提示', {
              confirmButtonText: '确定',
              cancelButtonText: '取消创建'
            }).then(({ value }) => {
              if(value === ''){
                this.$message({
                  type: 'error',
                  message: '流程名字不能为空'
                });
                this.getProcessName()
              }
              else {
                this.processName = value;
                this.createNewDiagram();
              }
    
            }).catch(() => {
              // this.back()
            });
          }
        },
        mounted(){
          var BpmnModeler = require('bpmn-js/lib/Modeler');
          var propertiesPanelModule = require('bpmn-js-properties-panel'),
            propertiesProviderModule = require('bpmn-js-properties-panel/lib/provider/camunda'),
            camundaModdleDescriptor = require('camunda-bpmn-moddle/resources/camunda');
    
          this.container = this.$refs.content;
          var canvas = this.$refs.canvas;
    
          this.bpmnModeler = new BpmnModeler({
            container: canvas,
            //添加控制板
            propertiesPanel: {
              parent: '#js-properties-panel'
            },
            additionalModules: [
              propertiesPanelModule,
              propertiesProviderModule
            ],
            moddleExtensions: {
              camunda: camundaModdleDescriptor
            }
          });
    
         // 获取到用户输入的流程名称
          this.getProcessName();
    
          // 下载画图
          let _this = this;
          // 获取a标签dom节点
          var downloadLink = this.$refs.saveDiagram;
          var downloadSvgLink = this.$refs.saveSvg;
          // 给图绑定事件,当图有发生改变就会触发这个事件
          this.bpmnModeler.on('commandStack.changed', function(){
            _this.saveSVG(function(err, svg) {
              _this.setEncoded(downloadSvgLink, 'diagram.svg', err ? null : svg);
            });
    
            _this.saveDiagram(function(err, xml) {
              _this.setEncoded(downloadLink, 'diagram.bpmn', err ? null : xml);
            });
          });
        }
      }
    </script>
    

    css:

    <style lang="scss">
      @import "./css/diagram-js.css";
      @import "./css/app.css";
      @import "./vendor/bpmn-font/css/bpmn-embedded.css";
      .containers{
        position: absolute;
        background-color: #ffffff;
        width: 100%;
        height: 90%;
      }
      .canvas{
        width: 100%;
        height: 100%;
      }
      .panel{
        position: absolute;
        right: 0;
        top: 0;
        width: 300px;
      }
      .buttons{
        position: absolute;left: 20px;bottom: 20px;
        &>li{
          display:inline-block;margin: 5px;
          &>a{
            color: #999;background: #eee;cursor:not-allowed;
            padding: 8px;border: 1px solid #ccc;
            &.active{color: #333;backgroud: #fff;cursor:pointer;}
          }
        }
      }
      .save {
        display: inline-block;
        position: absolute;
        bottom: 20px;
        left: 25%;
      }
    </style>
    
    1.一打开页面
    2.输入完了流程名
    请忽略掉返回列表按钮

    相关文章

      网友评论

      • 龙珠爱好者联盟:请问如何让a标签直接就可以点击下载呢?
        Lia代码猪崽:在mounted()里有给a标签绑定事件的
      • 沙眉:左边工具框的HTML文档在哪儿呢?我想更改他的样式
        Lia代码猪崽:左边的工具框的样式在这里
        @Import "./css/diagram-js.css";
        @Import "./css/app.css";
        @Import "./vendor/bpmn-font/css/bpmn-embedded.css";
        你可以用谷歌浏览器检查然后找到更具体的类名去修改原来的。更推荐你自己去覆盖它,这样比较好
      • 沙眉:为什么初始化bpmn的时候一定要先放一个“图形”在那里呢?为何不能从空白处开始?
        cs0710:大佬 你这个this.id作为保存的参数是随机生成的吗?在文章里没看到给this.id赋值
        Lia代码猪崽:<bpmn2:process id=\"Process_1\" name=\"" + this.processName + "\" isExecutable=\"false\">\r\n
        这一句就是初始化的那个圆 去掉应该就没有了
        Lia代码猪崽:好像也是可以的。在这个函数里有写初始化的
        createNewDiagram() {
        // 定义空的图的模型,这里我们根据用户输入,利用字符串的拼接,定义了这个流程图的名字,不需要的就把字符串的拼接去掉。
        // 把 <bpmn2:process id=\"Process_1\" name=\"" + this.processName + "\" isExecutable=\"false\"> 改成 <bpmn2:process id=\"Process_1\" isExecutable=\"false\"> 就好
        const newDiagramXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"sample-diagram\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\r\n <bpmn2:process id=\"Process_1\" name=\"" + this.processName + "\" isExecutable=\"false\">\r\n <bpmn2:startEvent id=\"StartEvent_1\"/>\r\n </bpmn2:process>\r\n <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\r\n <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\r\n <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\r\n <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"412.0\" y=\"240.0\"/>\r\n </bpmndi:BPMNShape>\r\n </bpmndi:BPMNPlane>\r\n </bpmndi:BPMNDiagram>\r\n</bpmn2:definitions>";
        this.bpmnModeler.importXML(newDiagramXML, function(err) {
        if (err) {
        console.error(err);
        }
        });
        },

      本文标题:在vue中使用bpmn-js(二)

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