若依(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); }