基于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(全局跨域处理)

五、代码特点

  1. 分层清晰:Controller → Service → Mapper
  2. 注解驱动@DataScope(数据权限过滤)、@Log(操作日志)
  3. 动态SQL:使用MyBatis动态标签(如<if><foreach>
  4. 缓存优化:高频数据(如菜单、字典)缓存到Redis
  5. 异常处理:全局异常处理器GlobalExceptionHandler

六、学习建议

  1. 从登录流程切入:跟踪LoginControllerAuthenticationManagerUserDetailsService
  2. 调试权限注解:修改@PreAuthorize观察接口拦截效果
  3. 扩展新模块:通过代码生成器创建新表,生成CRUD代码
  4. 定制数据权限:参考@DataScope实现部门数据过滤
  5. 学习前端交互:结合若依前端代码(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)    收藏  举报

导航