终于把ruoyi这个开源项目系统的学完了

断断续续两个多月研究了一下这个开源项目ruoyi-vue,是前后端分离版的,也写了一点xmind笔记。下面再具体的回忆一下后端的实现的细节,最后再将自己总结的xmind文件上传。

ps:使用目录结构总结,也方便读者和自己总结。

登录功能

ruoyi-login.png

流程图如上

  1. 验证验证码
  2. 数据库读取用户
  3. 校验密码
  4. 生成Token

小节

这种方案,可以作为单点登录SSO的实现方式,统一一个认证中心,分配Token,再统一认证。

数据权限

这一功能,可以参考我的一篇独立博客。这是ruoyi-vue的核心功能,他可以根据用户的不同,划分不同的数据权限,实现方面来说就是一张dept_role之间映射表来根据部门决定用户有什么权限,然后通过AOP将拼接的SQL添加到mapper中。

juejin.cn/post/708237…

ps:后续添加一个RBAC模型的介绍,对于理解这个数据权限挺重要的。

异步任务

使用异步任务,可以大大减轻系统的压力,不至于任务一下打到数据库上,官方评测mysql的QPS大概在4k左右,顶不住很大的压力,所以可以适当添加异步任务削峰(这个主要还是得添加mq)。
在ruo-vue中简单使用了异步任务,他是使用了一个线程池ScheduledThreadPool,延时执行了给定的数据库日志任务。

本地限流

限流,意思是在某个时间段内,访问的次数只能在规定的数量内,本质上还是为了保护接口不被打挂。在ruo-vue中提供了两个实现。我们可以来看看。

  1. 使用@RateLimiter注解即可,使用很简单。
    1. 实现是使用AOP对方法访问进行计数。根据访问方法的全限定类名+方法名为key,数量为value,进行判断,超过了指定的数量,即触发Exception返回。由于这里步骤较多(自增value,判断value是否超过count)所以使用了Lua脚本保证原子性同时又减少网络开销。
    2. 可以有两种模式,一种是全局,一种是IP。默认是全局只同居类名+方法名,而IP会加上IP前缀,粒度小一些。
  2. 使用@RepeatSubmit注解,在规定的时间内不能提交第二次,可以理解为限流+脚本防刷。
    1. 实现时使用拦截器进行拦截,判断拦截的方法是否有这个注解,有的话,进行判断。
    2. 判断逻辑也是根据redis中获取上次访问的参数(这里较简单就没有使用Lua脚本),如果相同,拦截,否则正常。

XSS脚本过滤

XSS是一种利用系统漏洞,将一些含有脚本内容的字符串提交到系统后,系统将其识别为代码后执行,对系统进行破坏的行为。 使用@Xss注解,即可过滤掉参数中的脚本。实现逻辑是自定义实现一个Validated验证,然后外部调用使用@Validated启动,会使用正则表达式清除带有<>的字符。

系统也不只是为了某个特定的参数,也有一个全局的xss过滤,实现逻辑是通过包装一个RequestWrapper,每次getParameter都会启动清除<>的逻辑。

多数据源

使用@DataSource注解再指定想要使用哪个数据源即可,默认是配置了Slave和Master两个类型,但是只有一个Master数据源,如果想使用Slave就在配置文件中添加一个数据源。

实现上,是使用了AOP对添加了@DataSource注解的方法或类进行设置,使用的是ThreadLocal和每个线程绑定数据源名称。

在启动系统时,会向IOC容器中,添加一个数据源的Bean,默认是使用的Master名称的数据源,若配置了Slave数据源,则会加载Slave的Bean然后添加到数据源管理中。供系统切换。(实现了一个AbstractRoutingDataSource的方法,返回我们设置的数据源名称即可就可以让数据源容器自动切换)。

业务逻辑

系统的业务逻辑,都在ruoyi-system模块中,里面大多是CRUD的逻辑,但是添加了很多的判断,这点是值得我们学习的,在结尾处我会将业务逻辑放在一个大的.xmind文件中,可以自行下载,点开ruoyi-admin下的system中(我是从controller开始分析的)。

下面再介绍一下各个模块的作用:

  1. 多数操作都使用了redis,避免每次都查询数据库(这里默认情况下,在admin更新了某个用户的数据权限后不是实时更新的,因为用户信息被缓存到了redis中。想改变也容易,自行更新即可)。

  2. 比较重要的是ruoyi-framework这个模块,几乎所有的注解实现都是在这里实现的(包括数据权限@DataScope),所以研究这个项目一定得看看framework这个模块。

  3. system-common这个模块是工具类。

代码生成器和定时任务不是系统的核心,如果要在自己系统集成的话可以在已有的基础上进行添加,非常快速。

架构设计

  1. admin:
    1. framework
    2. common
    3. gen
    4. quartz
  2. common
  3. framework
    1. system
  4. system
    1. common

admin提供总控功能,将请求分发到各模块
common提供工具
framework提供核心内容
system提供跟系统相关内容

总结

总的来说,学习了两个月,还是学习到了一些业务逻辑以及编码方式,例如在使用

  1. AOP对业务功能增强方面
  2. 设计模式
    1. 的抽象类加子类实现的模板方法
    2. 拦截器Wrapper包装的装饰器模式
    3. MVC模式serive是如何解耦的
    4. 全局异常加国际化的继承处理
  3. 常见的逻辑:比如登录JWT,验证,注册,缓存redis的使用,数据过滤,以及上述的一些功能。

ps:后续我们还可以继续搭建一下cloud版本的内容。

xmind文件总结

链接:pan.baidu.com/s/1tXqnAXkA… 提取码:1234

猜你喜欢

转载自juejin.im/post/7092248102635536414