🏛️ RuoYi (若依) v4.8.3 架构学习笔记

📅 创建时间:2026-05-20

🏷️ 标签: Spring Boot 4 Apache Shiro MyBatis Thymeleaf 后台管理系统 代码生成 若依

📍 项目路径:E:\workSpace\RuoYi

🌐 官网:www.ruoyi.vip

📑 目录
  1. 项目总览
  2. 模块架构与依赖
  3. 安全架构 (Shiro)
  4. 前端架构 (Thymeleaf SSR)
  5. 后端分层架构
  6. Controller 路由全景
  7. 代码生成引擎
  8. AOP 横切关注点
  9. 技术栈全景
  10. 部署与监控
  11. 学习要点与启发

1. 项目总览

RuoYi(若依)是国内最流行的开源 Java 后台管理系统之一,基于 Spring Boot + Shiro + MyBatis + Thymeleaf 构建,提供完整的权限管理、代码生成、系统监控等企业级功能。v4.8.3 版本升级至 Spring Boot 4.0.3 + Java 17,采用 Jakarta EE 命名空间。

框架版本
v4.8.3
Spring Boot
4.0.3
Java 版本
17
Maven 模块
6 个
安全框架
Apache Shiro 2.1
ORM
MyBatis 4.0.1
模板引擎
Thymeleaf
部署方式
JAR / WAR
💡 核心定位:RuoYi 不是微服务架构,而是一个单体应用(monolith),通过 Maven 多模块实现代码分层和关注点分离。适合作为中小型项目的快速开发脚手架。另有微服务版本 RuoYi-Cloud

2. 模块架构与依赖

2.1 模块总览

🏠 ruoyi-admin
Web 入口模块,可执行 JAR。包含所有 Controller、Thymeleaf 模板、静态资源。依赖其他所有模块。
⚙️ ruoyi-framework
框架核心:Shiro 安全配置、AOP 切面、数据源配置、异步任务管理、缓存/权限/字典等公共服务。
📦 ruoyi-system
系统管理领域:用户、角色、菜单、部门、岗位、字典、配置、通知等实体、Service、Mapper。
⏰ ruoyi-quartz
定时任务模块:基于 Quartz 的任务调度,支持 cron 表达式、任务日志、执行策略。
🔧 ruoyi-generator
代码生成引擎:读取数据库元数据,通过 Velocity 模板生成完整的 CRUD 代码(Controller/Service/Mapper/HTML/SQL)。
🧩 ruoyi-common
公共基础:BaseEntity、BaseController、AjaxResult、注解(@Log/@DataScope/@Excel/@RepeatSubmit 等)、工具类、XSS 过滤。

2.2 模块依赖关系

ruoyi-admin (Web 入口, 可执行 JAR) / | \ v v v ruoyi-framework ruoyi-quartz ruoyi-generator | | | v v v ruoyi-system ruoyi-common ruoyi-common | v ruoyi-common (基础层, 所有模块依赖) 依赖方向: 上层 ──依赖──> 下层 (单向, 无循环)
📋 各模块职责详解
模块核心类职责
ruoyi-commonBaseEntity, BaseController, AjaxResult, TableDataInfo公共基类、响应封装、分页集成、工具类、自定义注解
ruoyi-systemSysUser, SysRole, SysMenu, SysDept, SysPost, SysConfig, SysDict*系统管理领域模型 + Service + Mapper(21 个 XML 映射文件)
ruoyi-frameworkShiroConfig, UserRealm, LogAspect, DataScopeAspect, AsyncManager安全认证、AOP 切面、数据源路由、异步任务、公共服务
ruoyi-quartzSysJob, SysJobLog, QuartzJobFactoryQuartz 定时任务调度与日志
ruoyi-generatorGenTable, GenTableColumn, GenTableServiceImpl代码生成:读取 information_schema,Velocity 渲染模板
ruoyi-adminRuoYiApplication, 所有 Controller应用入口、Web 层、Thymeleaf 模板、静态资源

3. 安全架构 (Apache Shiro)

3.1 认证流程

🔐 登录认证链路
1
用户提交 → 用户名 + 密码 + 验证码 → POST /login
2
Shiro 过滤器captchaValidate 过滤器先校验验证码
3
Realm 认证UserRealm.doGetAuthenticationInfo() 委托给 SysLoginService.login()
4
安全校验 → IP 黑名单 → 用户存在性 → 删除/锁定状态 → 密码匹配
5
成功处理 → 设置角色/权限,异步记录登录日志,创建 Session
6
失败处理 → 抛出特定异常(Captcha/UserNotExists/PasswordNotMatch/UserBlocked/BlackList)

3.2 授权模型

🛡️ RBAC 权限模型
SysUser (用户) │ ├── M:N ──> SysRole (角色) │ │ │ ├── M:N ──> SysMenu (菜单/权限) │ └── M:N ──> SysDept (数据权限范围) │ └── M:N ──> SysPost (岗位) 权限字符串格式: "system:user:list", "system:user:add", "system:user:export" 角色标识格式: "admin", "common"

UserRealm.doGetAuthorizationInfo() 加载当前用户的角色集合和菜单权限集合,返回 SimpleAuthorizationInfo,Shiro 据此做访问控制。

3.3 Shiro 过滤器链

URL 模式过滤器说明
/favicon.ico, /css/**, /js/**, /img/**anon静态资源,匿名可访问
/captcha/captchaImage**anon验证码图片,匿名可访问
/loginanon, captchaValidate登录页,需验证码校验
/registeranon, captchaValidate注册页,需验证码校验
/logoutlogout登出处理
/**user, kickout, onlineSession, syncOnlineSession, csrfValidateFilter所有其他页面:认证 + 踢人 + 在线会话 + 同步 + CSRF

3.4 自定义安全过滤器

过滤器功能
captchaValidate校验验证码正确性
onlineSession检查 Session 状态(过期/强制下线)
syncOnlineSession异步同步 Session 属性变更到数据库
kickout同用户最大并发会话控制(EhCache 实现)
csrfValidateFilterCSRF 防护(默认禁用)
logout自定义登出逻辑

3.5 Session 管理(数据库持久化)

📋 Session-in-DB 模式

RuoYi 将 Shiro Session 持久化到 sys_user_online 数据库表,实现:

配置项说明
Session 超时30 分钟过期自动清除
数据库同步周期1 分钟Session 属性变更延迟写入 DB
验证间隔10 分钟定时检查过期 Session
最大并发会话-1(无限制)可配置,超出后按策略踢人
Remember MeAES-128 Cookie30 天有效期,HttpOnly

3.6 密码安全策略

4. 前端架构 (Thymeleaf SSR)

🎨 技术选型:服务端渲染 (SSR)

RuoYi 采用经典的 服务端渲染 模式,没有独立的前端框架(无 Vue/React/Angular)。前端由 Thymeleaf 模板 + jQuery + Bootstrap 构成,适合后台管理系统的快速开发。

📂 模板与静态资源结构
ruoyi-admin/src/main/resources/
├── templates/                    # Thymeleaf 模板
│   ├── system/                   # 系统管理页面
│   │   ├── user/                 #   用户管理
│   │   ├── role/                 #   角色管理
│   │   ├── menu/                 #   菜单管理
│   │   ├── dept/                 #   部门管理
│   │   ├── dict/                 #   字典管理
│   │   ├── config/               #   参数设置
│   │   ├── notice/               #   通知公告
│   │   ├── login.html            #   登录页
│   │   ├── register.html         #   注册页
│   │   └── index.html            #   主框架页
│   ├── monitor/                  # 监控页面
│   │   ├── cache/                #   缓存监控
│   │   ├── server/               #   服务器监控
│   │   ├── online/               #   在线用户
│   │   └── operlog/, logininfor/ #   日志管理
│   ├── tool/                     # 工具页面
│   │   ├── gen/                  #   代码生成
│   │   └── build/                #   表单构建
│   ├── demo/                     # 演示页面
│   └── error/                    # 错误页面 (404, 500)
└── static/
    ├── css/                      # 样式表
    ├── js/                       # jQuery + Bootstrap + 插件
    ├── ajax/                     # AJAX 工具函数
    ├── ruoyi/                    # 若依自定义 JS/CSS
    ├── i18n/                     # 国际化资源
    ├── img/, fonts/              # 图片/字体
    └── file/                     # 上传文件目录
🔗 Thymeleaf + Shiro 集成

通过 thymeleaf-extras-shiro 在模板中直接做权限判断:

<!-- 有 user:list 权限才显示按钮 -->
<shiro:hasPermission name="system:user:add">
    <button class="btn btn-primary">新增用户</button>
</shiro:hasPermission>

<!-- 有 admin 角色才显示 -->
<shiro:hasRole name="admin">
    <div>管理员专属内容</div>
</shiro:hasRole>
🌘 UI 框架
技术用途
jQueryDOM 操作、AJAX 请求、事件处理
Bootstrap响应式布局、组件(表格、表单、模态框)
Bootstrap Table数据表格(分页、排序、搜索、导出)
Summernote富文本编辑器
Bootstrap Select下拉选择组件
iCheck美化复选框/单选框

5. 后端分层架构

🏗️ 经典四层分层
┌─────────────────────────────────────────────────────────────────┐ │ Controller 层 (ruoyi-admin) │ │ 接收 HTTP 请求 / 参数校验 / 调用 Service / 返回 AjaxResult │ │ 所有 Controller 继承 BaseController │ └───────────────────────────┬─────────────────────────────────────┘ │ ┌───────────────────────────▼─────────────────────────────────────┐ │ Service 层 (接口) (ruoyi-system) │ │ 定义业务契约: ISysUserService, ISysRoleService, ... │ └───────────────────────────┬─────────────────────────────────────┘ │ ┌───────────────────────────▼─────────────────────────────────────┐ │ Service Impl 层 (ruoyi-system) │ │ 业务逻辑实现 / 事务管理 (@Transactional) / 数据组装 │ └──────────┬────────────────────────────────────┬─────────────────┘ │ │ ┌──────────▼──────────┐ ┌────────────▼────────────────┐ │ Mapper 接口 │ │ Mapper XML │ │ (MyBatis Interface) │ │ (SQL 映射, 动态 SQL) │ └──────────┬──────────┘ └────────────┬────────────────┘ │ │ └────────────────┬───────────────────┘ ▼ ┌──────────────┐ │ MySQL │ │ (Druid 池) │ └──────────────┘

5.1 BaseController 核心能力

所有 Controller 继承 BaseController,获得统一的分页和响应处理能力:

方法功能
startPage()启动 PageHelper 分页拦截,下一个 MyBatis 查询自动添加 LIMIT
getDataTable(List)将列表封装为 TableDataInfo(含 total、rows、code、msg)
toAjax(boolean)将布尔结果封装为 AjaxResult(成功/失败 + 提示信息)
@InitBinder日期类型自动转换
ShiroUtils.getSysUser()获取当前登录用户信息

5.2 统一响应格式

// AjaxResult - 操作响应
{
  "code": 0,           // 0=成功, 500=失败
  "msg": "操作成功",     // 提示信息
  "data": { ... }      // 可选的业务数据
}

// TableDataInfo - 分页响应
{
  "code": 0,
  "msg": "查询成功",
  "rows": [ ... ],     // 数据列表
  "total": 100          // 总记录数
}

5.3 数据权限 (@DataScope)

🔒 行级数据过滤

@DataScope 注解 + DataScopeAspect 实现行级数据安全:

@DataScope(deptAlias = "d", userAlias = "u")
public List<SysUser> selectUserList(SysUser user) {
    return mapper.selectUserList(user);
}
// 自动追加: AND d.dept_id IN (SELECT dept_id FROM sys_role_dept WHERE role_id = ...)

5.4 多数据源 (@DataSource)

通过 @DataSource 注解 + DataSourceAspect AOP 实现声明式数据源切换:

@DataSource(value = DataSourceType.SLAVE)
public List<SysUser> selectUserListFromSlave(SysUser user) {
    return mapper.selectUserList(user);
}

底层使用 DynamicDataSource(继承 AbstractRoutingDataSource)+ ThreadLocal 实现运行时切换。从库默认禁用。

5.5 MyBatis Mapper 层

模块Mapper 数量核心 Mapper
ruoyi-system21 个 XMLSysUserMapper, SysRoleMapper, SysMenuMapper, SysDeptMapper, SysConfigMapper, SysDictDataMapper, SysLogininforMapper, SysOperLogMapper ...
ruoyi-quartz2 个 XMLSysJobMapper, SysJobLogMapper
ruoyi-generator2 个 XMLGenTableMapper, GenTableColumnMapper

配置: 二级缓存启用,useGeneratedKeys,SLF4J 日志,PageHelper MySQL 方言分页。

6. Controller 路由全景

所有 Controller 位于 ruoyi-admin/src/main/java/com/ruoyi/web/controller/,按功能域组织:

6.1 通用模块 (/common)

Controller路由功能
CommonController/common/download, /common/upload, /common/uploads文件上传/下载

6.2 系统模块 (/system)

Controller路由功能
SysLoginController/login登录页面与登录提交
SysIndexController/index主框架页面
SysCaptchaController/captcha/captchaImage验证码图片生成 (Kaptcha)
SysRegisterController/register用户注册
SysUserController/system/user/**用户 CRUD + 重置密码 + 分配角色
SysRoleController/system/role/**角色 CRUD + 菜单权限分配
SysMenuController/system/menu/**菜单/权限树 CRUD
SysDeptController/system/dept/**部门树 CRUD
SysPostController/system/post/**岗位 CRUD
SysDictTypeController/system/dict/type/**字典类型 CRUD
SysDictDataController/system/dict/data/**字典数据 CRUD
SysConfigController/system/config/**系统参数配置
SysNoticeController/system/notice/**通知公告 CRUD
SysProfileController/system/user/profile/**个人信息修改/密码修改

6.3 监控模块 (/monitor)

Controller路由功能
CacheController/monitor/cache/**EhCache 缓存查看/清除
DruidController/monitor/druid/**Druid 监控页重定向
ServerController/monitor/server/**服务器信息 (CPU/内存/磁盘 via oshi)
SysLogininforController/monitor/logininfor/**登录日志查询/删除/导出
SysOperlogController/monitor/operlog/**操作日志查询/删除/导出
SysUserOnlineController/monitor/online/**在线用户列表/强退

6.4 工具模块 (/tool)

Controller路由功能
GenController/tool/gen/**代码生成(导入表、预览、生成下载)
SwaggerController/tool/swaggerSwagger UI 重定向
BuildController/tool/build/**表单构建器

7. 代码生成引擎

🔧 代码生成器工作原理
┌──────────────┐ ┌──────────────────┐ ┌──────────────────────┐ │ MySQL DB │────>│ information_schema │────>│ GenTableMapper │ │ (业务表) │ │ (元数据查询) │ │ GenTableColumnMapper │ └──────────────┘ └──────────────────┘ └──────────┬───────────┘ │ v ┌──────────────────────┐ │ GenTableServiceImpl │ │ (元数据处理 + 上下文) │ └──────────┬───────────┘ │ v ┌──────────────────────┐ │ Apache Velocity │ │ 模板引擎渲染 │ └──────────┬───────────┘ │ ┌──────────────────────┼──────────────────────┐ v v v ┌──────────┐ ┌──────────┐ ┌──────────┐ │ Java 代码 │ │ XML 映射 │ │ HTML 页面 │ │ .java │ │ .xml │ │ .html │ └──────────┘ └──────────┘ └──────────┘

7.1 14 个 Velocity 模板

模板生成物说明
domain.java.vm实体类继承 BaseEntity,@Excel 注解
sub-domain.java.vm子表实体主从表的从表实体
controller.java.vmControllerCRUD + 分页 + 导出 + 权限注解
mapper.java.vmMapper 接口MyBatis Mapper Interface
mapper.xml.vmMapper XMLSQL 映射(select/insert/update/delete)
service.java.vmService 接口业务方法定义
serviceImpl.java.vmService 实现业务逻辑 + 事务注解
list.html.vm列表页Bootstrap Table + 搜索表单
add.html.vm新增页表单页面
edit.html.vm编辑页表单页面(回显数据)
view.html.vm详情页只读展示
tree.html.vm树形选择关联字典/树表时使用
list-tree.html.vm树表列表左树右表布局
sql.vmSQL 脚本DDL + 菜单插入 SQL
💡 设计亮点:代码生成器不是简单的脚手架,它读取真实的数据库元数据,生成的代码完全符合 RuoYi 的编码规范(BaseEntity 继承、@Excel 注解、PageHelper 分页、AjaxResult 响应、Thymeleaf 模板),可以直接放入项目使用。

8. AOP 横切关注点

RuoYi 大量使用自定义注解 + AOP 切面实现横切关注点的解耦,是其架构的核心设计亮点:

注解切面功能实现原理
@Log LogAspect 操作日志自动记录 拦截 Controller 方法,记录操作人、IP、方法名、参数、耗时,异步写入 sys_oper_log
@DataScope DataScopeAspect 行级数据权限过滤 根据用户部门/角色,向 MyBatis 参数注入 SQL WHERE 条件
@DataSource DataSourceAspect 多数据源声明式切换 方法执行前设置 ThreadLocal 数据源标识,DynamicDataSource 据此路由
@RepeatSubmit 重复提交切面 防止表单重复提交 基于请求参数 Hash + 时间窗口判断
@PermissionsAspect 权限校验切面 方法级权限控制 通过 Shiro SecurityUtils.getSubject().isPermitted() 校验
⚡ 异步任务管理

AsyncManager + AsyncFactory 模式:

// 使用示例
AsyncManager.me().execute(AsyncFactory.recordLogininfor(
    username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")
));

8.1 自定义注解一览

注解所在模块用途
@Logruoyi-common操作日志记录
@DataScoperuoyi-common数据权限过滤
@DataSourceruoyi-common多数据源切换
@Excelruoyi-commonExcel 导入导出列映射
@RepeatSubmitruoyi-common防重复提交
@Sensitiveruoyi-common数据脱敏(手机号/身份证等)
@Anonymousruoyi-common匿名可访问端点(免认证)

9. 技术栈全景

技术版本用途
Java17运行时 (Jakarta EE 命名空间)
Spring Boot4.0.3应用框架 (WebMVC)
Apache Shiro2.1.0 (jakarta)认证、授权、会话管理
MyBatis4.0.1ORM / SQL 映射
Druid1.2.28数据库连接池 + SQL 监控
Thymeleaf-服务端 HTML 模板引擎
PageHelper2.1.1MyBatis 分页插件
EhCache-本地缓存(Shiro 缓存后端)
Quartz-定时任务调度
Apache Velocity2.3代码生成模板引擎
Kaptcha2.3.3验证码图片生成
Springdoc OpenAPI3.0.2Swagger UI / API 文档
MySQL8.x关系数据库
Apache POI4.1.2Excel 导入导出
oshi-core6.10.0服务器硬件监控(CPU/内存/磁盘)
YAUAA-User-Agent 解析(浏览器/OS 识别)
FastJSON1.2.83JSON 序列化
thymeleaf-extras-shiro-Thymeleaf 中的 Shiro 权限标签

10. 部署与监控

10.1 部署方式

方式说明
可执行 JARspring-boot-maven-plugin 打包,java -jar ruoyi-admin.jar 运行
WAR 部署maven-war-plugin 打 WAR,部署到外部 Tomcat
Linux 脚本ry.sh start|stop|restart|status
Windows 脚本ry.bat 交互式菜单(启动/停止/重启/状态)

10.2 JVM 调优参数

-Xms512m -Xmx1024m                           # 堆内存 512M~1G
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m  # 元空间
-XX:+HeapDumpOnOutOfMemoryError               # OOM 时 dump
-XX:+UseParallelGC -XX:+UseParallelOldGC      # 并行 GC
-Duser.timezone=Asia/Shanghai                 # 时区设置

10.3 内置监控能力

监控项实现入口
服务器状态oshi-core (CPU/内存/JVM/磁盘)/monitor/server
SQL 监控Druid StatView (慢 SQL >1s)/druid
在线用户Session-in-DB 查询/monitor/online
缓存监控EhCache 管理 UI/monitor/cache
操作日志@Log + LogAspect → sys_oper_log/monitor/operlog
登录日志AsyncFactory → sys_logininfor/monitor/logininfor
API 文档Springdoc OpenAPI 3/swagger-ui.html

10.4 EhCache 缓存策略

缓存名最大条目过期策略用途
loginRecordCache2000空闲 10 分钟密码错误次数跟踪(锁定机制)
sys-userCache10000永不过期活跃用户缓存
sys-authCache10000LRU 淘汰用户授权信息(角色/权限)
sys-config1000永久系统配置参数
sys-dict1000永久字典数据
shiro-activeSessionCache10000永不过期Shiro 活跃 Session

11. 学习要点与启发

🎓 架构设计启发

1. 单体应用的模块化思维

RuoYi 是单体应用,但通过 Maven 多模块实现了清晰的代码分层:common → system → framework → admin。每层职责明确,依赖单向,体现了"单体不等于混乱"的理念。

2. AOP 是框架的灵魂

@Log、@DataScope、@DataSource、@RepeatSubmit 等注解+切面的组合,让业务代码只需关注核心逻辑,横切关注点完全解耦。这是 RuoYi 最值得学习的设计模式。

3. Session-in-DB 的工程价值

将 Session 持久化到数据库,虽然性能不如 Redis,但实现简单、支持跨实例共享、且天然支持在线用户管理。对于中小型项目,这是务实的选择。

4. 代码生成器的深度集成

不是简单的模板脚手架,而是读取真实数据库元数据,生成的代码完全符合项目规范(BaseEntity、@Excel、PageHelper、Thymeleaf 模板),可直接生产使用。

5. 数据权限的行级安全

@DataScope 通过 AOP 自动向 SQL 注入过滤条件,实现行级数据安全。这种"声明式数据权限"比在每个查询中手动加条件优雅得多。

6. 服务端渲染的适用场景

Thymeleaf SSR + jQuery + Bootstrap 的组合虽然"传统",但对于后台管理系统来说开发效率极高:不需要前端构建工具、不需要 API 文档、前后端一体化部署。

📋 值得深入研究的点
🔄 与其他方案的对比
维度RuoYi (若依)Mall-Swarm (商城)
架构风格单体 (Monolith)微服务 (Microservices)
安全框架Apache ShiroSa-Token
前端方案Thymeleaf SSRUniApp (Vue 2)
配置管理application.ymlNacos Config Center
会话管理Shiro Session-in-DBRedis Token
适用场景后台管理系统C 端电商应用
部署复杂度单 JAR + MySQL多服务 + 中间件集群

📅 生成时间:2026-05-20 | 📁 项目路径:E:\workSpace\RuoYi

🤖 由 Claude Code 自动生成 | 📚 知识库:C:\Users\sunjie\Documents\我的知识库\技术项目知识库