refactor:报错内容修改
parent
5cae4ea12a
commit
092c7f9cc3
|
@ -80,11 +80,6 @@
|
|||
<artifactId>mapstruct-plus-spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>jakarta.servlet</groupId>
|
||||
<artifactId>jakarta.servlet-api</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>jakarta.validation</groupId>
|
||||
<artifactId>jakarta.validation-api</artifactId>
|
||||
|
|
|
@ -38,6 +38,11 @@
|
|||
<artifactId>iot-common-core</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cc.iotkit</groupId>
|
||||
<artifactId>iot-common-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cc.iotkit</groupId>
|
||||
<artifactId>iot-common-satoken</artifactId>
|
||||
|
|
|
@ -35,6 +35,11 @@
|
|||
<artifactId>iot-common-redis</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cc.iotkit</groupId>
|
||||
<artifactId>iot-common-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
|
|
@ -6,8 +6,8 @@ import cc.iotkit.common.redis.utils.RedisUtils;
|
|||
import cc.iotkit.common.satoken.utils.LoginHelper;
|
||||
import cc.iotkit.common.undefined.LoginUser;
|
||||
import cc.iotkit.common.undefined.UserOnlineDTO;
|
||||
import cc.iotkit.common.utils.ServletUtils;
|
||||
import cc.iotkit.common.utils.ip.AddressUtils;
|
||||
import cc.iotkit.common.web.utils.ServletUtils;
|
||||
import cn.dev33.satoken.config.SaTokenConfig;
|
||||
import cn.dev33.satoken.listener.SaTokenListener;
|
||||
import cn.dev33.satoken.stp.SaLoginModel;
|
||||
|
|
|
@ -1,92 +1,92 @@
|
|||
package cc.iotkit.common.tenant.config;
|
||||
|
||||
import cc.iotkit.common.redis.config.RedisConfig;
|
||||
import cc.iotkit.common.tenant.core.TenantSaTokenDao;
|
||||
import cc.iotkit.common.tenant.manager.TenantSpringCacheManager;
|
||||
import cc.iotkit.common.tenant.properties.TenantProperties;
|
||||
import cc.iotkit.common.utils.ReflectUtils;
|
||||
import cn.dev33.satoken.dao.SaTokenDao;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
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.cache.CacheManager;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* 租户配置类
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@EnableConfigurationProperties(TenantProperties.class)
|
||||
@AutoConfiguration(after = {RedisConfig.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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 多租户缓存管理器
|
||||
*/
|
||||
@Primary
|
||||
@Bean
|
||||
public CacheManager tenantCacheManager() {
|
||||
return new TenantSpringCacheManager();
|
||||
}
|
||||
|
||||
/**
|
||||
* 多租户鉴权dao实现
|
||||
*/
|
||||
@Primary
|
||||
@Bean
|
||||
public SaTokenDao tenantSaTokenDao() {
|
||||
return new TenantSaTokenDao();
|
||||
}
|
||||
|
||||
}
|
||||
//package cc.iotkit.common.tenant.config;
|
||||
//
|
||||
//import cc.iotkit.common.redis.config.RedisConfig;
|
||||
//import cc.iotkit.common.tenant.core.TenantSaTokenDao;
|
||||
//import cc.iotkit.common.tenant.manager.TenantSpringCacheManager;
|
||||
//import cc.iotkit.common.tenant.properties.TenantProperties;
|
||||
//import cc.iotkit.common.utils.ReflectUtils;
|
||||
//import cn.dev33.satoken.dao.SaTokenDao;
|
||||
//import cn.hutool.core.util.ObjectUtil;
|
||||
//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.cache.CacheManager;
|
||||
//import org.springframework.context.annotation.Bean;
|
||||
//import org.springframework.context.annotation.Primary;
|
||||
//
|
||||
//import java.util.ArrayList;
|
||||
//
|
||||
///**
|
||||
// * 租户配置类
|
||||
// *
|
||||
// * @author Lion Li
|
||||
// */
|
||||
//@EnableConfigurationProperties(TenantProperties.class)
|
||||
//@AutoConfiguration(after = {RedisConfig.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);
|
||||
// }
|
||||
// };
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * 多租户缓存管理器
|
||||
// */
|
||||
// @Primary
|
||||
// @Bean
|
||||
// public CacheManager tenantCacheManager() {
|
||||
// return new TenantSpringCacheManager();
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * 多租户鉴权dao实现
|
||||
// */
|
||||
// @Primary
|
||||
// @Bean
|
||||
// public SaTokenDao tenantSaTokenDao() {
|
||||
// return new TenantSaTokenDao();
|
||||
// }
|
||||
//
|
||||
//}
|
||||
|
|
|
@ -1,55 +1,55 @@
|
|||
package cc.iotkit.common.tenant.handle;
|
||||
|
||||
import cc.iotkit.common.satoken.utils.LoginHelper;
|
||||
import cc.iotkit.common.tenant.helper.TenantHelper;
|
||||
import cc.iotkit.common.tenant.properties.TenantProperties;
|
||||
import cc.iotkit.common.utils.StringUtils;
|
||||
import cn.hutool.core.collection.ListUtil;
|
||||
import lombok.AllArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 自定义租户处理器
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@AllArgsConstructor
|
||||
public class PlusTenantLineHandler implements TenantLineHandler {
|
||||
|
||||
private final TenantProperties tenantProperties;
|
||||
|
||||
@Override
|
||||
public Expression getTenantId() {
|
||||
String tenantId = LoginHelper.getTenantId();
|
||||
if (StringUtils.isBlank(tenantId)) {
|
||||
return new NullValue();
|
||||
}
|
||||
String dynamicTenantId = TenantHelper.getDynamic();
|
||||
if (StringUtils.isNotBlank(dynamicTenantId)) {
|
||||
// 返回动态租户
|
||||
return new StringValue(dynamicTenantId);
|
||||
}
|
||||
// 返回固定租户
|
||||
return new StringValue(tenantId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean ignoreTable(String tableName) {
|
||||
String tenantId = LoginHelper.getTenantId();
|
||||
// 判断是否有租户
|
||||
if (StringUtils.isNotBlank(tenantId)) {
|
||||
// 不需要过滤租户的表
|
||||
List<String> excludes = tenantProperties.getExcludes();
|
||||
// 非业务表
|
||||
List<String> tables = ListUtil.toList(
|
||||
"gen_table",
|
||||
"gen_table_column"
|
||||
);
|
||||
tables.addAll(excludes);
|
||||
return tables.contains(tableName);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
//package cc.iotkit.common.tenant.handle;
|
||||
//
|
||||
//import cc.iotkit.common.satoken.utils.LoginHelper;
|
||||
//import cc.iotkit.common.tenant.helper.TenantHelper;
|
||||
//import cc.iotkit.common.tenant.properties.TenantProperties;
|
||||
//import cc.iotkit.common.utils.StringUtils;
|
||||
//import cn.hutool.core.collection.ListUtil;
|
||||
//import lombok.AllArgsConstructor;
|
||||
//
|
||||
//import java.util.List;
|
||||
//
|
||||
///**
|
||||
// * 自定义租户处理器
|
||||
// *
|
||||
// * @author Lion Li
|
||||
// */
|
||||
//@AllArgsConstructor
|
||||
//public class PlusTenantLineHandler implements TenantLineHandler {
|
||||
//
|
||||
// private final TenantProperties tenantProperties;
|
||||
//
|
||||
// @Override
|
||||
// public Expression getTenantId() {
|
||||
// String tenantId = LoginHelper.getTenantId();
|
||||
// if (StringUtils.isBlank(tenantId)) {
|
||||
// return new NullValue();
|
||||
// }
|
||||
// String dynamicTenantId = TenantHelper.getDynamic();
|
||||
// if (StringUtils.isNotBlank(dynamicTenantId)) {
|
||||
// // 返回动态租户
|
||||
// return new StringValue(dynamicTenantId);
|
||||
// }
|
||||
// // 返回固定租户
|
||||
// return new StringValue(tenantId);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public boolean ignoreTable(String tableName) {
|
||||
// String tenantId = LoginHelper.getTenantId();
|
||||
// // 判断是否有租户
|
||||
// if (StringUtils.isNotBlank(tenantId)) {
|
||||
// // 不需要过滤租户的表
|
||||
// List<String> excludes = tenantProperties.getExcludes();
|
||||
// // 非业务表
|
||||
// List<String> tables = ListUtil.toList(
|
||||
// "gen_table",
|
||||
// "gen_table_column"
|
||||
// );
|
||||
// tables.addAll(excludes);
|
||||
// return tables.contains(tableName);
|
||||
// }
|
||||
// return true;
|
||||
// }
|
||||
//
|
||||
//}
|
||||
|
|
|
@ -1,59 +1,59 @@
|
|||
package cc.iotkit.common.tenant.handle;
|
||||
|
||||
|
||||
import cc.iotkit.common.constant.GlobalConstants;
|
||||
import cc.iotkit.common.redis.handler.KeyPrefixHandler;
|
||||
import cc.iotkit.common.tenant.helper.TenantHelper;
|
||||
import cc.iotkit.common.utils.StringUtils;
|
||||
|
||||
/**
|
||||
* 多租户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, GlobalConstants.GLOBAL_REDIS_KEY)) {
|
||||
return super.map(name);
|
||||
}
|
||||
String tenantId = TenantHelper.getTenantId();
|
||||
if (StringUtils.startsWith(name, tenantId)) {
|
||||
// 如果存在则直接返回
|
||||
return super.map(name);
|
||||
}
|
||||
return super.map(tenantId + ":" + name);
|
||||
}
|
||||
|
||||
/**
|
||||
* 去除前缀
|
||||
*/
|
||||
@Override
|
||||
public String unmap(String name) {
|
||||
String unmap = super.unmap(name);
|
||||
if (StringUtils.isBlank(unmap)) {
|
||||
return null;
|
||||
}
|
||||
if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) {
|
||||
return super.unmap(name);
|
||||
}
|
||||
String tenantId = TenantHelper.getTenantId();
|
||||
if (StringUtils.startsWith(unmap, tenantId)) {
|
||||
// 如果存在则删除
|
||||
return unmap.substring((tenantId + ":").length());
|
||||
}
|
||||
return unmap;
|
||||
}
|
||||
|
||||
}
|
||||
//package cc.iotkit.common.tenant.handle;
|
||||
//
|
||||
//
|
||||
//import cc.iotkit.common.constant.GlobalConstants;
|
||||
//import cc.iotkit.common.redis.handler.KeyPrefixHandler;
|
||||
//import cc.iotkit.common.tenant.helper.TenantHelper;
|
||||
//import cc.iotkit.common.utils.StringUtils;
|
||||
//
|
||||
///**
|
||||
// * 多租户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, GlobalConstants.GLOBAL_REDIS_KEY)) {
|
||||
// return super.map(name);
|
||||
// }
|
||||
// String tenantId = TenantHelper.getTenantId();
|
||||
// if (StringUtils.startsWith(name, tenantId)) {
|
||||
// // 如果存在则直接返回
|
||||
// return super.map(name);
|
||||
// }
|
||||
// return super.map(tenantId + ":" + name);
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * 去除前缀
|
||||
// */
|
||||
// @Override
|
||||
// public String unmap(String name) {
|
||||
// String unmap = super.unmap(name);
|
||||
// if (StringUtils.isBlank(unmap)) {
|
||||
// return null;
|
||||
// }
|
||||
// if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) {
|
||||
// return super.unmap(name);
|
||||
// }
|
||||
// String tenantId = TenantHelper.getTenantId();
|
||||
// if (StringUtils.startsWith(unmap, tenantId)) {
|
||||
// // 如果存在则删除
|
||||
// return unmap.substring((tenantId + ":").length());
|
||||
// }
|
||||
// return unmap;
|
||||
// }
|
||||
//
|
||||
//}
|
||||
|
|
|
@ -1,137 +1,138 @@
|
|||
package cc.iotkit.common.tenant.helper;
|
||||
|
||||
import cc.iotkit.common.constant.GlobalConstants;
|
||||
import cc.iotkit.common.redis.utils.RedisUtils;
|
||||
import cc.iotkit.common.satoken.utils.LoginHelper;
|
||||
import cc.iotkit.common.utils.SpringUtils;
|
||||
import cc.iotkit.common.utils.StringUtils;
|
||||
import cn.dev33.satoken.context.SaHolder;
|
||||
import cn.dev33.satoken.spring.SpringMVCUtil;
|
||||
import cn.hutool.core.convert.Convert;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* 租户助手
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@Slf4j
|
||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class TenantHelper {
|
||||
|
||||
private static final String DYNAMIC_TENANT_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "dynamicTenant";
|
||||
|
||||
private static final ThreadLocal<String> TEMP_DYNAMIC_TENANT = new TransmittableThreadLocal<>();
|
||||
|
||||
/**
|
||||
* 租户功能是否启用
|
||||
*/
|
||||
public static boolean isEnable() {
|
||||
return Convert.toBool(SpringUtils.getProperty("tenant.enable"), false);
|
||||
}
|
||||
|
||||
/**
|
||||
* 开启忽略租户(开启后需手动调用 {@link #disableIgnore()} 关闭)
|
||||
*/
|
||||
public static void enableIgnore() {
|
||||
InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build());
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭忽略租户
|
||||
*/
|
||||
public static void disableIgnore() {
|
||||
InterceptorIgnoreHelper.clearIgnoreStrategy();
|
||||
}
|
||||
|
||||
/**
|
||||
* 在忽略租户中执行
|
||||
*
|
||||
* @param handle 处理执行方法
|
||||
*/
|
||||
public static void ignore(Runnable handle) {
|
||||
enableIgnore();
|
||||
try {
|
||||
handle.run();
|
||||
} finally {
|
||||
disableIgnore();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 在忽略租户中执行
|
||||
*
|
||||
* @param handle 处理执行方法
|
||||
*/
|
||||
public static <T> T ignore(Supplier<T> handle) {
|
||||
enableIgnore();
|
||||
try {
|
||||
return handle.get();
|
||||
} finally {
|
||||
disableIgnore();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置动态租户(一直有效 需要手动清理)
|
||||
* <p>
|
||||
* 如果为非web环境 那么只在当前线程内生效
|
||||
*/
|
||||
public static void setDynamic(String tenantId) {
|
||||
if (!SpringMVCUtil.isWeb()) {
|
||||
TEMP_DYNAMIC_TENANT.set(tenantId);
|
||||
return;
|
||||
}
|
||||
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
||||
RedisUtils.setCacheObject(cacheKey, tenantId);
|
||||
SaHolder.getStorage().set(cacheKey, tenantId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取动态租户(一直有效 需要手动清理)
|
||||
* <p>
|
||||
* 如果为非web环境 那么只在当前线程内生效
|
||||
*/
|
||||
public static String getDynamic() {
|
||||
if (!SpringMVCUtil.isWeb()) {
|
||||
return TEMP_DYNAMIC_TENANT.get();
|
||||
}
|
||||
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
||||
String tenantId = (String) SaHolder.getStorage().get(cacheKey);
|
||||
if (StringUtils.isNotBlank(tenantId)) {
|
||||
return tenantId;
|
||||
}
|
||||
tenantId = RedisUtils.getCacheObject(cacheKey);
|
||||
SaHolder.getStorage().set(cacheKey, tenantId);
|
||||
return tenantId;
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除动态租户
|
||||
*/
|
||||
public static void clearDynamic() {
|
||||
if (!SpringMVCUtil.isWeb()) {
|
||||
TEMP_DYNAMIC_TENANT.remove();
|
||||
return;
|
||||
}
|
||||
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
||||
RedisUtils.deleteObject(cacheKey);
|
||||
SaHolder.getStorage().delete(cacheKey);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前租户id(动态租户优先)
|
||||
*/
|
||||
public static String getTenantId() {
|
||||
String tenantId = TenantHelper.getDynamic();
|
||||
if (StringUtils.isBlank(tenantId)) {
|
||||
tenantId = LoginHelper.getTenantId();
|
||||
}
|
||||
return tenantId;
|
||||
}
|
||||
|
||||
}
|
||||
//package cc.iotkit.common.tenant.helper;
|
||||
//
|
||||
//import cc.iotkit.common.constant.GlobalConstants;
|
||||
//import cc.iotkit.common.redis.utils.RedisUtils;
|
||||
//import cc.iotkit.common.satoken.utils.LoginHelper;
|
||||
//import cc.iotkit.common.utils.SpringUtils;
|
||||
//import cc.iotkit.common.utils.StringUtils;
|
||||
//import cn.dev33.satoken.context.SaHolder;
|
||||
//import cn.dev33.satoken.spring.SpringMVCUtil;
|
||||
//import cn.hutool.core.convert.Convert;
|
||||
//import com.alibaba.ttl.TransmittableThreadLocal;
|
||||
//import lombok.AccessLevel;
|
||||
//import lombok.NoArgsConstructor;
|
||||
//import lombok.extern.slf4j.Slf4j;
|
||||
//
|
||||
//import java.util.function.Supplier;
|
||||
//
|
||||
///**
|
||||
// * 租户助手
|
||||
// *
|
||||
// * @author Lion Li
|
||||
// */
|
||||
//@Slf4j
|
||||
//@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
//public class TenantHelper {
|
||||
//
|
||||
// private static final String DYNAMIC_TENANT_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "dynamicTenant";
|
||||
//
|
||||
// private static final ThreadLocal<String> TEMP_DYNAMIC_TENANT = new TransmittableThreadLocal<>();
|
||||
//
|
||||
// /**
|
||||
// * 租户功能是否启用
|
||||
// */
|
||||
// public static boolean isEnable() {
|
||||
// return Convert.toBool(SpringUtils.getProperty("tenant.enable"), false);
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * 开启忽略租户(开启后需手动调用 {@link #disableIgnore()} 关闭)
|
||||
// */
|
||||
// public static void enableIgnore() {
|
||||
// InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build());
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * 关闭忽略租户
|
||||
// */
|
||||
// public static void disableIgnore() {
|
||||
// InterceptorIgnoreHelper.clearIgnoreStrategy();
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * 在忽略租户中执行
|
||||
// *
|
||||
// * @param handle 处理执行方法
|
||||
// */
|
||||
// public static void ignore(Runnable handle) {
|
||||
// enableIgnore();
|
||||
// try {
|
||||
// handle.run();
|
||||
// } finally {
|
||||
// disableIgnore();
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * 在忽略租户中执行
|
||||
// *
|
||||
// * @param handle 处理执行方法
|
||||
// */
|
||||
// public static <T> T ignore(Supplier<T> handle) {
|
||||
// enableIgnore();
|
||||
// try {
|
||||
// return handle.get();
|
||||
// } finally {
|
||||
// disableIgnore();
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * 设置动态租户(一直有效 需要手动清理)
|
||||
// * <p>
|
||||
// * 如果为非web环境 那么只在当前线程内生效
|
||||
// */
|
||||
// public static void setDynamic(String tenantId) {
|
||||
// if (!SpringMVCUtil.isWeb()) {
|
||||
// TEMP_DYNAMIC_TENANT.set(tenantId);
|
||||
// return;
|
||||
// }
|
||||
// String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
||||
// RedisUtils.setCacheObject(cacheKey, tenantId);
|
||||
// SaHolder.getStorage().set(cacheKey, tenantId);
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * 获取动态租户(一直有效 需要手动清理)
|
||||
// * <p>
|
||||
// * 如果为非web环境 那么只在当前线程内生效
|
||||
// */
|
||||
// public static String getDynamic() {
|
||||
// if (!SpringMVCUtil.isWeb()) {
|
||||
// return TEMP_DYNAMIC_TENANT.get();
|
||||
// }
|
||||
// String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
||||
// String tenantId = (String) SaHolder.getStorage().get(cacheKey);
|
||||
// if (StringUtils.isNotBlank(tenantId)) {
|
||||
// return tenantId;
|
||||
// }
|
||||
// tenantId = RedisUtils.getCacheObject(cacheKey);
|
||||
// SaHolder.getStorage().set(cacheKey, tenantId);
|
||||
// return tenantId;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * 清除动态租户
|
||||
// */
|
||||
// public static void clearDynamic() {
|
||||
// if (!SpringMVCUtil.isWeb()) {
|
||||
// TEMP_DYNAMIC_TENANT.remove();
|
||||
// return;
|
||||
// }
|
||||
// String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
||||
// RedisUtils.deleteObject(cacheKey);
|
||||
// SaHolder.getStorage().delete(cacheKey);
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * 获取当前租户id(动态租户优先)
|
||||
// */
|
||||
// public static String getTenantId() {
|
||||
// String tenantId = TenantHelper.getDynamic();
|
||||
// if (StringUtils.isBlank(tenantId)) {
|
||||
// tenantId = LoginHelper.getTenantId();
|
||||
// }
|
||||
// return tenantId;
|
||||
// }
|
||||
//
|
||||
//}
|
||||
|
|
|
@ -1,32 +1,32 @@
|
|||
package cc.iotkit.common.tenant.manager;
|
||||
|
||||
import cc.iotkit.common.constant.GlobalConstants;
|
||||
import cc.iotkit.common.redis.manager.PlusSpringCacheManager;
|
||||
import cc.iotkit.common.tenant.helper.TenantHelper;
|
||||
import cc.iotkit.common.utils.StringUtils;
|
||||
import org.springframework.cache.Cache;
|
||||
|
||||
/**
|
||||
* 重写 cacheName 处理方法 支持多租户
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
public class TenantSpringCacheManager extends PlusSpringCacheManager {
|
||||
|
||||
public TenantSpringCacheManager() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Cache getCache(String name) {
|
||||
if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) {
|
||||
return super.getCache(name);
|
||||
}
|
||||
String tenantId = TenantHelper.getTenantId();
|
||||
if (StringUtils.startsWith(name, tenantId)) {
|
||||
// 如果存在则直接返回
|
||||
return super.getCache(name);
|
||||
}
|
||||
return super.getCache(tenantId + ":" + name);
|
||||
}
|
||||
|
||||
}
|
||||
//package cc.iotkit.common.tenant.manager;
|
||||
//
|
||||
//import cc.iotkit.common.constant.GlobalConstants;
|
||||
//import cc.iotkit.common.redis.manager.PlusSpringCacheManager;
|
||||
//import cc.iotkit.common.tenant.helper.TenantHelper;
|
||||
//import cc.iotkit.common.utils.StringUtils;
|
||||
//import org.springframework.cache.Cache;
|
||||
//
|
||||
///**
|
||||
// * 重写 cacheName 处理方法 支持多租户
|
||||
// *
|
||||
// * @author Lion Li
|
||||
// */
|
||||
//public class TenantSpringCacheManager extends PlusSpringCacheManager {
|
||||
//
|
||||
// public TenantSpringCacheManager() {
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public Cache getCache(String name) {
|
||||
// if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) {
|
||||
// return super.getCache(name);
|
||||
// }
|
||||
// String tenantId = TenantHelper.getTenantId();
|
||||
// if (StringUtils.startsWith(name, tenantId)) {
|
||||
// // 如果存在则直接返回
|
||||
// return super.getCache(name);
|
||||
// }
|
||||
// return super.getCache(tenantId + ":" + name);
|
||||
// }
|
||||
//
|
||||
//}
|
||||
|
|
|
@ -17,17 +17,6 @@
|
|||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<!-- web 容器使用 undertow 性能更强 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-undertow</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
|
@ -35,6 +24,16 @@
|
|||
<artifactId>hutool-captcha</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>transmittable-thread-local</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cn.dev33</groupId>
|
||||
<artifactId>sa-token-core</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
|
|
|
@ -4,13 +4,13 @@ import cc.iotkit.common.utils.StringUtils;
|
|||
import cc.iotkit.common.web.config.properties.XssProperties;
|
||||
import cc.iotkit.common.web.filter.RepeatableFilter;
|
||||
import cc.iotkit.common.web.filter.XssFilter;
|
||||
import jakarta.servlet.DispatcherType;
|
||||
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
|
||||
import javax.servlet.DispatcherType;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
|
|
|
@ -1,30 +0,0 @@
|
|||
package cc.iotkit.common.web.config;
|
||||
|
||||
import io.undertow.server.DefaultByteBufferPool;
|
||||
import io.undertow.websockets.jsr.WebSocketDeploymentInfo;
|
||||
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
|
||||
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
|
||||
|
||||
/**
|
||||
* Undertow 自定义配置
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@AutoConfiguration
|
||||
public class UndertowConfig implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {
|
||||
|
||||
/**
|
||||
* 设置 Undertow 的 websocket 缓冲池
|
||||
*/
|
||||
@Override
|
||||
public void customize(UndertowServletWebServerFactory factory) {
|
||||
// 默认不直接分配内存 如果项目中使用了 websocket 建议直接分配
|
||||
factory.addDeploymentInfoCustomizers(deploymentInfo -> {
|
||||
WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo();
|
||||
webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(false, 512));
|
||||
deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
|
@ -1,10 +1,10 @@
|
|||
package cc.iotkit.common.web.filter;
|
||||
|
||||
import cc.iotkit.common.utils.StringUtils;
|
||||
import jakarta.servlet.*;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import org.springframework.http.MediaType;
|
||||
|
||||
import javax.servlet.*;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
|
|
|
@ -2,12 +2,12 @@ package cc.iotkit.common.web.filter;
|
|||
|
||||
import cc.iotkit.common.constant.Constants;
|
||||
import cn.hutool.core.io.IoUtil;
|
||||
import jakarta.servlet.ReadListener;
|
||||
import jakarta.servlet.ServletInputStream;
|
||||
import jakarta.servlet.ServletResponse;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletRequestWrapper;
|
||||
|
||||
import javax.servlet.ReadListener;
|
||||
import javax.servlet.ServletInputStream;
|
||||
import javax.servlet.ServletResponse;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletRequestWrapper;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
package cc.iotkit.common.web.filter;
|
||||
|
||||
import cc.iotkit.common.utils.StringUtils;
|
||||
import jakarta.servlet.*;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.http.HttpMethod;
|
||||
|
||||
import javax.servlet.*;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
|
@ -26,9 +27,7 @@ public class XssFilter implements Filter {
|
|||
String tempExcludes = filterConfig.getInitParameter("excludes");
|
||||
if (StringUtils.isNotEmpty(tempExcludes)) {
|
||||
String[] url = tempExcludes.split(StringUtils.SEPARATOR);
|
||||
for (int i = 0; url != null && i < url.length; i++) {
|
||||
excludes.add(url[i]);
|
||||
}
|
||||
excludes.addAll(Arrays.asList(url));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4,13 +4,13 @@ import cc.iotkit.common.utils.StringUtils;
|
|||
import cn.hutool.core.io.IoUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.http.HtmlUtil;
|
||||
import jakarta.servlet.ReadListener;
|
||||
import jakarta.servlet.ServletInputStream;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletRequestWrapper;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.MediaType;
|
||||
|
||||
import javax.servlet.ReadListener;
|
||||
import javax.servlet.ServletInputStream;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletRequestWrapper;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
|
|
@ -11,7 +11,7 @@ package cc.iotkit.common.web.handler;
|
|||
|
||||
import cc.iotkit.common.api.Response;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import cn.dev33.satoken.util.SaResult;
|
||||
import org.springframework.core.MethodParameter;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.converter.HttpMessageConverter;
|
||||
|
@ -22,6 +22,7 @@ import org.springframework.web.context.request.RequestContextHolder;
|
|||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.Map;
|
||||
|
||||
@ControllerAdvice
|
||||
|
|
|
@ -6,14 +6,15 @@ import cc.iotkit.common.utils.StringUtils;
|
|||
import cc.iotkit.common.web.filter.RepeatedlyRequestWrapper;
|
||||
import cn.hutool.core.io.IoUtil;
|
||||
import cn.hutool.core.map.MapUtil;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import com.alibaba.ttl.TransmittableThreadLocal;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.time.StopWatch;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.servlet.HandlerInterceptor;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.BufferedReader;
|
||||
import java.util.Map;
|
||||
|
||||
|
|
|
@ -1,12 +1,19 @@
|
|||
package cc.iotkit.common.utils;
|
||||
package cc.iotkit.common.web.utils;
|
||||
|
||||
import cc.iotkit.common.utils.StringUtils;
|
||||
import cn.hutool.core.convert.Convert;
|
||||
import cn.hutool.extra.servlet.JakartaServletUtil;
|
||||
import cn.hutool.http.HttpStatus;
|
||||
import jakarta.servlet.ServletRequest;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.servlet.http.HttpSession;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.context.request.RequestAttributes;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.servlet.http.HttpSession;
|
||||
import java.io.IOException;
|
||||
import java.net.URLDecoder;
|
||||
import java.net.URLEncoder;
|
||||
|
@ -14,8 +21,6 @@ import java.nio.charset.StandardCharsets;
|
|||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
|
||||
/**
|
||||
|
@ -24,7 +29,7 @@ import lombok.NoArgsConstructor;
|
|||
* @author ruoyi
|
||||
*/
|
||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class ServletUtils extends JakartaServletUtil {
|
||||
public class ServletUtils {
|
||||
|
||||
/**
|
||||
* 获取String参数
|
||||
|
@ -163,7 +168,7 @@ public class ServletUtils extends JakartaServletUtil {
|
|||
}
|
||||
|
||||
public static String getClientIP() {
|
||||
return getClientIP(getRequest());
|
||||
return getRequest().getRemoteAddr();
|
||||
}
|
||||
|
||||
/**
|
|
@ -102,6 +102,11 @@
|
|||
<artifactId>iot-script-engine</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cc.iotkit</groupId>
|
||||
<artifactId>iot-message-core</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
*/
|
||||
package cc.iotkit.comps;
|
||||
|
||||
import cc.iotkit.common.Constants;
|
||||
import cc.iotkit.common.constant.Constants;
|
||||
import io.vertx.core.MultiMap;
|
||||
import io.vertx.core.Vertx;
|
||||
import io.vertx.core.buffer.Buffer;
|
||||
|
|
|
@ -112,7 +112,7 @@ public class DeviceComponentManager {
|
|||
componentInstance.create(new CompConfig(300, component.getConfig()));
|
||||
|
||||
try {
|
||||
if(component.CONVER_TYPE_STATIC.equals(component.getConverType())){
|
||||
if(ProtocolComponent.CONVER_TYPE_STATIC.equals(component.getConverType())){
|
||||
IConverter converterInstance;
|
||||
try {
|
||||
converterInstance=ComponentClassLoader.getConverter(component.getId());
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
*/
|
||||
package cc.iotkit.comps.service;
|
||||
|
||||
import cc.iotkit.common.Constants;
|
||||
import cc.iotkit.common.constant.Constants;
|
||||
import cc.iotkit.common.enums.ErrCode;
|
||||
import cc.iotkit.common.exception.BizException;
|
||||
import cc.iotkit.common.utils.DeviceUtil;
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
*/
|
||||
package cc.iotkit.comps.service;
|
||||
|
||||
import cc.iotkit.common.Constants;
|
||||
import cc.iotkit.common.constant.Constants;
|
||||
import cc.iotkit.common.thing.ThingService;
|
||||
import cc.iotkit.common.utils.JsonUtils;
|
||||
import cc.iotkit.comps.DeviceComponentManager;
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
*/
|
||||
package cc.iotkit.comps.service;
|
||||
|
||||
import cc.iotkit.common.Constants;
|
||||
import cc.iotkit.common.constant.Constants;
|
||||
import cc.iotkit.data.manager.IDeviceInfoData;
|
||||
import cc.iotkit.model.device.DeviceInfo;
|
||||
import cc.iotkit.model.device.message.ThingModelMessage;
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
*/
|
||||
package cc.iotkit.comps.service;
|
||||
|
||||
import cc.iotkit.common.Constants;
|
||||
import cc.iotkit.common.constant.Constants;
|
||||
import cc.iotkit.common.utils.JsonUtils;
|
||||
import cc.iotkit.data.manager.IDeviceInfoData;
|
||||
import cc.iotkit.data.manager.IThingModelData;
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
package cc.iotkit.system.dto.vo;
|
||||
|
||||
import cc.iotkit.system.dto.SysMenu;
|
||||
import cc.iotkit.model.system.SysMenu;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
|
@ -19,8 +18,6 @@ import java.util.List;
|
|||
@Data
|
||||
@AutoMapper(target = SysMenu.class)
|
||||
public class SysMenuVo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,13 +1,6 @@
|
|||
package cc.iotkit.system.mapper;
|
||||
|
||||
import cc.iotkit.system.dto.vo.SysMenuVo;
|
||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Constants;
|
||||
import org.dromara.common.core.constant.UserConstants;
|
||||
import cc.iotkit.system.dto.SysMenu;
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
package cc.iotkit.system.mapper;
|
||||
|
||||
import cc.iotkit.system.dto.vo.SysPostVo;
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
import cc.iotkit.system.dto.SysPost;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
|
|
@ -1,14 +1,6 @@
|
|||
package cc.iotkit.system.mapper;
|
||||
|
||||
import cc.iotkit.system.dto.vo.SysRoleVo;
|
||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Constants;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import org.dromara.common.mybatis.annotation.DataColumn;
|
||||
import org.dromara.common.mybatis.annotation.DataPermission;
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
import cc.iotkit.system.dto.SysRole;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
|
|
@ -5,9 +5,9 @@ import cc.iotkit.common.constant.Constants;
|
|||
import cc.iotkit.common.undefined.PagedDataVo;
|
||||
import cc.iotkit.common.log.event.LogininforEvent;
|
||||
import cc.iotkit.common.utils.MapstructUtils;
|
||||
import cc.iotkit.common.utils.ServletUtils;
|
||||
import cc.iotkit.common.utils.StringUtils;
|
||||
import cc.iotkit.common.utils.ip.AddressUtils;
|
||||
import cc.iotkit.common.web.utils.UnsignedMathGenerator;
|
||||
import cc.iotkit.model.system.SysLogininfor;
|
||||
import cc.iotkit.system.dto.bo.SysLogininforBo;
|
||||
import cc.iotkit.system.dto.vo.SysLogininforVo;
|
||||
|
@ -48,7 +48,7 @@ public class SysLogininforServiceImpl implements ISysLogininforService {
|
|||
public void recordLogininfor(LogininforEvent logininforEvent) {
|
||||
HttpServletRequest request = logininforEvent.getRequest();
|
||||
final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
|
||||
final String ip = ServletUtils.getClientIP(request);
|
||||
final String ip = UnsignedMathGenerator.ServletUtils.getClientIP(request);
|
||||
|
||||
String address = AddressUtils.getRealAddressByIP(ip);
|
||||
StringBuilder s = new StringBuilder();
|
||||
|
|
|
@ -1,180 +1,180 @@
|
|||
package cc.iotkit.system.service.impl;
|
||||
|
||||
import cc.iotkit.common.api.PageRequest;
|
||||
import cc.iotkit.common.constant.CacheNames;
|
||||
import cc.iotkit.common.undefined.PagedDataVo;
|
||||
import cc.iotkit.common.exception.BizException;
|
||||
import cc.iotkit.common.redis.utils.CacheUtils;
|
||||
import cc.iotkit.common.redis.utils.RedisUtils;
|
||||
import cc.iotkit.common.tenant.core.TenantDto;
|
||||
import cc.iotkit.common.tenant.helper.TenantHelper;
|
||||
import cc.iotkit.common.utils.JsonUtils;
|
||||
import cc.iotkit.common.utils.MapstructUtils;
|
||||
import cc.iotkit.common.utils.StreamUtils;
|
||||
import cc.iotkit.common.utils.StringUtils;
|
||||
import cc.iotkit.model.system.SysOssConfig;
|
||||
import cc.iotkit.system.dto.bo.SysOssConfigBo;
|
||||
import cc.iotkit.system.dto.vo.SysOssConfigVo;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import cc.iotkit.system.service.ISysOssConfigService;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 对象存储配置Service业务层处理
|
||||
*
|
||||
* @author Lion Li
|
||||
* @author 孤舟烟雨
|
||||
* @date 2021-08-13
|
||||
*/
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class SysOssConfigServiceImpl implements ISysOssConfigService {
|
||||
|
||||
private final SysOssConfigMapper baseMapper;
|
||||
|
||||
/**
|
||||
* 项目启动时,初始化参数到缓存,加载配置类
|
||||
*/
|
||||
@Override
|
||||
public void init() {
|
||||
List<SysOssConfig> list = TenantHelper.ignore(() ->
|
||||
baseMapper.selectList(
|
||||
new LambdaQueryWrapper<SysOssConfig>().orderByAsc(TenantDto::getTenantId))
|
||||
);
|
||||
Map<String, List<SysOssConfig>> map = StreamUtils.groupByKey(list, SysOssConfig::getTenantId);
|
||||
try {
|
||||
for (String tenantId : map.keySet()) {
|
||||
TenantHelper.setDynamic(tenantId);
|
||||
// 加载OSS初始化配置
|
||||
for (SysOssConfig config : map.get(tenantId)) {
|
||||
String configKey = config.getConfigKey();
|
||||
if ("0".equals(config.getStatus())) {
|
||||
RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, configKey);
|
||||
}
|
||||
CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config));
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
TenantHelper.clearDynamic();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public SysOssConfigVo queryById(Long ossConfigId) {
|
||||
return baseMapper.selectVoById(ossConfigId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PagedDataVo<SysOssConfigVo> queryPageList(SysOssConfigBo bo, PageRequest<?> query) {
|
||||
LambdaQueryWrapper<SysOssConfig> lqw = buildQueryWrapper(bo);
|
||||
Page<SysOssConfigVo> result = baseMapper.selectVoPage(query.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
|
||||
private LambdaQueryWrapper<SysOssConfig> buildQueryWrapper(SysOssConfigBo bo) {
|
||||
LambdaQueryWrapper<SysOssConfig> lqw = Wrappers.lambdaQuery();
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getConfigKey()), SysOssConfig::getConfigKey, bo.getConfigKey());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getBucketName()), SysOssConfig::getBucketName, bo.getBucketName());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysOssConfig::getStatus, bo.getStatus());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean insertByBo(SysOssConfigBo bo) {
|
||||
SysOssConfig config = MapstructUtils.convert(bo, SysOssConfig.class);
|
||||
validEntityBeforeSave(config);
|
||||
boolean flag = baseMapper.insert(config) > 0;
|
||||
if (flag) {
|
||||
CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config));
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean updateByBo(SysOssConfigBo bo) {
|
||||
SysOssConfig config = MapstructUtils.convert(bo, SysOssConfig.class);
|
||||
validEntityBeforeSave(config);
|
||||
LambdaUpdateWrapper<SysOssConfig> luw = new LambdaUpdateWrapper<>();
|
||||
luw.set(ObjectUtil.isNull(config.getPrefix()), SysOssConfig::getPrefix, "");
|
||||
luw.set(ObjectUtil.isNull(config.getRegion()), SysOssConfig::getRegion, "");
|
||||
luw.set(ObjectUtil.isNull(config.getExt1()), SysOssConfig::getExt1, "");
|
||||
luw.set(ObjectUtil.isNull(config.getRemark()), SysOssConfig::getRemark, "");
|
||||
luw.eq(SysOssConfig::getOssConfigId, config.getOssConfigId());
|
||||
boolean flag = baseMapper.update(config, luw) > 0;
|
||||
if (flag) {
|
||||
CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config));
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(SysOssConfig entity) {
|
||||
if (StringUtils.isNotEmpty(entity.getConfigKey())
|
||||
&& !checkConfigKeyUnique(entity)) {
|
||||
throw new BizException("操作配置'" + entity.getConfigKey() + "'失败, 配置key已存在!");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if (isValid) {
|
||||
if (CollUtil.containsAny(ids, OssConstant.SYSTEM_DATA_IDS)) {
|
||||
throw new BizException("系统内置, 不可删除!");
|
||||
}
|
||||
}
|
||||
List<SysOssConfig> list = CollUtil.newArrayList();
|
||||
for (Long configId : ids) {
|
||||
SysOssConfig config = baseMapper.selectById(configId);
|
||||
list.add(config);
|
||||
}
|
||||
boolean flag = baseMapper.deleteBatchIds(ids) > 0;
|
||||
if (flag) {
|
||||
list.forEach(sysOssConfig ->
|
||||
CacheUtils.evict(CacheNames.SYS_OSS_CONFIG, sysOssConfig.getConfigKey()));
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断configKey是否唯一
|
||||
*/
|
||||
private boolean checkConfigKeyUnique(SysOssConfig sysOssConfig) {
|
||||
long ossConfigId = ObjectUtil.isNull(sysOssConfig.getOssConfigId()) ? -1L : sysOssConfig.getOssConfigId();
|
||||
SysOssConfig info = baseMapper.selectOne(new LambdaQueryWrapper<SysOssConfig>()
|
||||
.select(SysOssConfig::getOssConfigId, SysOssConfig::getConfigKey)
|
||||
.eq(SysOssConfig::getConfigKey, sysOssConfig.getConfigKey()));
|
||||
if (ObjectUtil.isNotNull(info) && info.getOssConfigId() != ossConfigId) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 启用禁用状态
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public int updateOssConfigStatus(SysOssConfigBo bo) {
|
||||
SysOssConfig sysOssConfig = MapstructUtils.convert(bo, SysOssConfig.class);
|
||||
int row = baseMapper.update(null, new LambdaUpdateWrapper<SysOssConfig>()
|
||||
.set(SysOssConfig::getStatus, "1"));
|
||||
row += baseMapper.updateById(sysOssConfig);
|
||||
if (row > 0) {
|
||||
RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, sysOssConfig.getConfigKey());
|
||||
}
|
||||
return row;
|
||||
}
|
||||
|
||||
}
|
||||
//package cc.iotkit.system.service.impl;
|
||||
//
|
||||
//import cc.iotkit.common.api.PageRequest;
|
||||
//import cc.iotkit.common.constant.CacheNames;
|
||||
//import cc.iotkit.common.undefined.PagedDataVo;
|
||||
//import cc.iotkit.common.exception.BizException;
|
||||
//import cc.iotkit.common.redis.utils.CacheUtils;
|
||||
//import cc.iotkit.common.redis.utils.RedisUtils;
|
||||
//import cc.iotkit.common.tenant.core.TenantDto;
|
||||
//import cc.iotkit.common.tenant.helper.TenantHelper;
|
||||
//import cc.iotkit.common.utils.JsonUtils;
|
||||
//import cc.iotkit.common.utils.MapstructUtils;
|
||||
//import cc.iotkit.common.utils.StreamUtils;
|
||||
//import cc.iotkit.common.utils.StringUtils;
|
||||
//import cc.iotkit.model.system.SysOssConfig;
|
||||
//import cc.iotkit.system.dto.bo.SysOssConfigBo;
|
||||
//import cc.iotkit.system.dto.vo.SysOssConfigVo;
|
||||
//import cn.hutool.core.collection.CollUtil;
|
||||
//import cn.hutool.core.util.ObjectUtil;
|
||||
//import lombok.RequiredArgsConstructor;
|
||||
//import lombok.extern.slf4j.Slf4j;
|
||||
//import cc.iotkit.system.service.ISysOssConfigService;
|
||||
//import org.springframework.stereotype.Service;
|
||||
//import org.springframework.transaction.annotation.Transactional;
|
||||
//
|
||||
//import java.util.Collection;
|
||||
//import java.util.List;
|
||||
//import java.util.Map;
|
||||
//
|
||||
///**
|
||||
// * 对象存储配置Service业务层处理
|
||||
// *
|
||||
// * @author Lion Li
|
||||
// * @author 孤舟烟雨
|
||||
// * @date 2021-08-13
|
||||
// */
|
||||
//@Slf4j
|
||||
//@RequiredArgsConstructor
|
||||
//@Service
|
||||
//public class SysOssConfigServiceImpl implements ISysOssConfigService {
|
||||
//
|
||||
// private final SysOssConfigMapper baseMapper;
|
||||
//
|
||||
// /**
|
||||
// * 项目启动时,初始化参数到缓存,加载配置类
|
||||
// */
|
||||
// @Override
|
||||
// public void init() {
|
||||
// List<SysOssConfig> list = TenantHelper.ignore(() ->
|
||||
// baseMapper.selectList(
|
||||
// new LambdaQueryWrapper<SysOssConfig>().orderByAsc(TenantDto::getTenantId))
|
||||
// );
|
||||
// Map<String, List<SysOssConfig>> map = StreamUtils.groupByKey(list, SysOssConfig::getTenantId);
|
||||
// try {
|
||||
// for (String tenantId : map.keySet()) {
|
||||
// TenantHelper.setDynamic(tenantId);
|
||||
// // 加载OSS初始化配置
|
||||
// for (SysOssConfig config : map.get(tenantId)) {
|
||||
// String configKey = config.getConfigKey();
|
||||
// if ("0".equals(config.getStatus())) {
|
||||
// RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, configKey);
|
||||
// }
|
||||
// CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config));
|
||||
// }
|
||||
// }
|
||||
// } finally {
|
||||
// TenantHelper.clearDynamic();
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public SysOssConfigVo queryById(Long ossConfigId) {
|
||||
// return baseMapper.selectVoById(ossConfigId);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public PagedDataVo<SysOssConfigVo> queryPageList(SysOssConfigBo bo, PageRequest<?> query) {
|
||||
// LambdaQueryWrapper<SysOssConfig> lqw = buildQueryWrapper(bo);
|
||||
// Page<SysOssConfigVo> result = baseMapper.selectVoPage(query.build(), lqw);
|
||||
// return TableDataInfo.build(result);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// private LambdaQueryWrapper<SysOssConfig> buildQueryWrapper(SysOssConfigBo bo) {
|
||||
// LambdaQueryWrapper<SysOssConfig> lqw = Wrappers.lambdaQuery();
|
||||
// lqw.eq(StringUtils.isNotBlank(bo.getConfigKey()), SysOssConfig::getConfigKey, bo.getConfigKey());
|
||||
// lqw.like(StringUtils.isNotBlank(bo.getBucketName()), SysOssConfig::getBucketName, bo.getBucketName());
|
||||
// lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysOssConfig::getStatus, bo.getStatus());
|
||||
// return lqw;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public Boolean insertByBo(SysOssConfigBo bo) {
|
||||
// SysOssConfig config = MapstructUtils.convert(bo, SysOssConfig.class);
|
||||
// validEntityBeforeSave(config);
|
||||
// boolean flag = baseMapper.insert(config) > 0;
|
||||
// if (flag) {
|
||||
// CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config));
|
||||
// }
|
||||
// return flag;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public Boolean updateByBo(SysOssConfigBo bo) {
|
||||
// SysOssConfig config = MapstructUtils.convert(bo, SysOssConfig.class);
|
||||
// validEntityBeforeSave(config);
|
||||
// LambdaUpdateWrapper<SysOssConfig> luw = new LambdaUpdateWrapper<>();
|
||||
// luw.set(ObjectUtil.isNull(config.getPrefix()), SysOssConfig::getPrefix, "");
|
||||
// luw.set(ObjectUtil.isNull(config.getRegion()), SysOssConfig::getRegion, "");
|
||||
// luw.set(ObjectUtil.isNull(config.getExt1()), SysOssConfig::getExt1, "");
|
||||
// luw.set(ObjectUtil.isNull(config.getRemark()), SysOssConfig::getRemark, "");
|
||||
// luw.eq(SysOssConfig::getOssConfigId, config.getOssConfigId());
|
||||
// boolean flag = baseMapper.update(config, luw) > 0;
|
||||
// if (flag) {
|
||||
// CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config));
|
||||
// }
|
||||
// return flag;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * 保存前的数据校验
|
||||
// */
|
||||
// private void validEntityBeforeSave(SysOssConfig entity) {
|
||||
// if (StringUtils.isNotEmpty(entity.getConfigKey())
|
||||
// && !checkConfigKeyUnique(entity)) {
|
||||
// throw new BizException("操作配置'" + entity.getConfigKey() + "'失败, 配置key已存在!");
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
// if (isValid) {
|
||||
// if (CollUtil.containsAny(ids, OssConstant.SYSTEM_DATA_IDS)) {
|
||||
// throw new BizException("系统内置, 不可删除!");
|
||||
// }
|
||||
// }
|
||||
// List<SysOssConfig> list = CollUtil.newArrayList();
|
||||
// for (Long configId : ids) {
|
||||
// SysOssConfig config = baseMapper.selectById(configId);
|
||||
// list.add(config);
|
||||
// }
|
||||
// boolean flag = baseMapper.deleteBatchIds(ids) > 0;
|
||||
// if (flag) {
|
||||
// list.forEach(sysOssConfig ->
|
||||
// CacheUtils.evict(CacheNames.SYS_OSS_CONFIG, sysOssConfig.getConfigKey()));
|
||||
// }
|
||||
// return flag;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * 判断configKey是否唯一
|
||||
// */
|
||||
// private boolean checkConfigKeyUnique(SysOssConfig sysOssConfig) {
|
||||
// long ossConfigId = ObjectUtil.isNull(sysOssConfig.getOssConfigId()) ? -1L : sysOssConfig.getOssConfigId();
|
||||
// SysOssConfig info = baseMapper.selectOne(new LambdaQueryWrapper<SysOssConfig>()
|
||||
// .select(SysOssConfig::getOssConfigId, SysOssConfig::getConfigKey)
|
||||
// .eq(SysOssConfig::getConfigKey, sysOssConfig.getConfigKey()));
|
||||
// if (ObjectUtil.isNotNull(info) && info.getOssConfigId() != ossConfigId) {
|
||||
// return false;
|
||||
// }
|
||||
// return true;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * 启用禁用状态
|
||||
// */
|
||||
// @Override
|
||||
// @Transactional(rollbackFor = Exception.class)
|
||||
// public int updateOssConfigStatus(SysOssConfigBo bo) {
|
||||
// SysOssConfig sysOssConfig = MapstructUtils.convert(bo, SysOssConfig.class);
|
||||
// int row = baseMapper.update(null, new LambdaUpdateWrapper<SysOssConfig>()
|
||||
// .set(SysOssConfig::getStatus, "1"));
|
||||
// row += baseMapper.updateById(sysOssConfig);
|
||||
// if (row > 0) {
|
||||
// RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, sysOssConfig.getConfigKey());
|
||||
// }
|
||||
// return row;
|
||||
// }
|
||||
//
|
||||
//}
|
||||
|
|
Loading…
Reference in New Issue