[TOC]
> Activiti Modeler 是 Activiti 官方提供的一款在线流程设计的前端插件,可以方便流程设计与开发人员绘制流程图,保存流程模型,部署至流程定义等等。
本节我们能就记录如何在spring boot项目中集成Activiti Modeler。
## 1、材料准备
首先我们需要获取activiti-explorer.zip,这个是activiti-5.22.0才有的。
链接:[https://pan.baidu.com/s/1zZ8vcjR63_hgzcLl6soiDw](https://pan.baidu.com/s/1zZ8vcjR63_hgzcLl6soiDw)
提取码:1e8a
后续所有的资料都可以通过这个地址下载。
## 2、集成
### 2.1 集成静态资源
* 在resources下新建static/modeler目录
找到 activiti-5.22.0\\wars\\activiti-explorer.war,将如图3个目录复制到static/modeler目录下。
![](https://img.kancloud.cn/8d/84/8d841fce8defbee42409710f2f0290e3_1016x637.png)
* 将下载好的汉化文件stencilset.json复制到src/main/resources目录下
* 用下载好的汉化文件en.json替换 static/modeler/editor-app/i18n/en.json文件
### 2.2 集成后端代码
* 在 `com/sxdx/workflow/activiti/rest `下新建`modeler`目录。将下载文件的 `activiti-5.22.0\Activiti-master\modules\activiti-modeler\src\\main\java\org\activiti\rest\editor` 目录下的所有文件(不包含目录)拷贝到 `com/sxdx/workflow/activiti/rest/modeler`目录下:
![](https://img.kancloud.cn/3a/01/3a014d7a39a7f8f5ba41562a61768a34_1078x350.png)
最后效果如下所示:
![](https://img.kancloud.cn/60/d9/60d9e930b085c7c0a8ce33e25090efa1_554x684.png)
### 2.3 代码修改
依次修改如下代码:
1、static/modeler/editor-app/app-cfg.js
![](https://img.kancloud.cn/d9/eb/d9eb426eabe6fdc305010536baa5fe8f_751x231.png)
2、static/modeler/editor-app/configuration/toolbar-default-actions.js
![](https://img.kancloud.cn/e7/4f/e74f3854c26f1dfc35f10af253cf7725_1059x314.png)
3、com/sxdx/workflow/activiti/rest/modeler 下的3个java文件中的所有方法的访问路径前都添加`/modeler`
![](https://img.kancloud.cn/b5/4b/b54b69ed9dbb80281a87e09cc124ad6c_1876x498.png)
4、将`ModelSaveRestResource`的`saveModel`改为POST访问,否则Activiti Modeler无法保存。
```
~~~
@RequestMapping(value="/modeler/model/{modelId}/save", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void saveModel(@PathVariable String modelId, @RequestBody MultiValueMap<String, String> values) {
//省略。。。
}
~~~
```
## 3、访问验证
启动服务,访问[http://localhost:8080/modeler/modeler.html](http://localhost:8080/modeler/modeler.html)
![](https://img.kancloud.cn/83/6f/836f0bc61c1dce7178f164c4dfb5bb87_1913x900.png)
会发现只有一个布局,各种功能及组件都没有显示出来。**这是因为我们没有定义流程模型**。
## 4、创建一个模型
### 4.1 代码创建一个流程模型
创建一个测试类 ModelerControllerTest
```
~~~
package com.sxdx.workflow.activiti.rest;
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.apache.commons.lang3.StringUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import static org.activiti.editor.constants.ModelDataJsonConstants.MODEL_DESCRIPTION;
import static org.activiti.editor.constants.ModelDataJsonConstants.MODEL_NAME;
@SpringBootTest
@RunWith(SpringRunner.class)
public class ModelerControllerTest {
@Resource
private RepositoryService repositoryService;
/**
* 创建模型
*/
@Test
public void create() {
String name = "请假流程";
String key = "leave";
String description = "这是一个简单的请假流程";
try {
ObjectMapper objectMapper = new ObjectMapper();
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.put("stencilset", stencilSetNode);
ObjectNode modelObjectNode = objectMapper.createObjectNode();
modelObjectNode.put(MODEL_NAME, name);
modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);
description = StringUtils.defaultString(description);
modelObjectNode.put(MODEL_DESCRIPTION, description);
Model newModel = repositoryService.newModel();
newModel.setMetaInfo(modelObjectNode.toString());
newModel.setName(name);
newModel.setKey(StringUtils.defaultString(key));
repositoryService.saveModel(newModel);
repositoryService.addModelEditorSource(newModel.getId(), editorNode.toString().getBytes("utf-8"));
System.out.println("生成的moduleId:"+newModel.getId());
} catch (Exception e) {
}
}
}
~~~
```
结果:
![](https://img.kancloud.cn/f6/e5/f6e50cc0f34fc2675ff5c4f5c55e9ea9_1092x474.png)
我们查看一下 act\_re\_model 表
![](https://img.kancloud.cn/c7/c2/c7c2478786a0f7663fa5f0358e97793c_1309x154.png)
### 4.2 再次访问
这次访问:[http://localhost:8080/modeler/modeler.html?modelId=1](http://localhost:8080/modeler/modeler.html?modelId=1), 这次就显示正常了。接下来我们就可以绘制流程图了。
**注意**:这个modelId参数是必须的,否则modeler的组件无法显示。
![](https://img.kancloud.cn/d1/d7/d1d74b5163b045e5c198454b14377fc3_1926x896.png)
如果出现访问404 ,请查看一下以下文件目录,static和modeler是有层级关系的,如果目录显示static.modeler则会404。
![](https://img.kancloud.cn/fc/90/fc9092ffba6224e74ea09184a7c3e1a6_450x380.png)
- 使用教程
- 1、环境说明
- 2、导入教程
- 3、系统展示
- 4、更新历史
- 搭建教程
- 第一章:Activiti模块
- 1、基本概念
- 2、资料下载
- 3、环境搭建
- 4、集成Activiti-Modeler流程设计器
- 5、七大Service接口
- 6、流程定义文件—流程定义—流程模型 的相互转化
- 7、用户和用户组
- 8、任务表单
- 8.1、表单分类
- 8.2 、动态表单实战、集成Swagger、Logback
- 8.3、外置表单实战
- 8.4、普通表单实战,集成Thymeleaf,Mybatis-Plus
- 8.5、表单模式选型
- 9、多实例(会签)
- 10、子流程和调用活动
- 10.1、子流程
- 10.2、事件子流程
- 10.3、调用活动
- 10.4、事务子流程
- 11、流程历史管理、补充获取流程定义列表接口
- 12、Activiti事件
- 12.1、 事件类别
- 12.2、 Activiti启动事件
- 12.3、Activiti结束事件
- 12.4、边界事件(一)
- 12.5、边界事件(二)
- 12.6、中间事件
- 13、网关
- 14、Activiti审批意见管理
- 15、Activiti流程驳回、流程回退
- 16、Activiti任务委托
- 17、Activiti流程的挂起、激活
- 第二章:基础架构完善
- 1、Spring-Security-OAuth2简介
- 2、搭建认证服务器
- 3、搭建资源服务器
- 4、Activiti自带的Rest接口
- 5、添加JWT支持
- 6、数据库存储授权码Code,Client信息
- 第三章、集成RBAC权限管理
- 1、RBAC-基于角色的访问控制
- 2、替换Activiti用户和用户组
- 3、Spring-Security获取当前操作人信息
- 4、OauthUserDetailService改造
- 第四章、使用Swagger生成静态接口文档