SpringBoot自定义启动器记录

一、使用步骤

下载:https://gitee.com/gs_work/flow-spring-boot-starter

通过Maven打包

安装到本地Maven仓库:

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

导入启动器中的flowdesign.sql文件到自己的数据库

创建SpringBoot工程引入依赖


    com.qianyu
    flow-spring-boot-starter
    0.0.1-SNAPSHOT

配置文件配置流程引擎需要的环境

flow:
 database: flowdesign          #数据库名
 user-table: system_user       #用户表名
 user-id: id                   #用户表id字段名
 role-table: system_role       #角色表名
 role-id: id                   #角色表id字段名
 user-name: realName           #用户表真实姓名字段名(没有可不配置)
 role-name: rname              #角色表角色名字段名(可不配置)
 #后置处理器的扫描路径、可填写多个路径,分隔
 handler-package: com.qianyu.flow.service.handler,com.qianyu.flow.utils.handler

启动类开启流程引擎自动配置

@EnableFlowAutoConfiguration
public class FlowApplication {
    public static void main(String[] args) {
        SpringApplication.run(FlowApplication.class, args);
    }
}

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

@Component
public class MyFlowInterceptor implements FlowInterceptor {
    @Autowired
    private ThreadLocalManager threadLocalManager;
 
    @Override
    public void beforeFlowProcesser() {
        threadLocalManager.setCurrentUser(new Long("6"));
    }
 
    @Override
    public void postFlowProcesser() {
        System.out.println(123);
    }
}

拦截器放入流程引擎

@Configuration
public class FlowConfig implements FlowInterceptorConfigurer {
    @Autowired
    private MyFlowInterceptor myFlowInterceptor;
    
    @Override
    public void configurer(FlowEngine flowEngine) {
        flowEngine.addInterceptor(myFlowInterceptor);
    }
}

自己的数据库用户表对应的实体实现SysUser接口

public class Emp implements SysUser {
    private Integer eid;
    private String username;
    private String password;
    private Integer isvalid;
    private String userRoles;
    private String realName;
 
    @Override
    public Long getId() {
        //返回用户id
        return eid.longValue();
    }
    @Override
    public String getUserRoles() {
        //返回用户角色字符串(1,2,3)
        return this.userRoles;
    }
    @Override
    public String getRealName() {
        //返回用户真实姓名
        return this.realName;
    }
    @Override
    public String getUsername() {
        //返回用户名
        return this.userName;
    }
}

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

//参数值为要做流程的表名  @FlowEntry用于标识要做流程的实体,参数值为实体id字段名
//返回值为权限表的id,因为流程是和权限模块绑定的,此处为测试,实际场景为查询出来的id
@FlowBegin(value = "leaves")
@Transactional
public Integer save(@FlowEntry("leaveid") Leaves leaves) {
    leavesMapper.save(leaves);
    return 2;
}

编写后置处理器

//用于标识此为一个流程后置处理器,参数值为要做流程的表名,和@FlowBegin注解参数值对应
@FlowHandler("leaves")
//要加上component注解,因为处理器是全部放在spring容器中,后续加载也会从spring容器加载
@Component
//实现FlowFinishedHandler接口
public class LeavesFlowHandler implements FlowFinishedHandler {
​
    //审批同意后的自动回调
    @Override
    public void postAllowHandle(String jsonForm, FormAudit formAudit) {
        System.out.println(JSON.parseObject(jsonForm, Leaves.class));
    }
 
    //审批拒绝后的自动回调
    @Override
    public void postRefuseHandle(String jsonForm, FormAudit formAudit) {
        System.out.println("拒绝");
    }
}

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

    @Autowired
    private FlowEngine flowEngine;
​
    //此处为测试代码,实际场景由客户端发送请求controller处理
    @Test
    public 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);
    }

二、流程引擎对象API

方法 介绍
getFlowList 获取所有流程
registerFlow 定义流程
registerFlowNode 定义流程节点(有重载方法,可一个或批量)
getFlowById 根据流程id查询流程
getFlowNodeById 根据流程节点id查询流程节点
audit 审批,参数为FormAudit(具体属性参考源码)
getAuditByForm 根据审批单查询审批详情
getFormTarget 查询源表的数据返回值为Map
getFormByRole 根据用户角色查询审批单
getFormByUser 根据审用户查询审批单
getTargetColumns 查询源表的列结构
getFormById 根据审批单id查询审批单
getFlowByModule 根据模块(权限)id查询流程
getFlowNodeByFlow 根据流程查询流程节点
removeFlow 移除流程
removeFlowNode 移除流程节点
removeForm 移除审批单
removeAudit 移除审批详情
removeNodeByFlow 根据流程移除流程节点
removeAuditByForm 根据审批单移除审批详情
appoint 委派(参数为Map,必须包含fid审批单id和appoint被委派人id)
login 登陆(将登陆用户存入redis)
logout 退出(将用户从redis登陆列表中移除)
addInterceptor 添加拦截器

三、执行流程原理

  1. 应用程序启动扫描配置文件配置的处理器包路径从Spring容器中加载所有@FlowHandler对应的类存入FlowHandlerManager容器
  2. 自定义拦截器、过滤器在请求进入api之前将用户id存入ThreadLocalManager
  3. 执行加了@FlowBegin的方法时通过SpringAOP环绕通知解析@FlowEntry的实体并将其封装为审批单对象存入数据库
  4. SpringAOP前置通知从ThreadLocalManager中获取id并从以此为条件从redis拉取用户数据并放入FlowUserManager容器中
  5. audit方法执行过程中发现审批流程结束从FlowHandlerManager中通过源表名获取处理器
  6. 获取到处理器后调用postAllowHandle或postRefuseHandle,至此流程结束

四、注意事项

如果是集中式应用,登陆后调用FlowUserManager的pushUser方法将用户存入FlowUserManager容器,编写过滤器或拦截器在请求进入api之前调用FlowUserManager对象的setUser设置当前登陆用户, 如果是分布式场景,在服务中导入启动器后,需要编写拦截器或过滤器,从Spring容器中获取ThreadLocalManager对象,无论是token校验还是session,解析出用户id存入ThreadLocalManager,后续会从中获取id从redis加载用户数据

你可能感兴趣的:(SpringBoot自定义启动器记录)