【RuoYi-SpringBoot3-Pro】:多租户功能上手指南

RuoYi-SpringBoot3-Pro多租户上手指南:原理、配置与实战避坑 多租户架构是SaaS化服务的基础能力,核心在于让一套系统同时服务多个客户,并通过数据隔离确保各租户互不可见。常见的实现方案包括独立数据库、独立Schema和共享表加租户字段,其中共享表方案因改造成本低、运维简单而广泛应用。RuoYi-SpringBoot3-Pro默认采用共享表与tenant_id字段相结合的方式,借助SQL拦截器自动拼接租户条件,从配置开关、套餐创建到业务表接入形成完整闭环。本文围绕多租户的设计原理、SQL拦截机制、租户上下文传递与线程清理、自建表改造流程展开,并结合实际工程中遇到的手写S 阅读详情

【RuoYi-SpringBoot3-Pro】:多租户功能上手指南

做 SaaS 系统最头疼的是什么?肯定是数据隔离。

RuoYi-SpringBoot3-Pro 直接集成了 MyBatis-Plus 的多租户插件(TenantLineInnerInterceptor),不用再关注租户 ID,框架层自动给你注入过滤条件。配合 使用 Dify + AI 快速生成多数据库建表语句,使开发效率直线提升!

开启配置

多租户功能默认是关闭的。在 ruoyi-admin 下面的 application.yml 里找 tenant 配置:

tenant:
  enable: true # 把它改成 true,多租户就生效了
  column: tenant_id # 你的表里用来区分租户的字段名,一般都叫 tenant_id
  filterTables: # 这里的表,会强制进行 SQL 过滤
  ignoreTables: # 这些表是不进行租户隔离的
    - sys_user # 用户表
    - sys_role # 角色表
    - sys_menu # 菜单表
    - sys_dept # 部门表
    - sys_dict_data # 字典数据
    # ... 省略其它系统表
  ignoreLoginNames: # 超级管理员,让他能看所有租户的数据
    - admin

由于 RuoYi-SpringBoot3-Pro 是在 RuoYi-Vue3 基础上的增强版,本着只做增强,不做改变 的原则,原来系统的表只在 sys_user 中添加了 tenant_id。有需要的小伙伴需要自行扩展。

实现代码

就像开头所说,其实实现特别简单,就是用 MyBatis-Plus 的拦截器。

在 ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java,中设置:

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(TenantProperties tenantProperties) {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    if (Boolean.TRUE.equals(tenantProperties.getEnable())) {
        // 启用多租户插件拦截
        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new MultiTenantHandler(tenantProperties)));
    }
    // ...
    return interceptor;
}

它注册了一个 TenantLineInnerInterceptor,并传入了一个 MultiTenantHandler。这个 Handler 位于 ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java,它会:

  1. 从当前登录用户信息里取出 tenantId。
  2. 判断当前表需不需要隔离(看是不是在 ignoreTables 里)。
  3. 如果需要隔离,就在你的 SQL 后面自动追加 AND tenant_id = 123。

注意事项

  • 多租户不等于权限过滤,租户之间是完全隔离的。
  • 由于多租户ID 是从当前登录用户信息获取,所以像定时任务的处理,需要自行根据业务逻辑判断。
  • 启用多租户后,所有执行的 method 的 SQL 都会进行处理。
  • 自定义的 SQL 请按规范书写,特别是涉及到多个表的每个表都要给别名,特别是 inner join 的要写标准的 inner join。

往期教程合集

RuoYi-SpringBoot3-Pro

RuoYi-SpringBoot3-Pro多租户实战:从配置到数据隔离的完整指南 多租户是SaaS化改造中的核心能力,其本质并非简单给业务表增加tenant_id字段,而是在整个SQL执行链路上实现租户维度的强制隔离。基于MyBatis-Plus的TenantLineInnerInterceptor,通过租户上下文管理、忽略表配置与拦截器链组装,能够在Spring Boot 3应用中自动为查询、插入等操作注入租户条件。合理设计租户模型,区分平台全局表与租户业务表,是保障数据隔离安全性的前提。在订单、客户、项目等典型业务场景中,需重点关注登录链路的系统表忽略、异步线程的租户透传、缓存键维度 阅读详情

相关推荐

RuoYi-SpringBoot3-Pro多租户实战:数据隔离与SQL自动过滤

多租户是SaaS系统与内部平台最基础的数据隔离手段,核心思路并非独立数据库,而是共享表加租户字段,让每张业务表通过tenant_id来区分归属。理解这个原理后,真正落地时会发现SQL改写、租户上下文传递、系统表排除等细节都是关键。利用MyBatis拦截器,框架能在查询、更新、删除时自动追加租户条件,无需每个Mapper手写过滤逻辑,显著降低漏写条件导致的数据越权风险。对于中小团队而言,这种方案兼顾部署成本与维护效率。RuoYi-SpringBoot3-Pro正是围绕这一思路构建了完整的多租户能力,本文从真实

weixin_42116058的博客 201

【RuoYi-SpringBoot3-Pro】:若依企业级增强版 —— 让开发更安全高效

RuoYi-Vue 增强版本,保留了原有的所有功能,并新增代码加密保护、三级等保支持、AI 对话能力、更强大的 ORM 支持、多数据库适配、低代码开发能力等企业级功能

AI时代超级个体,专注AI应用落地,开发经验分享 3074

ruoyi-vue-pro-Spring Boot 后台管理系统资源

RuoYi-Vue Pro Spring Boot + MyBatis Plus + Vue & Element + RBAC SaaS Flowable CRMERPIoTAI Star

【RuoYi-SpringBoot3-Pro】:接入 AI 对话能力

RuoYi-SpringBoot3-Pro框架内置了开箱即用的OpenAI工具类,帮助开发者快速集成AI对话功能。该工具类基于官方OpenAI Java SDK封装,支持同步/流式对话、多角色消息和代理配置,兼容所有遵循OpenAI协议的第三方API。核心组件包括配置类OpenAIConfig、工具类OpenAI和消息实体AIMessage。通过简单配置即可实现AI对话功能,并提供前端集成示例和最佳实践建议,如错误处理、Token控制和敏感信息保护。

未名胡的博客 529

802.1x之EAP-TLS测试方法

CA证书一般是由权威的认证机构发出,用来验证该机构签名的证书,持有CA证书的设备可以验证对端的证书是否由自己信任的机构颁发的。在我们内部使用证书时,我没可以自己充当CA认证机构,管理私钥和CA证书,使用他们签名服务器、客户端证书。2、使用证书请求文件server_csr.pem、CA私钥、CA公钥生成服务器证书(正常情况下自己不拥有CA私钥,是把证书请求文件发给认证机构,由认证机构返回证书)进行802.1x EAP-TLS认证时需要IPC、服务器分别存储CA证书、设备证书、私钥,通过交换证书实现身份验证。

写作是为了更好的思考 2164

Win10家庭版中文用户名改英文全攻略:从注册表到环境变量一步不落

本文详细介绍了Windows 10家庭版中文用户名改为英文的完整流程,包括注册表编辑、环境变量调整等关键步骤。通过激活管理员账户、重命名用户文件夹、修改注册表键值等操作,彻底解决因中文路径导致的软件兼容性问题,并提供常见错误解决方案和系统维护建议。

weixin_29227425的博客 427

【RuoYi-SpringBoot3-Pro】:多数据库支持,再也不用为数据库选型烦恼了

【RuoYi-SpringBoot3-Pro】:多数据库支持,再也不用为数据库选型烦恼了

AI时代超级个体,专注AI应用落地,开发经验分享 2795

Ubuntu20.04 安装 MATLAB R2023b 常见问题及解决方案

本文提供了Ubuntu20.04系统上安装MATLAB R2023b的完整指南,包括系统要求检查、依赖项安装、详细安装步骤及常见问题解决方案。特别针对GTK模块加载失败、OpenGL图形加速问题和中文显示乱码等常见问题提供了有效解决方法,帮助用户顺利完成安装并优化使用体验。

weixin_42619061的博客 483

【RuoYi-SpringBoot3-Pro】:MyBatis-Plus 集成

本文详细介绍 RuoYi-SpringBoot3-Pro 框架中 MyBatis-Plus 的集成方案,包括核心插件配置、多租户支持、Lambda 查询、代码生成等实战技巧

AI时代超级个体,专注AI应用落地,开发经验分享 1828

别再只会插拔了!深入Linux内核,手把手调试USB热插拔中断(以高通平台为例)

本文深入探讨了Linux内核中USB热插拔中断的调试方法,特别针对高通平台提供了详细的实战指南。从硬件基础到内核机制,再到中断调试工具和常见问题排查,帮助开发者系统性地解决USB设备识别问题。通过监控中断状态、分析处理流程和高级调试技巧,提升USB热插拔的稳定性和性能。

weixin_29161785的博客 429

小米手机免登录开启USB安装与调试(MIUI 9-11实测,已Root可用)

本文详细介绍了小米手机免登录开启USB安装与调试的底层方案,适用于已Root的MIUI 9-11版本设备。通过修改系统配置、禁用MIUI安装器验证和强制开启USB调试等步骤,帮助开发者绕过账号限制,实现快速调试。文章包含不同MIUI版本的兼容性处理和常见问题解决方法,实测有效。

weixin_33675507的博客 289

【RuoYi-SpringBoot3-Pro】:拒绝“大众脸”!高颜值前端框架选型

在若依的生态中,Element Plus 无疑是绝对的王者。它稳定、文档丰富、社区庞大,是快速构建后台管理系统的首选。然而,随着客户审美水平的提高和项目差异化需求的增加,“千篇一律的若依脸”逐渐成为了一个痛点。

AI时代超级个体,专注AI应用落地,开发经验分享 1344

C#中的Chart控件——当数据源很多时可以显示进度条拉动观察,也可以记录到后台文本详细对照

C#中的Chart控件——当数据源很多时可以显示进度条拉动观察,也可以记录到后台文本详细对照下面进行详细步骤说明,感兴趣的同学可以看一下: 1简单示例(一条线): 2.数据源随着时间不断变化,进度条变化 。多条线: 3.看在整段时期内的数据大体图(消去或出现)进度条: 4.后台将时刻记录变化记录到一个txt文本里以供详细校验: 话不多说上码: using System; using Sys...

帅boy的博客 4308

ruoyi-vue ,ruoyi-vue-plus ,ruoyi-vue-pro 谁才是真正的王者

从职业生涯伊始,笔者一直是微服务架构的坚定拥趸,这很大程度上源于长期深耕互联网行业,习惯了高并发、分布式架构下的开发模式。然而,去年在优化某航空公司核心用户中心系统时,笔者的技术认知受到了不小的冲击。因为航空公司用户中心是一个典型的单体应用——尽管业务量不小,但稳定的业务模型和有限的扩展需求,使得单体架构反而比微服务更高效、更经济。事实上,单体应用在 IT 领域始终占据着不可替代的生态位。甚至可以说,在大多数业务场景下,单体架构不仅完全够用,甚至可能是更优解。它的价值主要体现在:开发效率高、运维复杂度低,尤

2505_90729871的博客 1218

【数据集4】GSWP3数据集详解

简介GSWP3数据集

WW、forever的博客 1367

Z-Image Turbo随机性增强插件的下载教程及使用方法 z-image生成图像太相似怎么办 Z-Image Turbo 整合包下载

Z-Image Turbo 是出了名的“seed 不敏感”,非常难做多样化图像创作。ComfyUi-ConditioningNoiseInjection 插件通过在conditioning(提示词编码)阶段加入可控噪声,成功解决了 Turbo 随机性不足的问题。它不仅能让 Turbo 产生更丰富的构图差异,还能保持主题稳定,是目前我测试过最有效的 Turbo 随机性增强工具。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1979

从0到100万用户:RuoYi-Vue-Pro多租户查询优化实战指南

你是否遇到过这样的困境?基于RuoYi-Vue-Pro开发的SaaS系统在初期运行流畅,但随着租户数量增长到数百甚至数千时,查询性能急剧下降,部分报表接口响应时间从毫秒级飙升至秒级,数据库CPU占用率长期居高不下。本文将从底层原理到实战优化,全方位解析如何突破多租户系统的查询性能瓶颈,让你的系统轻松支撑百万级用户规模。 读完本文你将掌握: - 多租户(Multi-Tenant)数据隔离的三种实现...

gitblog_01426的博客 645

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

芋道 ruoyi-vue-pro 技术文档

芋道 ruoyi-vue-pro 技术文档 【免费下载链接】ruoyi-vue-pro ???? 官方推荐 ???? RuoYi-Vue 全新 Pro 版本,优化重构所有功能。基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 微信小程序,支持 RBAC 动态权限、数据...

gitblog_01403的博客 1356

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

RuoYi-Vue Pro框架学习启动教程

[yudao-vue-pro (opens new window)](https://gitee.com/zhijiantianya/ruoyi-vue-pro),RuoYi-Vue 全新 Pro 版本,优化重构所有功能。

cai_4的博客 1万+

RuoYi-Vue-Pro:构建企业级SpringBoot后台管理系统的终极解决方案

在当今数字化转型浪潮中,企业对于高效、稳定、可扩展的后台管理系统需求日益迫切。RuoYi-Vue-Pro作为基于SpringBoot的完整后台管理框架,通过多租户SaaS架构、工作流引擎和智能代码生成器等核心功能,为开发者提供了从项目搭建到生产部署的全方位支持。 ## 🏗️ 项目价值定位:企业数字化转型的坚实基石 RuoYi-Vue-Pro不仅仅是一个技术框架,更是企业数字化转型的战略性工具

gitblog_01006的博客 967

聊聊 ruoyi-vue ,ruoyi-vue-plus ,ruoyi-vue-pro 谁才是真正的王者

评估维度RuoYi-Vue核心优势极简开箱即用多租户/功能增强全生态功能预制二次开发⭐⭐⭐⭐⭐(源码简洁)⭐⭐⭐☆(需理解模块化)⭐⭐(需深度裁剪)成本效益人力/时间成本最低中等投入高回报(中等偏上)需评估功能利用率RuoYi-Vue 的架构和分层非常适合新手入门,文档详细,社区活跃,最重要的是作者在持续维护。因此,它是笔者心中快速开发平台的王者。原创作者: makemylife转载于: https://www.cnblogs.com/makemylife/p/18870399。

weixin_37065385的博客 830

终极SpringBoot后台管理系统:ruoyi-vue-pro完整开发指南

还在为构建企业级应用而烦恼吗?传统开发方案要么功能不全,要么架构复杂,要么文档缺失?ruoyi-vue-pro一站式解决所有开发痛点!这个基于SpringBoot的完整后台管理系统,集成了权限控制、工作流引擎、支付系统、AI大模型等核心功能,让你快速搭建专业的企业应用。 ## 为什么选择ruoyi-vue-pro?解决你的实际开发难题 **常见开发痛点分析:** - 权限系统复杂,难以维护 -

gitblog_00090的博客 513

一个强大灵活的后台管理系统,支持SaaS 多租户、商城、CRM、ERP 等功能,目前已经101.6k star (附源码)

一个丰富优化重构的后台管理系统,为企业提供了一个强大、灵活、易用的解决方案。

m0_68103752的博客 2753

【ruoyi-vue-pro】开源下载和安装教程

【ruoyi-vue-pro】开源下载和安装教程 【免费下载链接】ruoyi-vue-pro ???? 官方推荐 ???? RuoYi-Vue 全新 Pro 版本,优化重构所有功能。基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 微信小程序,支持 RBAC 动态权限...

gitblog_01425的博客 1350
上一篇: 【n8n教程】:Remove Duplicates节点,清洁重复数据
下一篇: 【n8n教程】:从零开始掌握表达式(Expressions),让数据流动起来!
undsky_
博客等级 码龄20年 6粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

undsky_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值