若依(RuoYi-Vue)+Flowable工作流前后端整合教程

news2025/2/22 19:01:52

此教程适合若依前后端分离项目,其他项目可以在扩展列表中进行查找。

近期公司里需要对很久以前的RuoYi-Vue前后端分离项目扩展出flowable的功能,当然这个重任也是落在了我的身上(不然也不会有这篇文章),然后我在官网看到了RuoYi-Vue-Flowable这个项目,按照文档提供的迁移方式对于我们这个老版本的项目来说无法正常运行,所以我联系了作者并更新了一下文档,打算在网上在发布一篇(毕竟有的人懒得看官方文档)。

官方项目地址:https://gitee.com/tony2y/RuoYi-flowable

把项目拉到本地后下面开始整合教程,整合教程分为前端和后端两个模块。

前端迁移流程

1.flowale功能页面相关内容迁移

1.1 把目录ruoyi-ui/src/views/下的flowable文件夹移动到你自己前端项目中的/src/views/文件下。

1.2 移动页面配套的js文件,将ruoyi-ui/src/api/下的flowable文件夹移动到自己项目中的/src/api/文件下。

2.flowale流程设计器相关内容迁移

ruoyi-ui/src/components目录下的customBpmn,flow,parser,Process,render,tinymce文件夹移动到自己项目中的/src/components文件下。

3.表单设计器与人员选择模块相关文件迁移

3.1ruoyi-ui/src/views/tool中的build文件夹移动到自己项目中的/src/views/tool文件下,存在则覆盖。

3.2 迁移表单设计器相关样式,将ruoyi-ui/src下的styles文件移动到自己项目中的/src文件夹下。

3.3 修改ruoyi-ui/src/utils/index.js中的deepClone函数。

修改为如下内容,存在该函数做修改,不存在做新增。

// 深拷贝对象
export function deepClone(obj) {
  const _toString = Object.prototype.toString

  // null, undefined, non-object, function
  if (!obj || typeof obj !== 'object') {
    return obj
  }

  // DOM Node
  if (obj.nodeType && 'cloneNode' in obj) {
    return obj.cloneNode(true)
  }

  // Date
  if (_toString.call(obj) === '[object Date]') {
    return new Date(obj.getTime())
  }

  // RegExp
  if (_toString.call(obj) === '[object RegExp]') {
    const flags = []
    if (obj.global) { flags.push('g') }
    if (obj.multiline) { flags.push('m') }
    if (obj.ignoreCase) { flags.push('i') }

    return new RegExp(obj.source, flags.join(''))
  }

  const result = Array.isArray(obj) ? [] : obj.constructor ? new obj.constructor() : {}

  for (const key in obj) {
    result[key] = deepClone(obj[key])
  }

  return result
}

3.4 迁移或替换相关js文件,存在则替换,不存在则新增,将ruoyi-ui/src/utils/generatorruoyi-ui/src/utils文件夹中对应下图红框的js文件移动到自己项目中对应的文件夹中。

3.5 迁移表单设计器相关图标,将ruoyi-ui/src下的icons文件移动到自己项目中的/src文件夹下。​

4. 流程表达式、流程监听器相关内容迁移

4.1 相关页面迁移,将ruoyi-ui/src/views/system下的expression,listener文件夹移动到自己项目中的/src/views/system文件夹下。

4.2 相关js文件迁移,将ruoyi-ui/src/api/system下的expression.js,listener.js文件移动到自己项目中的/src/api/system文件夹下。

5. main.js中引入组件

main.js中结合上图添加如下代码。

import Tinymce from '@/components/tinymce/index.vue'
  
Vue.component('tinymce', Tinymce)

6. package.json中新增依赖

package.json中结合上图添加如下依赖。

"bpmn-js": "^11.1.0",
"diagram-js": "^11.4.1",
"xcrud": "^0.4.19",
"vkbeautify": "^0.99.3",

7. 新增路由配置

ruoyi-ui/src/router/index.js文件中添加路由配置,不同的ruoyi版本路由写法不一致,请参照自己项目路由进行添加。

参考如下:

  {
    path: '/flowable',
    component: Layout,
    hidden: true,
    children: [
      {
        path: 'definition/model/',
        component: () => import('@/views/flowable/definition/model'),
        name: 'Model',
        meta: { title: '流程设计', icon: '' }
      }
    ]
  },
  {
    path: '/flowable',
    component: Layout,
    hidden: true,
    children: [
      {
        path: 'task/finished/detail/index',
        component: () => import('@/views/flowable/task/finished/detail/index'),
        name: 'FinishedRecord',
        meta: { title: '流程详情', icon: '' }
      }
    ]
  },
  {
    path: '/flowable',
    component: Layout,
    hidden: true,
    children: [
      {
        path: 'task/myProcess/detail/index',
        component: () => import('@/views/flowable/task/myProcess/detail/index'),
        name: 'MyProcessRecord',
        meta: { title: '流程详情', icon: '' }
      }
    ]
  },
  {
    path: '/flowable',
    component: Layout,
    hidden: true,
    children: [
      {
        path: 'task/myProcess/send/index',
        component: () => import('@/views/flowable/task/myProcess/send/index'),
        name: 'SendRecord',
        meta: { title: '流程发起', icon: '' }
      }
    ]
  },
  {
    path: '/flowable',
    component: Layout,
    hidden: true,
    children: [
      {
        path: 'task/todo/detail/index',
        component: () => import('@/views/flowable/task/todo/detail/index'),
        name: 'TodoRecord',
        meta: { title: '流程处理', icon: '' }
      }
    ]
  },
  {
    path: '/tool',
    component: Layout,
    hidden: true,
    children: [
      {
        path: 'build/index',
        component: () => import('@/views/tool/build/index'),
        name: 'FormBuild',
        meta: { title: '表单配置', icon: '' }
      }
    ]
  }

8. 启动项目

删除node_modules文件夹,控制台执行npm install下载完毕后启动项目即可。

由于加入了流程校验器,迁移项目后启动错误请执行以下命令

npm install create-bpmnlint-plugin -D

后端迁移流程

1. 在父级pom文件中加入如下依赖

<!-- properties -->
<properties>
  <flowable.version>6.7.2</flowable.version>
</properties>
<!-- dependency -->
<dependency>
  <groupId>com.ruoyi</groupId>
  <artifactId>ruoyi-flowable</artifactId>
  <version>${ruoyi.version}</version>
</dependency>
<dependency>
  <groupId>io.swagger</groupId>
  <artifactId>swagger-annotations</artifactId>
  <version>1.5.21</version>
  <scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter</artifactId>
    <version>${flowable.version}</version>
</dependency>
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-boot-starter</artifactId>
  <version>3.4.0</version>
</dependency>
<!--el表达式计算-->
<dependency>
  <groupId>com.googlecode.aviator</groupId>
  <artifactId>aviator</artifactId>
  <version>5.3.3</version>
</dependency>

<!--modules -->
 <modules>
    <module>ruoyi-flowable</module>
</modules>

2. 把RuoYi-flowable项目中的ruoyi-flowable文件夹整个迁移到自己项目中

3. 在admin项目的pom文件中引入ruoyi-flowable项目

<dependency>
    <groupId>com.ruoyi</groupId>
    <artifactId>ruoyi-flowable</artifactId>
</dependency>

4. 迁移flowable相关类

根据若依项目的版本不同,缺少的实体类,mapper,service也会有所不同,所以需要根据flowable项目中所提示缺少的类进行针对性的拷贝,如果为service接口记得补全对应的controller。

5. 在admin项目的yml配置文件中新增如下配置

application.yml文件中添加如下配置

# flowable相关表
flowable:
  # true 会对数据库中所有表进行更新操作。如果表不存在,则自动创建(建议开发时使用)
  database-schema-update: false
  # 关闭定时任务JOB
  async-executor-activate: false

数据源地址后需要加上nullCatalogMeansCurrent=true,保证自动创建flowable表时不会报错。

6. 迁移数据库表

新建一个库执行tony-flowable.sql文件,flowable项目中少什么表就将对应的表导入到自己的数据库中,mysql数据库版本要用5.7。

7. 数据迁移

sys_menu对应下图红框中的菜单数据加入到自己的表中。

 将sys_dict_type对应下图红框中的字典类型数据添加到自己的表中。

 将sys_dict_data对应下图红框中的字典数据添加到自己的表中。

8. 启动项目

第一次启动时需要把yml配置文件中的database-schema-update设置为true,这样会自动创建flowable中所需要的全部表。

完成上述操作后就可以在自己项目中正常使用了。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL---优化日志

目录 一、MySQL优化 3、mysql server上的优化 3.1、MySQL查询缓存 3.2、索引和数据缓存 3.2、线程缓存 二、MySQL日志 2.1、redo log 重做日志 2.2、undo log 回滚日志 2.3、错误日志 2.4、查询日志 2.5、二进制日志 2.5.1、基于binlog数据恢复实践操作 六、慢查…

苹果删除的照片如何恢复?无法拒绝的3个方法!

热爱摄影的人通常很热爱生活&#xff0c;照片是捕捉事物、人物、风景以及情绪的最佳方式。通过拍照&#xff0c;我们可以留住生活中路过的美好瞬间&#xff0c;所以照片对我们来说是非常有纪念意义的。 但有时候可能会因为误操作而删除了一些非常重要的照片。那么苹果手机删除…

【Python从入门到进阶】36、Selenium 动作交互

接上篇《35、selenium基本语法学习》 上一篇我们介绍了selenium的基本语法&#xff0c;包括元素定位以及访问元素信息的操作。本篇我们来学习selenium操作网页的动作内容。 一、什么是selenium动作操作 动作操作是指使用Selenium调用WebDriver执行与用户交互相关的动作&#…

可视化大屏报表的设计与制作 | 附成果图

大屏可视化报表是一种以大屏幕为展示媒介&#xff0c;通过图形、图表、文字等多种方式将数据信息呈现出来的报表形式。它具有视觉冲击力强、信息量大、交互性高等特点&#xff0c;能够帮助企业快速获取数据背后的价值和洞见&#xff0c;提高决策效率。因此近年来&#xff0c;大…

软件设计模式系列之十一——装饰模式

当谈到设计软件系统时&#xff0c;经常需要考虑如何使系统更加灵活、可扩展和易维护。设计模式是一种被广泛采用的方法&#xff0c;用于解决常见的设计问题&#xff0c;并提供了一套可重用的解决方案。装饰模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&…

iOS应用上线需要注意的问题

将iOS应用上线到App Store需要仔细注意一系列问题&#xff0c;以确保应用的质量、安全性和用户体验。以下是一些在iOS应用上线过程中需要注意的关键问题&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。…

教你快速使用springboot整合图形验证码的两种方式

前言 今天给大家展示的是springboot使用图形验证码的两种方式&#xff0c;第一种基于hutool来实现&#xff0c;第二种方式基于axet实现。现在我们来谈一谈为什么要学习验证码 防止恶意攻击&#xff1a;验证码是一种常用的安全措施&#xff0c;它可以有效地防止恶意攻击&#x…

C++学习笔记——类与对象(六个默认成员函数)

1、构造函数 在一个类中&#xff0c;编译器会自动生成默认的成员函数&#xff0c;当对象进行初始化时&#xff0c;会默认调用这个函数来初始化。 构造函数是一个特殊的成员函数&#xff0c;名字与类名相同,创建类类型对象时由编译器自动调用&#xff0c;以保证 每个数据成员都有…

HTTPS的工作过程

HTTPS就是对HTTP进行了加密&#xff0c;因为要保证数据安全&#xff0c;就需要进行加密&#xff0c;网络中不再直接传输明文了&#xff0c;而是加密之后的密文&#xff0c;加密的方法有很多&#xff0c;但是整体可以分为两大类:对称加密和非对称加密 对称加密 对称加密其实就是…

Vue中的深度监听(Deep Watch):详细解析与实际示例

Vue中的深度监听&#xff08;Deep Watch&#xff09;&#xff1a;详细解析与实际示例 Vue.js 是一款流行的前端 JavaScript 框架&#xff0c;其响应式系统是其核心特性之一。通过响应式系统&#xff0c;Vue允许开发者轻松地监听数据的变化并对其做出响应。在某些情况下&#x…

零基础学前端(七)将项目发布成网站

我们学习了HTML和CSS&#xff0c;已经可以做出精美的静态网页。我们不慌学习JavaScript&#xff0c;因为Javascript的作用是为网页增加动作和数据交换&#xff0c;只能让网页更完美而已&#xff0c;现在网页的基础我们已经可以搭建&#xff0c;我们不妨先将网站发布出去&#x…

uniapp选择地址弹窗组件

1.效果 2.子组件在components里面创建组件AddreessWindow <template><view style"position: relative;z-index: 999999 !important;"><view class"address-window" :class"value true ? on : "><view class"title…

Controller统一异常处理和yaml配置

目录 Controller统一异常处理 url解析 static下静态资源文件的访问 配置类 如何访问static下的资源文件 yaml基础语法 注解赋值 批量注入 单个注入 Controller统一异常处理 Controller统一异常处理ControllerAdvice&#xff1a;统一为Controller进行"增强" …

聊聊Spring中循环依赖与三级缓存

先看几个问题 什么事循环依赖&#xff1f;什么情况下循环依赖可以被处理&#xff1f;spring是如何解决循环依赖的&#xff1f; 什么是循环依赖&#xff1f; 简单理解就是实例 A 依赖实例 B 的同时 B 也依赖了 A Component public class A {// A 中依赖 BAutowiredprivate B b…

【表格插入小计行】el-table表格,数组对象中根据某字段插入小计行计算数据

前言 功能解释&#xff1a;遇到的一个需求&#xff0c;是表格的tabledata数组。里面有科室医生还有很多消费指标等数据。然后需要我排序后把科室放在一起。然后在每个科室下面添加一行数据&#xff0c;是小计行。用于计算上面相同科室的所有数据汇总。然后最下面再来个合计行&…

【深度学习实验】前馈神经网络(四):自定义逻辑回归模型:前向传播、反向传播算法

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 逻辑回归Logistic类 a. 构造函数__init__ b. __call__(self, x)方法 c. 前向传播forward d. 反向传播backward 2. 模型训练 3. 代码整合 一、实验介绍 实现逻…

JavaWeb 学习笔记 5:JSP

JavaWeb 学习笔记 5&#xff1a;JSP 简单的说&#xff0c;JSP 就是 Java Html&#xff0c;JSP 的出现是为了让 Java Web 应用生成动态页面更容易。 1.快速开始 1.1.依赖 添加 JSP 依赖&#xff1a; <dependency><groupId>javax.servlet.jsp</groupId>&…

华为云云耀云服务器L实例评测|使用docker部署禅道系统

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 文章目录 前言准备工作华为云账号注册充值、购买服务器 服务器操作密码修改登录远程工具 禅道部署简介 部署…

【校招VIP】java语言考点之序列化

考点介绍&#xff1a; 将java对象转换为字节序列的过程称为对象的序列化。对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上&#xff0c;通常存放在一个文件中。 2) 在网络上传送对象的字节序列。 java语言考点之序列化-相关题目及解析内容可点击文章末尾链…