天天看点

Flowable快速工作流脚手架_Jsite角色授权不显示

JSite 快速开发框架,内置Flowable工作流引擎 · 五大基础模块 · 前后端基础代码自动生成 · 权限精确控制。
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
说明:此版本我已经调通,最新版本正在更新,页面未处理好,因此采用历史版本。

文章目录

  • ​​一、克隆/打开项目​​
  • ​​1.1. 搜索项目​​
  • ​​1.2. 复制ssh地址​​
  • ​​1.3. 将项目克隆到本地​​
  • ​​1.4. idea打开项目`JSite`​​
  • ​​二、配置项目​​
  • ​​2.1. 解决依赖​​
  • ​​2.1.1. 配置maven本地仓库​​
  • ​​2.1.2. 配置阿里云镜像地址镜像​​
  • ​​2.2. 切换到历史节点​​
  • ​​2.3. 修改数据库连接信息​​
  • ​​2.4. 初始化数据库脚本​​
  • ​​2.5. 配置Redis​​
  • ​​2.6. 启动Redis​​
  • ​​2.7. 关闭演示模式​​
  • ​​2.7.1. 关闭演示模式开关​​
  • ​​2.7.2. 切换正常模式​​
  • ​​三、启动项目​​
  • ​​3.1. 启动类报错​​
  • ​​3.2. 重新编译打包​​
  • ​​四、请假实战​​
  • ​​4.1. 部署流程​​
  • ​​4.2. 发起流程​​
  • ​​4.3. 已发任务查看​​
  • ​​4.4. 部门经理流转​​
  • ​​4.4.1. 登录dept账号​​
  • ​​4.4.2. 在待办任务中,签收任务​​
  • ​​4.4.3. 在待办任务中,办理任务​​

一、克隆/打开项目

1.1. 搜索项目

  • 在码云搜索框中搜索​

    ​JSite​

  • 或者直接点击码云项目链接:

    ​​​https://gitee.com/baseweb/JSite​​

  • Flowable快速工作流脚手架_Jsite角色授权不显示
    Flowable快速工作流脚手架_Jsite角色授权不显示

1.2. 复制ssh地址

Flowable快速工作流脚手架_Jsite角色授权不显示

1.3. 将项目克隆到本地

git clone [email protected]:baseweb/JSite.git      
Flowable快速工作流脚手架_Jsite角色授权不显示

1.4. idea打开项目JSite

Flowable快速工作流脚手架_Jsite角色授权不显示

二、配置项目

2.1. 解决依赖

2.1.1. 配置maven本地仓库

Flowable快速工作流脚手架_Jsite角色授权不显示

2.1.2. 配置阿里云镜像地址镜像

Flowable快速工作流脚手架_Jsite角色授权不显示

2.2. 切换到历史节点

Flowable快速工作流脚手架_Jsite角色授权不显示
git checkout 47c0d6c8      
Flowable快速工作流脚手架_Jsite角色授权不显示

2.3. 修改数据库连接信息

  • 前提:在mysql中创建​

    ​jsite​

    ​数据库
  • Flowable快速工作流脚手架_Jsite角色授权不显示

2.4. 初始化数据库脚本

模块 数据库脚本
文件模块 jsite_file_mysql.sql
代码生成模块 jsite_gen_mysql.sql
oa工作流模块 jsite_oa_mysql.sql
系统模块 jsite_sys_mysql.sql
定时器模块 jsite_sys_qrtz_mysql.sql
测试模块 jsite_test_mysql.sql
初始化数据 jsite-init.sql
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示

项目启动后截图:

Flowable快速工作流脚手架_Jsite角色授权不显示

2.5. 配置Redis

Flowable快速工作流脚手架_Jsite角色授权不显示

2.6. 启动Redis

Flowable快速工作流脚手架_Jsite角色授权不显示

双击运行即可

Flowable快速工作流脚手架_Jsite角色授权不显示

2.7. 关闭演示模式

2.7.1. 关闭演示模式开关

Flowable快速工作流脚手架_Jsite角色授权不显示

2.7.2. 切换正常模式

static/modler/scripts/controllers/processes.js      
  • 在119行
  • Flowable快速工作流脚手架_Jsite角色授权不显示
    Flowable快速工作流脚手架_Jsite角色授权不显示

三、启动项目

3.1. 启动类报错

  • 问题现象
  • Flowable快速工作流脚手架_Jsite角色授权不显示
  • 问题定位
  • 再启动类中,PropertiesUtils这个工具类是​

    ​com.jsite.common.io.PropertiesUtils​

    ​中的类,初步判断是,jsite-common模块没有安装板本地仓库,导致jsite-web项目以来失败。
  • Flowable快速工作流脚手架_Jsite角色授权不显示
  • 深一步追根溯源
  • 在jsite-web的pom.xml中,依赖了jsite-framework模块
  • Flowable快速工作流脚手架_Jsite角色授权不显示
  • 进入jsite-framework模块的pom中
Flowable快速工作流脚手架_Jsite角色授权不显示

从上面可以看出,我们的初步判断是正确的,那就好解决了,没有安装到本地仓库,那就让我们借助maven打包编译插件帮我们安装jsite-common到本地仓库就好了。

3.2. 重新编译打包

  • 执行命令
mvn clean install -DTests=true      

或者

idea插件操作

Flowable快速工作流脚手架_Jsite角色授权不显示
  • 再次验证,没有报错
  • Flowable快速工作流脚手架_Jsite角色授权不显示
  • 浏览器访问:​​http://localhost:8081/jsite​​
演示系统账号 密码
jsite admin
dept 123456
jsitehr 123456
jsiteuser 123456
  • 部署流程,只能由系统管理员
  • 发起流程:都可以,前提是由系统管理员部署流程成功后,在发起流程的类表中才会显示,然后每个人选择对应的流程,进行节点流转。

说明:上面3个账号角色分别为系统管理员、部门经理、HR,普通员工。

请假流程发起后,流程下一步自动流转到“部门经理”角色账号下,部门经理审批后自动流转到“hr角色账号下”。测试时,需要登录不同角色账号,在代办任务中查看流程代办任务。

Flowable快速工作流脚手架_Jsite角色授权不显示
  • 刷新页面即可登陆成功
  • Flowable快速工作流脚手架_Jsite角色授权不显示

四、请假实战

4.1. 部署流程

Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示

4.2. 发起流程

Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示

4.3. 已发任务查看

Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示

4.4. 部门经理流转

4.4.1. 登录dept账号

Flowable快速工作流脚手架_Jsite角色授权不显示

4.4.2. 在待办任务中,签收任务

Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示

4.4.3. 在待办任务中,办理任务

Flowable快速工作流脚手架_Jsite角色授权不显示

响应码500

Flowable快速工作流脚手架_Jsite角色授权不显示
  • 请求的url
  • Flowable快速工作流脚手架_Jsite角色授权不显示
  • 页面传递的参数
  • Flowable快速工作流脚手架_Jsite角色授权不显示
  • 控制台报错信息提取
  • 在获取代办列表FlowTaskService的104行
  • Flowable快速工作流脚手架_Jsite角色授权不显示
  • 在获取代办列表FlowTaskService的105行
e.setProcDefId(pd.getId());      

这里需要tProcDefId对吧,程序中写的是从pd中获取,但是里面,没有

Flowable快速工作流脚手架_Jsite角色授权不显示

其实这个tProcDefId在task中,因此需要修改代码。

Flowable快速工作流脚手架_Jsite角色授权不显示
  • 点击办理,procDefId=undefined
  • Flowable快速工作流脚手架_Jsite角色授权不显示
  • 第一步进FlowTaskController的form方法,调用getFormKey的service进行业务处理
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示

从上图可以看出很明显,没有获取到procDefId

,清除缓存,再次测试,点击待办任务菜单,debbug看程序,

procDefId=leave:1:b74aaad7-15d6-11ea-9f45-4a5ab6e330e5      
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
  • 点击办理
  • Flowable快速工作流脚手架_Jsite角色授权不显示
    Flowable快速工作流脚手架_Jsite角色授权不显示
    Flowable快速工作流脚手架_Jsite角色授权不显示
  • 很明显获取到值了!!!

    f8跳过,页面又抛出403,权限的错了,真是一波未平一波又起啊。

  • Flowable快速工作流脚手架_Jsite角色授权不显示
  • 从页面很明显是没有办理权限,导致403错误,情有可原,对吧,那就给dept用户配置权限呗,

    登录jsite系统管理员账号,给dept用户配置权限

  • Flowable快速工作流脚手架_Jsite角色授权不显示
    Flowable快速工作流脚手架_Jsite角色授权不显示
    Flowable快速工作流脚手架_Jsite角色授权不显示
  • 角色授权既然是空的,我想静静。看看控制台报错信息再定位问题吧?
  • Flowable快速工作流脚手架_Jsite角色授权不显示
  • 从控制台中可以看出,由2条信息比较醒目:
java.lang.ClassNotFoundException: com.jsite.modules.sys.utils.AreaOfficeUtils      
at com.jsite.modules.sys.web.RoleController.form(RoleController.java:74)      

异常信息很明晰那说AreaOfficeUtils类,RoleController.java:74,既然有文件位置,那咱们就去看看吧,

从以下图中可以看出,通过反射区找 com.jsite.modules.sys.utils.AreaOfficeUtils类,那就在程序中找找有这个类吗?

Flowable快速工作流脚手架_Jsite角色授权不显示

程序我是看明白了,他想调用AreaOfficeUtils类的getOfficeList(获取当前用户有权限访问的部门方法),再utils包下就3个工具类,经过查找,UserUtils类中,有getOfficeList(获取当前用户有权限访问的部门方法),那就好办了,类名修改一下即可,再次测试。

Flowable快速工作流脚手架_Jsite角色授权不显示

校色授权,就显示了。

Flowable快速工作流脚手架_Jsite角色授权不显示

但是,我就不明白了,想获取一个工具类的方法,直接调用不就行了,如果是静态的方法,直接用类名.调用不更方便。代码还写了折磨多行,浪费。

代用的方法和我们预期的一样静态的,那就轻松+快乐了。

Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示

一行代码就搞定了。哈哈哈!!!

测试一下,好不好使,对吧

Flowable快速工作流脚手架_Jsite角色授权不显示

从上图可以看出,也好使。dept用户的办理权限,我也配置好了,再去待办任务菜单中,去办理任务应该就好了,光预测也不行,测试一下保险。

Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示

任务办理完了,在已办任务菜单中,查看一下任务办理的详情不为过吧,

这里演示以,下面查看当前节点信息,debug断点调试了。

Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示

其实,也是那个definitinotallow=undefined导致的,也是由于获取的对象不对,这里我直接修改程序。

Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示

解决方案:

//修改后的程序
e.setProcDefId(histTask.getProcessDefinitionId());      
Flowable快速工作流脚手架_Jsite角色授权不显示

再次测试

Flowable快速工作流脚手架_Jsite角色授权不显示

任务办理完了,在已办任务(历史)菜单中,查看一下任务办理的节点信息不为过吧,

Flowable快速工作流脚手架_Jsite角色授权不显示

其实,也是那个definitinotallow=undefined导致的,也是由于获取的对象不对,这里我直接修改程序。

Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示

解决方案:

//修改后的程序
e.setProcDefId(histTask.getProcessDefinitionId());      
Flowable快速工作流脚手架_Jsite角色授权不显示

再次测试

Flowable快速工作流脚手架_Jsite角色授权不显示

下一个节点是hr,同理hr也需要权限

Flowable快速工作流脚手架_Jsite角色授权不显示

jsitehr登录

Flowable快速工作流脚手架_Jsite角色授权不显示

在待办任务菜单中,先对待办任务进行签收,签收之后进行办理。

Flowable快速工作流脚手架_Jsite角色授权不显示

在已办任务菜单中,查看当前节点信息

Flowable快速工作流脚手架_Jsite角色授权不显示

在已办任务菜单中,查看详情

Flowable快速工作流脚手架_Jsite角色授权不显示

节点流转结束了,jsite发起流程的执行人,查看一下历史任务应该吧。

Flowable快速工作流脚手架_Jsite角色授权不显示

先追踪一下流程详情

Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示

很明显又是这个问题,大家应该知道怎末改了吧,

Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示

再次测试

Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示

总上,异常现象有2种:

  1. 在待办任务/已办任务/已发任务都会抛出异常,都是由于definitionId=undefined导致的
  2. 由于没有办理权限导致的403

    到此,一个完整的工作流走完了。

补充,在待办任务菜单中会出现2种业务场景,上明只讲了一种,直接在待办任务列表中签收任务,然后办理,已经签收的任务,另外一种情况就是,我还未签收,但是,我想先不签收,先查看一下节点信息和流程详情,也符合业务需要,这样需要在待办任务中添加这种业务场景。

当前属于未签收的业务场景:

Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示

解决方案:

//源程序
  // e.setProcDefId(pd.getId());
  //修改后
  e.setProcDefId(task.getProcessDefinitionId());      
Flowable快速工作流脚手架_Jsite角色授权不显示
Flowable快速工作流脚手架_Jsite角色授权不显示
/**
   * 获取待办列表
   * @param procDefKey 流程定义标识
   * @return
   */
  public Page<Flow> todoList(Flow act){
    String userId = UserUtils.getUser().getLoginName();//ObjectUtils.toString(UserUtils.getUser().getId());
    
    Page<Flow> result = new Page<Flow>();
    
    List<Flow> flowList = new ArrayList<Flow>();
    
    // =============== 已经签收的任务  ===============
    TaskQuery todoTaskQuery = taskService.createTaskQuery().taskAssignee(userId).active()
        .includeProcessVariables().orderByTaskCreateTime().desc();
    
    // 设置查询条件
    if (StringUtils.isNotBlank(act.getProcDefKey())){
      todoTaskQuery.processDefinitionKey(act.getProcDefKey());
    }
    if (act.getBeginDate() != null){
      todoTaskQuery.taskCreatedAfter(act.getBeginDate());
    }
    if (act.getEndDate() != null){
      todoTaskQuery.taskCreatedBefore(act.getEndDate());
    }
    
    result.setCount(todoTaskQuery.count());
    // 查询列表
    List<Task> todoList = todoTaskQuery.list();
    for (Task task : todoList) {
      Flow e = new Flow();
      e.setTaskId(task.getId());
      e.setTaskDefKey(task.getTaskDefinitionKey());
      e.setTaskName(task.getName());
      e.setAssignee(task.getAssignee());
      e.setCreateTime(task.getCreateTime());
      e.setExecutionId(task.getExecutionId());
      e.setVars(task.getProcessVariables());
      
      ProcessDefinition pd = ProcessDefCache.get(task.getProcessDefinitionId());
      //源程序
      // e.setProcDefId(pd.getId());
      //修改后
      e.setProcDefId(task.getProcessDefinitionId());
      e.setProcDefname(pd.getName());
      e.setProcDefKey(pd.getKey());
      e.setProcDefversion(pd.getVersion());
      
      e.setProcInsId(task.getProcessInstanceId());
      e.setStatus("todo");
      flowList.add(e);
    }
    
    // =============== 等待签收的任务  ===============
    TaskQuery toClaimQuery = taskService.createTaskQuery().taskCandidateUser(userId)
        .includeProcessVariables().active().orderByTaskCreateTime().desc();
    
    // 设置查询条件
    if (StringUtils.isNotBlank(act.getProcDefKey())){
      toClaimQuery.processDefinitionKey(act.getProcDefKey());
    }
    if (act.getBeginDate() != null){
      toClaimQuery.taskCreatedAfter(act.getBeginDate());
    }
    if (act.getEndDate() != null){
      toClaimQuery.taskCreatedBefore(act.getEndDate());
    }
    
    // 查询列表
    List<Task> toClaimList = toClaimQuery.list();
    for (Task task : toClaimList) {
      Flow e = new Flow();
      e.setTaskId(task.getId());
      e.setTaskDefKey(task.getTaskDefinitionKey());
      e.setTaskName(task.getName());
      e.setAssignee(task.getAssignee());
      e.setCreateTime(task.getCreateTime());
      e.setExecutionId(task.getExecutionId());
      e.setVars(task.getProcessVariables());
      
      ProcessDefinition pd = ProcessDefCache.get(task.getProcessDefinitionId());
      //源程序
      // e.setProcDefId(pd.getId());
      //修改后
      e.setProcDefId(task.getProcessDefinitionId());
      e.setProcDefname(pd.getName());
      e.setProcDefKey(pd.getKey());
      e.setProcDefversion(pd.getVersion());
      
      e.setProcInsId(task.getProcessInstanceId());
      e.setStatus("claim");
      flowList.add(e);
    }
    logger.info("==FLOWABLE LIST=="+JsonMapper.toJsonString(flowList));
    result.setList(flowList);
    return result;
  }