本文主要是介绍多租户功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
多租户功能是基于租户共享同一个数据库、同一个表,但在表中通过tenant_id区分租户的数据的模式,基于mybatis-plus的多租户SQL解析器实现,如果对mybatis-plus不了解,请先看官方文档:https://mybatis.plus/guide/interceptor-tenant-line.html
租户功能说明
- 一个租户就是一个商城,一个商城下可以有app、小程序、h5等多个展示端,同一租户下的不同端查出的数据是相同的
- 有租户约束的情况下,各租户的数据相互隔离,用户只能管理自己所属租户的数据,没有租户信息约束的表除外
- 自动维护租户ID,不需要手动处理,即可实现通过租户ID 过滤的效果
- 表中添加 tenant_id 字段
- 在nacos相应服务的配置文件中维护这张表即可(例如以下微信模块的配置文件:lun-weixin-admin-dev.yml,其他模块同理)
# 租户表维护
base:tenant:column: tenant_idtables:- wx_app- wx_menu- wx_user- wx_auto_reply- wx_msg- wx_mass_msg
后台租户ID自动维护
- 通过TenantContextHolderFilter拦截器,获取到token在redis中的租户ID 放到theadlocal 中
前端api租户ID自动维护
- 通过ThirdSessionInterceptor拦截器,获取到thirdSession在redis中的租户ID 放到theadlocal 中
无租户ID场景
- 不需要租户信息约束的方法,在mapper的方法上添加注解
旧版:@SqlParser(filter=true)
,新版:@InterceptorIgnore(tenantLine="true")
,加上这个注解后mybatisPlus就不会在这个sql自动维护租户ID了
旧版
@SqlParser(filter=true)
SysUser getByNoTenant(SysUser sysUser);
新版
@InterceptorIgnore(tenantLine="true")
SysUser getByNoTenant(SysUser sysUser);
- 有些没有token或thirdSession但又需要租户的场景,比如订单支付回调是不会有token和thirdSession的,所以系统不会自动维护;此时我们可以先通过回调传过来的appId,去做无租户约束的查询获取到租户ID,再手动维护进去TenantContextHolder.setTenantId
获取当前租户
TenantContextHolder.getTenantId
强制切换租户
TenantContextHolder.setTenantId
注:在增删改过程中请勿对 tenant_id字段手动赋值,不然报错
租户表维护
机构表sys_organ中parent_id为0的机构默认为一个租户
这篇关于多租户功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!