diff --git a/README.md b/README.md
index eeb3f7b..3ef0ea0 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@
[](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/master/LICENSE)
[](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
-[](https://gitee.com/dromara/RuoYi-Vue-Plus)
+[](https://gitee.com/dromara/RuoYi-Vue-Plus)
[]()
[]()
[]()
diff --git a/pom.xml b/pom.xml
index 750673b..7b92aa7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,44 +13,42 @@
RuoYi-Vue-Plus多租户管理系统
- 5.2.2
- 3.2.9
+ 5.2.3
+ 3.2.11
UTF-8
UTF-8
17
3.5.16
2.6.0
0.15.0
- 4.0.2
+ 4.0.3
2.3
- 1.38.0
- 3.5.7
+ 1.39.0
+ 3.5.8
3.9.1
5.8.31
- 4.10.0
3.2.3
- 3.34.1
+ 3.37.0
2.2.7
4.3.1
1.1.2
- 1.4.4
+ 1.4.5
0.2.0
1.18.34
1.76
1.16.6
2.7.0
- 2.3.15.Final
- 2.25.15
- 0.29.13
+ 2.28.22
+ 0.31.3
- 3.3.2
+ 3.3.3
1.2.83
- 8.7.2-20240808
+ 8.7.2-20241022
7.0.1
@@ -69,6 +67,8 @@
local
info
+ ruoyi
+ 123456
@@ -77,6 +77,8 @@
dev
info
+ ruoyi
+ 123456
@@ -88,6 +90,8 @@
prod
warn
+ ruoyi
+ 123456
@@ -225,12 +229,6 @@
${p6spy.version}
-
- com.squareup.okhttp3
- okhttp
- ${okhttp.version}
-
-
software.amazon.awssdk
@@ -313,25 +311,9 @@
- io.undertow
- undertow-core
- ${undertow.version}
-
-
- io.undertow
- undertow-servlet
- ${undertow.version}
-
-
- io.undertow
- undertow-websockets-jsr
- ${undertow.version}
-
-
-
- commons-compress
- org.apache.commons
- 1.26.2
+ commons-io
+ commons-io
+ 2.15.0
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 5e20dae..4410ab5 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -8,8 +8,8 @@ spring.boot.admin.client:
metadata:
username: ${spring.boot.admin.client.username}
userpassword: ${spring.boot.admin.client.password}
- username: ruoyi
- password: 123456
+ username: @monitor.username@
+ password: @monitor.password@
--- # snail-job 配置
snail-job:
@@ -25,6 +25,8 @@ snail-job:
namespace: ${spring.profiles.active}
# 随主应用端口飘逸
port: 2${server.port}
+ # 客户端ip指定
+ host:
--- # 数据源配置
spring:
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
index 2823bba..d261118 100644
--- a/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -11,8 +11,8 @@ spring.boot.admin.client:
metadata:
username: ${spring.boot.admin.client.username}
userpassword: ${spring.boot.admin.client.password}
- username: ruoyi
- password: 123456
+ username: @monitor.username@
+ password: @monitor.password@
--- # snail-job 配置
snail-job:
@@ -28,6 +28,8 @@ snail-job:
namespace: ${spring.profiles.active}
# 随主应用端口飘逸
port: 2${server.port}
+ # 客户端ip指定
+ host:
--- # 数据源配置
spring:
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 5d94bef..82d0f1e 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -223,9 +223,10 @@ xss:
# 过滤开关
enabled: true
# 排除链接(多个用逗号分隔)
- excludes: /system/notice
- # 匹配链接
- urlPatterns: /system/*,/monitor/*,/tool/*
+ excludeUrls:
+ - /system/notice
+ - /workflow/model/save
+ - /workflow/model/editModelXml
# 全局线程池相关配置
# 如使用JDK21请直接使用虚拟线程 不要开启此配置
diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml
index 455408d..dbc5f1c 100644
--- a/ruoyi-common/ruoyi-common-bom/pom.xml
+++ b/ruoyi-common/ruoyi-common-bom/pom.xml
@@ -14,7 +14,7 @@
- 5.2.2
+ 5.2.3
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/SseException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/SseException.java
new file mode 100644
index 0000000..a76e16d
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/SseException.java
@@ -0,0 +1,62 @@
+package org.dromara.common.core.exception;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * sse 特制异常
+ *
+ * @author LionLi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public final class SseException extends RuntimeException {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 错误码
+ */
+ private Integer code;
+
+ /**
+ * 错误提示
+ */
+ private String message;
+
+ /**
+ * 错误明细,内部调试错误
+ */
+ private String detailMessage;
+
+ public SseException(String message) {
+ this.message = message;
+ }
+
+ public SseException(String message, Integer code) {
+ this.message = message;
+ this.code = code;
+ }
+
+ @Override
+ public String getMessage() {
+ return message;
+ }
+
+ public SseException setMessage(String message) {
+ this.message = message;
+ return this;
+ }
+
+ public SseException setDetailMessage(String detailMessage) {
+ this.detailMessage = detailMessage;
+ return this;
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java
index d0163e6..8e501df 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java
@@ -5,11 +5,13 @@ import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.core.lang.tree.parser.NodeParser;
-import org.dromara.common.core.utils.reflect.ReflectUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
+import org.dromara.common.core.utils.reflect.ReflectUtils;
import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
/**
* 扩展 hutool TreeUtil 封装系统树构建
@@ -24,12 +26,54 @@ public class TreeBuildUtils extends TreeUtil {
*/
public static final TreeNodeConfig DEFAULT_CONFIG = TreeNodeConfig.DEFAULT_CONFIG.setNameKey("label");
+ /**
+ * 构建树形结构
+ *
+ * @param 输入节点的类型
+ * @param 节点ID的类型
+ * @param list 节点列表,其中包含了要构建树形结构的所有节点
+ * @param nodeParser 解析器,用于将输入节点转换为树节点
+ * @return 构建好的树形结构列表
+ */
public static List> build(List list, NodeParser nodeParser) {
if (CollUtil.isEmpty(list)) {
- return null;
+ return CollUtil.newArrayList();
}
K k = ReflectUtils.invokeGetter(list.get(0), "parentId");
return TreeUtil.build(list, k, DEFAULT_CONFIG, nodeParser);
}
+ /**
+ * 获取节点列表中所有节点的叶子节点
+ *
+ * @param 节点ID的类型
+ * @param nodes 节点列表
+ * @return 包含所有叶子节点的列表
+ */
+ public static List> getLeafNodes(List> nodes) {
+ if (CollUtil.isEmpty(nodes)) {
+ return CollUtil.newArrayList();
+ }
+ return nodes.stream()
+ .flatMap(TreeBuildUtils::extractLeafNodes)
+ .collect(Collectors.toList());
+ }
+
+ /**
+ * 获取指定节点下的所有叶子节点
+ *
+ * @param 节点ID的类型
+ * @param node 要查找叶子节点的根节点
+ * @return 包含所有叶子节点的列表
+ */
+ private static Stream> extractLeafNodes(Tree node) {
+ if (!node.hasChild()) {
+ return Stream.of(node);
+ } else {
+ // 递归调用,获取所有子节点的叶子节点
+ return node.getChildren().stream()
+ .flatMap(TreeBuildUtils::extractLeafNodes);
+ }
+ }
+
}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java
index b8b12d4..6dde129 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java
@@ -21,7 +21,8 @@ public final class RegexUtils extends ReUtil {
*/
public static String extractFromString(String input, String regex, String defaultInput) {
try {
- return ReUtil.get(regex, input, 1);
+ String str = ReUtil.get(regex, input, 1);
+ return str == null ? defaultInput : str;
} catch (Exception e) {
return defaultInput;
}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/sql/SqlUtil.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/sql/SqlUtil.java
index 3e109b2..fcf9fb4 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/sql/SqlUtil.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/sql/SqlUtil.java
@@ -15,7 +15,7 @@ public class SqlUtil {
/**
* 定义常用的 sql关键字
*/
- public static final String SQL_REGEX = "select |insert |delete |update |drop |count |exec |chr |mid |master |truncate |char |and |declare ";
+ public static String SQL_REGEX = "and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()";
/**
* 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序)
diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptorManager.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptorManager.java
index a6d3cf9..2d795e0 100644
--- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptorManager.java
+++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptorManager.java
@@ -17,7 +17,10 @@ import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.util.ClassUtils;
import java.lang.reflect.Field;
-import java.util.*;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
@@ -34,7 +37,7 @@ public class EncryptorManager {
/**
* 缓存加密器
*/
- Map encryptorMap = new ConcurrentHashMap<>();
+ Map encryptorMap = new ConcurrentHashMap<>();
/**
* 类加密字段缓存
@@ -67,11 +70,12 @@ public class EncryptorManager {
* @param encryptContext 加密执行者需要的相关配置参数
*/
public IEncryptor registAndGetEncryptor(EncryptContext encryptContext) {
- if (encryptorMap.containsKey(encryptContext)) {
- return encryptorMap.get(encryptContext);
+ int key = encryptContext.hashCode();
+ if (encryptorMap.containsKey(key)) {
+ return encryptorMap.get(key);
}
IEncryptor encryptor = ReflectUtil.newInstance(encryptContext.getAlgorithm().getClazz(), encryptContext);
- encryptorMap.put(encryptContext, encryptor);
+ encryptorMap.put(key, encryptor);
return encryptor;
}
@@ -81,7 +85,7 @@ public class EncryptorManager {
* @param encryptContext 加密执行者需要的相关配置参数
*/
public void removeEncryptor(EncryptContext encryptContext) {
- this.encryptorMap.remove(encryptContext);
+ this.encryptorMap.remove(encryptContext.hashCode());
}
/**
diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/CryptoFilter.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/CryptoFilter.java
index 9835132..79d58da 100644
--- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/CryptoFilter.java
+++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/CryptoFilter.java
@@ -99,7 +99,7 @@ public class CryptoFilter implements Filter {
}
}
} catch (Exception e) {
- throw new RuntimeException(e);
+ return null;
}
return null;
}
diff --git a/ruoyi-common/ruoyi-common-excel/pom.xml b/ruoyi-common/ruoyi-common-excel/pom.xml
index 14b9410..dd4a5ee 100644
--- a/ruoyi-common/ruoyi-common-excel/pom.xml
+++ b/ruoyi-common/ruoyi-common-excel/pom.xml
@@ -25,11 +25,6 @@
com.alibaba
easyexcel
-
- commons-compress
- org.apache.commons
- 1.26.2
-
diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java
index cdbd00f..4c6c1a4 100644
--- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java
+++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java
@@ -159,8 +159,7 @@ public class LogAspect {
private void setRequestValue(JoinPoint joinPoint, OperLogEvent operLog, String[] excludeParamNames) throws Exception {
Map paramsMap = ServletUtils.getParamMap(ServletUtils.getRequest());
String requestMethod = operLog.getRequestMethod();
- if (MapUtil.isEmpty(paramsMap)
- && HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) {
+ if (MapUtil.isEmpty(paramsMap) && StringUtils.equalsAny(requestMethod, HttpMethod.PUT.name(), HttpMethod.POST.name(), HttpMethod.DELETE.name())) {
String params = argsArrayToString(joinPoint.getArgs(), excludeParamNames);
operLog.setOperParam(StringUtils.substring(params, 0, 2000));
} else {
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java
index 956be9f..24557ed 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java
@@ -18,9 +18,7 @@ import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.function.Function;
-import java.util.stream.Collectors;
/**
* 自定义 Mapper 接口, 实现 自定义扩展
@@ -69,9 +67,7 @@ public interface BaseMapperPlus extends BaseMapper {
* @return 插入操作是否成功的布尔值
*/
default boolean insertBatch(Collection entityList) {
- Db.saveBatch(entityList);
- // 临时解决 新版本 mp 插入状态判断错误问题
- return true;
+ return Db.saveBatch(entityList);
}
/**
@@ -81,9 +77,7 @@ public interface BaseMapperPlus extends BaseMapper {
* @return 更新操作是否成功的布尔值
*/
default boolean updateBatchById(Collection entityList) {
- Db.updateBatchById(entityList);
- // 临时解决 新版本 mp 插入状态判断错误问题
- return true;
+ return Db.updateBatchById(entityList);
}
/**
@@ -93,9 +87,7 @@ public interface BaseMapperPlus extends BaseMapper {
* @return 插入或更新操作是否成功的布尔值
*/
default boolean insertOrUpdateBatch(Collection entityList) {
- Db.saveOrUpdateBatch(entityList);
- // 临时解决 新版本 mp 插入状态判断错误问题
- return true;
+ return Db.saveOrUpdateBatch(entityList);
}
/**
@@ -106,9 +98,7 @@ public interface BaseMapperPlus extends BaseMapper {
* @return 插入操作是否成功的布尔值
*/
default boolean insertBatch(Collection entityList, int batchSize) {
- Db.saveBatch(entityList, batchSize);
- // 临时解决 新版本 mp 插入状态判断错误问题
- return true;
+ return Db.saveBatch(entityList, batchSize);
}
/**
@@ -119,9 +109,7 @@ public interface BaseMapperPlus extends BaseMapper {
* @return 更新操作是否成功的布尔值
*/
default boolean updateBatchById(Collection entityList, int batchSize) {
- Db.updateBatchById(entityList, batchSize);
- // 临时解决 新版本 mp 插入状态判断错误问题
- return true;
+ return Db.updateBatchById(entityList, batchSize);
}
/**
@@ -132,9 +120,7 @@ public interface BaseMapperPlus extends BaseMapper {
* @return 插入或更新操作是否成功的布尔值
*/
default boolean insertOrUpdateBatch(Collection entityList, int batchSize) {
- Db.saveOrUpdateBatch(entityList, batchSize);
- // 临时解决 新版本 mp 插入状态判断错误问题
- return true;
+ return Db.saveOrUpdateBatch(entityList, batchSize);
}
/**
@@ -169,8 +155,8 @@ public interface BaseMapperPlus extends BaseMapper {
* @param idList 主键ID集合
* @return 查询到的VO对象列表
*/
- default List selectVoBatchIds(Collection extends Serializable> idList) {
- return selectVoBatchIds(idList, this.currentVoClass());
+ default List selectVoByIds(Collection extends Serializable> idList) {
+ return selectVoByIds(idList, this.currentVoClass());
}
/**
@@ -181,8 +167,8 @@ public interface BaseMapperPlus extends BaseMapper {
* @param VO类的类型
* @return 查询到的VO对象列表,经过转换为指定的VO类后返回
*/
- default List selectVoBatchIds(Collection extends Serializable> idList, Class voClass) {
- List list = this.selectBatchIds(idList);
+ default List selectVoByIds(Collection extends Serializable> idList, Class voClass) {
+ List list = this.selectByIds(idList);
if (CollUtil.isEmpty(list)) {
return CollUtil.newArrayList();
}
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java
index 5ac74c3..ab7e0f6 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java
@@ -6,8 +6,8 @@ import cn.hutool.core.util.ObjectUtil;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Expression;
-import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
+import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import org.apache.ibatis.io.Resources;
import org.dromara.common.core.domain.dto.RoleDTO;
@@ -106,7 +106,7 @@ public class PlusDataPermissionHandler {
try {
Expression expression = CCJSqlParserUtil.parseExpression(dataFilterSql);
// 数据权限使用单独的括号 防止与其他条件冲突
- Parenthesis parenthesis = new Parenthesis(expression);
+ ParenthesedExpressionList parenthesis = new ParenthesedExpressionList<>(expression);
if (ObjectUtil.isNotNull(where)) {
return new AndExpression(where, parenthesis);
} else {
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java
index a7cfee5..cd43c68 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java
@@ -62,8 +62,8 @@ public class DataBaseHelper {
// charindex(',100,' , ',0,100,101,') <> 0
return "charindex(',%s,' , ','+%s+',') <> 0".formatted(var, var2);
} else if (dataBasyType == DataBaseType.POSTGRE_SQL) {
- // (select position(',100,' in ',0,100,101,')) <> 0
- return "(select position(',%s,' in ','||%s||',')) <> 0".formatted(var, var2);
+ // (select strpos(',0,100,101,' , ',100,')) <> 0
+ return "(select strpos(','||%s||',' , ',%s,')) <> 0".formatted(var2, var);
} else if (dataBasyType == DataBaseType.ORACLE) {
// instr(',0,100,101,' , ',100,') <> 0
return "instr(','||%s||',' , ',%s,') <> 0".formatted(var2, var);
diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
index 5e300da..ba924c0 100644
--- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
+++ b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
@@ -15,12 +15,12 @@ import org.dromara.common.oss.properties.OssProperties;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.core.ResponseInputStream;
-import software.amazon.awssdk.core.async.AsyncRequestBody;
import software.amazon.awssdk.core.async.AsyncResponseTransformer;
import software.amazon.awssdk.core.async.BlockingInputStreamAsyncRequestBody;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3AsyncClient;
import software.amazon.awssdk.services.s3.S3Configuration;
+import software.amazon.awssdk.services.s3.crt.S3CrtHttpConfiguration;
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
import software.amazon.awssdk.services.s3.model.NoSuchBucketException;
import software.amazon.awssdk.services.s3.model.S3Exception;
@@ -83,10 +83,10 @@ public class OssClient {
StaticCredentialsProvider credentialsProvider = StaticCredentialsProvider.create(
AwsBasicCredentials.create(properties.getAccessKey(), properties.getSecretKey()));
- //MinIO 使用 HTTPS 限制使用域名访问,站点填域名。需要启用路径样式访问
+ // MinIO 使用 HTTPS 限制使用域名访问,站点填域名。需要启用路径样式访问
boolean isStyle = !StringUtils.containsAny(properties.getEndpoint(), OssConstant.CLOUD_SERVICE);
- //创建AWS基于 CRT 的 S3 客户端
+ // 创建AWS基于 CRT 的 S3 客户端
this.client = S3AsyncClient.crtBuilder()
.credentialsProvider(credentialsProvider)
.endpointOverride(URI.create(getEndpoint()))
@@ -95,6 +95,9 @@ public class OssClient {
.minimumPartSizeInBytes(10 * 1025 * 1024L)
.checksumValidationEnabled(false)
.forcePathStyle(isStyle)
+ .httpConfiguration(S3CrtHttpConfiguration.builder()
+ .connectionTimeout(Duration.ofSeconds(60)) // 设置连接超时
+ .build())
.build();
//AWS基于 CRT 的 S3 AsyncClient 实例用作 S3 传输管理器的底层客户端
@@ -178,7 +181,9 @@ public class OssClient {
.key(key)
.contentMD5(StringUtils.isNotEmpty(md5Digest) ? md5Digest : null)
.contentType(contentType)
- .acl(getAccessPolicy().getObjectCannedACL())
+ // 用于设置对象的访问控制列表(ACL)。不同云厂商对ACL的支持和实现方式有所不同,
+ // 因此根据具体的云服务提供商,你可能需要进行不同的配置(自行开启,阿里云有acl权限配置,腾讯云没有acl权限配置)
+ //.acl(getAccessPolicy().getObjectCannedACL())
.build())
.addTransferListener(LoggingTransferListener.create())
.source(filePath).build());
@@ -215,7 +220,10 @@ public class OssClient {
}
try {
// 创建异步请求体(length如果为空会报错)
- BlockingInputStreamAsyncRequestBody body = AsyncRequestBody.forBlockingInputStream(length);
+ BlockingInputStreamAsyncRequestBody body = BlockingInputStreamAsyncRequestBody.builder()
+ .contentLength(length)
+ .subscribeTimeout(Duration.ofSeconds(30))
+ .build();
// 使用 transferManager 进行上传
Upload upload = transferManager.upload(
@@ -224,7 +232,9 @@ public class OssClient {
y -> y.bucket(properties.getBucketName())
.key(key)
.contentType(contentType)
- .acl(getAccessPolicy().getObjectCannedACL())
+ // 用于设置对象的访问控制列表(ACL)。不同云厂商对ACL的支持和实现方式有所不同,
+ // 因此根据具体的云服务提供商,你可能需要进行不同的配置(自行开启,阿里云有acl权限配置,腾讯云没有acl权限配置)
+ //.acl(getAccessPolicy().getObjectCannedACL())
.build())
.build());
@@ -340,8 +350,8 @@ public class OssClient {
* @return UploadResult 包含上传后的文件信息
* @throws OssException 如果上传失败,抛出自定义异常
*/
- public UploadResult uploadSuffix(byte[] data, String suffix) {
- return upload(new ByteArrayInputStream(data), getPath(properties.getPrefix(), suffix), Long.valueOf(data.length), FileUtils.getMimeType(suffix));
+ public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) {
+ return upload(new ByteArrayInputStream(data), getPath(properties.getPrefix(), suffix), Long.valueOf(data.length), contentType);
}
/**
@@ -353,8 +363,8 @@ public class OssClient {
* @return UploadResult 包含上传后的文件信息
* @throws OssException 如果上传失败,抛出自定义异常
*/
- public UploadResult uploadSuffix(InputStream inputStream, String suffix, Long length) {
- return upload(inputStream, getPath(properties.getPrefix(), suffix), length, FileUtils.getMimeType(suffix));
+ public UploadResult uploadSuffix(InputStream inputStream, String suffix, Long length, String contentType) {
+ return upload(inputStream, getPath(properties.getPrefix(), suffix), length, contentType);
}
/**
diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java
index 793e21f..6e83df1 100644
--- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java
+++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java
@@ -44,6 +44,7 @@ public class CaffeineCacheDecorator implements Cache {
}
@SuppressWarnings("unchecked")
+ @Override
public T get(Object key, Class type) {
Object o = CAFFEINE.get(getUniqueKey(key), k -> cache.get(key, type));
return (T) o;
@@ -55,6 +56,7 @@ public class CaffeineCacheDecorator implements Cache {
cache.put(key, value);
}
+ @Override
public ValueWrapper putIfAbsent(Object key, Object value) {
CAFFEINE.invalidate(getUniqueKey(key));
return cache.putIfAbsent(key, value);
@@ -65,6 +67,7 @@ public class CaffeineCacheDecorator implements Cache {
evictIfPresent(key);
}
+ @Override
public boolean evictIfPresent(Object key) {
boolean b = cache.evictIfPresent(key);
if (b) {
@@ -78,6 +81,7 @@ public class CaffeineCacheDecorator implements Cache {
cache.clear();
}
+ @Override
public boolean invalidate() {
return cache.invalidate();
}
diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/CacheUtils.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/CacheUtils.java
index 42a88d6..865ffa5 100644
--- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/CacheUtils.java
+++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/CacheUtils.java
@@ -1,19 +1,15 @@
package org.dromara.common.redis.utils;
-import org.dromara.common.core.utils.SpringUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
-import org.redisson.api.RMap;
+import org.dromara.common.core.utils.SpringUtils;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
-import java.util.Set;
-
/**
- * 缓存操作工具类 {@link }
+ * 缓存操作工具类
*
* @author Michelle.Chung
- * @date 2022/8/13
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@SuppressWarnings(value = {"unchecked"})
@@ -21,16 +17,6 @@ public class CacheUtils {
private static final CacheManager CACHE_MANAGER = SpringUtils.getBean(CacheManager.class);
- /**
- * 获取缓存组内所有的KEY
- *
- * @param cacheNames 缓存组名称
- */
- public static Set