mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-09-20 18:15:56 +08:00
update 重构 抽取 ruoyi-common-tenant 租户模块
update 优化 redis 支持租户模式 update 重构 登录用户将数据存储到 token 内部 适配多租户改动
This commit is contained in:
parent
937e8cc53f
commit
9a1b560cd5
@ -15,15 +15,15 @@ import com.ruoyi.common.core.enums.DeviceType;
|
|||||||
import com.ruoyi.common.core.enums.LoginType;
|
import com.ruoyi.common.core.enums.LoginType;
|
||||||
import com.ruoyi.common.core.enums.TenantStatus;
|
import com.ruoyi.common.core.enums.TenantStatus;
|
||||||
import com.ruoyi.common.core.enums.UserStatus;
|
import com.ruoyi.common.core.enums.UserStatus;
|
||||||
import com.ruoyi.common.core.exception.TenantException;
|
|
||||||
import com.ruoyi.common.core.exception.user.CaptchaException;
|
import com.ruoyi.common.core.exception.user.CaptchaException;
|
||||||
import com.ruoyi.common.core.exception.user.CaptchaExpireException;
|
import com.ruoyi.common.core.exception.user.CaptchaExpireException;
|
||||||
import com.ruoyi.common.core.exception.user.UserException;
|
import com.ruoyi.common.core.exception.user.UserException;
|
||||||
import com.ruoyi.common.core.utils.*;
|
import com.ruoyi.common.core.utils.*;
|
||||||
import com.ruoyi.common.log.event.LogininforEvent;
|
import com.ruoyi.common.log.event.LogininforEvent;
|
||||||
import com.ruoyi.common.mybatis.helper.TenantHelper;
|
|
||||||
import com.ruoyi.common.redis.utils.RedisUtils;
|
import com.ruoyi.common.redis.utils.RedisUtils;
|
||||||
import com.ruoyi.common.satoken.utils.LoginHelper;
|
import com.ruoyi.common.satoken.utils.LoginHelper;
|
||||||
|
import com.ruoyi.common.tenant.exception.TenantException;
|
||||||
|
import com.ruoyi.common.tenant.helper.TenantHelper;
|
||||||
import com.ruoyi.common.web.config.properties.CaptchaProperties;
|
import com.ruoyi.common.web.config.properties.CaptchaProperties;
|
||||||
import com.ruoyi.system.domain.SysUser;
|
import com.ruoyi.system.domain.SysUser;
|
||||||
import com.ruoyi.system.domain.vo.SysTenantVo;
|
import com.ruoyi.system.domain.vo.SysTenantVo;
|
||||||
|
|||||||
@ -31,6 +31,7 @@
|
|||||||
<module>ruoyi-common-sensitive</module>
|
<module>ruoyi-common-sensitive</module>
|
||||||
<module>ruoyi-common-json</module>
|
<module>ruoyi-common-json</module>
|
||||||
<module>ruoyi-common-encrypt</module>
|
<module>ruoyi-common-encrypt</module>
|
||||||
|
<module>ruoyi-common-tenant</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<artifactId>ruoyi-common</artifactId>
|
<artifactId>ruoyi-common</artifactId>
|
||||||
|
|||||||
@ -152,6 +152,13 @@
|
|||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 租户模块 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.ruoyi</groupId>
|
||||||
|
<artifactId>ruoyi-common-tenant</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
|
||||||
|
|||||||
@ -20,7 +20,7 @@ public interface CacheConstants {
|
|||||||
/**
|
/**
|
||||||
* 验证码 redis key
|
* 验证码 redis key
|
||||||
*/
|
*/
|
||||||
String CAPTCHA_CODE_KEY = "captcha_codes:";
|
String CAPTCHA_CODE_KEY = TenantConstants.GLOBAL_REDIS_KEY + "captcha_codes:";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 参数管理 cache key
|
* 参数管理 cache key
|
||||||
|
|||||||
@ -33,7 +33,7 @@ public interface CacheNames {
|
|||||||
/**
|
/**
|
||||||
* 租户
|
* 租户
|
||||||
*/
|
*/
|
||||||
String SYS_TENANT = "sys_tenant#30d";
|
String SYS_TENANT = TenantConstants.GLOBAL_REDIS_KEY + "sys_tenant#30d";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户账户
|
* 用户账户
|
||||||
|
|||||||
@ -48,4 +48,6 @@ public interface TenantConstants {
|
|||||||
*/
|
*/
|
||||||
String DEFAULT_TENANT_ID = "000000";
|
String DEFAULT_TENANT_ID = "000000";
|
||||||
|
|
||||||
|
String GLOBAL_REDIS_KEY = "global:";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,14 +7,10 @@ import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
|
|||||||
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
|
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
|
|
||||||
import com.ruoyi.common.mybatis.handler.InjectionMetaObjectHandler;
|
import com.ruoyi.common.mybatis.handler.InjectionMetaObjectHandler;
|
||||||
import com.ruoyi.common.mybatis.handler.PlusTenantLineHandler;
|
|
||||||
import com.ruoyi.common.mybatis.interceptor.PlusDataPermissionInterceptor;
|
import com.ruoyi.common.mybatis.interceptor.PlusDataPermissionInterceptor;
|
||||||
import com.ruoyi.common.mybatis.properties.TenantProperties;
|
|
||||||
import org.mybatis.spring.annotation.MapperScan;
|
import org.mybatis.spring.annotation.MapperScan;
|
||||||
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||||
|
|
||||||
@ -23,19 +19,14 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
|
|||||||
*
|
*
|
||||||
* @author Lion Li
|
* @author Lion Li
|
||||||
*/
|
*/
|
||||||
@EnableConfigurationProperties(TenantProperties.class)
|
|
||||||
@EnableTransactionManagement(proxyTargetClass = true)
|
@EnableTransactionManagement(proxyTargetClass = true)
|
||||||
@AutoConfiguration
|
@AutoConfiguration
|
||||||
@MapperScan("${mybatis-plus.mapperPackage}")
|
@MapperScan("${mybatis-plus.mapperPackage}")
|
||||||
public class MybatisPlusConfig {
|
public class MybatisPlusConfig {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public MybatisPlusInterceptor mybatisPlusInterceptor(TenantProperties tenantProperties) {
|
public MybatisPlusInterceptor mybatisPlusInterceptor() {
|
||||||
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
|
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
|
||||||
if (tenantProperties.getEnable()) {
|
|
||||||
// 多租户插件
|
|
||||||
interceptor.addInnerInterceptor(tenantLineInnerInterceptor(tenantProperties));
|
|
||||||
}
|
|
||||||
// 数据权限处理
|
// 数据权限处理
|
||||||
interceptor.addInnerInterceptor(dataPermissionInterceptor());
|
interceptor.addInnerInterceptor(dataPermissionInterceptor());
|
||||||
// 分页插件
|
// 分页插件
|
||||||
@ -45,13 +36,6 @@ public class MybatisPlusConfig {
|
|||||||
return interceptor;
|
return interceptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 多租户插件
|
|
||||||
*/
|
|
||||||
public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties tenantProperties) {
|
|
||||||
return new TenantLineInnerInterceptor(new PlusTenantLineHandler(tenantProperties));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 数据权限拦截器
|
* 数据权限拦截器
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -1,8 +1,10 @@
|
|||||||
package com.ruoyi.common.satoken.utils;
|
package com.ruoyi.common.satoken.utils;
|
||||||
|
|
||||||
import cn.dev33.satoken.context.SaHolder;
|
import cn.dev33.satoken.context.SaHolder;
|
||||||
|
import cn.dev33.satoken.stp.SaLoginModel;
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import cn.hutool.json.JSONObject;
|
||||||
import com.ruoyi.common.core.constant.TenantConstants;
|
import com.ruoyi.common.core.constant.TenantConstants;
|
||||||
import com.ruoyi.common.core.constant.UserConstants;
|
import com.ruoyi.common.core.constant.UserConstants;
|
||||||
import com.ruoyi.common.core.domain.model.LoginUser;
|
import com.ruoyi.common.core.domain.model.LoginUser;
|
||||||
@ -40,8 +42,7 @@ public class LoginHelper {
|
|||||||
*/
|
*/
|
||||||
public static void login(LoginUser loginUser) {
|
public static void login(LoginUser loginUser) {
|
||||||
SaHolder.getStorage().set(LOGIN_USER_KEY, loginUser);
|
SaHolder.getStorage().set(LOGIN_USER_KEY, loginUser);
|
||||||
StpUtil.login(loginUser.getLoginId());
|
StpUtil.login(loginUser.getLoginId(), new SaLoginModel().setExtra(LOGIN_USER_KEY, loginUser));
|
||||||
setLoginUser(loginUser);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -52,15 +53,9 @@ public class LoginHelper {
|
|||||||
*/
|
*/
|
||||||
public static void loginByDevice(LoginUser loginUser, DeviceType deviceType) {
|
public static void loginByDevice(LoginUser loginUser, DeviceType deviceType) {
|
||||||
SaHolder.getStorage().set(LOGIN_USER_KEY, loginUser);
|
SaHolder.getStorage().set(LOGIN_USER_KEY, loginUser);
|
||||||
StpUtil.login(loginUser.getLoginId(), deviceType.getDevice());
|
StpUtil.login(loginUser.getLoginId(), new SaLoginModel()
|
||||||
setLoginUser(loginUser);
|
.setDevice(deviceType.getDevice())
|
||||||
}
|
.setExtra(LOGIN_USER_KEY, loginUser));
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置用户数据(多级缓存)
|
|
||||||
*/
|
|
||||||
public static void setLoginUser(LoginUser loginUser) {
|
|
||||||
StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -71,7 +66,7 @@ public class LoginHelper {
|
|||||||
if (loginUser != null) {
|
if (loginUser != null) {
|
||||||
return loginUser;
|
return loginUser;
|
||||||
}
|
}
|
||||||
loginUser = (LoginUser) StpUtil.getTokenSession().get(LOGIN_USER_KEY);
|
loginUser = ((JSONObject) StpUtil.getExtra(LOGIN_USER_KEY)).toBean(LoginUser.class);
|
||||||
SaHolder.getStorage().set(LOGIN_USER_KEY, loginUser);
|
SaHolder.getStorage().set(LOGIN_USER_KEY, loginUser);
|
||||||
return loginUser;
|
return loginUser;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,12 +22,6 @@
|
|||||||
<artifactId>ruoyi-common-satoken</artifactId>
|
<artifactId>ruoyi-common-satoken</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- Sa-Token 权限认证, 在线文档:http://sa-token.dev33.cn/ -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>cn.dev33</groupId>
|
|
||||||
<artifactId>sa-token-spring-boot3-starter</artifactId>
|
|
||||||
<version>${satoken.version}</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
37
ruoyi-common/ruoyi-common-tenant/pom.xml
Normal file
37
ruoyi-common/ruoyi-common-tenant/pom.xml
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<groupId>com.ruoyi</groupId>
|
||||||
|
<artifactId>ruoyi-common</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
<relativePath>../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>ruoyi-common-tenant</artifactId>
|
||||||
|
|
||||||
|
<description>
|
||||||
|
ruoyi-common-tenant 租户模块
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.ruoyi</groupId>
|
||||||
|
<artifactId>ruoyi-common-mybatis</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.ruoyi</groupId>
|
||||||
|
<artifactId>ruoyi-common-redis</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>transmittable-thread-local</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
||||||
@ -0,0 +1,77 @@
|
|||||||
|
package com.ruoyi.common.tenant.config;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
|
||||||
|
import com.ruoyi.common.core.utils.reflect.ReflectUtils;
|
||||||
|
import com.ruoyi.common.mybatis.config.MybatisPlusConfig;
|
||||||
|
import com.ruoyi.common.redis.config.RedisConfig;
|
||||||
|
import com.ruoyi.common.redis.config.properties.RedissonProperties;
|
||||||
|
import com.ruoyi.common.tenant.handle.PlusTenantLineHandler;
|
||||||
|
import com.ruoyi.common.tenant.handle.TenantKeyPrefixHandler;
|
||||||
|
import com.ruoyi.common.tenant.properties.TenantProperties;
|
||||||
|
import org.redisson.config.ClusterServersConfig;
|
||||||
|
import org.redisson.config.SingleServerConfig;
|
||||||
|
import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer;
|
||||||
|
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 租户配置类
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
*/
|
||||||
|
@EnableConfigurationProperties(TenantProperties.class)
|
||||||
|
@AutoConfiguration(after = {RedisConfig.class, MybatisPlusConfig.class})
|
||||||
|
@ConditionalOnProperty(value = "tenant.enable", havingValue = "true")
|
||||||
|
public class TenantConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化租户配置
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public boolean tenantInit(MybatisPlusInterceptor mybatisPlusInterceptor,
|
||||||
|
TenantProperties tenantProperties) {
|
||||||
|
List<InnerInterceptor> interceptors = new ArrayList<>();
|
||||||
|
// 多租户插件 必须放到第一位
|
||||||
|
interceptors.add(tenantLineInnerInterceptor(tenantProperties));
|
||||||
|
interceptors.addAll(mybatisPlusInterceptor.getInterceptors());
|
||||||
|
mybatisPlusInterceptor.setInterceptors(interceptors);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 多租户插件
|
||||||
|
*/
|
||||||
|
public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties tenantProperties) {
|
||||||
|
return new TenantLineInnerInterceptor(new PlusTenantLineHandler(tenantProperties));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public RedissonAutoConfigurationCustomizer tenantRedissonCustomizer(RedissonProperties redissonProperties) {
|
||||||
|
return config -> {
|
||||||
|
TenantKeyPrefixHandler nameMapper = new TenantKeyPrefixHandler(redissonProperties.getKeyPrefix());
|
||||||
|
SingleServerConfig singleServerConfig = ReflectUtils.invokeGetter(config, "singleServerConfig");
|
||||||
|
if (ObjectUtil.isNotNull(singleServerConfig)) {
|
||||||
|
// 使用单机模式
|
||||||
|
// 设置多租户 redis key前缀
|
||||||
|
singleServerConfig.setNameMapper(nameMapper);
|
||||||
|
ReflectUtils.invokeSetter(config, "singleServerConfig", singleServerConfig);
|
||||||
|
}
|
||||||
|
ClusterServersConfig clusterServersConfig = ReflectUtils.invokeGetter(config, "clusterServersConfig");
|
||||||
|
// 集群配置方式 参考下方注释
|
||||||
|
if (ObjectUtil.isNotNull(clusterServersConfig)) {
|
||||||
|
// 设置多租户 redis key前缀
|
||||||
|
clusterServersConfig.setNameMapper(nameMapper);
|
||||||
|
ReflectUtils.invokeSetter(config, "clusterServersConfig", clusterServersConfig);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,5 +1,6 @@
|
|||||||
package com.ruoyi.common.mybatis.core.domain;
|
package com.ruoyi.common.tenant.core;
|
||||||
|
|
||||||
|
import com.ruoyi.common.mybatis.core.domain.BaseEntity;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
@ -1,13 +1,13 @@
|
|||||||
package com.ruoyi.common.core.exception;
|
package com.ruoyi.common.tenant.exception;
|
||||||
|
|
||||||
import com.ruoyi.common.core.exception.base.BaseException;
|
import com.ruoyi.common.core.exception.base.BaseException;
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户信息异常类
|
* 租户异常类
|
||||||
*
|
*
|
||||||
* @author ruoyi
|
* @author Lion Li
|
||||||
*/
|
*/
|
||||||
public class TenantException extends BaseException {
|
public class TenantException extends BaseException {
|
||||||
|
|
||||||
@ -1,10 +1,10 @@
|
|||||||
package com.ruoyi.common.mybatis.handler;
|
package com.ruoyi.common.tenant.handle;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
|
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
|
||||||
import com.ruoyi.common.core.utils.StringUtils;
|
import com.ruoyi.common.core.utils.StringUtils;
|
||||||
import com.ruoyi.common.mybatis.helper.TenantHelper;
|
|
||||||
import com.ruoyi.common.mybatis.properties.TenantProperties;
|
|
||||||
import com.ruoyi.common.satoken.utils.LoginHelper;
|
import com.ruoyi.common.satoken.utils.LoginHelper;
|
||||||
|
import com.ruoyi.common.tenant.helper.TenantHelper;
|
||||||
|
import com.ruoyi.common.tenant.properties.TenantProperties;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import net.sf.jsqlparser.expression.Expression;
|
import net.sf.jsqlparser.expression.Expression;
|
||||||
import net.sf.jsqlparser.expression.LongValue;
|
import net.sf.jsqlparser.expression.LongValue;
|
||||||
@ -0,0 +1,48 @@
|
|||||||
|
package com.ruoyi.common.tenant.handle;
|
||||||
|
|
||||||
|
import com.ruoyi.common.core.constant.TenantConstants;
|
||||||
|
import com.ruoyi.common.core.utils.StringUtils;
|
||||||
|
import com.ruoyi.common.redis.handler.KeyPrefixHandler;
|
||||||
|
import com.ruoyi.common.satoken.utils.LoginHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 多租户redis缓存key前缀处理
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
*/
|
||||||
|
public class TenantKeyPrefixHandler extends KeyPrefixHandler {
|
||||||
|
|
||||||
|
public TenantKeyPrefixHandler(String keyPrefix) {
|
||||||
|
super(keyPrefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 增加前缀
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String map(String name) {
|
||||||
|
if (StringUtils.isBlank(name)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (StringUtils.contains(name, TenantConstants.GLOBAL_REDIS_KEY)) {
|
||||||
|
return super.map(name);
|
||||||
|
}
|
||||||
|
return super.map(LoginHelper.getTenantId() + ":" + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 去除前缀
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String unmap(String name) {
|
||||||
|
String unmap = super.unmap(name);
|
||||||
|
if (StringUtils.isBlank(unmap)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (StringUtils.contains(name, TenantConstants.GLOBAL_REDIS_KEY)) {
|
||||||
|
return super.unmap(name);
|
||||||
|
}
|
||||||
|
return unmap.substring((LoginHelper.getTenantId() + ":").length());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,12 +1,13 @@
|
|||||||
package com.ruoyi.common.mybatis.helper;
|
package com.ruoyi.common.tenant.helper;
|
||||||
|
|
||||||
import cn.dev33.satoken.context.SaHolder;
|
import cn.dev33.satoken.context.SaHolder;
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy;
|
import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy;
|
||||||
import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
|
import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
|
||||||
|
import com.ruoyi.common.core.constant.TenantConstants;
|
||||||
import com.ruoyi.common.core.utils.SpringUtils;
|
import com.ruoyi.common.core.utils.SpringUtils;
|
||||||
import com.ruoyi.common.core.utils.StringUtils;
|
import com.ruoyi.common.core.utils.StringUtils;
|
||||||
import com.ruoyi.common.mybatis.properties.TenantProperties;
|
import com.ruoyi.common.tenant.properties.TenantProperties;
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
@ -20,7 +21,7 @@ public class TenantHelper {
|
|||||||
|
|
||||||
private static final TenantProperties PROPERTIES = SpringUtils.getBean(TenantProperties.class);
|
private static final TenantProperties PROPERTIES = SpringUtils.getBean(TenantProperties.class);
|
||||||
|
|
||||||
private static final String DYNAMIC_TENANT_KEY = "dynamicTenant";
|
private static final String DYNAMIC_TENANT_KEY = TenantConstants.GLOBAL_REDIS_KEY + "dynamicTenant";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 租户功能是否启用
|
* 租户功能是否启用
|
||||||
@ -44,14 +45,14 @@ public class TenantHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置动态租户
|
* 设置动态租户(一直有效)
|
||||||
*/
|
*/
|
||||||
public static void setDynamic(String tenantId) {
|
public static void setDynamic(String tenantId) {
|
||||||
StpUtil.getTokenSession().set(DYNAMIC_TENANT_KEY, tenantId);
|
StpUtil.getTokenSession().set(DYNAMIC_TENANT_KEY, tenantId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取动态租户(多级缓存)
|
* 获取动态租户(一直有效)
|
||||||
*/
|
*/
|
||||||
public static String getDynamic() {
|
public static String getDynamic() {
|
||||||
String tenantId = (String) SaHolder.getStorage().get(DYNAMIC_TENANT_KEY);
|
String tenantId = (String) SaHolder.getStorage().get(DYNAMIC_TENANT_KEY);
|
||||||
@ -64,7 +65,7 @@ public class TenantHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 清除动态租户
|
* 清除动态租户(一直有效)
|
||||||
*/
|
*/
|
||||||
public static void clearDynamic() {
|
public static void clearDynamic() {
|
||||||
SaHolder.getStorage().delete(DYNAMIC_TENANT_KEY);
|
SaHolder.getStorage().delete(DYNAMIC_TENANT_KEY);
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.ruoyi.common.mybatis.properties;
|
package com.ruoyi.common.tenant.properties;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
@ -0,0 +1 @@
|
|||||||
|
com.ruoyi.common.tenant.config.TenantConfig
|
||||||
@ -6,7 +6,7 @@ package ${packageName}.domain;
|
|||||||
#end
|
#end
|
||||||
#end
|
#end
|
||||||
#if($IsTenant==1)
|
#if($IsTenant==1)
|
||||||
import com.ruoyi.common.mybatis.core.domain.TenantEntity;
|
import com.ruoyi.common.tenant.core.TenantEntity;
|
||||||
#else
|
#else
|
||||||
import com.ruoyi.common.mybatis.core.domain.BaseEntity;
|
import com.ruoyi.common.mybatis.core.domain.BaseEntity;
|
||||||
#end
|
#end
|
||||||
|
|||||||
@ -63,7 +63,7 @@
|
|||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.ruoyi</groupId>
|
<groupId>com.ruoyi</groupId>
|
||||||
<artifactId>ruoyi-common-satoken</artifactId>
|
<artifactId>ruoyi-common-tenant</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@ -1,16 +1,13 @@
|
|||||||
package com.ruoyi.system.controller.system;
|
package com.ruoyi.system.controller.system;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
|
||||||
import com.ruoyi.common.core.constant.UserConstants;
|
import com.ruoyi.common.core.constant.UserConstants;
|
||||||
import com.ruoyi.common.core.domain.R;
|
import com.ruoyi.common.core.domain.R;
|
||||||
import com.ruoyi.common.core.domain.model.LoginUser;
|
|
||||||
import com.ruoyi.common.excel.utils.ExcelUtil;
|
import com.ruoyi.common.excel.utils.ExcelUtil;
|
||||||
import com.ruoyi.common.log.annotation.Log;
|
import com.ruoyi.common.log.annotation.Log;
|
||||||
import com.ruoyi.common.log.enums.BusinessType;
|
import com.ruoyi.common.log.enums.BusinessType;
|
||||||
import com.ruoyi.common.mybatis.core.page.PageQuery;
|
import com.ruoyi.common.mybatis.core.page.PageQuery;
|
||||||
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
|
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
|
||||||
import com.ruoyi.common.satoken.utils.LoginHelper;
|
|
||||||
import com.ruoyi.common.web.core.BaseController;
|
import com.ruoyi.common.web.core.BaseController;
|
||||||
import com.ruoyi.system.domain.SysDept;
|
import com.ruoyi.system.domain.SysDept;
|
||||||
import com.ruoyi.system.domain.SysUserRole;
|
import com.ruoyi.system.domain.SysUserRole;
|
||||||
@ -110,13 +107,14 @@ public class SysRoleController extends BaseController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (roleService.updateRole(role) > 0) {
|
if (roleService.updateRole(role) > 0) {
|
||||||
// 更新缓存用户权限
|
// // 更新缓存用户权限
|
||||||
LoginUser loginUser = LoginHelper.getLoginUser();
|
// LoginUser loginUser = LoginHelper.getLoginUser();
|
||||||
SysUserVo sysUser = userService.selectUserById(loginUser.getUserId());
|
// SysUserVo sysUser = userService.selectUserById(loginUser.getUserId());
|
||||||
if (ObjectUtil.isNotNull(sysUser)) {
|
// if (ObjectUtil.isNotNull(sysUser)) {
|
||||||
loginUser.setMenuPermission(permissionService.getMenuPermission(sysUser.getUserId()));
|
// loginUser.setMenuPermission(permissionService.getMenuPermission(sysUser.getUserId()));
|
||||||
LoginHelper.setLoginUser(loginUser);
|
// LoginHelper.setLoginUser(loginUser);
|
||||||
}
|
// }
|
||||||
|
// todo LoginUser 改为存储到token内部 无法热更新 等待后续想办法
|
||||||
return R.ok();
|
return R.ok();
|
||||||
}
|
}
|
||||||
return R.fail("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
|
return R.fail("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import com.ruoyi.common.log.annotation.Log;
|
|||||||
import com.ruoyi.common.log.enums.BusinessType;
|
import com.ruoyi.common.log.enums.BusinessType;
|
||||||
import com.ruoyi.common.mybatis.core.page.PageQuery;
|
import com.ruoyi.common.mybatis.core.page.PageQuery;
|
||||||
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
|
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
|
||||||
import com.ruoyi.common.mybatis.helper.TenantHelper;
|
import com.ruoyi.common.tenant.helper.TenantHelper;
|
||||||
import com.ruoyi.common.web.core.BaseController;
|
import com.ruoyi.common.web.core.BaseController;
|
||||||
import com.ruoyi.system.domain.bo.SysTenantBo;
|
import com.ruoyi.system.domain.bo.SysTenantBo;
|
||||||
import com.ruoyi.system.domain.bo.SysUserBo;
|
import com.ruoyi.system.domain.bo.SysUserBo;
|
||||||
|
|||||||
@ -17,7 +17,7 @@ import com.ruoyi.common.log.annotation.Log;
|
|||||||
import com.ruoyi.common.log.enums.BusinessType;
|
import com.ruoyi.common.log.enums.BusinessType;
|
||||||
import com.ruoyi.common.mybatis.core.page.PageQuery;
|
import com.ruoyi.common.mybatis.core.page.PageQuery;
|
||||||
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
|
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
|
||||||
import com.ruoyi.common.mybatis.helper.TenantHelper;
|
import com.ruoyi.common.tenant.helper.TenantHelper;
|
||||||
import com.ruoyi.common.satoken.utils.LoginHelper;
|
import com.ruoyi.common.satoken.utils.LoginHelper;
|
||||||
import com.ruoyi.common.web.core.BaseController;
|
import com.ruoyi.common.web.core.BaseController;
|
||||||
import com.ruoyi.system.domain.SysDept;
|
import com.ruoyi.system.domain.SysDept;
|
||||||
|
|||||||
@ -2,7 +2,7 @@ package com.ruoyi.system.domain;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.ruoyi.common.mybatis.core.domain.TenantEntity;
|
import com.ruoyi.common.tenant.core.TenantEntity;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package com.ruoyi.system.domain;
|
|||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableLogic;
|
import com.baomidou.mybatisplus.annotation.TableLogic;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.ruoyi.common.mybatis.core.domain.TenantEntity;
|
import com.ruoyi.common.tenant.core.TenantEntity;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package com.ruoyi.system.domain;
|
|||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.ruoyi.common.core.constant.UserConstants;
|
import com.ruoyi.common.core.constant.UserConstants;
|
||||||
import com.ruoyi.common.mybatis.core.domain.TenantEntity;
|
import com.ruoyi.common.tenant.core.TenantEntity;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@ package com.ruoyi.system.domain;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.ruoyi.common.mybatis.core.domain.TenantEntity;
|
import com.ruoyi.common.tenant.core.TenantEntity;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@ package com.ruoyi.system.domain;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.ruoyi.common.mybatis.core.domain.TenantEntity;
|
import com.ruoyi.common.tenant.core.TenantEntity;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@ package com.ruoyi.system.domain;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.ruoyi.common.mybatis.core.domain.TenantEntity;
|
import com.ruoyi.common.tenant.core.TenantEntity;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@ package com.ruoyi.system.domain;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.ruoyi.common.mybatis.core.domain.TenantEntity;
|
import com.ruoyi.common.tenant.core.TenantEntity;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@ package com.ruoyi.system.domain;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.ruoyi.common.mybatis.core.domain.TenantEntity;
|
import com.ruoyi.common.tenant.core.TenantEntity;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package com.ruoyi.system.domain;
|
|||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableLogic;
|
import com.baomidou.mybatisplus.annotation.TableLogic;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.ruoyi.common.mybatis.core.domain.TenantEntity;
|
import com.ruoyi.common.tenant.core.TenantEntity;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|||||||
@ -2,7 +2,7 @@ package com.ruoyi.system.domain;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.*;
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
import com.ruoyi.common.core.constant.UserConstants;
|
import com.ruoyi.common.core.constant.UserConstants;
|
||||||
import com.ruoyi.common.mybatis.core.domain.TenantEntity;
|
import com.ruoyi.common.tenant.core.TenantEntity;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
package com.ruoyi.system.domain.bo;
|
package com.ruoyi.system.domain.bo;
|
||||||
|
|
||||||
import com.ruoyi.common.mybatis.core.domain.BaseEntity;
|
import com.ruoyi.common.mybatis.core.domain.BaseEntity;
|
||||||
import com.ruoyi.common.mybatis.core.domain.TenantEntity;
|
import com.ruoyi.common.tenant.core.TenantEntity;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package com.ruoyi.system.domain.bo;
|
|||||||
import com.ruoyi.common.core.validate.AddGroup;
|
import com.ruoyi.common.core.validate.AddGroup;
|
||||||
import com.ruoyi.common.core.validate.EditGroup;
|
import com.ruoyi.common.core.validate.EditGroup;
|
||||||
import com.ruoyi.common.mybatis.core.domain.BaseEntity;
|
import com.ruoyi.common.mybatis.core.domain.BaseEntity;
|
||||||
import com.ruoyi.common.mybatis.core.domain.TenantEntity;
|
import com.ruoyi.common.tenant.core.TenantEntity;
|
||||||
import jakarta.validation.constraints.NotBlank;
|
import jakarta.validation.constraints.NotBlank;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import jakarta.validation.constraints.Size;
|
import jakarta.validation.constraints.Size;
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package com.ruoyi.system.domain.bo;
|
|||||||
import com.ruoyi.common.core.validate.AddGroup;
|
import com.ruoyi.common.core.validate.AddGroup;
|
||||||
import com.ruoyi.common.core.validate.EditGroup;
|
import com.ruoyi.common.core.validate.EditGroup;
|
||||||
import com.ruoyi.common.mybatis.core.domain.BaseEntity;
|
import com.ruoyi.common.mybatis.core.domain.BaseEntity;
|
||||||
import com.ruoyi.common.mybatis.core.domain.TenantEntity;
|
import com.ruoyi.common.tenant.core.TenantEntity;
|
||||||
import jakarta.validation.constraints.NotBlank;
|
import jakarta.validation.constraints.NotBlank;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import jakarta.validation.constraints.Size;
|
import jakarta.validation.constraints.Size;
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
package com.ruoyi.system.runner;
|
package com.ruoyi.system.runner;
|
||||||
|
|
||||||
import com.ruoyi.common.core.config.RuoYiConfig;
|
import com.ruoyi.common.core.config.RuoYiConfig;
|
||||||
import com.ruoyi.common.mybatis.helper.TenantHelper;
|
import com.ruoyi.common.tenant.helper.TenantHelper;
|
||||||
import com.ruoyi.system.service.ISysConfigService;
|
import com.ruoyi.system.service.ISysConfigService;
|
||||||
import com.ruoyi.system.service.ISysDictTypeService;
|
import com.ruoyi.system.service.ISysDictTypeService;
|
||||||
import com.ruoyi.system.service.ISysOssConfigService;
|
import com.ruoyi.system.service.ISysOssConfigService;
|
||||||
@ -29,7 +29,7 @@ public class SystemApplicationRunner implements ApplicationRunner {
|
|||||||
@Override
|
@Override
|
||||||
public void run(ApplicationArguments args) throws Exception {
|
public void run(ApplicationArguments args) throws Exception {
|
||||||
TenantHelper.enableIgnore();
|
TenantHelper.enableIgnore();
|
||||||
ossConfigService.init();
|
// ossConfigService.init();
|
||||||
log.info("初始化OSS配置成功");
|
log.info("初始化OSS配置成功");
|
||||||
if (ruoyiConfig.isCacheLazy()) {
|
if (ruoyiConfig.isCacheLazy()) {
|
||||||
TenantHelper.disableIgnore();
|
TenantHelper.disableIgnore();
|
||||||
|
|||||||
@ -16,7 +16,7 @@ import com.ruoyi.common.core.utils.SpringUtils;
|
|||||||
import com.ruoyi.common.core.utils.StringUtils;
|
import com.ruoyi.common.core.utils.StringUtils;
|
||||||
import com.ruoyi.common.mybatis.core.page.PageQuery;
|
import com.ruoyi.common.mybatis.core.page.PageQuery;
|
||||||
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
|
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
|
||||||
import com.ruoyi.common.mybatis.helper.TenantHelper;
|
import com.ruoyi.common.tenant.helper.TenantHelper;
|
||||||
import com.ruoyi.system.domain.*;
|
import com.ruoyi.system.domain.*;
|
||||||
import com.ruoyi.system.domain.bo.SysTenantBo;
|
import com.ruoyi.system.domain.bo.SysTenantBo;
|
||||||
import com.ruoyi.system.domain.vo.SysTenantVo;
|
import com.ruoyi.system.domain.vo.SysTenantVo;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user