一、项目构建流程:
下载对应若依代码:
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. 定时任务
新增一个定时任务
数据库该表新增一条数据
主要注意这三个字段的配置数字