定制直播软件,一步步实现审批流框架

news/2025/3/31 23:03:18/文章来源:https://www.cnblogs.com/yunbaomengnan/p/18799139

定制直播软件,一步步实现审批流框架

一、使用步骤

通过Maven打包
安装到本地Maven仓库:

#jar包方式安装(安装安装记得用resource下的pom文件覆盖本地仓库的)
mvn install:install-file -Dfile=jar包路径 -DgroupId=com.shallowUniverse -DartifactId=process-spring-boot-starter -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar

 

#在文件夹中安装
mvn clean install

 

导入启动器中的flowdesign.sql文件到自己的数据库
创建SpringBoot工程引入依赖

<dependency><groupId>com.qianyu</groupId><artifactId>process-spring-boot-starter</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>

 

配置文件(application.yml)配置流程引擎需要的环境

#配置流程引擎数据库对象参数、处理器扫描路径
process:database: flowdesignuser-table: system_useruser-id: iduser-name: realNamerole-table: system_rolerole-id: idrole-name: rnamedept-table: deptdept-id: iddept-name: namehandler-packages: com.example.testflow.handler

 

启动类开启流程引擎自动配置(@EnableProcess)

@SpringBootApplication
@EnableProcess
@MapperScan(basePackages = {"com.example.process.mapper"})
public class TestFlowApplication {public static void main(String[] args) {SpringApplication.run(TestFlowApplication.class, args);}
}

 

自定义拦截器(实现ProcessInterceptor接口)

@Component
public class ProcessUserInterceptor implements ProcessInterceptor {@Resourceprivate ProcessUserManager processUserManager;@Overridepublic void beforeExecuteProcessor(HttpServletRequest httpServletRequest) {//这里正常情况是从request解析token或者session拿到用户信息,此处为测试ProcessUser processUser = new ProcessUser();processUser.setId(1L);processUser.setRealName("gs");processUser.setUsername("gs");processUser.setUserRoles("1");processUser.setDeptId(1L);processUserManager.setSysUser(processUser);}@Overridepublic void postExecuteProcessor(Method method, Object returnValue) {if ("findByRole".equals(method.getName())) {System.out.println("转换之前=========>");System.out.println(returnValue);System.out.println("转换之后=========>");List<Approval> approvals = (List<Approval>) returnValue;approvals.clear();returnValue = approvals;}}
}

 

拦截器放入流程引擎

@Configuration
public class ProcessConfig implements ProcessInterceptorConfigurer {@Resourceprivate ProcessUserInterceptor processUserInterceptor;@Overridepublic void configurer(ProcessEngine processEngine) {//增加用户校验拦截器
        processEngine.addInterceptor(processUserInterceptor);}
}

 

自己的数据库用户表对应的实体实现SysUser接口(可以不实现直接使用ProcessUser对象封装数据)

public class SystemUser implements SysUser {private Long id;private String username;private Long dept;private String realName;private String userRoles;@Overridepublic Long getId() {return id;}@Overridepublic Long getDept() {return dept;}@Overridepublic String getUsername() {return username;}@Overridepublic String getUserRoles() {return userRoles;}@Overridepublic String getRealName() {return realName;}
}

 

在需要开启审批的方法上加上注解

@Service
public class LeavesService extends ServiceImpl<LeavesMapper, Leaves> {@Resourceprivate LeavesMapper leavesMapper;@ProcessBegin(value = "leaves")@Overridepublic boolean save(@ProcessEntry(primaryKey = "leavesId", processField = "flowId",underscoreToCamelCase = true) Leaves leaves) {return leavesMapper.insert(leaves) > 0;}
}

 

编写后置处理器

//实现FlowFinishedHandler接口
//要加上component注解,因为处理器是全部放在spring容器中,后续加载也会从spring容器加载
@ProcessHandler("leaves")
@Component
public class LeavesFlowHandler implements ProcessFinishedHandler {
​//审批同意后的自动回调
    @Overridepublic void postAllowHandle(String jsonApproval, ApprovalDetails approvalDetails) {System.out.println(JSON.parseObject(jsonApproval, Leaves.class));}//审批拒绝后的自动回调
    @Overridepublic void postRefuseHandle(String jsonApproval,ApprovalDetails approvalDetails) {System.out.println("拒绝");}
}

 

在需要使用的地方引入FlowEngine对象

  @Autowiredprivate FlowEngine flowEngine;
​//此处为测试代码,实际场景由客户端发送请求controller处理
    @Testpublic void contextLoads() throws FormNotExistException {Emp emp = new Emp();emp.setEid(1);flowEngine.login(emp);Leaves leaves = new Leaves();leaves.setContent("请假");leaves.setIsvalid(1);leavesService.save(leaves);}

 

二、注解以接口介绍

@ProcessBegin
value:要做流程的表名,和数据库对应
@ProcessEntry
primaryKey:实体主键字段名
underscoreToCamelCase:主键是否驼峰
processField:实体流程字段名
@ProcessHandler
value:做流程的表名,和@ProcessBegin填写的对应
SysUser
Long getId();
当前用户id
Long getDept();
当前用户部门id
String getUsername();
当前用户用户名
String getUserRoles();
当前用户角色id字符串,格式1,2,3
String getRealName();
当前用户真实姓名
ProcessInterceptor
void beforeExecuteProcessor(HttpServletRequest httpServletRequest);
这里主要用于解析token或者session拿到用户信息
void postExecuteProcessor(Method method, Object returnValue);
可以对拿到的返回值进行过滤
ProcessInterceptorConfigurer
void configurer(ProcessEngine processEngine)
可以在加载时拿到ProcessEngine对象,添加拦截器或进行改造扩展
ProcessFinishedHandler
void postAllowHandle(String jsonForm, ApprovalDetails formAudit)
审批全部同意以后的回调方法,第一个参数为目标表数据json串,可自行转回对象
void postRefuseHandle(String jsonForm, ApprovalDetails formAudit)
审批中途拒绝以后的回调方法,第一个参数为目标表数据json串,可自行转回对象
ProcessUserManager
SysUser getSysUser();
拿到当前用户
void setSysUser(SysUser sysUser);
设置当前用户

三、执行流程原理

应用程序启动扫描配置文件配置的处理器包路径从Spring容器中加载所有@ProcessHandler对应的类存入ProcessHandlerManager容器
自定义拦截器在流程引擎方法被调用前将用户信息存入ProcessUserManager
执行加了@ProcessBegin的方法时通过SpringAOP环绕通知解析@ProcessEntry的实体并将其封装为审批单对象存入数据库
ProcessEngine的executeApproval()方法执行过程中发现审批流程结束从ProcessHandlerManager中通过源表名获取处理器
获取到处理器后调用postAllowHandle或postRefuseHandle,至此流程结束

四、注意事项

至少要编写一个自定义拦截器解析token或者session拿到用户信息并放入ProcessUserManager,否则无法正常做审批流,启动类上要加上@EnableProcess注解,否则不会加载ProcessEngine对象,配置文件的dept相关的字段可不配置,不配置的情况下不会根据部门进行节点匹配,可根据需求自行配置,用户管理器ProcessUserManager的默认作用域为审批流框架内部方法,如需增加作用域请编写切面,参考如下:

@Aspect
@Component
public class MyAspect {@Resourceprivate ProcessEngine processEngine;@Pointcut("execution(* com.example.process.service.*.*(..))")public void pointCut() {}@Before("pointCut()")public void before() throws AuthenticationException {processEngine.autoWriedUser();}
}

 

以上就是定制直播软件,一步步实现审批流框架, 更多内容欢迎关注之后的文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/907461.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flutter:用http库下载文件

一,安装第三方库 地址: https://pub.dev/packages/http 编辑pubspec.yaml: dependencies:flutter:sdk: flutterpath_provider: ^2.1.5http: ^1.3.0 然后点击 pub get 二,代码: import package:flutter/material.dart; import package:http/http.dart show get; import packa…

flutter:从接口获取json数据后并解析

一,代码: dart代码:model class GoodsListItem {String name;String desc;int id;GoodsListItem(this.name,this.desc, this.id) {}GoodsListItem.fromJson(Map<String, dynamic>json):name=json["name"],desc = json["desc"],id = json["id&q…

图解 CSS 选择器

https://zhuanlan.zhihu.com/p/715717977CSS 选择器用于选择 HTML 元素并将样式应用于它们。使用这些选择器,可以定义特定条件下应用哪些样式。除了普通的选择器外,还有伪类和伪元素,用于选择具有特定状态或特定部分的元素,并将样式应用于它们。本文将通过图文并茂的方式展…

二分图学习笔记

使用题单:二分图 - 从入门到入土。 二分图概念 对于一个图,如果能够把它的点集恰好分成两个部分,使得这第一个部分里面的点两两不连边,第二个部分里面的点也两两不连边,则该图是二分图。或者说每一条边都横跨了两个集合。 举个例子:这个图是二分图,因为我们可以将它分成…

SciTech-EECS-Signal-OpAmp(Operational Amplifier,运算放大器): Gain增益放大倍数计算公式 + 分流器采样百安级大电流的微电压信号 + 微电压信号放大

SciTech-EECS-Signal-OpAmp(Operational Amplifier,运算放大器): Gain增益放大倍数计算公式## 分流器采样百安级大电流的微电压信号 OpAmp(运算放大器)微电压信号放大 如上图所示,\(\large V_{out} = V_{in} \times (1+ \dfrac{R_{2}}{R_{1}})\) TL431+MOS管,充满自停的充电器…

读DAMA数据管理知识体系指南34数据仓库和商务智能概念

读DAMA数据管理知识体系指南34数据仓库和商务智能概念1. 业务驱动因素 1.1. 主要驱动力是运营支持职能、合规需求和商务智能活动 1.2. 用数据来证明他们是合规的,因为数据仓库中包含历史数据,所以经常被用来响应这类要求 1.3. 商务智能支持一直是建设数据仓库的主要原因 2. 目…

环境检测 温湿度 噪声 建大仁科

环境检测 温湿度 噪声 建大仁科 1、温湿度 wifi版本 配置软件2、噪声 wifi 版本 配置软件 android手机上安装 蓝牙连接配置3、平台下载 RS-RJ-K监控平台-平台软件-温湿度传感器产品说明书下载及选型erwa.cn 二娃测试备忘

C# 13 中的新增功能实操

前言 今天大姚带领大家一起来看看 C# 13 中的新增几大功能,并了解其功能特性和实际应用场景。 前提准备 要体验 C# 13 新增的功能可以使用最新的 Visual Studio 2022 版本或 .NET 9 SDK 尝试这些功能。 Visual Studio 2022安装https://visualstudio.microsoft.com/zh-hans/dow…

Open R1 项目进展第一期

DeepSeek R1 发布已经两周了,而我们启动 open-r1 项目——试图补齐它缺失的训练流程和合成数据——也才过了一周。这篇文章简单聊聊:Open-R1 在模仿 DeepSeek-R1 流程和数据方面的进展 我们对 DeepSeek-R1 的认识和相关讨论 DeepSeek-R1 发布后社区搞出来的有趣项目这既是项目…

GPU内核实现(下)

3. ELLPACK 内核 ELLPACK SpMV实现沿行并行计算。由于数据已被重新排序为以列为主存储,因此沿ELLPACK数据连续行的内存访问被合并。在下面显示的实现中,假设输入cols和vals数组已经转换为ELLPACK格式。这种格式的一个关键部分是元数据参数,即每行非零的最大数量,它也作为参…

GPU内核实现(上)

GPU内核实现 以下是基于CSR和ELLPACK格式的一些标准SpMV实现。 1. 标量CSR内核 GPU加速SpMV的最简单实现之一是标量内核方法。标量内核分配一个线程来处理SpMV中的每个稀疏点积。稀疏点积由每个线程以顺序方式处理,从而消除了对需要共享内存和/或扭曲级别降低的更高级技术的需…

稀疏矩阵向量乘法介绍

稀疏矩阵向量乘法介绍 稀疏矩阵向量乘法(SpMV)是每个隐式稀疏线性代数求解器。从简单的 Krylov 算法到 multigrid 的算法性能方法在很大程度上取决于 SpMV 实现的速度。因为 SpMV 具有非常低的算术强度,定义为浮点操作数,则实现速度受内存带宽。最大化内存带宽的实现将实现…