引入工作流(bpmn-js,Vue)

原因

因为工作要求引入工作流,所以采用了bpmn-js,官网上看了一下,结合网上搜索到的资料,做一个整理。

引入的方法

//先要npm install  bpmn-js bpmn-js-properties-panel camunda-bpmn-moddle这三个包
import Modeler from 'bpmn-js/lib/Modeler'
import propertiesPanelModule from 'bpmn-js-properties-panel'// 属性面板
import propertiesProviderModule from 'bpmn-js-properties-panel/lib/provider/camunda'
import camundaModdleDescriptor from 'camunda-bpmn-moddle/resources/camunda'// 扩展属性
//样式引入(工具栏和属性栏)
  @import 'node_modules/bpmn-js/dist/assets/diagram-js.css';
  @import ‘’node_modules/bpmn-js/dist/assets/bpmn-font/css/bpmn.css';
  @import 'node_modules/bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css';
  @import 'node_modules/bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css';
  @import 'node_modules/bpmn-js-properties-panel/dist/assets/bpmn-js-properties-panel.css';

初始化数据

    async initData() {
      const vm = this
      vm.bpmnInfo.xmlStr = '<?xml version="1.0" encoding="UTF-8"?>\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">\n' +
        '  <bpmn2:process id="Process_1" isExecutable="false">\n' +
        '  </bpmn2:process>\n' +
        '  <bpmndi:BPMNDiagram id="BPMNDiagram_1">\n' +
        '    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">\n' +
        '      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">\n' +
        '        <dc:Bounds height="36.0" width="36.0" x="412.0" y="240.0"/>\n' +
        '      </bpmndi:BPMNShape>\n' +
        '    </bpmndi:BPMNPlane>\n' +
        '  </bpmndi:BPMNDiagram>\n' +
        '</bpmn2:definitions>'
      vm.createNewDiagram()
    },

初始化模板

    createModeler() {
      // create a modeler
      this.bpmnModeler = new Modeler(
        { container: '#canvas',
          // 添加控制板
          propertiesPanel: {
            parent: '#js-properties-panel'
          },
          additionalModules: [
            // 左边工具栏以及节点
            propertiesProviderModule,
            // 右边的工具栏
            propertiesPanelModule
          ],
          moddleExtensions: {
            camunda: camundaModdleDescriptor
          }
        })
      // 实时保存
      const _this = this
      // 给图绑定事件,当图有发生改变就会触发这个事件
      this.bpmnModeler.on('commandStack.changed', function() {
        _this.saveBmap()
      })
    },

目前我用到的几个方法(保存,上传文件,下载,撤销,恢复撤销,放大,缩小)

保存
    // 实时保存
    saveBmap() {
      const vm = this
      vm.bpmnModeler.saveXML({ format: true }, (err, xml) => {
        if (err) { return }
        vm.bpmnInfo.xmlStr = xml
      })
      vm.bpmnModeler.saveSVG({ format: true }, (err, data) => {
        if (err) { return }
      })
    },
    // 上传文件
    handleOpenFile(e) {
      const vm = this
      const input = document.createElement('input')
      input.type = 'file'
      input.click()// 打开文件选择框
      input.onchange = function() {
        const file = input.files[0]
        if (window.FileReader) {
          try {
            var fr = new FileReader()
            fr.readAsText(file) // 将文件读取为文本
            fr.onload = function(e) {
              vm.bpmnInfo.xmlStr = fr.result
              vm.createNewDiagram()
            }
          } catch (e) {
            errorInfo(e.toString())
          }
        } else {
          errorInfo('您的浏览器可能不支持此操作')
        }
      }
      document.body.removeChild(input)
    },
    // 下载xml/svg
    download(type, data, name) {
      // 下载xml/svg
      let dataTrack = ''
      const a = document.createElement('a')
      switch (type) {
        case 'xml':
          dataTrack = 'bpmn'
          break
        case 'svg':
          dataTrack = 'svg'
          break
        default:
          break
      }
      const reName = name || `diagram.${dataTrack}`
      a.setAttribute(
        'href',
        `data:application/bpmn20-xml;charset=UTF-8,${encodeURIComponent(data)}`
      )
      a.setAttribute('target', '_blank')
      a.setAttribute('dataTrack', `diagram:download-${dataTrack}`)
      a.setAttribute('download', reName)
      document.body.appendChild(a)
      a.click()
      document.body.removeChild(a)
    },
    // 下载 XML 格式
    handleDownloadXml() {
      this.bpmnModeler.saveXML({ format: true }, (err, xml) => {
        if (err) {
          alert('导出错误,请重试')
        } else {
          this.download('xml', xml)
        }
      })
    },
    // 下载 SVG 格式
    saveImg() {
      this.bpmnModeler.saveSVG({ format: true }, (err, xml) => {
        if (err) {
          alert('导出错误,请重试')
        } else {
          this.download('svg', xml)
        }
      })
    },
   // 前进
    handleRedo() {
      this.bpmnModeler.get('commandStack').redo()
    },
    // 后退
    handleUndo() {
      this.bpmnModeler.get('commandStack').undo()
    },
    // 放大缩小
    handleZoom(radio) {
      const vm = this
      this.bpmnModeler.get('canvas').zoom(vm.newScale)
    }
  resetView(){
    //恢复到原位
     vm.bpmnModeler.get('canvas').zoom('fit-viewport')
   }

汉化

customTranslate 官网有直接去下载
import customTranslate from '../../customTranslate';
const customTranslateModule={
       translate:["value",customTranslate]
    }
additionalModules: [propertiesProviderModule, propertiesPanelModule,customTranslateModule],
图片
image.png

有很多不足之处,请大家指出,一起学习,共同进步。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。