refactor:报错内容修改

V0.5.x
xiwa 2023-05-18 23:18:35 +08:00
parent 5cae4ea12a
commit 092c7f9cc3
32 changed files with 628 additions and 662 deletions

View File

@ -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>

View File

@ -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>

View File

@ -35,6 +35,11 @@
<artifactId>iot-common-redis</artifactId>
</dependency>
<dependency>
<groupId>cc.iotkit</groupId>
<artifactId>iot-common-web</artifactId>
</dependency>
</dependencies>
<build>

View File

@ -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;

View File

@ -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();
// }
//
//}

View File

@ -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;
// }
//
//}

View File

@ -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;
/**
* rediskey
*
* @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;
// }
//
//}

View File

@ -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;
// }
//
//}

View File

@ -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);
// }
//
//}

View File

@ -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>

View File

@ -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;

View File

@ -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);
});
}
}

View File

@ -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;
/**

View File

@ -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;

View File

@ -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));
}
}

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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();
}
/**

View File

@ -102,6 +102,11 @@
<artifactId>iot-script-engine</artifactId>
</dependency>
<dependency>
<groupId>cc.iotkit</groupId>
<artifactId>iot-message-core</artifactId>
</dependency>
</dependencies>
<build>

View File

@ -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;

View File

@ -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());

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;
/**

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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();

View File

@ -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;
// }
//
//}