基于Spring Boot的权限管理系统——若依(RuoYi)结构代码分析(一)、总览
若依(RuoYi)是一款基于Spring Boot的权限管理系统,其代码结构清晰、模块化程度高,适合学习企业级项目开发。以下是对若依管理台后端工程的核心模块和代码结构的讲解:
一、项目结构概览
ruoyi-admin // 启动模块(主工程)
ruoyi-common // 公共模块(工具类、通用组件)
ruoyi-system // 系统模块(核心业务:用户、角色、菜单等)
ruoyi-framework // 框架模块(核心配置、权限控制)
ruoyi-generator // 代码生成模块
二、核心技术栈
- 核心框架:Spring Boot + MyBatis + Spring Security
- 权限控制:基于角色的访问控制(RBAC)、接口级权限注解
- 数据库:MySQL + Redis(缓存、会话管理)
- 工具类:Hutool工具库、Jackson序列化
- 其他:Swagger(API文档)、Quartz(定时任务)
三、核心模块详解
1. 权限控制(Spring Security)
- 认证流程:
- 用户登录 →
LoginService.login()
→ 生成Token(JWT或Redis Session) - 请求拦截 →
JwtAuthenticationTokenFilter
→ 验证Token并注入用户信息
- 用户登录 →
- 权限注解:
@PreAuthorize("@ss.hasPermi('system:user:list')") // 接口权限校验 public R list(...) { ... }
- 权限校验逻辑:
PermissionService
根据用户角色动态加载权限数据- 权限数据缓存到Redis,避免频繁查询数据库
2. 系统管理模块(ruoyi-system)
- 核心实体:
SysUser
(用户)、SysRole
(角色)、SysMenu
(菜单)
- 数据库表关系:
- 用户 ↔ 角色(多对多,
sys_user_role
表) - 角色 ↔ 菜单(多对多,
sys_role_menu
表)
- 用户 ↔ 角色(多对多,
- 关键代码:
SysUserController
:用户管理接口(增删改查)SysRoleService
:角色权限分配逻辑SysMenuServiceImpl.buildMenuTree()
:递归构建菜单树
3. 代码生成器(ruoyi-generator)
- 作用:通过数据库表自动生成Controller、Service、Mapper代码
- 核心类:
GenTable
:表信息模型VelocityInitializer
:模板引擎生成代码
- 配置文件:
generator.yml
:配置包路径、作者信息等
4. 通用工具类(ruoyi-common)
- 常用工具:
SecurityUtils
:获取当前登录用户ServletUtils
:处理HTTP请求响应StringUtils
:字符串处理ExcelUtil
:POI封装导出Excel
四、核心配置解析
- 全局配置:
application.yml
(数据源、Redis、Swagger开关) - 安全配置:
SecurityConfig
(放行路径、密码加密方式) - MyBatis配置:
MyBatisConfig
(分页插件、事务管理) - 跨域配置:
CorsConfig
(全局跨域处理)
五、代码特点
- 分层清晰:Controller → Service → Mapper
- 注解驱动:
@DataScope
(数据权限过滤)、@Log
(操作日志) - 动态SQL:使用MyBatis动态标签(如
<if>
、<foreach>
) - 缓存优化:高频数据(如菜单、字典)缓存到Redis
- 异常处理:全局异常处理器
GlobalExceptionHandler
六、学习建议
- 从登录流程切入:跟踪
LoginController
→AuthenticationManager
→UserDetailsService
- 调试权限注解:修改
@PreAuthorize
观察接口拦截效果 - 扩展新模块:通过代码生成器创建新表,生成CRUD代码
- 定制数据权限:参考
@DataScope
实现部门数据过滤 - 学习前端交互:结合若依前端代码(Vue)理解接口调用
示例:用户登录流程
// 登录入口
@PostMapping("/login")
public R login(@RequestBody LoginBody loginBody) {
String token = loginService.login(loginBody.getUsername(), loginBody.getPassword());
return R.ok().put("token", token);
}
// 实际认证逻辑(LoginService)
public String login(String username, String password) {
// 1. 用户验证
Authentication authentication = authenticationManager.authenticate(...);
// 2. 生成Token
return tokenService.createToken(loginUser);
}
posted on 2025-02-25 15:53 随便聊聊然后记住我id 阅读(1049) 评论(0) 收藏 举报