1. 首页
  2. >
  3. 编程技术
  4. >
  5. Java

若依cloud前后端分离版本详解(ruoyi-cloud)

一、项目构建流程:

下载对应若依代码:
https://gitee.com/y_project/RuoYi-Cloud?_from=gitee_search

下载nacos,配置nacos

运行脚本文件

项目里有脚本文件

③启动nacos

startup.cmd -m standalone (需要配置jdk环境变量)

http://localhost:8848/nacos 账号密码 nacos

④修改nacos配置文件

3.下载seata

配置seata

启动seate

4.启动后端各模块服务

顺序:

5.启动前端服务

动态代理的网关配置

## 开发 ```bash # 克隆项目 git clone https://gitee.com/y_project/RuoYi-Vue # 进入项目目录 cd ruoyi-ui # 安装依赖 npm install #-- (以下备用) --# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 # 启动服务 npm run dev ``` 浏览器访问 http://localhost:80 ## 发布 ```bash # 构建测试环境 npm run build:stage # 构建生产环境 npm run build:prod ``` 

二、项目解析

1. 验证码

spring函数式编程WebFlux:

由gateway网关处理/code这个请求,将它路由到validateCodeHandler这个处理器去处理,把请求路由到对应的handler去处理。

这个ValidateCodeHandler主要作用就是验证码的获取:

最后调用createCaptcha这个方法生成验证码:

setCacheObject:

调用该方法想redis中储存值,key为前缀加生成的uuid,value是验证码的答案,并且设置超时时间2分钟。

通过ImageIO将它转化为二进制写进流里面,最后将这个img转成Base64的编码通过Ajax返回给前端。

2. 登录

login方法:

通过该方法拿到用户的用户名、密码。

通过拿到的用户名、密码,先去验证是否为空及是否在一定范围内。

remoteUserService查询用户的信息:通过Feign调用ruoyi-system模块的getUserInfo方法。

记录用户登录的一些操作日志和获取当前的登录用户。

createToken方法:获取登录token

先生成token,uuid、用户id、用户名、ip地址,赋予token一个前缀名称,随后存入redis,key为带前缀的token,value为登录用户,并设置过期时间,最后将token返回给前端。

3. 前端路由守卫

去前端模块全局搜/getinfo:

再搜getInfo()这个方法:

搜GetInfo:

router.beforEach(路由守卫):

前端每次路由的时候都会执行,类似于拦截器,路由之前做什么,路由之后做什么。

如果能拿到token,说明已经登录,但是你还想去/login登录页面,则将页面转到首页。

如果不是去登录页面,则判断当前用户是否已拉取完user_info信息,根据roles权限生成可访问的路由表,动态添加可访问路由表。

如果没有token:

查看去往路径是否在白名单内,如果在白名单,不需要登录直接前往,否则重定向到登录页面。

4. 认证

前端拦截器:

后端拦截器(AuthFilter):

获取请求的url,对比白名单,看是否需要跳过验证。

白名单配置:从nacos配置中心的配置文件中读取白名单列表

如果不在白名单列表,则判断token的各种状态:是否有token,token是否过期等。

如果token正常,则获取用户id和用户名,判断是否为空,为空返回令牌验证失败。

最后将token存入redis,并设置过期时间。

5. 登出

从请求中拿到token,判断token是否为空,不为空将token加上固定的前缀,根据前缀+token作为的key从redis中取出用户。如果拿到的用户不为空,删除redis用户缓存记录,记录用户退出日志。

前端:获取到退出请求将转到首页面。

6. 鉴权

前端:

后端:

@RequiresPermissions("monitor:online:list")

通过@RequiresPermissions注解来控制权限,如果有当前菜单的权限则展示该菜单,如果没有则不展示该菜单。

该注解在ruoyi-common模块下的security里:

利用aop切面技术将使用到该注解的方法进行环绕通知。

其中就包含@RequiresPermissions

角色权限:

权限验证,逻辑实现类:

校验用户是否登录,校验用户登录状态是否正常,获取当前用户的缓存信息,验证当前用户有效期。

验证当前用户是否具备某权限:

先获取该用户,再通过getPermiList()方法获取当前账号的权限列表:

如果验证未通过,则抛出异常: NotPermissionException。

该类包含鉴权方法:

①验证用户是否具备某权限, 如果验证未通过,则抛出异常: NotPermissionException

②根据注解(@RequiresPermissions)鉴权, 如果验证未通过,则抛出异常: NotPermissionException

③验证用户是否含有指定权限,必须全部拥有

④验证用户是否含有指定权限,只需包含其中一个

⑤判断用户是否拥有某个角色,如果验证未通过,则抛出异常: NotRoleException

⑥根据注解(@RequiresRoles)鉴权

⑦验证用户是否含有指定角色,必须全部拥有

⑧验证用户是否含有指定角色,只需包含其中一个

⑨根据注解(@RequiresLogin)鉴权

⑩根据注解(@RequiresPermissions)鉴权

另外还有辅助鉴权方法:

①获取当前账号的角色列表方法:getRoleList()

②获取当前账号的权限列表方法:getPermiList()

③判断是否包含权限方法:hasPermi()

④判断是否包含角色方法:hasRole()

问题

1. 新增模块报gateway找不到路径404,postman调用接口显示500

因为新增的模块没有配置nacos里面的gateway配置文件,新增模块要新增routes路由,否则找不到。

spring:

redis:

host: localhost

port: 6379

password: 123456

cloud:

gateway:

discovery:

locator:

lowerCaseServiceId: true

enabled: true

routes:

# 认证中心

- id: uav-auth

uri: lb://uav-auth

predicates:

- Path=/auth/**

filters:

# 验证码处理

- CacheRequestFilter

- ValidateCodeFilter

- StripPrefix=1

2. 定时任务

新增一个定时任务

数据库该表新增一条数据

主要注意这三个字段的配置数字