当前位置: 首页 > news >正文

JeecgBoot集成工作流实战教程

Activiti是一个轻量级的工作流程和业务流程管理(BPM)平台,它主要面向业务人员、开发人员和系统管理员。这个平台的核心是一个快速且可靠的Java BPMN 2流程引擎。Activiti是开源的,并且基于Apache许可证进行分发。它可以运行在任何Java应用程序、服务器、集群或云环境中,并且与Spring框架完美集成,以其轻量级和基于简单概念的特点而闻名

Activiti在中国市场的情况

Activiti的工作流引擎功能包括流程定义与建模、流程执行与管理、集成与扩展等。它适用于各行各业的业务流程自动化,包括消费品行业、制造业、电信服务业、金融服务业、物流服务业、政府事业机构等。Activiti的工作流引擎可用于构建各种类型的工作流,如审批流程、业务流程等,通过定义清晰的流程和任务分配规则,企业可以提高工作效率,减少人为错误,并实现流程的自动化。由于activiti发展比较早,在国内各种新老系统都有广泛应用。

如果您是一名新手,该如何快速将Activiti工作流用于自己的业务开发? 我们推荐使用JeecgFlow,这套技术脚手架将帮您快速提高效率。接下来,本文将通过JeecgBoot如何集成Activiti工作流进行阐述,助力您自己动手实现一些简单的Demo!

环境介绍

项目版本
JeecgBoot3.6.1
Activiti7.0.0.Beat2
jdk1.8

JeecgBoot新增activiti模块

首先,我们要新建一个模块,命名成:jeecg-module-activiti, 与现有的命名方式保持一致。在这个模块去做activiti工作流相关的业务。

1.在项目中,点击右键,选择module

在这里插入图片描述

添加图片注释,不超过 140 字(可选)

2.直接进入创建模块,不要选择任何依赖。

在这里插入图片描述

添加图片注释,不超过 140 字(可选)

3.完成模块命令,写入jeecg-module-activiti

在这里插入图片描述

添加图片注释,不超过 140 字(可选)

<dependency><groupId>org.jeecgframework.boot</groupId><artifactId>jeecg-boot-base-core</artifactId>
</dependency>

并在该模块下加入上述依赖。 这个是jeecg的核心模块,也是一个公共模块。

4.在jeecg-boot-module-system的start模块的pom.xml引入新增的activit模块

    <dependency><groupId>org.jeecgframework.boot</groupId><artifactId>jeecg-module-activiti</artifactId><version>${jeecgboot.version}</version></dependency>

5.swagger配置

在swagger配置新模块的swagger扫描bean.找到Swagger2Config。追加如下Bean配置。

@Bean
public Docket loanApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("会员模块").select()//此包路径下的类,才生成接口文档.apis(RequestHandlerSelectors.basePackage("org.jeecg.crm"))//加了ApiOperation注解的类,才生成接口文档.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)).paths(PathSelectors.any()).build().securitySchemes(Collections.singletonList(securityScheme()));//.globalOperationParameters(setHeaderToken());
}

6.mybatis-plus配置

mybatis-plus在application.yml中的配置.

mybatis-plus:mapper-locations: classpath*:classpath*:org/jeecg/activiti/**/xml/*Mapper.
  • mybatis-plus配置类的配置.MybatisPlusSaasConfig配置mapper文件扫描路径
@Configuration
@MapperScan(value={"org.jeecg.modules.**.mapper*","org.jeecg.activiti.**.mapper*"})
public class MybatisPlusSaasConfig {
}

完成以上配置, 你可以往这个模块建表。到这也就完成第一步。模块建立。 接下来说明下如何完善activiti模块的依赖和配置。

Activiti模块的安装和配置

项目父pom.xml中新增activiti的依赖

<dependencyManagement><dependencies><!--以下是所需的依赖文件--><dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter</artifactId><version>7.0.0.Beta2</version><exclusions><exclusion><!-- 重点坑,不排除mybatis的话,在启动项目时会报错mybatisplus缺少类   --><artifactId>mybatis</artifactId><groupId>org.mybatis</groupId></exclusion></exclusions></dependency></dependencies>
</dependencyManagement>

jeecg-module-activit模块的依赖

<dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter</artifactId><exclusions><exclusion><!-- 重点坑,不排除mybatis的话,在启动项目时会报错mybatisplus缺少类   --><artifactId>mybatis</artifactId><groupId>org.mybatis</groupId></exclusion></exclusions>
</dependency>

注意啦!需要将这个模块在jeecg-module-system/jeecg-system-start模块的pom.xml新增,如下

<dependencies><!-- SYSTEM 系统管理模块 --><dependency><groupId>org.jeecgframework.boot</groupId><artifactId>jeecg-system-biz</artifactId><version>${jeecgboot.version}</version></dependency><!-- Activiti模块 --><dependency><groupId>org.jeecgframework.boot</groupId><artifactId>jeecg-module-activti</artifactId><version>${jeecgboot.version}</version></dependency><!-- DEMO 示例模块 --><dependency><groupId>org.jeecgframework.boot</groupId><artifactId>jeecg-module-demo</artifactId><version>${jeecgboot.version}</version></dependency><!-- flyway 数据库自动升级 --><dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId></dependency>
</dependencies>

application.yml配置

spring:activiti:#1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常#2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建#3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)#4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)database-schema-update: true# 检测历史信息表是否存在,activiti7默认不生成历史信息表,开启历史表db-history-used: true# 历史记录存储等级history-level: fullcheck-process-definitions: true

mysql配置->nullCatalogMeansCurrent=true

url: jdbc:mysql://rxxx/jeecg-camunda?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
//需要在尾部追加nullCatalogMeansCurrent=true
//如果不追加, 可能会出现cause: java.sql.SQLSyntaxErrorException: 
Table 'jeecg-camunda.act_ge_property' doesn't exist

Activiti7 中自带的 Security 安全框架排除掉(因为我这里使用的是 Shiro 安全框架,Security 就没什么用处了)

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, SecurityAutoConfiguration.class,SecurityAutoConfiguration.class,ManagementWebSecurityAutoConfiguration.class})
public class OAApplication
{public static void main(String[] args){SpringApplication.run(OAApplication.class, args);System.out.println("启动成功~");}
}上面排除 Security 安全框架的操作对于 Activiti 7.1.0.M6 这个版本是没用的,
因为这个版本的代码强引用了 SpringSecurity 里的内容,
比如在 Activiti 的 SpringBoot 配置类中,强引用 UserDetailsService,
没有这个就会报错,所以我们还需要把版本降到7.1.0.M4及以下。

代码编写

@ApiOperation(value = "启动流程", notes = "启动流程")
@PostMapping("/start")
public Result<?> start(@RequestBody LeaveReq leaveReq) {log.info("start.leaveReq:{}" + Thread.currentThread().getId());LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();//启动流程&&并设置启动人Authentication.setAuthenticatedUserId(loginUser.getUsername());Map<String, Object> variables = new HashMap<>(4);variables.put("general", loginUser.getUsername());variables.put("guide", "诸葛亮");variables.put("leader", "刘备");ProcessInstance processInstance =     runtimeService.startProcessInstanceByKey(leaveReq.getModelKey(), variables);}

综上就是一个Activiti工作流在JeecgBoot开源项目中集成并且简易运行的案例, 更多详情,请访问JeecgFlow

相关文章:

JeecgBoot集成工作流实战教程

Activiti是一个轻量级的工作流程和业务流程管理&#xff08;BPM&#xff09;平台&#xff0c;它主要面向业务人员、开发人员和系统管理员。这个平台的核心是一个快速且可靠的Java BPMN 2流程引擎。Activiti是开源的&#xff0c;并且基于Apache许可证进行分发。它可以运行在任何…...

第三十章 章节练习商品列表组件封装

目录 一、需求说明 二、技术要点 三、完整代码 3.1. main.js 3.2. App.vue 3.3. MyTable.vue 3.4. MyTag.vue 一、需求说明 1. my-tag 标签组件封装 (1) 双击显示输入框&#xff0c;输入框获取焦点 (2) 失去焦点&#xff0c;隐藏输入框 (3) 回显标签信息 (4) 内…...

NumPy 高级索引

NumPy 高级索引 NumPy 是 Python 中用于科学计算的核心库之一,它提供了一个强大的N维数组对象和许多用于操作这些数组的函数。在 NumPy 中,除了基本的索引和切片操作外,还提供了高级索引功能,这使得您可以以更加灵活和高效的方式访问和操作数组中的数据。本文将详细介绍 N…...

C/C++常用编译工具链:GCC,Clang

目录 GNU Compiler Collection GCC的优势 编译产生的中间文件 Clang Clang的特点 什么是LLVM&#xff1f; Clang编译过程中产生的中间表示文件 关于Clang的调试 C 编译工具链中有几个主要的编译工具&#xff0c;包括&#xff1a; GNU Compiler Collection (GCC…...

let和war的区别

let和war的区别 看不懂图片&#xff0c;可以看视频教程...

[CUDA] stream使用笔记

文章目录 1. stream一般用法2. stream与event&#xff1a;3. stream异常的排查4. stream的异步与同步行为 1. stream一般用法 cudaStream_t stream_; cudaStreamCreate(&stream_); // create stream // some operators running on this stream_ cudaStreamSynchronize(str…...

第二课:开发工具

在本课中&#xff0c;我们将介绍一些常用的C开发工具&#xff0c;并附上下载链接&#xff0c;帮助你选择合适的工具进行开发。 1. DEVC DEVC 是一个轻量级的C开发工具&#xff0c;适合初学者使用。它提供了基本的代码编辑、编译和调试功能。 下载链接: DEVC 下载 2. Visual…...

Vue 学习随笔系列十三 -- ElementUI 表格合并单元格

ElementUI 表格合并单元格 文章目录 ElementUI 表格合并单元格[TOC](文章目录)一、表头合并二、单元格合并1、示例代码2、示例效果 一、表头合并 参考&#xff1a; https://www.jianshu.com/p/2befeb356a31 二、单元格合并 1、示例代码 <template><div><el-…...

对于一个含有直流和交流分量的信号,如何使用示波器正确显示并测出直流电压值和交流电压峰峰值?

对于一个含有直流&#xff08;DC&#xff09;和交流&#xff08;AC&#xff09;分量的混合信号&#xff0c;使用示波器来正确显示和测量其直流电压值和交流电压峰峰值需要选择适当的设置和方法。以下是详细的步骤&#xff1a; 所需设备 示波器电压探头 步骤一&#xff1a;连…...

移动混合开发面试题及参考答案

目录 什么是混合开发(Hybrid App)? 混合开发(Hybrid App)与原生开发相比有什么优缺点? 优点 缺点 混合开发(Hybrid App)的兴起原因是什么? 市场竞争和成本控制需求 技术发展和资源整合 人才资源的考量 Web App、Native App 和混合开发(Hybrid App)的区别是…...

命令行工具开发秘籍:从零开始创建实用Python脚本(如何创建Python命令行工具)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 创建命令行工具的基础🔖 在非模块化的环境中🔖 在模块化环境中📝 打包和安装模块📝 使用命令行工具⚓️ 相关链接 ⚓️📖 介绍 📖 如何将自己的Python模块打包成一个可在命令行中直接执行的工具?…...

Python - PDF 分割成单页、PDF 转图片(PNG)

文章目录 PDF 分割成一页页的 PDFPDF 转 PNGPDF 分割成一页页的 PDF import fitz def split_pdf(pdf_path, save_dir):source_pdf = fitz.open(pdf_path)# 遍历source_pdf中的每一页,page_number从0开始计数 for idx...

【网络】套接字编程——TCP通信

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;TCP网络服务器简单模拟实现。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;…...

PyTorch实践-CNN-验证码识别

1 需求 GitHub - xhh890921/cnn-captcha-pytorch: 小黑黑讲AI&#xff0c;AI实战项目《验证码识别》 2 接口 含义 在optim.Adam接口中&#xff0c;lr参数代表学习率&#xff08;Learning Rate&#xff09;。学习率是优化算法中的一个关键超参数&#xff0c;它决定了在每次迭代…...

json和pb的比较

1.介绍 在数据序列化和通信领域&#xff0c;schema 指的是用于定义数据结构的模式或结构描述。它描述了数据的字段、类型、嵌套结构和约束&#xff0c;并在数据验证和解释上发挥重要作用。常见的 schema 格式包括 Protocol Buffers (proto)、JSON Schema、XML Schema 等。 Pr…...

Redis-基本了解

一、Redis 初识 Redis 是⼀种基于键值对&#xff08;key-value&#xff09;的NoSQL数据库&#xff0c;与很多键值对数据库不同的是&#xff0c;Redis 中的值可以是由string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&#xff08;列表&#xff09…...

HarmonyOS第一课 06 构建更加丰富的页面-习题解析

判断题 1. Tabs组件可以通过接口传入一个TabsController&#xff0c;该TabsController可以控制Tabs组件进行页签切换。T 正确(True) 错误(False) 使用 this.tabsController.changeIndex(this.currentIndex); 可以切换页签 WebviewController提供了变更Web组件显示内容的接口…...

计算机的错误计算(一百四十三)

摘要 探讨 MATLAB 中 附近数的余弦函数的计算精度问题。 例1. 已知 计算 与 直接贴图吧&#xff1a; 另外&#xff0c;16位的正确值分别为 -0.3012758451921695e-7 与 -0.3765996542384011e-10&#xff08;ISRealsoft 提供&#xff09;。 容易看出&#xff0c;MATLAB的输…...

大数据之——Window电脑本地配置hadoop系统(100%包避坑!!方便日常测试,不用再去虚拟机那么麻烦)

之前我们的hadoop不管是伪分布式还是分布式&#xff0c;都是配置在虚拟机上&#xff0c;我们有的时候想要运行一些mapreduce、hdfs的操作&#xff0c;又要把文件移到虚拟机&#xff0c;又要上传hdfs&#xff0c;麻烦得要死&#xff0c;那么有的时候我们写的一些java、python的h…...

汽车固态电池深度报告

固态电池符合未来大容量二次电池发展方向&#xff0c;半固态电池已装车&#xff0c;高端长续航车型、e-VTOL 等方向对固态电池需求明确。固态电池理论上具备更高的能量密度、更好的热稳定性、更长的循环寿命等优点&#xff0c;是未来大容量二次电池发展方向。根据中国汽车动力…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...