目录
介绍
-
基于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
-
检查是否是一个有效的ema
-
-
-