RuoYi-Vue-Plus 实战指南:多租户后台管理系统从零跑通到选型判断【免费下载链接】RuoYi-Vue-Plus多租户后台管理系统 重写RuoYi-Vue所有功能 集成 Sa-Token、Mybatis-Plus、WarmFlow、SpringDoc、Hutool、OSS 定期同步项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-PlusRuoYi-Vue-Plus 是 Dromara 团队对 RuoYi-Vue 的完全重写版后端(当前版本 6.0.0,基于 Spring Boot 4.1 + JDK 21),面向需要多租户、审批流、分布式能力的团队,开箱提供用户/角色/菜单、文件存储、定时任务、工作流等一整套后台能力。适合已经在用或准备选型 RuoYi 系框架的 Java 后端团队。本文按"先跑起来,再讲场景,最后给选型结论"的顺序组织。一、初体验:从克隆到登录页面(一条流程走通)整条链路只有 4 步,全部依赖已就绪(JDK 21、Maven 3.6+、MySQL 8、Redis 6+):git clone https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-Plus cd RuoYi-Vue-Plus mysql -uroot -proot -e "CREATE DATABASE `ry-vue` DEFAULT CHARACTER SET utf8mb4" source script/sql/ry_vue.sql # 主库;如需工作流再导入 ry_workflow.sql启动:执行 ruoyi-admin/ 下的 DromaraApplication.java,默认端口 8080。前端另有一个配套的 plus-ui 项目(README 中有地址),构建后走 nginx 反代。默认管理员账号登录后即可看到菜单管理、角色管理、代码生成等页面,接口文档地址在/api-docs(SpringDoc 分组扫描见 application.yml 的springdoc.group-configs)。不想手动装 MySQL/Redis/MinIO 的话,直接用 script/docker/docker-compose.yml,它编排了 mysql 8.4.9、redis 8.6.3、minio、nginx 和两台ruoyi/ruoyi-server:6.0.0应用容器(server1/server2 双节点,用来演示分布式会话与分布式锁场景);换 Oracle/PostgreSQL/SQLServer 则看 script/docker/database.yml,对应的建库脚本在 script/sql/ 下的 oracle、postgres、sqlserver 子目录,文件名一一对应。注意一点:spring.profiles.active由 Maven profile 注入,根 pom.xml 里dev是默认激活的(对应 application-dev.yml),local和prod各一份配置,改配置前先确认自己跑的是哪个 profile。二、场景地图:它替你把哪些业务问题解决了不按模块罗列,直接说你能拿它交付的东西:数据范围隔离(权限场景)。给 Mapper 方法挂@DataPermission注解,框架在 SQL 执行前自动拼上部门/角色的行级过滤条件。业务代码不用写任何where dept_id in (...),换查询方法、加 join 表都继续生效。示例见 TestDemoMapper.java。接口级鉴权。基于 Sa-Token,@SaCheckLogin、@SaCheckRole、@SaCheckPermission、二级认证校验直接写在 Controller 上,角色与权限支持AND、OR这类组合表达式(演示代码在 SaTokenTestController.java)。登录侧是策略模式:密码、短信、邮箱、扫码(Xcx)、第三方社交登录(JustAuth)各是一个策略类,统一在 IAuthStrategy.java 后面扩展即可。审批流。工作流模块用 WarmFlow 1.8.9 实现转办、委派、加减签、会签/或签/票签,自带流程图设计器 UI(warm-flow.ui: true)。请假流程的演示定义就在 script/leave/ 下的 6 个 JSON 文件,导入后可以在页面上直接发起、审批、跟踪。多租户与套餐。仓库 README 将"针对分布式集群场景全方位升级"作为项目定位,多租户是其核心方向(TenantLineInnerInterceptor在 MybatisPlusConfig.java 的插件清单注释中列为标准接入点);社区另有"删除多租户与工作流"的精简分支,单租户项目不必背着这两套能力。后台运营基座。用户/部门/岗位/菜单/字典/参数/通知公告、操作日志与登录日志、在线用户踢出、缓存监控、服务监控(SpringBoot-Admin)、文件管理(MinIO + 一切 S3 协议云存储)、代码生成器(设计好表结构一键生成 CRUD 与前端页面)。三、深挖:数据权限注解与登录策略这两个最值钱的技术点3.1@DataPermission:一行注解替代手写过滤 SQL实现链路很短,读一遍源码就有底:入口是 PlusDataPermissionInterceptor.java。它继承 Mybatis-Plus 的BaseMultiTableInnerInterceptor,在beforeQuery处理 SELECT,在beforePrepare处理 UPDATE/DELETE,用 jsqlparser 解析出Table节点后逐个改写 WHERE 子句——所以多表 join、子查询、union(SetOperationList分支)都能覆盖。规则由 PlusDataPermissionHandler.java 提供,它从@DataPermission注解读取条件并拼装 SQL 片段;上下文缺失时会抛"数据权限上下文缺失"异常,而不是静默放行。拦截器顺序在 MybatisPlusConfig.java 里固定为:数据权限 → 分页 → 乐观锁,且注册了一个完整 SQL 日志拦截器(mybatis-plus.sql-log.enabled: true时开启),控制台能直接看到改写前后的 SQL。收益很直接:权限规则收敛在 Mapper 层一处声明,业务 Service 完全不感知;新人写新查询方法时不会"忘记加过滤条件"。代价是复杂动态 SQL 要验证一下改写结果,建议上线前用 sql-log 把关键接口的 SQL 抽查一遍。3.2 登录策略:加一种登录方式不碰主流程ruoyi-admin/src/main/java/org/dromara/web/service/impl/ 下有 5 个策略实现:PasswordAuthStrategy、SmsAuthStrategy、EmailAuthStrategy、XcxAuthStrategy(小程序)、SocialAuthStrategy(微信/钉钉等三方),每个只实现IAuthStrategy接口里的校验逻辑;登录成功后通过 UserLoginSuccessEvent.java 发 Spring 事件,UserLoginSuccessListener.java 负责后续动作(如在线用户登记)。想接一个新的登录方式(比如企业 LDAP),流程是:新建一个策略类 → 注册为 Spring Bean → 在客户端管理页面给它开登录方式。客户端维度的登录方式、token 时效都是数据库里可配置的(对应SysClientController管理的sys_client表),不用改代码就能控制"PC 端只许密码登录、小程序端只许授权登录"。四、配置说明:启动前必改的 5 项配置位置作用怎么改application-dev.ymlspring.datasource.dynamic.datasource.master主库连接改成你的jdbc:mysql://host:3306/ry-vue?...、账号、密码;换 Oracle/PG/SQLServer 时同文件里有注释好的示例块,取消注释切换driverClassName即可同文件spring.data.redis缓存/会话/分布式锁依赖默认密码写死为ruoyi123,上线前必须替换;哨兵/集群模式需改对应连接配置application.ymlsa-token.jwt-secret-keytoken 签发密钥默认是abcdefghijklmnopqrstuvwxyz,生产环境换成随机长串同文件api-decrypt.publicKey/privateKey请求/响应 body 加解密的 RSA 密钥对(api-decrypt.enabled默认true)官方注释明确写了"使用者请自行更换",需前后端同步替换同文件server.port应用端口,默认 8080与本地其它服务冲突时直接改;docker 部署时也可用环境变量SERVER_PORT覆盖(见 docker-compose 的 server1 定义)其余配置(验证码captcha.type: math、文件上传max-file-size: 10MB、工作流warm-flow.enabled: true、MQTT/ES/SnailJob/SnailAI 等)默认值可直接跑通,用到哪块再开哪块,不必一次读完 384 行。五、踩坑手册:现象 → 原因 → 解法现象原因解法启动报 8080 端口被占默认端口与本地服务冲突改server.port,或停掉占用进程登录接口 401/报 token 无效,换了密钥后前端突然全挂前后端加解密密钥没同步换api-decrypt的公私钥与前端约定的密钥是一对,必须成对替换集群下雪花 ID 重复多台机器同网段时默认工作号冲突框架已用本机网卡 MAC 绑定雪花生成器(见idGenerator()),确认各节点网卡地址不同即可列表页 SQL 没带部门过滤Mapper 方法没声明数据权限条件在方法上加@DataPermission并配置维度;确认没有走willIgnoreDataPermission的豁免路径分页插件与排序冲突、批量写入慢分页合理化、批处理参数默认值PaginationInnerInterceptor已开setOverflow(true);MySQL 批量写慢时确认 url 里带rewriteBatchedStatements=true(dev 配置默认带)用 Redis 7/8 的客户端特性报兼容问题Redisson 4.6.1 对旧版 Redis 的语法差异项目声明支持 Redis 6+,先对齐版本;分布式限流、队列等新特性依赖 Redis 6 语法工作流页面打不开设计器warm-flow.ui被关闭或静态路径被拦检查warm-flow.ui: true,以及security.excludes是否包含/warm-flow-ui/configDocker 部署数据丢了数据目录挂载在宿主机/docker/...下备份时注意 mysql、redis、minio 的挂载卷路径(docker-compose 中已写明)六、选型参考:什么团队该用,什么团队别用适合:中台/多部门后台,需要"部门-角色-菜单-按钮"四级权限和数据范围控制,且不想自己维护这套过滤逻辑;有审批业务(请假、报销、用章),想省掉自研流程引擎的几个月;团队用 Spring Boot 3/4 + MyBatis-Plus 技术栈,希望框架把缓存(Redisson)、分布式锁(Lock4j)、任务调度(SnailJob)、文件(MinIO/S3)、短信(sms4j)、Excel 这些轮子都选好了;需要国产化数据库适配(Oracle、PostgreSQL、SQLServer 脚本齐全,达梦/金仓走 MyBatis-Plus 方言支持)。不适合:只要单租户单节点、逻辑简单的内部小工具——这套框架的模块数和依赖面(工作流、AI、MQTT、ES 全是可选但都预置在依赖树里)对你就是负担,社区有删减多租户与工作流的 Single 分支可以考虑;需要严格微服务拆分的架构——它是"单体 + 分布式能力"的定位,不是一套微服务脚手架;团队不熟 Java 生态,或前端要 Vue2 老版本——官方前端是 Vue3 + TS + Element Plus 重写的,老 Vue2 前端不能直接对接。七、小结与下一步RuoYi-Vue-Plus 的价值一句话:把权限隔离、审批流、文件与任务调度这些"每个后台都要做一遍"的事做成了默认值,你只需要写业务表和业务逻辑。下一步建议:先用script/sql/ry_vue.sql建库启动一次,然后用代码生成器对一张真实业务表生成 CRUD,跑通"建表 → 生成 → 挂 @DataPermission → 接口文档验收"这整条链路,半天内你就能判断它和你项目的契合度。【免费下载链接】RuoYi-Vue-Plus多租户后台管理系统 重写RuoYi-Vue所有功能 集成 Sa-Token、Mybatis-Plus、WarmFlow、SpringDoc、Hutool、OSS 定期同步项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-Plus创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RuoYi-Vue-Plus 实战指南:多租户后台管理系统从零跑通到选型判断【免费下载链接】RuoYi-Vue-Plus多租户后台管理系统 重写RuoYi-Vue所有功能 集成 Sa-Token、Mybatis-Plus、WarmFlow、SpringDoc、Hutool、OSS 定期同步项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-PlusRuoYi-Vue-Plus 是 Dromara 团队对 RuoYi-Vue 的完全重写版后端(当前版本 6.0.0,基于 Spring Boot 4.1 + JDK 21),面向需要多租户、审批流、分布式能力的团队,开箱提供用户/角色/菜单、文件存储、定时任务、工作流等一整套后台能力。适合已经在用或准备选型 RuoYi 系框架的 Java 后端团队。本文按"先跑起来,再讲场景,最后给选型结论"的顺序组织。一、初体验:从克隆到登录页面(一条流程走通)整条链路只有 4 步,全部依赖已就绪(JDK 21、Maven 3.6+、MySQL 8、Redis 6+):git clone https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-Plus cd RuoYi-Vue-Plus mysql -uroot -proot -e "CREATE DATABASE `ry-vue` DEFAULT CHARACTER SET utf8mb4" source script/sql/ry_vue.sql # 主库;如需工作流再导入 ry_workflow.sql启动:执行 ruoyi-admin/ 下的 DromaraApplication.java,默认端口 8080。前端另有一个配套的 plus-ui 项目(README 中有地址),构建后走 nginx 反代。默认管理员账号登录后即可看到菜单管理、角色管理、代码生成等页面,接口文档地址在/api-docs(SpringDoc 分组扫描见 application.yml 的springdoc.group-configs)。不想手动装 MySQL/Redis/MinIO 的话,直接用 script/docker/docker-compose.yml,它编排了 mysql 8.4.9、redis 8.6.3、minio、nginx 和两台ruoyi/ruoyi-server:6.0.0应用容器(server1/server2 双节点,用来演示分布式会话与分布式锁场景);换 Oracle/PostgreSQL/SQLServer 则看 script/docker/database.yml,对应的建库脚本在 script/sql/ 下的 oracle、postgres、sqlserver 子目录,文件名一一对应。注意一点:spring.profiles.active由 Maven profile 注入,根 pom.xml 里dev是默认激活的(对应 application-dev.yml),local和prod各一份配置,改配置前先确认自己跑的是哪个 profile。二、场景地图:它替你把哪些业务问题解决了不按模块罗列,直接说你能拿它交付的东西:数据范围隔离(权限场景)。给 Mapper 方法挂@DataPermission注解,框架在 SQL 执行前自动拼上部门/角色的行级过滤条件。业务代码不用写任何where dept_id in (...),换查询方法、加 join 表都继续生效。示例见 TestDemoMapper.java。接口级鉴权。基于 Sa-Token,@SaCheckLogin、@SaCheckRole、@SaCheckPermission、二级认证校验直接写在 Controller 上,角色与权限支持AND、OR这类组合表达式(演示代码在 SaTokenTestController.java)。登录侧是策略模式:密码、短信、邮箱、扫码(Xcx)、第三方社交登录(JustAuth)各是一个策略类,统一在 IAuthStrategy.java 后面扩展即可。审批流。工作流模块用 WarmFlow 1.8.9 实现转办、委派、加减签、会签/或签/票签,自带流程图设计器 UI(warm-flow.ui: true)。请假流程的演示定义就在 script/leave/ 下的 6 个 JSON 文件,导入后可以在页面上直接发起、审批、跟踪。多租户与套餐。仓库 README 将"针对分布式集群场景全方位升级"作为项目定位,多租户是其核心方向(TenantLineInnerInterceptor在 MybatisPlusConfig.java 的插件清单注释中列为标准接入点);社区另有"删除多租户与工作流"的精简分支,单租户项目不必背着这两套能力。后台运营基座。用户/部门/岗位/菜单/字典/参数/通知公告、操作日志与登录日志、在线用户踢出、缓存监控、服务监控(SpringBoot-Admin)、文件管理(MinIO + 一切 S3 协议云存储)、代码生成器(设计好表结构一键生成 CRUD 与前端页面)。三、深挖:数据权限注解与登录策略这两个最值钱的技术点3.1@DataPermission:一行注解替代手写过滤 SQL实现链路很短,读一遍源码就有底:入口是 PlusDataPermissionInterceptor.java。它继承 Mybatis-Plus 的BaseMultiTableInnerInterceptor,在beforeQuery处理 SELECT,在beforePrepare处理 UPDATE/DELETE,用 jsqlparser 解析出Table节点后逐个改写 WHERE 子句——所以多表 join、子查询、union(SetOperationList分支)都能覆盖。规则由 PlusDataPermissionHandler.java 提供,它从@DataPermission注解读取条件并拼装 SQL 片段;上下文缺失时会抛"数据权限上下文缺失"异常,而不是静默放行。拦截器顺序在 MybatisPlusConfig.java 里固定为:数据权限 → 分页 → 乐观锁,且注册了一个完整 SQL 日志拦截器(mybatis-plus.sql-log.enabled: true时开启),控制台能直接看到改写前后的 SQL。收益很直接:权限规则收敛在 Mapper 层一处声明,业务 Service 完全不感知;新人写新查询方法时不会"忘记加过滤条件"。代价是复杂动态 SQL 要验证一下改写结果,建议上线前用 sql-log 把关键接口的 SQL 抽查一遍。3.2 登录策略:加一种登录方式不碰主流程ruoyi-admin/src/main/java/org/dromara/web/service/impl/ 下有 5 个策略实现:PasswordAuthStrategy、SmsAuthStrategy、EmailAuthStrategy、XcxAuthStrategy(小程序)、SocialAuthStrategy(微信/钉钉等三方),每个只实现IAuthStrategy接口里的校验逻辑;登录成功后通过 UserLoginSuccessEvent.java 发 Spring 事件,UserLoginSuccessListener.java 负责后续动作(如在线用户登记)。想接一个新的登录方式(比如企业 LDAP),流程是:新建一个策略类 → 注册为 Spring Bean → 在客户端管理页面给它开登录方式。客户端维度的登录方式、token 时效都是数据库里可配置的(对应SysClientController管理的sys_client表),不用改代码就能控制"PC 端只许密码登录、小程序端只许授权登录"。四、配置说明:启动前必改的 5 项配置位置作用怎么改application-dev.ymlspring.datasource.dynamic.datasource.master主库连接改成你的jdbc:mysql://host:3306/ry-vue?...、账号、密码;换 Oracle/PG/SQLServer 时同文件里有注释好的示例块,取消注释切换driverClassName即可同文件spring.data.redis缓存/会话/分布式锁依赖默认密码写死为ruoyi123,上线前必须替换;哨兵/集群模式需改对应连接配置application.ymlsa-token.jwt-secret-keytoken 签发密钥默认是abcdefghijklmnopqrstuvwxyz,生产环境换成随机长串同文件api-decrypt.publicKey/privateKey请求/响应 body 加解密的 RSA 密钥对(api-decrypt.enabled默认true)官方注释明确写了"使用者请自行更换",需前后端同步替换同文件server.port应用端口,默认 8080与本地其它服务冲突时直接改;docker 部署时也可用环境变量SERVER_PORT覆盖(见 docker-compose 的 server1 定义)其余配置(验证码captcha.type: math、文件上传max-file-size: 10MB、工作流warm-flow.enabled: true、MQTT/ES/SnailJob/SnailAI 等)默认值可直接跑通,用到哪块再开哪块,不必一次读完 384 行。五、踩坑手册:现象 → 原因 → 解法现象原因解法启动报 8080 端口被占默认端口与本地服务冲突改server.port,或停掉占用进程登录接口 401/报 token 无效,换了密钥后前端突然全挂前后端加解密密钥没同步换api-decrypt的公私钥与前端约定的密钥是一对,必须成对替换集群下雪花 ID 重复多台机器同网段时默认工作号冲突框架已用本机网卡 MAC 绑定雪花生成器(见idGenerator()),确认各节点网卡地址不同即可列表页 SQL 没带部门过滤Mapper 方法没声明数据权限条件在方法上加@DataPermission并配置维度;确认没有走willIgnoreDataPermission的豁免路径分页插件与排序冲突、批量写入慢分页合理化、批处理参数默认值PaginationInnerInterceptor已开setOverflow(true);MySQL 批量写慢时确认 url 里带rewriteBatchedStatements=true(dev 配置默认带)用 Redis 7/8 的客户端特性报兼容问题Redisson 4.6.1 对旧版 Redis 的语法差异项目声明支持 Redis 6+,先对齐版本;分布式限流、队列等新特性依赖 Redis 6 语法工作流页面打不开设计器warm-flow.ui被关闭或静态路径被拦检查warm-flow.ui: true,以及security.excludes是否包含/warm-flow-ui/configDocker 部署数据丢了数据目录挂载在宿主机/docker/...下备份时注意 mysql、redis、minio 的挂载卷路径(docker-compose 中已写明)六、选型参考:什么团队该用,什么团队别用适合:中台/多部门后台,需要"部门-角色-菜单-按钮"四级权限和数据范围控制,且不想自己维护这套过滤逻辑;有审批业务(请假、报销、用章),想省掉自研流程引擎的几个月;团队用 Spring Boot 3/4 + MyBatis-Plus 技术栈,希望框架把缓存(Redisson)、分布式锁(Lock4j)、任务调度(SnailJob)、文件(MinIO/S3)、短信(sms4j)、Excel 这些轮子都选好了;需要国产化数据库适配(Oracle、PostgreSQL、SQLServer 脚本齐全,达梦/金仓走 MyBatis-Plus 方言支持)。不适合:只要单租户单节点、逻辑简单的内部小工具——这套框架的模块数和依赖面(工作流、AI、MQTT、ES 全是可选但都预置在依赖树里)对你就是负担,社区有删减多租户与工作流的 Single 分支可以考虑;需要严格微服务拆分的架构——它是"单体 + 分布式能力"的定位,不是一套微服务脚手架;团队不熟 Java 生态,或前端要 Vue2 老版本——官方前端是 Vue3 + TS + Element Plus 重写的,老 Vue2 前端不能直接对接。七、小结与下一步RuoYi-Vue-Plus 的价值一句话:把权限隔离、审批流、文件与任务调度这些"每个后台都要做一遍"的事做成了默认值,你只需要写业务表和业务逻辑。下一步建议:先用script/sql/ry_vue.sql建库启动一次,然后用代码生成器对一张真实业务表生成 CRUD,跑通"建表 → 生成 → 挂 @DataPermission → 接口文档验收"这整条链路,半天内你就能判断它和你项目的契合度。【免费下载链接】RuoYi-Vue-Plus多租户后台管理系统 重写RuoYi-Vue所有功能 集成 Sa-Token、Mybatis-Plus、WarmFlow、SpringDoc、Hutool、OSS 定期同步项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-Plus创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考