vue整合bpmn.js,汉化及整合activiti

1.安装bpmn.js

安装命令:npm install bpmn-js bpmn-js-properties-panel

2.汉化

汉化包:customTranslate

主要代码:

importcustomTranslatefrom'../../customTranslate';

constcustomTranslateModule={

translate:["value",customTranslate]}

additionalModules:[propertiesProviderModule,propertiesPanelModule,customTranslateModule]

3.整合activiti

引入activiti.json文件: import activitiModdleDescriptor from '@/api/bpmnjs/activiti.json'

主要代码

// 初始化BpmnModeler

    initBpmnModeler() {

      this.container = this.$refs.content

      const canvas = this.$refs.canvas

      var customTranslateModule = {

        translate: ['value', customTranslate]

      }

      this.bpmnModeler = new BpmnModeler({

        container: canvas,

        propertiesPanel: {

          parent: '#js-properties-panel'

        },

        additionalModules: [

          // 右边的工具栏

          propertiesPanelModule,

          // 左边工具栏以及节点

          propertiesProviderModule,

          // customControlsModule,

          // 汉化

          customTranslateModule,

          BpmnModeler, {

            // paletteProvider: ['value', ''], // 禁用左面板

            // labelEditingProvider: ['value', ''], // 禁用编辑

            // contextPadProvider: ['value', ''], // 禁用点击出现的contextPad

            // bendpoints: ['value', {}], // 禁止流程线变换waypoints

            zoomScroll: ['value', ''] // 禁止画布滚动

            // moveCanvas: ['value', ''] // 禁止拖拽

          }

        ],

        moddleExtensions: {

          // 模块拓展,拓展activiti的描述

          activiti: activitiModdleDescriptor

          // camunda: camundaModdleDescriptor

        }

      })

      this.importBpmnXml()

    }

// 前进

    handleRedo() {

      this.bpmnModeler.get('commandStack').redo()

    },

// 后退

    handleUndo() {

      this.bpmnModeler.get('commandStack').undo()

    },

// 导出bpmn文件

    exportBpmn() {

      this.bpmnModeler.saveXML({ format: true }, function(err, xml) {

        if (err) {

          return console.error('无法保存BPMN', err)

        }

        // 如果浏览器支持msSaveOrOpenBlob方法(也就是使用IE浏览器的时候)

        if (window.navigator.msSaveOrOpenBlob) {

          var blob = new Blob([xml], { type: 'text/plain' })

          window.navigator.msSaveOrOpenBlob(blob, 'activiti.bpmn')

        } else {

          var eleLink = document.createElement('a')

          eleLink.download = 'activiti.bpmn'

          eleLink.style.display = 'none'

          const blob = new Blob([xml]) // 字符内容转变成blob地址

          eleLink.href = URL.createObjectURL(blob)

          document.body.appendChild(eleLink) // 触发点击

          eleLink.click()

          document.body.removeChild(eleLink) // 然后移除

        }

      })

    },

// 导出图片

    exportImg() {

      if (window.navigator.msSaveOrOpenBlob) {

        console.log('IE浏览器无法下载,建议使用谷歌浏览器')

        return

      }

      // 获取SVG数据(图片)

      this.bpmnModeler.saveSVG({ format: true }, (err, data) => {

        if (err) {

          console.log('保存失败')

        }

        var svgXml = data

        var canvas = document.createElement('canvas') // 准备空画布

        canvas.width = '1000px'

        canvas.height = screen.availHeight

        canvas.fillStyle = '#FFFFFF'

        canvg(canvas, svgXml)

        var imagedata = canvas.toDataURL('image/png')

        // 如果浏览器支持msSaveOrOpenBlob方法(也就是使用IE浏览器的时候)

        if (window.navigator.msSaveOrOpenBlob) {

          var bstr = atob(imagedata.split(',')[1])

          var n = bstr.length

          var u8arr = new Uint8Array(n)

          while (n--) {

            u8arr[n] = bstr.charCodeAt(n)

          }

          var blob = new Blob([u8arr])

          window.navigator.msSaveOrOpenBlob(blob, 'activiti.png')

        } else {

          var a = document.createElement('a')

          a.href = imagedata // 将画布内的信息导出为png图片数据

          a.download = 'activiti' // 设定下载名称

          a.click() // 点击触发下载

        }

      })

    },

// 直接部署(前后端)

deployEvent() {

      const formData = new FormData()

      // 获取保存的bpmn,发送给后台

      this.bpmnModeler.saveXML({ format: true }, function(err, xml) {

        if (err) {

          return console.error('无法保存BPMN', err)

        }

        formData.append('reportFile', new Blob([xml], { type: 'text/xml' }), 'activiti.bpmn')

      })

      uploadFilesDirect(formData).then(data => {

        // 跳转到流程管理列表

        this.$router.push({

          path: '/activiti/index'

        })

        this.$notify({

          title: '成功',

          message: '发布成功!',

          type: 'success'

        })

      }).catch(response => {

        this.$notify.error({

          title: '错误',

          message: '发布失败!'

        })

      })

    },


export function uploadFiles(formData) {

  return request({

    url: '/processDefinition/deploy',

    method: 'POST',

    data: formData

  })

}


@RequestMapping(value = "/deploy/direct", method = RequestMethod.POST)

public ResultVo<String> deployDirect(MultipartFile[] reportFile) {

String processes = "processes";

for (MultipartFile multipartFileBpmn : reportFile) {

    try {

FileUtils.upload(multipartFileBpmn.getInputStream(), processes , multipartFileBpmn.getOriginalFilename());

String filePath = ResourceUtils.getURL("classpath:").getPath() + File.separator + processes

+ File.separator;

FileInputStream bpmnStream = new FileInputStream(filePath + multipartFileBpmn.getOriginalFilename());

repositoryService.createDeployment()

        .addInputStream("activiti.bpmn", bpmnStream)

                        .deploy();

} catch (Exception e) {

logger.error(e.getMessage());

throw new BaseException(BaseExceptionCode.文件下载失败);

}

}

return ResultVo.success();

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,192评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,186评论 1 303
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,844评论 0 252
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,471评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,876评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,891评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,068评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,791评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,539评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,772评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,250评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,577评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,244评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,146评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,949评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,995评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,812评论 2 276

推荐阅读更多精彩内容