前言

上篇文章介绍了如何在Spring Boot2集成activiti6

接下来,小编会一步一步的介绍如何集成在线设计器

Activiti Modoler 介绍

什么是 Activiti Modoler 呢,简单的说就是一个在线画流程图功能模块,它是 Activiti 实现的

虽然说可以通过eclipse、idea等插件去设计画流程图

但是有时候是需要客户动态创建并设计流程图,所以这里就需要把在线设计器集成进自己项目中

所以说,我们要做的就是把 Activiti Modoler 相关模块集成到自己项目中

注意,Activiti 并没有提供接口,这里我们只能通过源码去一步一步集成进来,废话不多说,下面开始

引入文件

首先,maven需要引入新的包(多了很多)

     <dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter-actuator</artifactId><version>6.0.0</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-modeler</artifactId><version>5.23.0</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-json-converter</artifactId><version>6.0.0</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-diagram-rest</artifactId><version>5.23.0</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-rest</artifactId><version>5.23.0</version></dependency><dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>batik-codec</artifactId><version>1.12</version><exclusions><exclusion><artifactId>commons-io</artifactId><groupId>commons-io</groupId></exclusion></exclusions></dependency><dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>batik-css</artifactId><version>1.12</version></dependency><dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>batik-svg-dom</artifactId><version>1.12</version></dependency><dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>batik-svggen</artifactId><version>1.12</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-explorer</artifactId><version>5.23.0</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-simple-workflow</artifactId><version>5.23.0</version></dependency>

然后,我们需要下载 Activiti 开源包

github:地址https://github.com/Activiti/Activiti/tree/5.x.

下载完解压后,第一步先引入前端文件,位置分别在

\modules\activiti-webapp-explorer2\src\main\webapp
\modules\activiti-webapp-explorer2\src\main\resources


圈中的都复制到项目中:

第二步开始引入后端文件,位置分别在

\modules\activiti-modeler\src\main\java\org\activiti\rest\editor\model
\modules\activiti-modeler\src\main\java\org\activiti\rest\editor\main

也都复制到项目中:

代码编写

首先修改前端的代码,找到 \editor-app\app-cfg.js 文件,把 contextRoot 对应属性路径删了变成空字符

var ACTIVITI = ACTIVITI || {};ACTIVITI.CONFIG = {'contextRoot' : '',
};

编写控制层类跳转方法,由于在线流程设计器需要 Model 才能初始化,所以在跳转到该页面去需要创建 Model,代码如下:

ModelerController.java

package com.ssactiviti.activiti.controller;import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Model;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;@Controller
@RequestMapping("/modeler")
public class ModelerController {@Resourceprivate RepositoryService repositoryService;@Resourceprivate ObjectMapper objectMapper;/*** 添加模型*/@GetMapping("/save")public void save(HttpServletResponse response) throws IOException {//创建模型Model modelData = repositoryService.newModel();ObjectNode modelObjectNode = objectMapper.createObjectNode();//模型名称modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, "请假");//模型版本modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);//模型详情modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, "请假详情");//以字符串信息存储进信息属性中modelData.setMetaInfo(modelObjectNode.toString());//模型名称modelData.setName("请假");//模型keymodelData.setKey("leave");//完善ModelEditorSource,这里固定的ObjectNode editorNode = objectMapper.createObjectNode();editorNode.put("id", "canvas");editorNode.put("resourceId", "canvas");ObjectNode stencilSetNode = objectMapper.createObjectNode();stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");editorNode.set("stencilset", stencilSetNode);//添加模型repositoryService.saveModel(modelData);repositoryService.addModelEditorSource(modelData.getId(), editorNode.toString().getBytes(StandardCharsets.UTF_8));response.sendRedirect("/static/activiti/modeler.html?modelId=" + modelData.getId());}}

这里因为 Springmvc 会拦截静态资源,所以需要配置静态资源不拦截

MvcConfig.java

package com.ssactiviti.config;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
@EnableWebMvc
class MvcConfig implements WebMvcConfigurer {@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {//定义一个convert转换消息的对象FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();//添加fastjson的配置信息FastJsonConfig fastJsonConfig = new FastJsonConfig();fastJsonConfig.setCharset(StandardCharsets.UTF_8);fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);//处理中文乱码问题List<MediaType> fastMediaTypes = new ArrayList<>();fastMediaTypes.add(MediaType.APPLICATION_JSON);//在convert中添加配置信息.fastConverter.setSupportedMediaTypes(fastMediaTypes);fastConverter.setFastJsonConfig(fastJsonConfig);//将convert添加到converters中converters.add(fastConverter);}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");registry.addResourceHandler("/templates/**").addResourceLocations("classpath:/templates/");}/*** 接收PUT、DELETE等请求参数* @return*/@Beanpublic FormContentFilter formContentFilter() {return new FormContentFilter();}}

开始运行程序,访问 http://127.0.0.1:8080/modeler/save,弹出该页面证明整合成功:

踩坑记

坑点1: js前台报这个错

TypeError: Cannot read property ‘namespace’ of undefined


小编第一次也踩过这个坑,网上相关描述也非常少

这里Spring Boot2默认采用jackson,当项目使用fastjson的时候,就会出现json转换异常的问题

也就是 ModelEditorJsonRestResource.java 里面的 getEditorJson() 方法返回了字符串,而不是 json 格式的数据导致的

解决办法就是把返回结果转换成 json 返回,方法返回改成Object,这里小编用的是 fastjson,所以对应方法是:

return JSONObject.parseObject(modelNode.toString());

坑点2: js前台报这个错

TypeError: Cannot read property ‘split’ of undefined


小编也踩过这个坑…导致这个坑的原因有两个

第一检查是否引入了 stencilset.json 文件,并且文件路径是否正确,默认存放resources下级目录

第二和坑点一同理,只需要在 StencilsetRestResource.java 里面的 getStencilset() 方法返回转成 json 即可

return JSONObject.parseObject(IOUtils.toString(stencilsetStream, "utf-8"));

坑点3: 保存模型的时候报错:

org.springframework.web.HttpMediaTypeNotSupportedException: Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported

这里只需要在ModelSaveRestResource.java里面,把方法参数改成如下即可:

@RequestMapping(value="/model/{modelId}/save", method = RequestMethod.PUT)@ResponseStatus(value = HttpStatus.OK)public void saveModel(@PathVariable String modelId, String name, String description, String json_xml, String svg_xml) {try {Model model = repositoryService.getModel(modelId);ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo());modelJson.put(MODEL_NAME, name);modelJson.put(MODEL_DESCRIPTION, description);model.setMetaInfo(modelJson.toString());model.setName(name);repositoryService.saveModel(model);repositoryService.addModelEditorSource(model.getId(), json_xml.getBytes("utf-8"));InputStream svgStream = new ByteArrayInputStream(svg_xml.getBytes("utf-8"));TranscoderInput input = new TranscoderInput(svgStream);PNGTranscoder transcoder = new PNGTranscoder();// Setup outputByteArrayOutputStream outStream = new ByteArrayOutputStream();TranscoderOutput output = new TranscoderOutput(outStream);// Do the transformationtranscoder.transcode(input, output);final byte[] result = outStream.toByteArray();repositoryService.addModelEditorSourceExtra(model.getId(), result);outStream.close();} catch (Exception e) {LOGGER.error("Error saving model", e);throw new ActivitiException("Error saving model", e);}}

这几个问题出现的比较多,一般解决了就基本没有问题了

汉化

汉化的过程非常简单,只需要分别用中文版的 stencilset.json 和 en.json 替换下即可:

汉化之后的效果:

那么基本代码和效果也演示完毕了

demo也已经放到码云上,获取方式在文章的Spring Boot2 + Activiti6 系列搭建教程开头篇(1) 结尾处

谢谢大家~

Spring Boot2 + Activiti6 集成在线流程设计器 Activiti modoler(3)相关推荐

  1. 快速开发工作流_02_集成在线流程设计器

    接上一篇:快速开发工作流_01_简单流程案例https://gblfy.blog.csdn.net/article/details/102881983 文章目录 七.流程设计器 modeler 7.1 ...

  2. 快速开发工作流_03_集成在线流程设计器_内置用户免登录

    接上一篇:快速开发工作流_02_集成在线流程设计器 https://gblfy.blog.csdn.net/article/details/103676784 文章目录 八.内置用户免登录 8.1. ...

  3. activiti7在线流程设计器_springboot2.x集成activiti6.0在线流程设计器

    我在网上找了很多资料都没有找到关于activiti6.0的在线流程设计器,大多数都是基于5.x的.因为6.0的源码包中没有在线设计器的资源包,因此本文使用的是activiti 5.22.0中web资源 ...

  4. [Activity] springMVC集成Activiti WebEditor 在线流程设计器

    WebEditor简介 Avtiviti是工作流引擎框架,可以使用自己通过Eclipse插件画出流程,然后编程.可实际中有用户自定义流程的场景,就需要把Activity插件的类似编辑器集成到自己的WE ...

  5. bpmn-js:vue集成bpmn-js流程设计器并汉化

    最近工作转到工作流模块开发了,需要开发一个流程设计器. 于是就开始接触到bpmn-js,搜索了不少资料,整合demo.现在总结一下如何在vue工程中集成bpmn-js流程设计器. 集成的效果: 目前这 ...

  6. 基于Flowable 6.x 的工作流管理平台源码 在线流程设计器 在线流程表单设

    基于Flowable 6.x 的工作流管理平台源码 在线流程设计器 在线流程表单设计器 单节点配置表单 多实例会签任务 任务节点配置任务/执行监听器 动态配置任务候选人 其它流程相关功能点

  7. 写了一个在线流程设计器,效果很炫[Siverlight版本]

    组件描述 让流程配置不在繁琐死板,UI界面效果极炫,设计流程图(工作流)就像使用Office Visio,所见即所得,让您以及您的客户眼前为之一亮,要想看到在线DEMO,下载Siverlight 3以 ...

  8. BPMN在线流程设计器

    jeeagile-process-designer 基于BPMN.VUE.ELEMENT-UI定制的个性化在线流程编辑器 在线体验地址: http://demo.jeeagile.vip 项目源码 g ...

  9. jsPlumb使用学习-在线流程设计器demo参考说明

    1.主要利用(jsplumb+jqueryUI)拖拽功能实现 2.学习过程中编写的画流程图效果图如下图: 以上demo源码下载地址:https://download.csdn.net/download ...

最新文章

  1. java类Timer和TimerTask的使用
  2. Android安装包apk文件在某些版本操作系统上安装解析包出错问题的解决办法
  3. 方法描述Mybatis使用之NEIS项目
  4. CentOS 7 的 Python2 升级成 Python 3.7
  5. 僵尸进程的产生,危害和解决方案
  6. OSChina 周四乱弹 ——巴叔是雾霾治理小先锋
  7. 漫步数学分析十二——嵌套
  8. rime android汉字,irime输入法安卓下载-iRime输入法 安卓版v3.0-PC6安卓网
  9. Shawn Wildermuth的《Architecting WP7 》系列文章
  10. 固定时间收敛的控制器设计(基础知识)
  11. 在Linux系统中 测试DNS,Linux系统中dns服务器网络设置及测试
  12. 性能测试指南 | 一些实用的排查命令(未完待续)
  13. 计算机运算器由什么组成部分,什么是运算器_运算器由什么组成
  14. 编程团体赛 python
  15. NS32F103C8T6 可完美替代 STM32F103C8T6
  16. 2022GCVC全球人工智能视觉产业与技术大会在青岛圆满落幕
  17. 十天小白训练营day02—古诗作业
  18. 【通俗易懂的通信】马尔可夫过程Ⅱ:马尔可夫链中的状态,常返、非常返
  19. openfalcon-hbs-learn
  20. 2020 2019年 计算机 408 考研 真题 详细 解答

热门文章

  1. 系统集成项目管理工程师:第22章职业道德规范学习笔记
  2. 【OKR 案例合集】人资及销售部门相关岗位 OKR 案例大合集
  3. android 高德地图按照经纬度导航出现路线偏差 原因:坐标系不一致
  4. ArcGIS Engine怎样快速合并一个图层的所有线面要素
  5. NVIDIA Jetson AGX Xavier安装realsense2
  6. Eth-Trunk链路聚合(不配置ip,只配置链路聚合)
  7. nvidia share有什么用_针对深度学习的GPU共享
  8. 关于PCIe协议的学习
  9. c语言面试知识点总结,C语言面试相关知识点
  10. ADB WIFI 使用方法(三步超简单,实测可行,整理分享)