若依(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); } (责任编辑:) |