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

Posted waynaqua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目讲解之火爆全网的开源后台管理系统RuoYi相关的知识,希望对你有一定的参考价值。

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

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

本文博主尽量用一个理性视角带领大家由浅入深看 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 响应结果、分页参数、文本处理等一众基础类
  • ruoyi-framework 是整个项目的核心模块,因为这里面有整个项目的核心配置代码,全部在 config 目录下

    其中 ShiroConfig 是最核心的配置,整合了 shiro 框架,给项目提供了权限管理功能
  • ruoyi-generator 主要用作代码生成,目包含一个对外提供服务模块所需的 contrller、domain、mapper、service、util、config 等包。如果添加 Spring Boot 启动类就可以直接作为独立项目启动。作为 ruoyi-admin 模块的插件存在,通过增添 pom 依赖来控制插件是否开启
  • ruoyi-quartz 主要用作定时任务,集成了分布式定时任务调度框架 quartz ,目录与ruoyi-generator类似,也是作为 ruoyi-admin 模块的插件存在,通过增添 pom 依赖来控制插件是否开启
  • ruoyi-system 包含后台系统中非核心用户、角色、菜单、字典类实体对象之外的 mapper、service 层功能代码
  • ruoyi-admin 用作后台web服务,包含后台系统的 controlelr 层代码以及配置文件。也是整个 RuoYi 项目后台的启动入口
  • ruoyi-xxxxxx 作为由开发人员引入的其他模块,一般是新业务模块代码

最后再列出项目 ruoyi-admin 的模块依赖图,简单讲解下各个模块间的依赖关系

  • 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 项目,欢迎大家讨论发言给出想法,最后希望本文对大家日常项目开发有所帮助,喜欢的朋友们可以点赞加关注

Ruoyi前后端分离式开源项目实战部署总结-环境搭建准备工作

《前后端分离式项目实战部署》这一系列的文章将从零讲解如何部署一个完整的开源项目。本教程是学习程序羊CodeSheep的视频《项目下载、运行、配置、构建、打包、部署:全步骤实战演示》。安利一波!!!非常走心的视频教程了。
这一系列文章主要分为两部分:

  1. 前期的环境搭建——软件安装+Linux节点搭建
  2. 开源项目下载及部署集群+测试

这里介绍的是如何部署Ruoyi这个前后端分离的开源项目-gitee地址



这里我们选择2.3的。将下载好的压缩包在本地打开。

这一篇文章主要介绍第一部分——环境搭建:centos安装及克隆,部署集群,常用软件安装(git,java,maven,docker,Tomcat,Node,Nginx)

注意的坑

这个问题我放在最前面,为了提到警示作用,因为后面的问题大多是出现在这里,比如Tomcat的8080端口,mysql的3306端口,redis的6379端口。如果发现后面跟着教程做着不对,初步去查看你的这些端口有没有开放。

#开放端口命令
firewall-cmd --list-port
#如果没有3306的端口,就打开
firewall-cmd --zone=public --add-port=3306/tcp --permanent
#重启防火墙
firewall-cmd --reload
#查看11111端口是否开启
firewall-cmd --query-port=3306/tcp
#开启其他端口也是这些命令

一、VM安装centos7及克隆

网上有很多教程讲解如何使用安装centos7,这里我们总计一下。

1、创建虚拟机

打开VMware,选择“文件—>新建虚拟机”,接下来按照图的步骤来(具体的安装可以看这篇教程-《在VMware虚拟机中安装CentOS 7(图文教程)》)





这里处理器我就默认最小,虚拟内存最小,根据电脑配置自行设定。









最后开启虚拟机,进行安装。
接下来安装的时候需要注意

这些位置。

  • 软件选择:要选择带有桌面。否则安装的就是一个核。
  • 安装位置的分区和文件系统需要注意对应
    – /boot分区设为200M:
    – /home目录设置为2048M:
    – swap分区设为2048M:
    – 根分区/分配剩余的全部空间:

接下来就是打开网络

然后开始安装,配置root和其他用户就可以了。安装不难。

2、安装常用开发软件-git,java,maven,docker,Tomcat,Node,Nginx

在这里我给了相应的软件和安装文档,直接复制粘贴就可以了。
注意:我的安装包是与我软件安装的文档对应起来的,如果是自己下载的其他版本的安装包,你需要改一些命令,主要是文件名对应就行了!慢慢折腾!
下载链接:链接: https://pan.baidu.com/s/1p_HT_K_r4Y3DcMRqhQ2sgA 提取码: mrdw 复制这段内容后打开百度网盘手机App,操作更方便哦

软件安装文档

Git
yum install git
git --version
java
rpm -qa | grep java
#删除java 开头的安装包
yum -y remove java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64
.....

创建目录

cd /usr/local/
mkdir java
cd java

解压

tar -zxvf jdk-8u291-linux-x64.tar.gz
rm -rf jdk-8u291-linux-x64.tar.gz 
vim  /etc/profile

环境变量

JAVA_HOME=/usr/local/java/jdk1.8.0_291
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH

生效

source /etc/profile
java -version
javac
Node

创建目录

cd /usr/local/
mkdir node
cd node
tar -xJvf node-v14.17.4-linux-x64.tar.xz 
rm -rf node-v14.17.4-linux-x64.tar.xz
vim  ~/.bash_profile

修改环境变量

#Nodejs
export PATH=/usr/local/node/node-v14.17.4-linux-x64/bin:$PATH

生效

source ~/.bash_profile
node -v
npm version
npx -v
Maven

创建目录

cd /usr/local/
mkdir maven
cd maven
tar -zxvf apache-maven-3.8.1-bin.tar.gz
rm -rf apache-maven-3.8.1-bin.tar.gz
vim  /usr/local/maven/apache-maven-3.8.1/conf/settings.xml

加速

      <mirror>
       <id>alimaven</id>
       <name>aliyun maven</name>
       <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
       <mirrorOf>central</mirrorOf>
      </mirror>

修改环境变量

vim /etc/profile 
#修改文件名
export MAVEN_HOME=/usr/local/maven/apache-maven-3.8.1
export PATH=$MAVEN_HOME/bin:$PATH

生效

source /etc/profile 
mvn –v
docker

方法一:

#1.卸载旧版本
yum remove docker \\
                  docker-client \\
                  docker-client-latest \\
                  docker-common \\
                  docker-latest \\
                  docker-latest-logrotate \\
                  docker-logrotate \\
                  docker-engine
#2.需要的安装包
yum install -y yum-utils

#3.设置镜像的仓库
yum-config-manager \\
    --add-repo \\
    https://download.docker.com/linux/centos/docker-ce.repo
#上述方法默认是从国外的,不推荐

#推荐使用国内的
yum-config-manager \\
    --add-repo \\
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
#更新yum软件包索引
yum makecache fast

#4.安装docker相关的 docker-ce 社区版 而ee是企业版
yum install docker-ce docker-ce-cli containerd.io # 这里我们使用社区版即可

#5.启动docker
systemctl start docker

#6. 使用docker version查看是否按照成功
docker version


#7. 加速地址
vim /etc/docker/daemon.json

{
    "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}

sudo systemctl daemon-reload
sudo systemctl restart docker


#8. 测试
docker run hello-world
12345678910111213141516171819202122232425262728293031323334353637


#9.查看已经下载的镜像(从这里可以查看已有镜像的id)
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
hello-world           latest              bf756fb1ae65        4 months ago      13.3kB
1234

方法二:(使用方法一就好了)

yum install -y docker
systemctl start docker.service
docker version
vim /etc/docker/daemon.json

{
    "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}

sudo systemctl daemon-reload
sudo systemctl restart docker

卸载

yum list installed|grep docker
yum -y remove docker.x86_64 docker-client.x86_64 docker-common.x86_64
rm -rf  /var/lib/docker

docker命令

docker restart $(docker ps -aq)  #重启所有容器
systemctl enable docker.service  #设置开机启动
Nginx

创建目录

cd /usr/local/
mkdir nginx
cd nginx
tar -zxvf nginx-1.17.9.tar.gz
rm -rf nginx-1.17.9.tar.gz 

预先安装额外的依赖

yum -y install pcre-devel
yum -y install openssl openssl-devel

编译安装nginx

cd nginx-1.17.9
./configure
make && make install

启动NGINX

cd /usr/local/nginx/sbin
/usr/local/nginx/sbin/nginx
ps -ef|grep nginx

其他命令

如果想停⽌Nginx服务
/usr/local/nginx/sbin/nginx -s stop
如果修改了配置⽂件后想重新加载Nginx,可执⾏
/usr/local/nginx/sbin/nginx -s reload
配置⽂件位于
/usr/local/nginx/conf/nginx.conf
Tomcat

创建目录

cd /usr/local/
mkdir tomcat
cd tomcat
tar -zxvf apache-tomcat-8.5.69.tar.gz 
rm -rf apache-tomcat-8.5.69.tar.gz

运行Tomcat

cd apache-tomcat-8.5.69/
cd bin/
./startup.sh

配置快捷操作和开机启动

cd /etc/rc.d/init.d
touch tomcat
chmod +x tomcat
vim tomcat 
#!/bin/bash
#chkconfig:- 20 90
#description:tomcat
#processname:tomcat
TOMCAT_HOME=/usr/local/tomcat/apache-tomcat-8.5.69
case $1 in
     start) su root $TOMCAT_HOME/bin/startup.sh;;
     stop) su root $TOMCAT_HOME/bin/shutdown.sh;;
     *) echo "require start|stop" ;;
esac

Tomcat的开启和关闭执⾏命令

service tomcat start
service tomcat stop

设置开机启动

chkconfig --add tomcat
chkconfig tomcat on

这就是相关的安装步骤。

3、克隆虚拟机

由于这个项目需要搭建一个集群,至少要三台服务器。所以我们在克隆出两台服务器。克隆的时候需要先将虚拟机关闭。





然后点击完成就可以了。

克隆的时候发现ip是自动增长的,如果想设置自定义的静态ip,自己去修改配置文件。

4、检查环境

开启每一台虚拟机,然后检查相关的环境是否已经安装好。因为是将第一台配置后再去克隆的,所以另外两台应该是有的。使用下面命令检查

git --version

java -version

node -v
npm version
npx -v

mvn –v

docker version

/usr/local/nginx/sbin/nginx
ps -ef|grep nginx

service tomcat start

二、分配虚拟机

我三台虚拟机的ip地址分别为
192.168.38.132 --部署前端
192.168.38.133 --部署后端
192.168.38.134 --部署后端

要测试三台服务器的相关网络,自行测试。

接下来项目会使用到xshell和WinSCP这两款软件,也要提前下载好,并且连接对应的虚拟机。


到这里前期的准备工作做完了。

注意要开放相对应的端口啊!!!!!!!

以上是关于项目讲解之火爆全网的开源后台管理系统RuoYi的主要内容,如果未能解决你的问题,请参考以下文章

RuoYi(若依开源框架)-前后台分离版-后端流程简单分析

RuoYi(若依开源框架)-前后台分离版-idea搭建运行

Ruoyi前后端分离式开源项目实战部署总结-环境搭建准备工作

RuoYi 若依后台管理系统-学习笔记-前后端分离项目中下拉框验证失效

RuoYi 若依后台管理系统-学习笔记-前后端分离项目中下拉框验证失效

诺依/RuoYi开源系统搭建总结