通用后台权限管理系统源码 前端采用?vue-element-admin。 后端采用 Spring Boot、MySQL、Redis。 权限认证使用 Spring Security & Token,支持多终端认证系统。 支持加载动态权限菜单,多方式轻松权限控制。 高效率开发,使用代码生成器可以一键生成前后端代码。 内置功能 分成三种内置功能: 系统功能 基础设施 研发工具 友情提示:本项目基于 RuoYi-Vue 修改,重构优化后端的代码,美化前端的界面。 额外新增的功能,我们使用??标记。 ?所有功能,都通过?单元测试?保证高质量。 系统功能 功能描述 用户管理 用户是系统操作者,该功能主要完成系统用户配置 在线用户 当前系统中活跃用户状态监控,支持手动踢下线 角色管理 角色菜单权限分配、设置角色按机构进行数据范围权限划分 菜单管理 配置系统菜单,操作权限,按钮权限标识等 部门管理 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限 岗位管理 配置系统用户所属担任职务 字典管理 对系统中经常使用的一些较为固定的数据进行维护 短信管理 短信渠道、短息模板、短信日志,对接阿里云、云片等主流短信平台 操作日志 系统正常操作日志记录和查询,集成 Swagger 生成日志内容 登录日志 系统登录日志记录查询,包含登录异常 错误码管理 系统所有错误码的管理,可在线修改错误提示,无需重启服务 通知公告 系统通知公告信息发布维护 基础设施 功能描述 配置管理 对系统动态配置常用参数,支持 SpringBoot 加载 定时任务 在线(添加、修改、删除)任务调度包含执行结果日志 文件服务 支持本地文件存储,同时支持兼容 Amazon S3 协议的云服务、开源组件 API 日志 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 MySQL 监控 监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈 Redis 监控 监控 Redis 数据库的使用情况,使用的 Redis Key 管理 Java 监控 基于 Spring Boot Admin 实现 Java 应用的监控 链路追踪 接入 SkyWalking 组件,实现链路追踪 日志中心 接入 SkyWalking 组件,实现日志中心 分布式锁 基于 Redis 实现分布式锁,满足并发场景 幂等组件 基于 Redis 实现幂等组件,解决重复请求问题 服务保障 基于 Resilience4j 实现服务的稳定性,包括限流、熔断等功能 日志服务 轻量级日志中心,查看远程服务器的日志 单元测试 基于 JUnit + Mockito 实现单元测试,保证功能的正确性、代码的质量等 研发工具 功能描述 代码生成 前后端代码的生成(Java、Vue、SQL、单元测试),支持 CRUD 下载 系统接口 基于 Swagger 自动生成相关的 RESTful API 接口文档 数据库文档 基于 Screw 自动生成数据库文档,支持导出 Word、HTML、MD 格式 表单构建 拖动表单元素生成相应的 HTML 代码 项目说明 yudao-dependencies Maven 依赖版本管理 yudao-framework Java 框架拓展 yudao-admin-server 管理后台的服务端 yudao-admin-ui 管理后台的 UI 界面 yudao-user-server 用户前台的服务端 yudao-user-ui 用户前台的 UI 界面 后端 框架说明版本学习指南 Spring Boot 应用开发框架 2.4.5 文档 MySQL 数据库服务器 5.7 Druid JDBC 连接池、监控组件 1.2.4 文档 MyBatis Plus MyBatis 增强工具包 3.4.1 文档 Dynamic Datasource 动态数据源 3.3.2 文档 Redis key-value 数据库 5.0 Redisson Redis 客户端 3.1.46 文档 Spring MVC MVC 框架 5.4.6 文档 Spring Secu
「这后台权限系统真带劲!」同事老张叼着牙签凑过来,盯着我屏幕里的动态菜单树啧啧称奇。确实,这套基于RuoYi-Vue深度魔改的系统,前后端分离架构玩得贼溜。今儿咱们就掰开揉碎看看,怎么用Spring Security和Vue实现丝滑的权限控制。
一、权限系统心脏跳动的秘密
核心的JWT拦截器长这样:
@Component public class JwtTokenFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String token = getToken(request); if (StringUtils.hasText(token) && jwtTokenProvider.validateToken(token)) { Authentication authentication = jwtTokenProvider.getAuthentication(token); SecurityContextHolder.getContext().setAuthentication(authentication); } chain.doFilter(request, response); } // 从Header/Param/Cookie三处掏token,够贴心吧? private String getToken(HttpServletRequest request) {...} }这拦截器就像个尽职的门卫,从请求的各个角落翻找token。一旦验证通过,直接把用户信息塞进SecurityContext,后续接口鉴权直接开绿灯。
二、动态菜单的魔法时刻
前端用vue-element-admin的addRoutes动态挂载路由:
// 在permission.js拦截路由 router.beforeEach(async (to, from, next) => { if (!store.getters.menusLoaded) { const { menus } = await store.dispatch('user/getInfo') const routes = generateRoutes(menus) router.addRoutes(routes) // 动态注入路由 next({ ...to, replace: true }) } else { next() } })妙就妙在generateRoutes这步,把后端返回的菜单树转成Vue路由对象。我见过有的系统要重启才能更新菜单,这货直接热更新,权限变更秒级生效。
三、代码生成器:真·生产力工具
后端基于MyBatis-Plus的代码生成器:
FastAutoGenerator.create(dataSourceConfig) .globalConfig(builder -> builder.author("芋道").outputDir("...")) .packageConfig(builder -> builder.parent("com.yudao")) .strategyConfig(builder -> { builder.addInclude("sys_user") // 指定表名 .entityBuilder().enableLombok() .controllerBuilder().enableRestStyle(); }) .injectionConfig(builder -> { builder.customMap(Collections.singletonMap("basePackage", "com.yudao")); }).execute();运行这段代码,自动生成Entity、Mapper、Service、Controller四层代码,连Swagger注解都给打好了。上次我接手个CRUD模块,从建表到接口发布只用了15分钟——这效率老板看了直呼内行。
四、监控三板斧够硬核
运维最爱的监控面板可不是花架子,来看个Redis监控的硬核实现:
@RestController @RequestMapping("/monitor/redis") public class RedisMonitorController { @Autowired private RedisTemplate<String, Object> redisTemplate; @GetMapping("/keys-size") public Result<Map<String, Object>> getKeysSize() { Properties info = redisTemplate.getRequiredConnectionFactory() .getConnection().serverCommands().info("memory"); return Result.success(new HashMap<String, Object>(){{ put("usedMemory", info.getProperty("used_memory")); put("totalKeys", redisTemplate.keys("*").size()); }}); } }直接调用Redis原生INFO命令,内存占用、Key数量一目了然。配合Spring Boot Admin的健康监控,运维小哥再也不用半夜爬起来查日志了。
这套系统最让我服气的是细节处理。比如分布式锁用Redisson实现得相当优雅:
public void doSomething(String lockKey) { RLock lock = redissonClient.getLock(lockKey); try { if (lock.tryLock(3, 30, TimeUnit.SECONDS)) { // 业务逻辑 } } finally { if (lock.isHeldByCurrentThread()) { lock.unlock(); } } }自动续期、可重入、超时控制这些坑都填平了。上次促销活动扛住了5万QPS,这锁的设计功不可没。
从ruoyi-vue重构过来,团队最大的感受是代码可测试性大幅提升。你看这个带@MockBean的单元测试:
@SpringBootTest class UserServiceTest { @MockBean private UserMapper userMapper; @Test void testGetUser() { when(userMapper.selectById(1L)).thenReturn(new User().setUsername("test")); User user = userService.getUser(1L); assertEquals("test", user.getUsername()); } }用Mockito模拟数据库操作,测试用例跑得飞起。现在每次提交前必须通过500+测试用例,线上bug直接腰斩。
前后端代码规约严格得令人发指,连MyBatis的XML文件都带着注释模板:
<!-- 按名字模糊查用户 --> <select id="selectByName" resultMap="UserResult"> SELECT * FROM sys_user WHERE del_flag = 0 <if test="name != null and name != ''"> AND username LIKE CONCAT('%', #{name}, '%') </if> </select>这种规范程度,新人接手第一天就能愉快地搬砖。要说遗憾嘛,要是能把TDD实践再加强下就更完美了——不过对于开源项目来说,现在的完成度已经够炸场子了。