目录
介绍
快速了解
环境部署
项目介绍
后台手册
前端手册
功能组件
模板引擎
组件文档
插件集成
基于Spring Boot、Spring Cloud & Alibaba的微服务的权限管理系统。
RuoYi-Cloud 是一个 Java EE 分布式微服务架构平台,基于经典技术组合(Spring Boot、Spring Cloud & Alibaba、Vue、Element),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、代码生成等。在线定时任务配置;支持集群,支持多数据源。
项目简介
RuoYi-Cloud是一款基于Spring Boot、Spring Cloud & Alibaba、Vue、Element的前后端分离微服务极速后台开发框架。
RuoYi-Cloud 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring Cloud & Alibaba、Vue、Element),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、代码生成等。在线定时任务配置;支持集群,支持多数据源。
主要特性
完全响应时布局(支持电脑、平板、手机等所有主流设备)
强大的一键生成功能(包括控制器、模型、视图、菜单等)
支持多数据源,简单配置即可以实现切换。
支持按钮及数据权限,可自定义部门数据权限
对常用的js插件进行二次封装,使js代码变得简介,更加易维护
完善的XSS防范及脚本过滤,彻底杜绝XSS攻击
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
跨站脚本攻击(XSS),是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。
Maven多项目依赖,模块及插件分项目,尽量松耦合,方便模块升级、增减模块
国际化支持,服务端及客户端支持
完善的日志记录体系简单注解即可实现
技术选型
1、系统环境
Java EE 8
Servlet 3.0
Apache Maven 3
2、主框架
Spring Boot 2.3.x
Spring Cloud Hoxton.SR9
Spring Framework 5.2.x
Spring Security 5.2.x
3、持久层
Apache MyBatis 3.5.x
Hibernate Validation 6.0.x
Alibaba Druid 1.2.x
4、视图层
Vue 2.6.x
Axios 0.21.0
Element 2.14.x
内置功能
用户管理
用户是系统操作者,该功能主要完成系统用户配置。
部门管理
配置系统组织机构(公司、部门、小组),树结构展现支持数据权限
岗位管理
配置系统用户所属担任职务
菜单管理
配置系统菜单,操作权限,按钮权限标识等
角色管理
角色菜单权限分配、设置角色按机构进行数据范围权限划分
字典管理
对系统中经常使用的一些较为固定的数据进行维护
参数管理
对系统动态配置常用参数
通知公告
系统通知公告信息发布维护
操作日志
系统正常操作日志记录和查询;系统异常信息日志记录和查询
登录日志
系统登录日志记录查询包含登录异常
在线用户
当前系统中活跃用户状态监控
定时任务
在线(添加、修改、删除)任务调度包含执行结果日志
代码生成
前后端代码的生成(java、html、xml、sql)支持CRUD下载
系统接口
根据业务代码自动生成相关的api接口文档
服务监控
监视的那个钱系统CPU、内存、磁盘、堆栈等相关信息
在线构建器
拖动表单元素生成相应的HTML代码
连接池监视
监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈
准备工作
JDK >= 1.8 (推荐1.8版本)
Mysql >= 5.7.0 (推荐5.7版本)
Redis >= 3.0
Maven >= 3.0
Node >= 10
运行系统
后端运行
前端运行
部署系统
后端部署
前端部署
环境变量
Nginx配置
Tomcat配置
常见问题
如果使用Mac需要修改nacos配置ruoyi-file-dev.yml文件路径path
如果使用Linux 提示表不存在,设置大小写敏感配置在/etc/my.cnf添加lower_case_table_names=1,重启MYSQL服务
如果提示当前权限不足,无法写入文件请检查ruoyi-file-dev.yml中的path路径或logback.xml中的log.path路径是否有可读可写操作权限
文件结构
后端结构
前端结构
核心技术
TIP
前端技术栈
前端技术栈 ES6、vue、vuex、vue-router、vue-cli、axios、element-ui
后端技术栈
Spring Boot、Spring Cloud & Alibaba、Nacos、Sentinel
后端技术
SpringBoot框架
1、介绍
Spring Boot是一款开箱即用框架,提供各种默认配置来简化项目配置。让我们的Spring应用变的更轻量化、更快的入门。 在主程序执行main函数就可以运行。你也可以打包你的应用为jar并通过使用java -jar来运行你的Web应用。它遵循"约定优先于配置"的原则, 使用SpringBoot只需很少的配置,大部分的时候直接使用默认的配置即可。同时可以与Spring Cloud的微服务无缝结合。
2、优点
使编码变得简单: 推荐使用注解。
使配置变得简单: 自动配置、快速集成新技术能力 没有冗余代码生成和XML配置的要求
使部署变得简单: 内嵌Tomcat、Jetty、Undertow等web容器,无需以war包形式部署
使监控变得简单: 提供运行时的应用监控
使集成变得简单: 对主流开发框架的无配置集成。
使开发变得简单: 极大地提高了开发快速构建项目、部署效率。
SpringCloud框架
1、介绍
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发, 如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。 Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来, 通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
2、优点
把模块拆分,使用接口通信,降低模块之间的耦合度。
把项目拆分成若干个子项目,不同的团队负责不同的子项目。
增加功能时只需要再增加一个子项目,调用其他系统的接口就可以。
可以灵活的进行分布式部署。
Spring Security安全控制
1、介绍
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。
2、功能
Authentication 认证,就是用户登录
Authorization 授权,判断用户拥有什么权限,可以访问什么资源
安全防护,跨站脚本攻击,session攻击等
非常容易结合Spring进行使用
3、Spring Security与Shiro的区别
相同点
1、认证功能
2、授权功能
3、加密功能
4、会话管理
5、缓存支持
6、rememberMe功能
不同点
优点:
1、Spring Security基于Spring开发,项目如果使用Spring作为基础,配合Spring Security做权限更加方便。而Shiro需要和Spring进行整合开发
2、Spring Security功能比Shiro更加丰富,例如安全防护方面
3、Spring Security社区资源相对比Shiro更加丰富
缺点:
1)Shiro的配置和使用比较简单,Spring Security上手复杂些
2)Shiro依赖性低,不需要依赖任何框架和容器,可以独立运行。Spring Security依赖Spring容器
前端技术
npm:node.js的包管理工具,用于统一管理我们前端项目中需要用到的包、插件、工具、命令等,便于开发和维护。
ES6:Javascript的新版本,ECMAScript6的简称。利用ES6我们可以简化我们的JS代码,同时利用其提供的强大功能来快速实现JS逻辑。
vue-cli:Vue的脚手架工具,用于自动生成Vue项目的目录及文件。
vue-router: Vue提供的前端路由工具,利用其我们实现页面的路由控制,局部刷新及按需加载,构建单页应用,实现前后端分离。
vuex:Vue提供的状态管理工具,用于统一管理我们项目中各种数据的交互和重用,存储我们需要用到数据对象。
element-ui:基于MVVM框架Vue开源出来的一套前端ui组件。
分页实现
前端调用实现
1、前端定义分页流程
后台逻辑实现
导入导出
注解参数说明
导出实现流程
1、前端调用方法
2、添加导出按钮事件
3、在实体变量上添加@Excel注解
4、在Controller添加导出方法
导入实现流程
自定义标题信息
自定义数据处理器
上传下载
上传实现流程
下载实现流程
权限注解
事务管理
新建的Spring Boot项目中,一般都会引用spring-boot-starter或者spring-boot-starter-web,而这两个起步依赖中都已经包含了对于spring-boot-starter-jdbc或spring-boot-starter-data-jpa的依赖。 当我们使用了这两个依赖的时候,框架会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager。 所以我们不需要任何额外配置就可以用@Transactional注解进行事务的使用。
@Transactional注解只能应用到public可见度的方法上,可以被应用于接口定义和接口方法,方法会覆盖类上面声明的事务。
例如用户新增需要插入用户表、用户与岗位关联表、用户与角色关联表,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作, 这样可以防止出现脏数据,就可以使用事务让它实现回退。
做法非常简单,我们只需要在方法或类添加@Transactional注解即可。
常见坑点1:遇到检查异常时,事务开启,也无法回滚。 例如下面这段代码,用户依旧增加成功,并没有因为后面遇到检查异常而回滚!!
原因分析:因为Spring的默认的事务规则是遇到运行异常(RuntimeException)和程序错误(Error)才会回滚。如果想针对检查异常进行事务回滚,可以在@Transactional注解里使用 rollbackFor属性明确指定异常。
常见坑点2: 在业务层捕捉异常后,发现事务不生效。 这是许多新手都会犯的一个错误,在业务层手工捕捉并处理了异常,你都把异常“吃”掉了,Spring自然不知道这里有错,更不会主动去回滚数据。
推荐做法:在业务层统一抛出异常,然后在控制层统一处理。
注解的常用属性
propagation
事物的传播行为,默认值为REQUIRED
isolation
事务的隔离度,默认采用DEFAULT
timeout
事务的超时时间,默认值为-1,不超时。如果设置了超时时间(单位秒),name如果超过该时间限制了但事务还没有完成,则自动回滚事务
read-only
指定事务是否为只读事务,默认值为false;为了忽略那些不需要事务的方法,比如读取数据,可以设置read-only为true
rollbackFor
用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。(xxx1.class,xxx2.class,......)
noRollbackerFor
抛出no-rollback-for指定的异常类型,不回滚事务。{xxx1.class,xxx2.class,......}
事务的传播机制
事务的传播机制是指如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。即:在执行一个@Transcation注解标注的方法时,开启了事务;当该方法还在执行中时,另一个人也触发了该方法;name此时怎么算事务呢,这时就可以通过事务的传播机制来指定处理方式
TransactionDefinition传播行为的常量
TransactionDefinition.PROPAGATION_REQUIED
如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这时默认值
TransactionDefinition.PROPAGATION_REQUIRES_NEW
创建一个新的事务,如果当前存在事务,则把当前事务挂起
TransactionDefinition.PROPAGATION_SUPPORTS
如果的那个钱存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行
TransactionDefinition.PROPAGATION_NOT_SUPPORTS
以非事务方式运行,如果当前存在事务,则把当前事务挂起
TransactionDefinition.PROPAGATION_NEVER
以非事务方式运行,如果当前存在事务,则抛出异常
TransactionDefinition.PROPRAGATION_MANDATORY
如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常
TransactionDefinition.PROPAGATION_NESTED
如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIED
异常处理
通常一个web框架中,有大量需要处理的异常。比如业务异常等。权限不足等等。前端通过弹出信息的方式告诉用户出了什么错误。通常情况下我们用try...catch...对异常进行捕捉处理,但是在实际项目中对义务模块进行异常捕捉,会造成代码重复和繁杂,我们希望代码中只有业务相关的操作,所以有的异常我们单独设立一个类来处理它。全局异常就是对框架所有异常进行统一管理。我们在可能发生异常的方法里throw抛给控制器。然后由全局异常处理器对异常进行统一处理。因此,我们的controller中的方法就可以很简洁了。
所谓的全局异常处理器就是使用@ControllerAdvice注解
1、统一返回实体定义
2、定义登录异常定义
3、基于@ControllerAdvice注解的Controller层的全局异常统一处理
4、测试访问请求
无法捕获异常?可以从以下几个方面着手检查
异常是否已被处理,即抛出异常后被catch,打印了日志或抛出了其它异常,异常是否非controller抛出,即在拦截器或过滤器中出现的异常
参数验证
注解参数说明
@Null
检查该字段为空
@NotNull
不能为null
@NotBlank
不能为空,常用于检查空字符串
@NotEmpty
不能为空,多用于检测list是否size是0
@Max
该字段的值只能小于或等于该值
@Min
该字段的值只能大于或等于该值
@Past
检查字段的日期是在过去
@Future
检查该字段的日期是否属于将来的日期
检查是否是一个有效的email地址
@Pattern(regex=,flag=)
被注释的元素必须符合指定的正则表达式
@Range(min=,max=,message=)
被注释的元素必须在合适的范围内
@Size(min=,max=)
检查该字段的size是否在min和max之间,是否是字符串、数组、集合、Map等
@Length(min=,max=)
检查所属的字段的长度是否在min和max之间,只能用于字符串
@AssertTrue
用于boolean字段,该字段只能为true
@AssertFalse
该字段的值只能为false
数据校验使用
1、基础使用,因为soringboot已经引入了基础包,所以直接使用就可以了,首先再controller上声明@Validated需要对数据进行校验
2、然后在对应字段Get方法上加上参数校验注解,如果不符合验证要求,则会以message的信息为准,返回给前端
系统日志
在实际开发中,对于某些关键业务,我们通常需要记录该操作的内容,一个操作调用一次记录方法,每次还得去收集参数等等,会造成大量代码重复。我们希望代码中只有业务相关的操作,在项目中使用注解来完成此项功能
在需要被记录日志的controller方法上添加@Log注解
注解参数说明
title
参数
title
类型
String
默认值
空
描述
操作模块
businessType
参数
businessType
类型
BusinessType
默认值
OTHER
描述
操作功能(OTHER其他、INSERT新增、UPDATE修改、DELETE删除、GRANT授权、EXPORT导出、IMPORT导入、FORCE强退、GENCOD生成代码、CLEAN清空数据)
参数operatorType
参数
operatorType
类型
OperatorType
默认值
MANAGE
描述
操作人类别(OTHER其他、MANAGE后台用户、MOBILE手机端用户)
isSaveRequestData
参数
isSaveRequestData
类型
boolean
默认值
true
描述
是否保存请求的参数
参数
参数
isSaveResponseData
类型
boolean
默认值
true
描述
是否保存响应的参数
自定义操作功能
1、在BusinessType中新增业务操作类型
2、在sys_dict_data字典数据表中初始化操作业务类型
3、在controller中使用注解
登录日志记录逻辑实现代码LogAspect.java
登录系统(系统管理-操作日志)
可以查询操作日志列表和详细信息
数据权限
在实际开发中,需要设置用户只能看哪些部门的数据,这种情况一般称为数据权限。
默认系统管理员admin拥有所有数据权限(userId=1),默认角色拥有所有数据权限(如不需要数据权限不用设置数据权限操作)
注解参数说明
deptAlias
参数
deptAlias
类型
String
默认值
空
描述
部门表的别名
userAlias
参数
userAlias
类型
String
默认值
空
描述
用户表的别名
数据权限使用
1、在(系统管理-角色管理)设置需要数据权限的角色目前支持一下几种权限
全部数据权限
自动数据权限
部门数据权限
部门及以下数据权限
仅本人数据权限
2、在需要数据权限控制方法上添加@DataScope注解,其中d和u用来表示表的别名
3、在mybatis查询底部标签添加数据范围过滤
仅实体继承BaseEntity才会进行处理,SQL语句会存放到BaseEntity对象中的params属性中,然后在xml中通过${params.dataScope}获取拼接后的语句
多数据源
在实际开发中,经常可能遇到在一个应用中可能需要访问多个数据库的情况,在项目中使用注解来完成此项功能。在需要被切换数据源的service或mapper方法上添加@DataSource注解
注解参数说明
value
参数
value
类型
DataSourceType
默认值
DataSourceType.MASTER
描述
主库
多数据源使用
1、在application-druid.yml配置从库数据源
2、在DataSourceType类添加数据源枚举
3、在DruidConfig配置读取数据源
4、在DruidConfig类DataSource方法添加数据源
5、在需要使用多数据源方法或类上添加@DataSource注解,其中value用来表示数据源
手动切换数据源
在需要切换数据源的方法中使用DynamicDataSourceContextHolder实现手动切换
代码生成
大部分项目里其实有很多代码都是重复的,几乎每个基础模块的代码都有增删改查的功能,而这些功能都是大同小异,如果这些功能都要自己去写,将会大大浪费我们的精力降低效率。所以这种重复性的代码可以使用代码生成
默认配置
单应用在resource目录下的application.yml,多模块rouyi-generator中的resouces目录下的generator.yml,可以自己根据实际情况调整默认配置
单表结构
新建数据库表结构(单表)
树标结构
新建数据库表结构(树表)
主子表结构
新建数据库表结构(主子表)
代码生成使用
1、登录系统(系统工具->代码生成->导入对应表)
2、代码生成系列中找到需要表(可预览、编辑、同步、删除生成配置)
3、点击生成代码会得到一个揉一.zip执行sql文件,按照包内目录结构复制到自己的项目中即可
代码生成支持编辑、预览、同步
预览:对生成代码提前预览,防止出现一些不符合预期的情况
同步:对原表的子弹进行同步,包括新增、删除、修改的字段处理
修改:对生成的代码基本信息、字段信息、生成信息做一系列的调整
另外多模块所有代码生成的相关业务逻辑diamante在ruoyi-generator模块,不需要再自行删除模块
定时任务
在实际项目开发中web应用有一类不可缺少的,那就是定时任务。定时任务的场景可以说是非常广泛,比如某些视屏网站,购买会员后,每天会给会员送成长值,每月会给会员送一些电影券;比如在保证最终一致性的场景中,往往利用定时任务调度进行一些对比工作;比如一些定时需要生成的报表、右键;比如一些㤇定时清理数据的任务等。所以我们提供方便有好的web界面,实现动态管理任务,可以达到动态控制定时任务启动、暂停、重启、删除、添加、修改等操作,极大地方便了开发过程
1、后台添加定时任务出处理类(支持Bean调用、Class类调用)
Bean调用示例:需要添加对应Bean注解@Component或@Service。调用目标字符串ryTask.ryParams('ry'),Class类调用示例:添加类和方法指定包即可。调用目标字符串:com.ruoyi.quartz.task.RyTask.ryParams('ry')
2、前端新建定时任务信息(系统监控->定时任务)
任务名称:
自定义,如:定时查询任务状态
任务分组:
根据字典sys_job_group配置
调用牧宝字符串:
设置后台任务方法名称参数
执行表达式:
可查询官方cron表达式介绍
执行策略:
定时任务自定义执行策略
并发执行:
是否需要多个任务同间时执行
状态:
是否启动定时任务
备注:
定时任务描述信息
3、点击执行测试,测试定时任务是否正常及调度日志是否正确,如正常执行表示任务配置成功
执行策略详解:
立即执行(所有misfire的任务会马上执行)打个比方,如果9点misfire了,在10:15系统恢复之后,9点,10点的misfire会马上执行
执行一次(会合并部分的misfire,正常执行下一个周期的任务)假设9,10的任务都misfire了,系统在10:15分起来了。只会执行一次misfire,下次正点执行。
放弃执行(所有的misfire不管,执行下一个周期的任务)
方法参数详解
字符串(需要单引号''标识 如:ryTask.ryParams(’ry’))
布尔类型(需要true false标识 如:ryTask.ryParams(true))
长整型(需要L标识 如:ryTask.ryParams(2000L))
浮点型(需要D标识 如:ryTask.ryParams(316.50D))
整型(纯数字即可)
cron表达式语法:
[秒] [分] [小时] [日] [月] [周] [年]
秒
说明
秒
必填
是
允许填写的值
0-59
允许的通配符
,-*/
分
说明
分
必填
是
允许填写的值
0-59
允许的通配符
,-*/
时
说明
时
必填
是
允许填写的值
0-23
允许的通配符
,-*/
日
说明
日
必填
是
允许填写的值
1-31
允许的通配符
,-*/
月
说明
月
必填
是
允许填写的值
1-12/JAN-DEC
允许的通配符
, - * ? / L W
周
说明
周
必填
是
允许填写的值
1-7 or SUN-SAT
允许的通配符
, - * ? / L #
年
说明
年
必填
是
允许填写的值
1970-2099
允许的通配符
,-*/
通配符说明:
表示所有值。 例如:在分的字段上设置 *,表示每一分钟都会触发
? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为”?” 具体设置为 0 0 0 10 * ?
表示区间。例如 在小时上设置 “10-12”,表示 10,11,12点都会触发
, 表示指定多个值,例如在周字段上设置 “MON,WED,FRI” 表示周一,周三和周五触发
/ 用于递增触发。如在秒上面设置”5/15” 表示从5秒开始,每增15秒触发(5,20,35,50)。 在月字段上设置’1/3’所示每月1号开始,每隔三天触发一次
L 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于”7”或”SAT”。如果在”L”前加上数字,则表示该数据的最后一个。例如在周字段上设置”6L”这样的格式,则表示“本月最后一个星期五”
W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上置”15W”,表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 “1W”,它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,”W”前只能设置具体的数字,不允许区间”-“)
常用表达式例子:
0 0 2 1 * ? *
表示在每月的1日的凌晨2点调整任务
0 15 10 ? * MON-FRI
表示周一到周五每天上午10:15执行作业
0 15 10 ? 6L 2002-2006
表示2002-2006年的每个月的最后一个星期五上午10:15执行作
0 0 10,14,16 * * ?
每天上午10点,下午2点,4点
0 0/30 9-17 * * ?
朝九晚五工作时间内每半小时
0 0 12 ? * WED
表示每个星期三中午12点
0 0 12 * * ?
每天中午12点触发
0 15 10 ? * *
每天上午10:15触发
0 15 10 * * ?
每天上午10:15触发
0 15 10 * * ? *
每天上午10:15触发
0 15 10 * * ? 2005
2005年的每天上午10:15触发
0 * 14 * * ?
在每天下午2点到下午2:59期间的每1分钟触发
0 0/5 14 * * ?
在每天下午2点到下午2:55期间的每5分钟触发
0 0/5 14,18 * * ?
在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
0 0-5 14 * * ?
在每天下午2点到下午2:05期间的每1分钟触发
0 10,44 14 ? 3 WED
每年三月的星期三的下午2:10和2:44触发
0 15 10 ? * MON-FRI
周一至周五的上午10:15触发
0 15 10 15 * ?
每月15日上午10:15触发
0 15 10 L * ?
每月最后一日的上午10:15触发
0 15 10 ? * 6L
每月的最后一个星期五上午10:15触发
0 15 10 ? * 6L 2002-2005
2002年至2005年的每月的最后一个星期五上午10:15触发
0 15 10 ? * 6#3
每月的第三个星期五上午10:15触发
多模块所有定时任务的相关业务逻辑代码在ruoyi-quartz模块,可以自行调整或剔除
系统接口
在现在的开发过程中还有很大一部分公司都以口口相传的方式来进行前后端的联调,而接口文档很大一部分都只停留在了说说而已的地步,或者写了代码再写文档。还有一点就是文档的修改,定义好的接口并不是一程不变的,可能在开发过程中文档修改不止一次的变化,这个时候就会很难受了。只要不是强制性要求,没人会愿意写这东西,而且在写的过程中,一个字母的错误就会导致联调时候的很大麻烦,但是通过Swagger,我们可以省略了这一步,而且文档出错率近乎于零,只要你在写代码的时候稍加几个注释,文档自动生成
1、在控制层Controller中添加注解来描述接口信息
2、在方法中配置接口的标题信息
3、在系统工具-系统接口测试相关接口
API详细说明
@Api
作用范围
协议集描述
使用位置
用于controller类上
@ApiModelProperty
作用范围
对象属性
使用位置
用在出入参数对象的字段上
@ApiOperation
作用范围
协议描述
使用位置
用在controller的方法上
@ApiResponses
作用范围
Response集
使用位置
用在controller的方法上
@ApiResponse
作用范围
Response
使用位置
用在@ApiResponses里边
@ApiImplicitParams
作用范围
非对象参数集
使用位置
用在controller的方法上
@ApiImplicitParam
作用范围
非对象参数描述
使用位置
用在@ApilmplicitParams的方法里边
@ApiModel
作用范围
描述返回对象的意义
使用位置
用在返回对象类上
api标记,用在类上,说明该类的作用。可以标记一个Controller类做为Swagger文档资源
与Controller注解并列使用。 属性配置:
values
属性名称
values
备注
url的路径值
tags
属性名称
tags
备注
如果设置这个值、value的值会被覆盖
description
属性名称
description
备注
对api资源的描述
basePath
属性名称
basePath
备注
基本路径可以不配置
position
属性名称
position
备注
如果配置多个Api想改变显示的顺序位置
produces
属性名称
produces
备注
For example, "application/json, application/xml"
consumes
属性名称
consumes
备注
For example, "application/json, application/xml"
protocols
属性名称
protocols
备注
Possible values: http, https, ws, wss.
authrizations
属性名称
authrizations
备注
高级特性认证时配置
hidden
属性名称
hidden
备注
配置为true 将在文档中隐藏
ApiOperation标记,用在方法上,说明方法的作用,每一个url资源的定义
与Controller中的方法并列使用,属性配置:
value
属性名称
value
备注
url的路径值
tags
属性名称
tags
备注
如果设置这个值、value的值会被覆盖
description
属性名称
description
备注
对api资源的描述
basePath
属性名称
basePath
备注
基本路径可以不配置
position
属性名称
position
备注
如果配置多个Api想改变现实的顺序位置
produces
属性名称
produces
备注
For example, "application/json, application/xml"
consumes
属性名称
consumes
备注
For example, "application/json, application/xml"
protocols
属性名称
protocols
备注
Possible values: http, https, ws, wss.
authorizations
属性名称
authorizations
备注
高级特性认证时配置
hidden
属性名称
hidden
备注
配置为true将在文档中隐藏
response
属性名称
response
备注
返回的对象
responseContainer
属性名称
responseContainer
备注
这些对象是有效的 "List", "Set" or "Map".,其他无效
httpMethod
属性名称
httpMethod
备注
"GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS" and "PATCH"
code
属性名称
code
备注
http的状态码 默认 200
extensions
属性名称
子主题 1
extensions
备注
扩展属性
ApiParam标记,请求属性
与Controller中的方法并列使用,属性配置:
name
属性名称
name
备注
属性名称
value
属性名称
value
备注
属性值
defaultValue
属性名称
defaultValue
备注
默认属性值
allowableValues
属性名称
allowableValues
备注
可以不配置
required
属性名称
required
备注
是否属性必填
access
属性名称
access
备注
不过多描述
allowMultiple
属性名称
allowMultiple
备注
默认为false
hidden
属性名称
hidden
备注
隐藏该属性
example
属性名称
example
备注
举例子
ApiResponse标记,响应配置,使用方式:
@ApiResponse(code = 400, message = "查询用户失败")
与Controller中的方法并列使用,属性配置:
code
属性名称
code
备注
http的状态码
message
属性名称
message
备注
描述
response
属性名称
response
备注
默认响应类void
codereference
属性名称
reference
备注
参考ApiOperation中的配置
responseHeaders
属性名称
responseHeaders
备注
参考ResponseHeader属性配置说明
responseContainer
属性名称
responseContainer
备注
参考ApiOpearation中的配置
ApiResponses标记,响应集配置,使用方式:
@ApiResponses({ @ApiResponse(code = 400, message = "无效的用户") })
与Controller中的方法并列使用,属性配置:
value
属性名称
value
备注
多个ApiResponse配置
ResponseHeader标记,响应头设置,使用方法
@ResponseHeader(name="head",description="响应头设计")
与Controller中的方法并列使用,属性配置:
name
属性名称
name
备注
响应头名称
description
属性名称
description
备注
描述
response
属性名称
response
备注
默认响应类 void
responseContainer
属性名称
responseContainer
备注
参考ApiOperation中配置
防重复提交
在接口方法上添加@RepeatSubmit注解即可,注解参数说明:
interval
参数
interval
类型
int
默认值
5000
描述
间隔时间(ms),小于此时间视为重复提交
message
参数
message
类型
String
默认值
不允许徐重复提交,请稍后再试
描述
提示信息
国际化支持
在我们开发web项目的时候,项目可能涉及到国外部署或者应用,也有可能会有国外的用户对项目进行范围跟,name在这种项目中,为客户展现的页面或者操作的信息就需要使用不同的语言,这就是我们所说的项目国际化。
后台国际化流程
1、修改I18nConfig设置默认语言,如默认中文:
2、修改配置application.yml中的basename国际化文件,默认是i18n路径下messages文件 (比如现在国际化文件是xx_zh_CN.properties、xx_en_US.properties,那么basename配置应为是i18n/xx
3、i18n目录文件下定义资源文件 美式英语 messages_en_US.properties
4、java代码使用MessageUtils获取国际化
前端国际化流程
1、html使用国际化#{资源文件key}
2、js使用国际化 首先在文件引入jquery-i18n-properties依赖,然后在初始化后即可通过JS函数获取对应国际化文件的内容。
3、界面定义切换语言
新建子模块
Maven多模块下新建子模块流程案例。
1、新建业务模块目录,例如:ruoyi-test。
2、在ruoyi-test业务模块下新建pom.xml文件以及src\main\java,src\main\resources目录。
3、根目录pom.xml依赖声明节点dependencies中添加依赖
4、根目录pom.xml模块节点modules添加业务模块
5、ruoyi-admin目录pom.xml添加模块依赖
6、测试模块在ruoyi-test业务模块添加com.ruoyi.test包,新建TestService.java
在ruoyi-admin新建测试类,调用helloTest成功返回hello代表成功。
前端组件
通用方法
表格方法
表单方法
弹层方法
操作方法
通用方法
表格使用
表的各项
列的各项
使用方法
弹层使用
权限使用
字典使用
参数使用
表单校验
默认校验规则
自定义校验规则
使用tooltip提示错误信息
弹窗功能
弹框的功能不管是在传统开发中还是如今比较流行的前后端分离开发中都是比较常见的功能,如:添加、编辑、确认框提示等等(当前页可以直接打开新页面), 为了解决这个问题,我们封装了弹框组件,根据使用场景的不同,框架做了继承开发,调用时只需要传入相应的参数即可。
参数说明:
title 弹窗标题,这个标题是在弹框的左上角显示的标题文字
url URL地址,这个是弹框调用的方法地址,比如添加、编辑时需要调用页面表单地址的方法
width 弹窗宽度,一个数值(不传时默认弹窗自适应显示)
height 弹窗高度,一个数值(不传时默认弹窗自适应显示)
callback 回调函数,弹窗成功弹出之后会默认进行回调
新增功能
新增方法我们写一个共用的方法add,下面我们详细的描述下,新增时是如何弹出窗体的。
参数说明:
id 需要传入到后台的唯一标识
总结:add方法里面进行了判断存在ID则进行内容替换,然后进行调用弹窗操作。
操作table.options.createUrl地址,弹窗table.options.modalName标题
修改功能
修改方法我们写一个共用的方法edit,下面我们详细的描述下,修改时是如何弹出窗体的。
参数说明
id 需要传入到后台的唯一标识 总结:edit方法里面进行了判断存在ID则进行内容替换,然后进行调用弹窗操作。 优先级:传参ID值 -> 选择uniqueId列值 -> 选择首列值 操作table.options.updateUrl地址,table.options.uniqueId唯一的标识符,弹窗table.options.modalName标题
删除功能
删除功能我们并不陌生,在大多数的数据列表中,都会有删除按钮的出现,顾名思义就是在有权限的前提下我们可以删除这条数据,点击删除会弹出删除确认框, 确定删除后才会发起网络请求,具体JS实现方法如下:
参数说明:
id 需要传入到后台的唯一标识
总结:remove方法里面进行了判断存在ID则进行内容替换,同时弹出确认提醒。
操作table.options.removeUrl地址,弹窗table.options.modalName标题
批量删除
批量操作就是可以选择多条记录数据进行批量处理的方法,在我们使用中批量删除算是最常用的了,删除多条数据时一条条删除非常耗时,那么批量删除可以很好的帮我解决此问题。
总结:removeAll方法里面默认会找到选择的第一列,其他情况可以设置指定列uniqueId即可。
操作table.options.removeUrl地址,弹窗table.options.modalName标题
调用方式:
$.operate.removeAll()
查看详情
查看记录数据的详情在我们项目研发中也是非常多见的,因此基于使用频率,我们也内置集成了查看详情的功能。
参数说明:
id 需要传入到后台的唯一标识
width 弹窗宽度,一个数值(不传时默认弹窗自适应显示)
height 弹窗高度,一个数值(不传时默认弹窗自适应显示)
总结:detail方法里面进行了判断存在ID则进行内容替换,同时可以传入指定宽度高度。操作table.options.detailUrl地址,弹窗table.options.modalName标题
搜索功能
对于大量的数据列表而言,我们常常需要根据条件获得我们所需要的数据源,这是条件搜索就可以帮助我们实现,正如很多模块我们所看到的那样在数据列表上方有很多的条件筛选框, 这是我们可以选择我们所需要查询的条件,然后去定向搜索,鉴于此框架也做了常规的集成。
参数说明:
formId 查询表单ID
tableId 查询表格ID
总结:默认查询第一个表单form以及表格table.options.id,search方法里面也进行了判断formId,tableId可以传入指定表单ID,表格ID查询。
导入功能
对于数据量大,导入可以大大提高使用者的使用效率,鉴于此框架也做了常规的集成。
参数说明:
formId 显示指定表单ID元素内容
width 弹窗宽度,一个数值(不传时默认弹窗400显示)
height 弹窗高度,一个数值(不传时默认弹窗230显示)
总结:importExcel方法里面进行了判断不存在formId参数则使用默认的importTpl,同时在回调函数实现了文件上传的ajax请求。
操作table.options.importUrl地址,弹窗table.options.modalName标题
下载模板
对于一些情况在导入前需要下载自定义模块的情况,也做了常规的集成。
总结:importTemplate会直接请求后端接口,生成模块成功后进行下载操作。
操作table.options.importTemplateUrl地址。
导出功能
项目中经常需要使用导入导出功能来加快数据的操作,框架实现的方式是先读取数据后上传到本地,等文件生成后,将文件传送到存储在本地磁盘(也可以改成CDN)进行存储,然后返回上传后的存储地址。 前端需要调用下载请求后再进行处理。对于高耗时的下载请求时,会有一定的优化。
参数说明:
formId 显示指定表单ID元素内容
总结:exportExcel默认导出参数为第一个表单form,同时也可以传入指定formId。
操作table.options.exportUrl地址,弹窗table.options.modalName标题
提交功能
提交功能我们并不陌生,在新增和修改页面中,都会有提交按钮的出现,顾名思义就是提交这条数据到后台处理。
参数说明:
url 提交的后台地址
data 提交到后台的数据
callback 回调函数,提交成功之后会默认进行回调
Thymeleaf
springboot中推荐使用thymeleaf作为模板引擎,因为thymeleaf提供了完美的springmvc支持,它是一个跟velocity、freemarker类似的模板引擎,他可以完全替代jsp。相较与其他的模板引擎,他有如下三个极吸引人的特点
Thymeleaf在有无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序猿在服务器查看带数据的动态页面效果。这是由于它支持html原型,然后再html标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释html时会忽略未定义的标签属性,所以thymeleaf的模板可以静态地运行;当有数据返回到页面时,Thymeleaf标签会动态的替换掉静态内容,使页面动态显示
Thymeleaf开箱即用的特性。它提供标准和spring标准两种方言,可以直接套用模板实现jstl、ognl表达式效果,避免每天套用模板、该jstl、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言。
Thymeleaf提供spring标准方言和一个与springMVC完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能
对象使用
文本国际化获取
获取变量方式
处理转义文本
链接表达式
数字对象
Thymeleaf主要使用org.thymeleaf.expression.Numbers这个类来处理数字,在模板中使用#numbers来表示这个对象。
字符串对象
Thymeleaf主要使用org.thymeleaf.expression.Strings这个类来处理数字,在模板中使用#strings来表示这个对象。
日期对象
Thymeleaf主要使用org.thymeleaf.expression.Dates这个类来处理日期,在模板中使用#dates来表示这个对象。
数组与集合对象
常用语法
运算符
表达式常量
字符串拼接
算数运算符
关系运算符
三目运算符
属性设置
条件判断
数据迭代
list数据迭代
map数据迭代
数据状态对象(自定义状态对象)
数据状态对象(默认规则 节点变量名+Stat)
星号表达式
模板片段
定义与引用模板片段
选择器的基础语法
含有变量的片段引用
删除模板
1、普通方法
2、remove删除方法(all删除包含标签和所有的子节点)
3、remove删除方法(body不包含标记删除,但删除其所有的子节点)
4、remove删除方法(tag包含标记的删除,但不删除它的子节点)
5、all-but-first(删除所有包含标签的孩子,除了第一个)
6、none(什么也不做)
模板注释
1、注释可见
2、注释不可见
内联语法
使用内联语法显示文本
在JavaScript中使用内联语法
在css中使用内联语法
内联语法注释
内联语法序列化
调用后台
html方式调用后台
JavaScript方式调用后台
注意script需要添加th:inline="javascript"
自定义标签
在使用Thymeleaf模板引擎开发页面时,我们可以自定义一些通用的标签,来简化开发、降低代码量,下面我以开发中常见的下拉选为例,使用Thymeleaf自定义一个下拉选择字典数据的公共组件。
1、创建自定义标签构建类
2、创建自定义标签注册类
3、模板引擎加入配置
4、使用自定义标签,其中sys_normal_disable为字典的类型。
自定义内置对象
Thymeleaf中提供了一些内置对象,并且在这些对象中提供了一些方法,方便我们来调用。获取这些对象,需要使用#对象名来引用。我们也可以自定义内置对象,下面使用Thymeleaf自定义时间工具内置对象。
1、实现IExpressionObjectFactory接口
2、定义内置对象的表达式方言
3、内置对象添加到模板引擎配置
4、使用自定义内置对象调用方法,其中dateUtils为DateUtils.java类。
bootstrap-datetimepicker
基于bootstrap的一款时间插件bootstrap-datetimepicker (opens new window),已经做了汉化处理。
laydate
基于layui的一款时间插件laydate
layer
layer (opens new window)是一款web弹层组
bootstrap-select
基于bootstrap的一款下拉框插件bootstrap-select
select2
基于jquery的一款下拉框插件select2
icheck
基于jquery的一款表单复选框、单选框美化插件icheck (opens new window),要重新定义触发事件
jasny-bootstrap
基于bootstrap的功能扩展插件(含文件上传)jasny
bootstrap-fileinput
基于bootstrap的文件上传插件bootstrap-fileinput
bootstrap-duallistbox
基于bootstrap的双重列表框插件bootstrap-duallistbox
jquery-validate
基于jquery的一款表单验证插件jquery-validate
jquery-validate插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求。 该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件验证,同时提供了一个用来编写用户自定义方法的 API。
bootstrap-suggest
基于bootstrap的按钮式下拉菜单组件的搜索建议插件bootstrap-suggest
bootstrap-typeahead
基于bootstrap的一款搜索自动补全插件bootstrap-typeahead
jquery-cxselect
基于jquery的一款联动下拉菜单插件jquery-cxselect
summernote
summernote (opens new window)是一款富文本编辑器
自定义样式,您可以使用styleTags选项设置自己的样式选择。
自定义fontNames,您可以使用fontNames选项定义字体。
自定义字体大小单位,您可以使用fontSizeUnits选项设置可用的字体大小单位。
自定义自定义行高,您可以覆盖默认列表并指定一个自定义列表。
自定义占位符,您可以定义占位符placeholder选择。
禁用拖拽,你可以禁用拖拽disableDragAndDrop选择。
禁用快捷键,你可以禁用自定义快捷键shortcuts选择
禁用TAB,您可以使用tabDisable选项禁用
对CodeView的XSS保护 Summernote为CodeView提供了XSS保护。它由iframe的过滤标签和白名单组成。白名单过滤器默认情况下处于启用状态,但过滤标签未启用
集成redis实现集群会话
1、由于切换成redis,可以删除一些处理类(不在同步到数据库表)和ehcache相关内容。
2、ruoyi-common\pom.xml模块添加整合依赖
3、ruoyi-admin文件application-druid.yml,添加redis配置
4、下载插件相关包和代码实现覆盖到工程中
5、测试验证会话集群,在线用户,缓存监控等功能是否正常。
集成jwt实现登录授权访问
jwt适用于前后端分离,但是不分离版本对外提供接口有时候也需要。不少小伙伴有提过要求,最近抽空整合了一下方案,参考步骤如下。
1、ruoyi-framework\pom.xml添加jwt依赖
2、下载插件相关包和代码实现覆盖到工程中
3、添加测试接口类
4、测试权限登录访问请求
登录访问(返回token) POST / http://localhost:80/jwt/login?username=ry&password=admin123
测试任意权限(header携带token) GET / http://localhost:80/api/list
测试菜单权限(header携带token) GET / http://localhost:80/api/user/list
测试角色权限(header携带token) GET / http://localhost:80/api/role/list
集成cas实现单点登录认证
单点登录(Single Sign On),简称为SSO,是比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
1、下载cas-overlay-template搭建cas服务器
下载项目GitHub - apereo/cas-overlay-template: Apereo CAS WAR Overlay template
此时将会在bulid目录下生成一个cas-resources文件夹,我们把里面的文件全部拷贝到cas-overlay-template/src/main/resources,将/etc/cas/thekeystore也拷贝到该目录下修改配置application.properties
为了方便测试直接屏蔽了ssl,端口改成了8080
在内嵌的Tomcat中运行cas
启动完成后浏览器中打开(http://localhost:8080/cas/login (opens new window))就可以访问了。
在登录也面输入用户名和密码:casuser/Mellon,出现界面表明cas已经部署成功。
2、cas服务端整合Mysql数据库,添加service-registry依赖
修改build.gradle文件,加入mysql驱动配置
修改resources/application.properties文件,加入数据库连接配置
3、设置允许http访问
修改resources/application.properties开启识别json
修改services/HTTPSandIMAPS-10000001.json,加入http
4、ruoyi-framework\pom.xml添加pac4j依赖
5、下载插件相关包和代码实现覆盖到工程中
6、测试单点登录访问请求,是否正常登陆以及退出,同时能访问多个不同系统。
集成docker实现一键部署
Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,最终只需要一个命令即可打包发布应用到任意平台中。
1、安装docker
2、检查docker和docker-compose是否安装成功
3、文件授权
4、下载若依docker插件,上传到自己的服务器目录
中db目录存放ruoyi数据库脚本
其中jar目录存放打包好的jar应用文件
数据库mysql地址需要修改成ruoyi-mysql
数据库脚本头部需要添加SET NAMES 'utf8';(防止乱码)
5、启动docker
6、构建docker服务
7、启动docker容器
8、访问应用地址
集成websocket实现实时通信
WebSocket是一种通信协议,可在单个TCP连接上进行全双工通信。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,并进行双向数据传输。
1、ruoyi-framework/pom.xml文件添加websocket依赖。
2、配置匿名访问(可选)
3、下载插件相关包和代码实现覆盖到工程中
4、测试验证
如果要测试验证可以把websocket.html内容复制到login.html,点击连接发送消息测试返回结果
集成atomikos实现分布式事务
在一些复杂的应用开发中,一个应用可能会涉及到连接多个数据源,所谓多数据源这里就定义为至少连接两个及以上的数据库了。 对于这种多数据的应用中,数据源就是一种典型的分布式场景,因此系统在多个数据源间的数据操作必须做好事务控制。在SpringBoot的官网推荐我们使用Atomikos (opens new window)。 当然分布式事务的作用并不仅仅应用于多数据源。例如:在做数据插入的时候往一个kafka消息队列写消息,如果信息很重要同样需要保证分布式数据的一致性。
若依框架已经通过Druid实现了多数据源切换,但是Spring开启事务后会维护一个ConnectionHolder,保证在整个事务下,都是用同一个数据库连接。所以我们需要Atomikos解决多数据源事务的一致性问题
1、ruoyi-framework/pom.xml文件添加atomikos依赖。
2、下载插件相关包和代码实现覆盖到工程中
3、测试验证
加入多数据源,如果不会使用可以参考多数据源实现。
使用undertow来替代tomcat容器
SpingBoot中我们既可以使用Tomcat作为Http服务,也可以用Undertow来代替。Undertow在高并发业务场景中,性能优于Tomcat。所以,如果我们的系统是高并发请求,不妨使用一下Undertow,你会发现你的系统性能会得到很大的提升。
1、ruoyi-framework\pom.xml模块修改web容器依赖,使用undertow来替代tomcat容器
2、修改application.yml,使用undertow来替代tomcat容器
3、修改文件上传工具类FileUploadUtils.java
集成actuator实现优雅关闭应用
优雅停机主要应用在版本更新的时候,为了等待正在工作的线程全部执行完毕,然后再停止。我们可以使用SpringBoot提供的Actuator
1、pom.xml中引入actuator依赖
2、配置文件中endpoint开启shutdown
3、在ShiroConfig中设置filterChainDefinitionMap配置url=anon
4、Post请求测试验证优雅停机 curl -X POST http://localhost:80/monitor/shutdown
集成aj-acptcha实现滑块验证码
集成以AJ-Captcha滑块验证码为例,不需要键盘手动输入,极大优化了传统验证码用户体验不佳的问题。目前对外提供两种类型的验证码,其中包含滑动拼图、文字点选。
1、ruoyi-framework\pom.xml添加依赖
2、修改application.yml,加入aj-captcha配置
3、下载插件相关包和代码实现覆盖到工程中
4、测试验证登录和注册页面滑块验证使用是否正常。
集成sharding-jdbc实现分库分表
sharding-jdbc是由当当捐入给apache的一款分布式数据库中间件,支持垂直分库、垂直分表、水平分库、水平分表、读写分离、分布式事务和高可用等相关功能。
1、ruoyi-framework\pom.xml模块添加sharding-jdbc整合依赖
2、创建两个测试数据库
3、创建两个测试订单表
4、配置文件application-druid.yml添加测试数据源
5、下载插件相关包和代码实现覆盖到工程中
6、测试验证
访问http://localhost/order/add/1入库到ry-order2
访问http://localhost/order/add/2入库到ry-order1
同时根据订单号order_id % 2入库到sys_order_0或者sys_order_1
集成just-auth是按第三方授权登录
对于一些想使用第三方平台授权登录可以使用JustAuth,支持Github、Gitee、微博、钉钉、百度、Coding、腾讯云开发者平台、OSChina、支付宝、QQ、微信、淘宝、Google、Facebook、抖音、领英、小米、微软、今日头条、Teambition、StackOverflow、Pinterest、人人、华为、企业微信、酷家乐、Gitlab、美团、饿了么和推特等第三方平台的授权登录。
1、ruoyi-common\pom.xml模块添加整合依赖
2、新建第三方登录授权表
3、下载插件相关包和代码实现覆盖到工程中
4、测试登录页面第三方授权登录,个人中心授权及取消功能是否正常使用。
集成mybatis-plus实现mybatis增强
Mybatis-Plus是在Mybatis的基础上进行扩展,只做增强不做改变,可以兼容Mybatis原生的特性。同时支持通用CRUD操作、多种主键策略、分页、性能分析、全局拦截等。极大帮助我们简化开发工作。
1、ruoyi-common\pom.xml模块添加整合依赖
2、ruoyi-admin文件application.yml,修改mybatis配置为mybatis-plus
3、添加Mybatis Plus配置MybatisPlusConfig.java。 PS:原来的MyBatisConfig.java需要删除掉
4、添加测试表和菜单信息
5、新增测试代码验证 新增 ruoyi-system\com\ruoyi\system\controller\SysStudentController.java
新增 ruoyi-system\com\ruoyi\system\domain\SysStudent.java
新增 ruoyi-system\com\ruoyi\system\mapper\SysStudentMapper.java
新增 ruoyi-system\com\ruoyi\system\service\ISysStudentService.java
新增 ruoyi-system\com\ruoyi\system\service\impl\SysStudentServiceImpl.java
新增 ruoyi-system\templates\system\student\add.html
新增 ruoyi-system\templates\system\student\edit.html
新增 ruoyi-system\templates\system\student\student.html
6、登录系统测试学生菜单增删改查功能。
集成easyexcel实现excel表格增强
如果默认的excel注解已经满足不了你的需求,可以使用excel的增强解决方案easyexcel,它是阿里巴巴开源的一个excel处理框架,使用简单、功能特性多、以节省内存著称。
1、ruoyi-common\pom.xml模块添加整合依赖
2、ExcelUtil.java新增easyexcel导出导入方法
3、模拟测试,以操作日志为例,修改相关类。
SysOperlogController.java改为exportEasyExcel
SysOperLog.java修改为@ExcelProperty注解
添加字符串翻译内容
ruoyi-system\com\ruoyi\system\domain\read\BusiTypeStringNumberConverter.java
ruoyi-system\com\ruoyi\system\domain\read\OperTypeConverter.java
ruoyi-system\com\ruoyi\system\domain\read\StatusConverter.java
4、登录系统,进入系统管理-日志管理-操作日志-执行导出功能
集成knife4j实现swagger文档增强
如果不习惯使用swagger可以使用前端UI的增强解决方案knife4j,对比swagger相比有以下优势,友好界面,离线文档,接口排序,安全控制,在线调试,文档清晰,注解增强,容易上手。
1、ruoyi-admin\pom.xml模块添加整合依赖
2、SwaggerController.java修改跳转访问地址
3、登录系统,访问菜单系统工具/系统接口,出现如下图表示成功。
集成ueditor实现富文本编辑器增强
UEditor是由百度前端研发部开发所见即所得富文本web编辑器,具有轻量、可定制、注重用户体验等特点。可以很好的满足国内用户的需求。
1、下载UEditor前端插件
2、ruoyi-admin\include.html添加ueditor
3、修改通知公告相关页面
修改 templates\system\notice\add.html
修改 templates\system\notice\edit.html
4、添加配置文件到ruoyi-admin\src\main\resources
新增 ueditor-config.json
5、新增Ueditor请求处理控制器
新增 ruoyi-admin\controller\common\UeditorController.java
6、登录系统,进入通知公告菜单测试富文本操作。
集成ip2region实现离线ip地址定位
离线IP地址定位库主要用于内网或想减少对外访问http带来的资源消耗。(代码已兼容支持jar包部署)
1、引入依赖
2、添加工具类RegionUtil.java
3、修改AddressUtils.java
4、添加离线IP地址库插件
5、添加离线IP地址库
在src/main/resources下新建ip2region复制文件ip2region.db到目录下。
集成jsencrypt实现密码加密传输方式
目前登录接口密码是明文传输,如果安全性有要求,可以调整成加密方式传输。
1、修改前端login.js对密码进行rsa加密。
2、修改login.html文件,引入jsencrypt插件
3、工具类security包下添加RsaUtils.java,用于RSA加密解密。
4、登录方法SysLoginController.java,对密码进行rsa解密。
5、测试访问验证访问 http://localhost/login 登录页面。提交时检查密码是否为加密传输,且后台也能正常解密。
集成druid实现数据库密码加密功能
数据库密码直接写在配置中,对运维安全来说,是一个很大的挑战。可以使用Druid为此提供一种数据库密码加密的手段ConfigFilter。项目已经集成druid所以只需按要求配置即可。
1、执行命令加密数据库密码
password输入你的数据库密码,输出的是加密后的结果。
2、配置数据源,提示Druid数据源需要对数据库密码进行解密。
3、DruidProperties配置connectProperties属性
4、启动应用程序测试验证加密结果
如若忘记密码可以使用工具类解密(传入生成的公钥+密码)
集成yuicompressor实现(CSS/JS压缩)
在Maven打包的时候可以使用YUI Compressor(压缩CSS/JS)文件,使用yuicompressor-maven-plugin插件进行压缩后会减小体积,提高请求速度。