项目讲解之火爆全网的开源后台管理系统RuoYi

这篇具有很好参考价值的文章主要介绍了项目讲解之火爆全网的开源后台管理系统RuoYi。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

博主是在2018年中就接触了 RuoYi 项目 这个项目,对于当时国内的开源后台管理系统来说,RuoYi 算是一个完成度较高,易读易懂、界面简洁美观的前后端不分离项目。

对于当时刚入行还在写 jsp 模板的博主来说,RuoYi 项目在后台基础功能、模块划分、易用性和页面美观度上,对比同期用 Java 开源的前后端不分离后台项目整体上是高了一个等级的。并且项目 commit 频繁,代码质量不断提高、bug不断修复,使得这个项目在今天来说任然是具有学习价值的。

本文博主尽量用一个理性视角带领大家由浅入深看 RuoYi 项目v4.7.6版本的优秀设计。

  • RuoYi 仓库地址:https://gitee.com/y_project/RuoYi
  • 版本:v4.7.6

一、快速了解

RuoYi 项目是一个基于 SpringBoot + Mybatis + Shiro 开发的轻量级 Java 快速开发框架,它包含基础的后台管理功能以及权限控制。项目作者对于 RuoYi 项目的定调是这样的:

RuoYi是一款基于SpringBoot+Bootstrap的极速后台开发框架。

RuoYi 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Apache Shiro、MyBatis、Thymeleaf、Bootstrap)。内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、通知公告等。在线定时任务配置;支持集群,支持多数据源,支持分布式事务。

二、多模块设计

如果想快速了解一个项目的设计理念那直接下载这个项目,查看项目结构即可略知一二。这里参考官网给出的项目结构:

com.ruoyi     
├── ruoyi-common            // 工具类
│       └── annotation                    // 自定义注解
│       └── config                        // 全局配置
│       └── constant                      // 通用常量
│       └── core                          // 核心控制
│       └── enums                         // 通用枚举
│       └── exception                     // 通用异常
│       └── json                          // JSON数据处理
│       └── utils                         // 通用类处理
│       └── xss                           // XSS过滤处理
├── ruoyi-framework         // 框架核心
│       └── aspectj                       // 注解实现
│       └── config                        // 系统配置
│       └── datasource                    // 数据权限
│       └── interceptor                   // 拦截器
│       └── manager                       // 异步处理
│       └── shiro                         // 权限控制
│       └── web                           // 前端控制
├── ruoyi-generator   // 代码生成(不用可移除)
├── ruoyi-quartz      // 定时任务(不用可移除)
├── ruoyi-system      // 系统代码
├── ruoyi-admin       // 后台服务
├── ruoyi-xxxxxx      // 其他模块

由上可知,RuoYi 前后端不分离项目按照模块划分成了七个模块

  • ruoyi-common 包含了整个项目基础的注解、枚举、异常、帮助类的定义以及在 core 包中定义的基础用户、角色、菜单、字典类的 entity 对象以及其他 ajax 响应结果、分页参数、文本处理等一众基础类
    ruyiadmin,mybatis,后台管理,spring,开源,java,mybatis
  • ruoyi-framework 是整个项目的核心模块,因为这里面有整个项目的核心配置代码,全部在 config 目录下
    ruyiadmin,mybatis,后台管理,spring,开源,java,mybatis
    其中 ShiroConfig 是最核心的配置,整合了 shiro 框架,给项目提供了权限管理功能
  • ruoyi-generator 主要用作代码生成,目包含一个对外提供服务模块所需的 contrller、domain、mapper、service、util、config 等包。如果添加 Spring Boot 启动类就可以直接作为独立项目启动。作为 ruoyi-admin 模块的插件存在,通过增添 pom 依赖来控制插件是否开启
    ruyiadmin,mybatis,后台管理,spring,开源,java,mybatis
  • ruoyi-quartz 主要用作定时任务,集成了分布式定时任务调度框架 quartz ,目录与ruoyi-generator类似,也是作为 ruoyi-admin 模块的插件存在,通过增添 pom 依赖来控制插件是否开启
  • ruoyi-system 包含后台系统中非核心用户、角色、菜单、字典类实体对象之外的 mapper、service 层功能代码
    ruyiadmin,mybatis,后台管理,spring,开源,java,mybatis
  • ruoyi-admin 用作后台web服务,包含后台系统的 controlelr 层代码以及配置文件。也是整个 RuoYi 项目后台的启动入口
    ruyiadmin,mybatis,后台管理,spring,开源,java,mybatis
  • ruoyi-xxxxxx 作为由开发人员引入的其他模块,一般是新业务模块代码

最后再列出项目 ruoyi-admin 的模块依赖图,简单讲解下各个模块间的依赖关系
ruyiadmin,mybatis,后台管理,spring,开源,java,mybatis

  • ruoyi-common 基础通用模块
  • ruoyi-system依赖ruoyi-common模块
  • ruoyi-framework依赖ruoyi-system模块
  • ruoyi-generator依赖ruoyi-common模块
  • ruoyi-quartz依赖ruoyi-common模块
  • ruoyi-admin依赖ruoyi-frameworkruoyi-generatorruoyi-quartz

看完了 RuoYi 的项目结构与模块依赖关系,大家可以看看自己日常开发业务后台的项目结构。或多或少,大家都可能遇到过那种一把梭所以代码都全部放在同一个 Maven 模块的项目。对比 RuoYi 的项目结构,相信大家都会觉得多模块设计是比单模块更优的设计。

拆分出ruoyi-common模块后,其他插件模块可以只引用ruoyi-common的通用代码就能完成插件功能开发。拆分出ruoyi-framework模块后,项目中的核心配置代码全部放在ruoyi-framework中与ruoyi-admin分离,防止对ruoyi-admin的修改影响到项目核心配置。博主认为合理的模块拆分可以减少模块间的耦合与改动模块所带来的影响范围。

通过多模块设计将项目划分成 common -> system -> framework -> admin 由低到高的核心模块以及插件形式的 common -> ruoyi-generator|ruoyi-quartz 模块。模块之间尽量松耦合,方便模块升级、增减模块。

三、优雅的操作日志记录

在 RuoYi 项目中通过 com.ruoyi.framework.aspectj.LogAspect 日志切面,以自定义日志注解作为切点来记录日志信息,这样可以避免在接口中进行重复的操作日志记录代码编写,以及日志记录发生异常也不影响接口返回。

自定义日志注解如下:

/**  
* 自定义操作日志记录注解  
*  
* @author ruoyi  
*/  
@Target({ ElementType.PARAMETER, ElementType.METHOD })  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
public @interface Log {  
    /**  
    * 模块  
    */  
    public String title() default "";  

    /**  
    * 功能  
    */  
    public BusinessType businessType() default BusinessType.OTHER;  

    /**  
    * 操作人类别  
    */  
    public OperatorType operatorType() default OperatorType.MANAGE;  

    /**  
    * 是否保存请求的参数  
    */  
    public boolean isSaveRequestData() default true;  

    /**  
    * 是否保存响应的参数  
    */  
    public boolean isSaveResponseData() default true;  

    /**  
    * 排除指定的请求参数  
    */  
    public String[] excludeParamNames() default {};  
}

可以看到 LogAspect 注解类中定义了模块名称、业务操作类型(新增、修改、删除、导出等业务操作)、操作人类别(其他、后台、手机等)、是否保存请求的参数、是否保存响应的参数、排除指定的请求参数等六个属性。我们在使用自定义注解时,通常只用根据接口作用指定模块名称和业务操作类型就可以,日志注解使用如下:

@Log(title = "参数管理", businessType = BusinessType.INSERT)  
@PostMapping("/add")  
@ResponseBody  
public AjaxResult addSave(@Validated SysConfig config) {...}

自定义日志注解切面代码如下:

/**  
* 操作日志记录处理  
*  
* @author ruoyi  
*/  
@Aspect  
@Component  
public class LogAspect {  
    private static final Logger log = LoggerFactory.getLogger(LogAspect.class);  

    /** 排除敏感属性字段 */  
    public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword" ... };  

    /** 计算操作消耗时间 */  
    private static final ThreadLocal<Long> TIME_THREADLOCAL = new NamedThreadLocal<Long>("Cost Time");  

    /**  
    * 处理请求前执行  
    */  
    @Before(value = "@annotation(controllerLog)")  
    public void boBefore(JoinPoint joinPoint, Log controllerLog) {  
    TIME_THREADLOCAL.set(System.currentTimeMillis());  
    }  

    /**  
    * 处理完请求后执行  
    *  
    * @param joinPoint 切点  
    */  
    @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult")  
    public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) {  
    handleLog(joinPoint, controllerLog, null, jsonResult);  
    }  

    /**  
    * 拦截异常操作  
    *  
    * @param joinPoint 切点  
    * @param e 异常  
    */  
    @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e")  
    public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) {  
    handleLog(joinPoint, controllerLog, e, null);  
    }  

    protected void handleLog(final JoinPoint joinPoint, Log controllerLog, 
        final Exception e, Object jsonResult)  
        ...
    } 
}

通过 aop 切面对使用了日志注解的方法进行三个方面的切入:

  • @Before(value = "@annotation(controllerLog)") 处理请求前执行记录日志记录开始时间
  • @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult") 处理完请求后执行记录日志结束时间,填充操作日志最后异步插入
  • @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e") 以及处理完请求发生异常后执行记录日志结束时间,填充操作日志、异常原因最后异步插入日志

在使用了日志切面后,操作日志记录的逻辑与后台各功能接口的业务逻辑相分离,减少了日志记录代码的的重复编写,后期修改日志记录逻辑只用修改切面代码,提高了操作日志记录的可维护性,也避免了日志记录发生异常时影响业务接口,使用线程池插入日志记录还可以缩短接口响应时长。可以看到通过切面完成日志记录有这么多好处。

其实 RuoYi 中不仅仅只有日志记录使用了切面处理,像是日常开发中数据过滤权限、多数据源切换等也都使用了切面处理。使用切面可以让我们集中处理单一逻辑、方便增添关注点、减少重复代码、对控制层零侵入性以及提高可维护性

四、总结

本文目前从模块设计、操作日志记录等两个方面对 RuoYi 项目进行了讲解。如果大家也使用过 RuoYi 项目,欢迎大家讨论发言给出想法,最后希望本文对大家日常项目开发有所帮助,喜欢的朋友们可以点赞加关注😘。文章来源地址https://www.toymoban.com/news/detail-785445.html

到了这里,关于项目讲解之火爆全网的开源后台管理系统RuoYi的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一个开源的汽修rbac后台管理系统项目,基于若依框架,实现了activiti工作流,附源码

    为了更加熟悉activiti工作流的使用和实战而改造的项目,欢迎大家参考和提出问题建议一起学习~ 源码gitee仓库地址:Yuzaki-NASA / Activiti7_test_car_rbac master分支是稳定版,dev分支是后来加了个新的并行审核流程和客户管理,个人测了多遍没啥问题,建议拉dev的代码。 sql文件在car

    2024年03月23日
    浏览(48)
  • Vue3.2 + TypeScript + Pinia + Vite4 + Element-Plus + 微前端(qiankun) 后台管理系统模板(已开源---显示项目页面截图)

    Wocwin-Admin,是基于 Vue3.2、TypeScript、Vite、Pinia、Element-Plus、Qiankun(微前端) 开源的一套后台管理模板;同时集成了微前端 qiankun也可以当做一个子应用。项目中组件页面使用了Element-plus 二次封装 t-ui-plus 组件,目前已新增fastmock接口。 Link:https://wocwin.github.io/wocwin-admin/ 账号:

    2024年02月08日
    浏览(82)
  • 开源后台服务管理系统的搭建

         在做大型业务时候,很多时候为快速完成项目的后期高并发和高可用等场景,需要快速搭建项目,后台管理就是其中一项,本章就是教大家利用码云上的人人开源如何搭建一个前后端分类的后台管理系统。具体的步骤如下。        https://gitee.com/renrenio        到码云上

    2023年04月14日
    浏览(53)
  • 12个开源的后台管理系统

    1. D2admin 开源地址:https://github.com/d2-projects/d2-admin 文档地址:https://d2.pub/zh/doc/d2-admin/ 效果预览:https://d2.pub/d2-admin/preview/#/index 开源协议:MIT 开源地址:https://github.com/PanJiaChen/vue-element-admin 文档地址:https://panjiachen.github.io/vue-element-admin-site/zh/ 效果预览:https://d2.pub/d2-admin/

    2024年01月16日
    浏览(50)
  • 开源后台管理系统Geekplus Admin

    本系统采用前后端分离开发模式,后端采用springboot开发技术栈,mybatis持久层框架,redis缓存,shiro认证授权框架,freemarker模版在线生成代码,websocket消息推送等,后台管理包含用户管理,角色管理,菜单权限管理,部门组织管理,通知管理,日志管理,系统监控,在线用户,

    2024年02月12日
    浏览(48)
  • vue3开源后台管理系统模板

    2022-08-28 推荐一些 Vue3 常用后台管理系统模板。 Vue3 在今年2月份已成为新的默认版本,本文收集了一些 Vue3 的后台管理系统模板,分享给在座的仌 👣。 还是老规矩,按照 Github 星标数量来依次介绍。 个人较推荐 vue-vben-admin、vue-pure-admin、naive-ui-admin、vue3-composition-admin、vue-

    2024年02月03日
    浏览(63)
  • 免费开源的vue+express搭建的后台管理系统

    此项目已开源 前端git地址:exp后台管理系统前端: exp后台管理系统前端 后端git地址:express后台管理系统: express后台管理系统 npm i yarn i 前端: npm run dev  |  yarn dev 后端: npm run start | yarn start 前端 后端 名称 版本 名称 版本 vue 2.6.11 node.js 16.13.0 vue-router 3.6.5 express 4.17.3 vuex 3.4.0

    2024年02月12日
    浏览(42)
  • 开源后台管理系统 (go-vue-admin)

    go-vue-admin 是一套基于go语言开源的后台管理系统。功能参考诺依网站 ,前后端分离。 前端采用vue3、Element Plus 、RuoYi-Vue3 后端采用gofrome 框架、mysql、redis、Jwt 实现了一键生成前后端代码,高效开发。 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 部门管理:

    2024年02月07日
    浏览(51)
  • 基于.NET6.0完全开源的MiniX后台管理系统,全端免费开源

    介绍 基于.NET 6.0打造的成熟后台管理系统框架,完全开源免费免费,集成了LayUI,操作界面友好!已应用到上百个项目,经过多年的沉淀,开源给广大用户使用。 整套架构包含后端\\\"miniAdmin\\\"+前端APP/小程序应用“miniAPP”+PC端“miniPC”,全栈开源,永久免费。 符合国家安全三级

    2024年02月11日
    浏览(49)
  • 基于SpringBoot+VUE的宠物医院后台管理系统【源码开源】【建议收藏】

    今天给大家开源一个基于SpringBoot+VUE的宠物医院后台管理系统,系统基于脚手架工程,花了大概1周时间做出来的。 该系统完全开源。 系统完美运行,无任何的bug,技术较多,可以当做 面试的项目或者作为毕设的项目。 通过本项目你可以学到: 项目是怎样前后端分离的 vue 是

    2024年02月07日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包