前言
最近在JavaWeb课程中完成了一个基于RuoYi-Vue的企业级后台管理系统开发实验。从环境搭建到功能实现,整个过程让我对Spring Boot + Vue前后端分离架构有了更深入的理解。RuoYi-Vue是一套全部开源的快速开发平台,基于经典技术组合(Spring Boot、Spring Security、MyBatis、Jwt、Vue),内置了部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、代码生成等模块。本文将记录这次实验的核心内容与收获。
一、项目概述
RuoYi-Vue是一个Java EE企业级快速开发平台,采用前后端分离架构。对于后台管理系统来讲,RuoYi-Vue实现的功能非常全面,基本做到了开箱即用。本次实验使用的是RuoYi-Vue v3.9.2版本,主要目的是掌握企业级Java快速开发框架的设计思想,学习RBAC权限模型的实现方式,以及熟悉JWT认证机制的工作原理。
二、技术栈与环境
整个项目的技术选型比较主流:
| 项目 | 版本/配置 |
|---|---|
| 后端框架 | Spring Boot 4.0.6 |
| 前端框架 | Vue 2.x + Element UI |
| JDK版本 | JDK 17+ |
| 数据库 | MySQL 8.x |
| 缓存 | Redis 6.x |
| ORM框架 | MyBatis 4.0.1 |
| 连接池 | Druid 1.2.28 |
| 项目构建 | Maven |
| 权限认证 | JWT + Spring Security |
RuoYi-Vue后端采用Spring Boot、Spring Security、Redis和Jwt,权限认证使用Jwt,支持多终端认证系统。
三、数据库设计
系统使用MySQL数据库,数据库名为ry-vue,共包含20余张数据表,主要分为系统管理、监控日志、定时任务、代码生成四大模块。
3.1 核心表设计
部门表(sys_dept) 采用树形结构设计,通过parent_id和ancestors字段实现无限级部门嵌套。ancestors字段存储从根节点到当前节点的完整路径(如0,100,101),便于查询某部门下的所有子部门。
用户信息表(sys_user) 记录了用户的核心信息,其中密码字段使用BCrypt加密存储。BCrypt是一种强哈希函数,即使密码相同,每次加密后生成的密文也不同,有效增强了密码安全性。
角色信息表(sys_role) 通过data_scope字段控制数据范围,支持全部数据、自定义、本部门、本部门及以下、仅本人五种数据权限级别。
菜单权限表(sys_menu) 支持三级结构:目录(M)→ 菜单(C)→ 按钮(F),通过perms字段存储权限标识(如system:user:list),实现按钮级的细粒度权限控制。
3.2 表关系
用户与角色为多对多 关系,通过sys_user_role关联表实现;角色与菜单同样为多对多 关系,通过sys_role_menu关联表实现菜单权限分配。这正是RBAC(基于角色的访问控制)模型的核心------将权限分配给角色、再将角色分配给用户。
四、系统架构
4.1 多模块Maven结构
项目采用Maven多模块设计,各模块职责清晰:
- ruoyi-admin:启动模块,包含Controller和启动类
- ruoyi-common:通用工具,包含注解、常量、工具类
- ruoyi-framework:核心框架,包含安全配置、拦截器
- ruoyi-system:系统模块,包含业务逻辑
- ruoyi-quartz:定时任务模块
- ruoyi-generator:代码生成模块
- ruoyi-ui:前端Vue项目
这种模块化设计使项目职责清晰,便于维护和扩展。
4.2 核心配置
数据源配置使用了阿里巴巴的Druid连接池,配置了初始连接数5个、最小空闲连接10个、最大活跃连接20个。
JWT Token配置 :请求头标识为Authorization,设置密钥和30分钟的有效期。
五、核心功能实现
5.1 登录认证流程
登录认证是整个系统的入口,核心流程如下:
- 前端提交用户名、密码、验证码到
/login接口 - 后端验证验证码正确性
- 验证用户名密码(BCrypt加密比对)
- 生成JWT Token返回前端
- 前端存储Token,后续请求通过Header携带
登录成功后,系统自动获取当前用户信息与权限菜单,进入首页。RuoYi-Vue的登录模块采用分层防御策略,包含前置校验层、认证层、授权层等多个安全层次。
5.2 权限控制
RuoYi采用改进型RBAC模型,构建了"用户-角色-菜单-接口-数据"的多级管控体系。权限管理包括菜单权限、按钮权限和数据权限三个维度。
接口层面采用Spring Security的@PreAuthorize注解进行权限控制:
java
@PreAuthorize("@ss.hasPermi('system:user:list')")
@GetMapping("/list")
public TableDataInfo list(SysUser user) { ... }
菜单权限控制用户能否看到某个菜单项,操作权限控制用户能否执行特定的操作(如查询、新增、修改、删除等)。
5.3 前端路由动态加载
登录成功后,后端根据用户角色返回对应的菜单列表,前端动态生成路由:
java
@GetMapping("getRouters")
public AjaxResult getRouters() {
Long userId = SecurityUtils.getUserId();
List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
return AjaxResult.success(menuService.buildMenus(menus));
}
前端使用Vue.js进行权限拦截,确保菜单和按钮的可见性与用户权限匹配。
5.4 代码生成器
RuoYi内置了强大的代码生成器,在线配置表信息即可生成对应的前后端代码,包含增删改查、排序、导出、权限控制等操作,编译即可使用。这极大提高了开发效率,特别适合业务边界清晰、迭代节奏可控的中小型系统。
六、实验结果
经过功能测试,所有核心模块均通过验证:
| 功能模块 | 测试结果 | 说明 |
|---|---|---|
| 用户登录 | ✅ 通过 | 支持验证码、JWT认证 |
| 用户管理 | ✅ 通过 | 增删改查、导入导出 |
| 部门管理 | ✅ 通过 | 树形结构展示 |
| 角色管理 | ✅ 通过 | 权限分配功能 |
| 菜单管理 | ✅ 通过 | 动态菜单加载 |
| 字典管理 | ✅ 通过 | 数据字典维护 |
| 操作日志 | ✅ 通过 | 日志记录完整 |
| 代码生成 | ✅ 通过 | 一键生成代码 |
性能方面,页面响应时间小于200ms,API接口响应小于100ms,支持100以上的并发数。
七、总结与思考
7.1 技术收获
通过这次实验,我对以下几个方面有了更深入的理解:
- 前后端分离架构:前端Vue负责展示,后端Spring Boot提供API,通过JWT实现无状态认证,前后端通过接口文档进行协作。
- RBAC权限模型 :理解了用户-角色-菜单的多对多关系设计,以及如何通过
@PreAuthorize注解实现接口级别的权限控制。 - 数据库设计模式 :学习了树形结构表设计(
ancestors字段)、软删除(del_flag字段)、BCrypt密码加密等企业级开发中的常见实践。 - 模块化开发:Maven多模块结构使项目职责清晰,便于团队协作和后期维护。
7.2 框架亮点
RuoYi-Vue作为一个成熟的快速开发平台,有几个非常突出的优点:
- 开箱即用:内置了企业后台管理系统所需的绝大部分功能模块
- 文档完善:官方文档非常细致且全部公开
- 代码生成器:一键生成CRUD代码,大幅提升开发效率
- 权限体系完善:从菜单到按钮再到数据,层层递进的权限控制
7.3 改进方向
当然,任何框架都有提升空间。对于RuoYi-Vue,可以考虑:
- 引入微服务架构以支持更大规模的应用场景
- 增加自动化测试用例,提高代码质量保障
- 优化前端性能(CDN加速、路由懒加载等)
参考资料
- RuoYi-Vue官方文档:http://doc.ruoyi.vip
- Spring Boot官方文档:https://spring.io/projects/spring-boot
- Vue.js官方文档:https://vuejs.org
- MyBatis官方文档:https://mybatis.org/mybatis-3/
以上就是本次RuoYi-Vue后台管理开发实验的全部记录。从数据库设计到前后端联调,从权限配置到代码生成,整个过程让我对现代企业级开发有了更直观的认识。如果你也在学习JavaWeb开发,RuoYi-Vue会是一个很好的学习范本。