Github 标星35k 的 SpringBoot整合acvtiviti开源分享,看完献上膝盖
ccwgpt 2025-05-11 14:33 19 浏览 0 评论
前言
activiti是目前比较流行的工作流框架,但是activiti学起来还是费劲,还是有点难度的,如何整合在线编辑器,如何和业务表单绑定,如何和系统权限绑定,这些问题都是要考虑到的,不是说纯粹的把activiti整合到系统中就完事了。如今国内比较流行的是前后端分离模式,之前都是前后端放一个工程里面,接口风格很乱,并且不好维护,前后端开发不是很方便。目前前端都做成了工程化的形式,比如国产的Vue,国外的React等等。为了顺应潮流,我就做了一套springboot-vue-activiti的快速开发小脚手架,对于大型项目来说还是不太适合,毕竟来说,一个人的开发能力有限,但是对于中小微型项目,并且带有审批业务的项目来说,那简直就是一个福音了。
一、效果展示
1.模型设计器
2.流程节点设置
审批人员可以根据角色、部门、部门负责人、直接选择人员等。
3.审批进度查询
二、操作过程
1.引入activiti依赖
<!-- Activiti 启动器 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>${activiti.version}</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Activiti 流程图 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-diagram-rest</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- Activiti 在线设计 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-modeler</artifactId>
<version>${activiti.version}</version>
</dependency>
2.编辑器代码及汉化
3.application.yml配置
activiti:
check-process-definitions: false
#启用作业执行器
async-executor-activate: false
#启用异步执行器
job-executor-activate: false
4.数据库表
三、业务表单和系统权限绑定
1.思路
1.新建一张流程定义扩展表(用来存储流程部署的基本信息、关联业务表名、前端路由信息、业务表单类型等),流程部署完后往流程定义扩展表插入部署基本信息,然后编辑已发布的流程,往扩展表中插入本流程的分类,关联表单信息。
2.关于自定义节点设置,主要是用来定义每个节点由哪个角色,或者具体哪个人来审批。建立一张节点扩展表(存储节点流转信息,指定人ID、角色ID,等)。
2.部分代码
// 获取模型
Model modelData = repositoryService.getModel(id);
byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());
if (bytes == null) {
return Result.error("模型数据为空,请先成功设计流程并保存");
}
try {
JsonNode modelNode = new ObjectMapper().readTree(bytes);
BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
if(model.getProcesses().size()==0){
return Result.error("模型不符要求,请至少设计一条主线流程");
}
byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);
// 部署发布模型流程
String processName = modelData.getName() + ".bpmn20.xml";
Deployment deployment = repositoryService.createDeployment()
.name(modelData.getName())
.addString(processName, new String(bpmnBytes, "UTF-8"))
.deploy();
String metaInfo = modelData.getMetaInfo();
JSONObject metaInfoMap = JSON.parseObject(metaInfo);
// 设置流程分类,保存扩展流程至数据库
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).list();
for (ProcessDefinition pd : list) {
ActZprocess actZprocess = new ActZprocess();
actZprocess.setId(pd.getId());
actZprocess.setName(modelData.getName());
actZprocess.setProcessKey(modelData.getKey());
actZprocess.setDeploymentId(deployment.getId());
actZprocess.setDescription(metaInfoMap.getString(ModelDataJsonConstants.MODEL_DESCRIPTION));
actZprocess.setVersion(pd.getVersion());
actZprocess.setDiagramName(pd.getDiagramResourceName());
actZprocessService.setAllOldByProcessKey(modelData.getKey());
actZprocess.setLatest(true);
actZprocessService.save(actZprocess);
}
}catch (Exception e){
String err = e.toString();
log.error(e.getMessage(),e);
if (err.indexOf("NCName")>-1){
return Result.error("部署失败:流程设计中的流程名称不能为空,不能为数字以及特殊字符开头!");
}
if (err.indexOf("PRIMARY")>-1){
return Result.error("部署失败:该模型已发布,key唯一!");
}
return Result.error("部署失败!");
}
return Result.ok("部署成功");
/*获取高亮实时流程图*/
@RequestMapping(value = "/getHighlightImg/{id}", method = RequestMethod.GET)
public void getHighlightImg(@PathVariable String id, HttpServletResponse response){
InputStream inputStream = null;
ProcessInstance pi = null;
String picName = "";
// 查询历史
HistoricProcessInstance hpi = historyService.createHistoricProcessInstanceQuery().processInstanceId(id).singleResult();
if (hpi.getEndTime() != null) {
// 已经结束流程获取原图
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery().processDefinitionId(hpi.getProcessDefinitionId()).singleResult();
picName = pd.getDiagramResourceName();
inputStream = repositoryService.getResourceAsStream(pd.getDeploymentId(), pd.getDiagramResourceName());
} else {
pi = runtimeService.createProcessInstanceQuery().processInstanceId(id).singleResult();
BpmnModel bpmnModel = repositoryService.getBpmnModel(pi.getProcessDefinitionId());
List<String> highLightedActivities = new ArrayList<String>();
// 高亮任务节点
List<Task> tasks = taskService.createTaskQuery().processInstanceId(id).list();
for (Task task : tasks) {
highLightedActivities.add(task.getTaskDefinitionKey());
}
List<String> highLightedFlows = new ArrayList<String>();
ProcessDiagramGenerator diagramGenerator = processEngineConfiguration.getProcessDiagramGenerator();
//"宋体"
inputStream = diagramGenerator.generateDiagram(bpmnModel, "png", highLightedActivities, highLightedFlows,
"宋体", "宋体", "宋体",null, 1.0);
picName = pi.getName()+".png";
}
try {
response.setContentType("application/octet-stream;charset=UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(picName, "UTF-8"));
byte[] b = new byte[1024];
int len = -1;
while ((len = inputStream.read(b, 0, 1024)) != -1) {
response.getOutputStream().write(b, 0, len);
}
response.flushBuffer();
} catch (IOException e) {
log.error(e.toString());
throw new JeecgBootException("读取流程图片失败");
}
}
总结
上面只是展示了部分代码和部分效果图,对于一个正常的审批流转业务来说,提交审批,申请人撤销,重新申请,审批人驳回,委托他人审批,会签,流程挂起,流程实时跟踪,并行网关,排他网关,监听,待办,已办消息通知等都是必须要的,我这就不一一展现了。
更多资料,私信回复【666】......
相关推荐
- 一个基于.Net Core遵循Clean Architecture原则开源架构
-
今天给大家推荐一个遵循CleanArchitecture原则开源架构。项目简介这是基于Asp.netCore6开发的,遵循CleanArchitecture原则,可以高效、快速地构建基于Ra...
- AI写代码翻车无数次,我发现只要提前做好这3步,bug立减80%
-
写十万行全是bug之后终于找到方法了开发"提示词管理助手"新版本那会儿,我差点被bug整崩溃。刚开始两周,全靠AI改代码架构,结果十万行程序漏洞百出。本来以为AI说没问题就稳了,结果...
- OneCode低代码平台的事件驱动设计:架构解析与实践
-
引言:低代码平台的事件驱动范式在现代软件开发中,事件驱动架构(EDA)已成为构建灵活、松耦合系统的核心范式。OneCode低代码平台通过创新性的注解驱动设计,将事件驱动理念深度融入平台架构,实现了业务...
- 国内大厂AI插件评测:根据UI图生成Vue前端代码
-
在IDEA中安装大厂的AI插件,打开ruoyi增强项目:yudao-ui-admin-vue31.CodeBuddy插件登录腾讯的CodeBuddy后,大模型选择deepseek-v3,输入提示语:...
- AI+低代码技术揭秘(二):核心架构
-
本文档介绍了为VTJ低代码平台提供支持的基本架构组件,包括Engine编排层、Provider服务系统、数据模型和代码生成管道。有关UI组件库和widget系统的信息,请参阅UI...
- GitDiagram用AI把代码库变成可视化架构图
-
这是一个名为gitdiagram的开源工具,可将GitHub仓库实时转换为交互式架构图,帮助开发者快速理解代码结构。核心功能一键可视化:替换GitHubURL中的"hub...
- 30天自制操作系统:第六天:代码架构整理与中断处理
-
1.拆开bootpack.c文件。根据设计模式将对应的功能封装成独立的文件。2.初始化pic:pic(可编程中断控制器):在设计上,cpu单独只能处理一个中断。而pic是将8个中断信号集合成一个中断...
- AI写代码越帮越忙?2025年研究揭露惊人真相
-
近年来,AI工具如雨后春笋般涌现,许多人开始幻想程序员的未来就是“对着AI说几句话”,就能轻松写出完美的代码。然而,2025年的一项最新研究却颠覆了这一期待,揭示了一个令人意外的结果。研究邀请了16位...
- 一键理解开源项目:两个自动生成GitHub代码架构图与说明书工具
-
一、GitDiagram可以一键生成github代码仓库的架构图如果想要可视化github开源项目:https://github.com/luler/reflex_ai_fast,也可以直接把域名替换...
- 5分钟掌握 c# 网络通讯架构及代码示例
-
以下是C#网络通讯架构的核心要点及代码示例,按协议类型分类整理:一、TCP协议(可靠连接)1.同步通信//服务器端usingSystem.Net.Sockets;usingTcpListene...
- 从复杂到优雅:用建造者和责任链重塑代码架构
-
引用设计模式是软件开发中的重要工具,它为解决常见问题提供了标准化的解决方案,提高了代码的可维护性和可扩展性,提升了开发效率,促进了团队协作,提高了软件质量,并帮助开发者更好地适应需求变化。通过学习和应...
- 低代码开发当道,我还需要学习LangChain这些框架吗?| IT杂谈
-
专注LLM深度应用,关注我不迷路前两天有位兄弟问了个问题:当然我很能理解这位朋友的担忧:期望效率最大化,时间用在刀刃上,“不要重新发明轮子”嘛。铺天盖地的AI信息轰炸与概念炒作,很容易让人浮躁与迷茫。...
- 框架设计并不是简单粗暴地写代码,而是要先弄清逻辑
-
3.框架设计3.框架设计本节我们要开发一个UI框架,底层以白鹭引擎为例。框架设计的第一步并不是直接撸代码,而是先想清楚设计思想,抽象。一个一个的UI窗口是独立的吗?不是的,...
- 大佬用 Avalonia 框架开发的 C# 代码 IDE
-
AvalonStudioAvalonStudio是一个开源的跨平台的开发编辑器(IDE),AvalonStudio的目标是成为一个功能齐全,并且可以让开发者快速使用的IDE,提高开发的生产力。A...
- 轻量级框架Lagent 仅需20行代码即可构建自己的智能代理
-
站长之家(ChinaZ.com)8月30日消息:Lagent是一个专注于基于LLM模型的代理开发的轻量级框架。它的设计旨在简化和提高这种模型下代理的开发效率。LLM模型是一种强大的工具,可以...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- mfc框架 (52)
- abb框架断路器 (48)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- tornado框架 (48)
- 前端框架bootstrap (54)
- orm框架有哪些 (51)
- 知识框架图 (52)
- ppt框架 (55)
- 框架图模板 (59)
- 内联框架 (52)
- cad怎么画框架 (58)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)