diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml
index 45c45937e..3bf41dcc8 100644
--- a/yudao-dependencies/pom.xml
+++ b/yudao-dependencies/pom.xml
@@ -47,15 +47,14 @@
0.1.16
4.0.0
- 7.1.0.M6
- 6.7.0
+ 6.7.2
3.0.4
1.18.20
1.4.1.Final
- 5.7.22
+ 5.8.5
2.2.7
- 2.2
+ 2.3
1.0.5
2.0.5
30.1.1-jre
@@ -64,11 +63,12 @@
3.8.0
0.1.55
2.4.1
+ 1.3.0
8.2.2
- 4.5.25
- 2.1.0
- 3.1.471
+ 4.6.0
+ 2.2.1
+ 3.1.561
1.2.7
1.4.0
@@ -149,6 +149,11 @@
yudao-spring-boot-starter-biz-error-code
${revision}
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-captcha
+ ${revision}
+
@@ -419,41 +424,6 @@
-
- org.activiti
- activiti-spring-boot-starter
- ${activiti.version}
-
-
- de.odysseus.juel
- juel-api
-
-
- de.odysseus.juel
- juel-spi
-
-
- org.mybatis
- mybatis
-
-
- el-api
- javax.el
-
-
-
-
- org.activiti
- activiti-image-generator
- ${activiti.version}
-
-
-
- cn.iocoder.cloud
- yudao-spring-boot-starter-activiti
- ${revision}
-
-
cn.iocoder.cloud
yudao-spring-boot-starter-flowable
@@ -530,6 +500,12 @@
${tika-core.version}
+
+ com.anji-plus
+ spring-boot-starter-captcha
+ ${aj-captcha.version}
+
+
org.apache.velocity
velocity-engine-core
diff --git a/yudao-framework/pom.xml b/yudao-framework/pom.xml
index cd703719c..1c1f28e3d 100644
--- a/yudao-framework/pom.xml
+++ b/yudao-framework/pom.xml
@@ -40,8 +40,8 @@
yudao-spring-boot-starter-biz-data-permission
yudao-spring-boot-starter-biz-error-code
- yudao-spring-boot-starter-activiti
yudao-spring-boot-starter-flowable
+ yudao-spring-boot-starter-captcha
yudao-framework
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/ArrayUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/ArrayUtils.java
index 366f96008..4285b8f4c 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/ArrayUtils.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/ArrayUtils.java
@@ -1,6 +1,7 @@
package cn.iocoder.yudao.framework.common.util.collection;
import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.collection.IterUtil;
import cn.hutool.core.util.ArrayUtil;
import java.util.Collection;
@@ -44,7 +45,7 @@ public class ArrayUtils {
if (CollectionUtil.isEmpty(from)) {
return (T[]) (new Object[0]);
}
- return ArrayUtil.toArray(from, (Class) CollectionUtil.getElementType(from.iterator()));
+ return ArrayUtil.toArray(from, (Class) IterUtil.getElementType(from.iterator()));
}
public static T get(T[] array, int index) {
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java
index d508c6ced..97fe67f61 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java
@@ -1,5 +1,7 @@
package cn.iocoder.yudao.framework.common.util.date;
+import cn.hutool.core.date.DateUtil;
+
import java.time.Duration;
import java.util.Calendar;
import java.util.Date;
@@ -120,4 +122,17 @@ public class DateUtils {
return c.getTime();
}
+ /**
+ * 是否今天
+ *
+ * @param date 日期
+ * @return 是否
+ */
+ public static boolean isToday(Date date) {
+ if (date == null) {
+ return false;
+ }
+ return DateUtil.isSameDay(date, new Date());
+ }
+
}
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/validation/ValidationUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/validation/ValidationUtils.java
index d9a01747d..f65955981 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/validation/ValidationUtils.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/validation/ValidationUtils.java
@@ -1,7 +1,6 @@
package cn.iocoder.yudao.framework.common.util.validation;
import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.StrUtil;
import org.springframework.util.StringUtils;
import javax.validation.ConstraintViolation;
@@ -17,16 +16,15 @@ import java.util.regex.Pattern;
*/
public class ValidationUtils {
+ private static final Pattern PATTERN_MOBILE = Pattern.compile("^(?:(?:\\+|00)86)?1(?:(?:3[\\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\\d])|(?:9[189]))\\d{8}$");
+
private static final Pattern PATTERN_URL = Pattern.compile("^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]");
private static final Pattern PATTERN_XML_NCNAME = Pattern.compile("[a-zA-Z_][\\-_.0-9_a-zA-Z$]*");
public static boolean isMobile(String mobile) {
- if (StrUtil.length(mobile) != 11) {
- return false;
- }
- // TODO 芋艿,后面完善手机校验
- return true;
+ return StringUtils.hasText(mobile)
+ && PATTERN_MOBILE.matcher(mobile).matches();
}
public static boolean isURL(String url) {
diff --git a/yudao-framework/yudao-spring-boot-starter-activiti/pom.xml b/yudao-framework/yudao-spring-boot-starter-activiti/pom.xml
deleted file mode 100644
index 3d5cf0919..000000000
--- a/yudao-framework/yudao-spring-boot-starter-activiti/pom.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
- cn.iocoder.cloud
- yudao-framework
- ${revision}
-
- 4.0.0
- yudao-spring-boot-starter-activiti
- jar
-
- ${project.artifactId}
- Activiti 拓展
- https://github.com/YunaiV/ruoyi-vue-pro
-
-
-
- cn.iocoder.cloud
- yudao-common
-
-
-
-
- cn.iocoder.cloud
- yudao-spring-boot-starter-security
-
-
-
-
- cn.iocoder.cloud
- yudao-spring-boot-starter-mybatis
-
-
-
-
- org.activiti
- activiti-spring-boot-starter
-
-
- org.activiti
- activiti-image-generator
-
-
-
-
-
diff --git a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/config/YudaoActivitiConfiguration.java b/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/config/YudaoActivitiConfiguration.java
deleted file mode 100644
index ad9780a1f..000000000
--- a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/config/YudaoActivitiConfiguration.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package cn.iocoder.yudao.framework.activiti.config;
-
-import cn.iocoder.yudao.framework.activiti.core.web.ActivitiWebFilter;
-import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum;
-import org.activiti.image.ProcessDiagramGenerator;
-import org.activiti.image.impl.DefaultProcessDiagramGenerator;
-import org.activiti.spring.SpringProcessEngineConfiguration;
-import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
-import org.apache.ibatis.session.SqlSessionFactory;
-import org.apache.ibatis.transaction.TransactionFactory;
-import org.mybatis.spring.transaction.SpringManagedTransactionFactory;
-import org.springframework.boot.web.servlet.FilterRegistrationBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.transaction.PlatformTransactionManager;
-
-@Configuration
-public class YudaoActivitiConfiguration {
-
- /**
- * Activiti 流程图的生成器。目前管理后台的流程图 svg,通过它绘制生成。
- */
- @Bean
- public ProcessDiagramGenerator processDiagramGenerator() {
- return new DefaultProcessDiagramGenerator();
- }
-
- @Bean
- public FilterRegistrationBean activitiWebFilter() {
- FilterRegistrationBean registrationBean = new FilterRegistrationBean<>();
- registrationBean.setFilter(new ActivitiWebFilter());
- registrationBean.setOrder(WebFilterOrderEnum.ACTIVITI_FILTER);
- return registrationBean;
- }
-
- /**
- * ProcessEngineConfigurationConfigurer 实现类,设置事务管理器,保证 ACT_ 表和自己的表的事务一致性
- */
- @Bean
- public ProcessEngineConfigurationConfigurer processEngineConfigurationConfigurer(
- PlatformTransactionManager platformTransactionManager) {
- return processEngineConfiguration -> processEngineConfiguration.setTransactionManager(platformTransactionManager);
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/util/ActivitiUtils.java b/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/util/ActivitiUtils.java
deleted file mode 100644
index 13ecf7957..000000000
--- a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/util/ActivitiUtils.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package cn.iocoder.yudao.framework.activiti.core.util;
-
-import cn.hutool.core.util.ArrayUtil;
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.ReflectUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
-import com.alibaba.ttl.TransmittableThreadLocal;
-import org.activiti.bpmn.converter.BpmnXMLConverter;
-import org.activiti.bpmn.model.BpmnModel;
-import org.activiti.bpmn.model.FlowElement;
-import org.activiti.bpmn.model.Process;
-import org.activiti.engine.impl.identity.Authentication;
-import org.activiti.engine.impl.util.io.BytesStreamSource;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-import java.util.function.Consumer;
-
-/**
- * Activiti 工具类
- *
- * @author 芋道源码
- */
-public class ActivitiUtils {
-
- static {
- setAuthenticationThreadLocal();
- }
-
- // ========== Authentication 相关 ==========
-
- /**
- * 反射修改 Authentication 的 authenticatedUserIdThreadLocal 静态变量,使用 TTL 线程变量
- * 目的:保证 @Async 等异步执行时,变量丢失的问题
- */
- private static void setAuthenticationThreadLocal() {
- ReflectUtil.setFieldValue(Authentication.class, "authenticatedUserIdThreadLocal",
- new TransmittableThreadLocal());
- }
-
- public static void setAuthenticatedUserId(Long userId) {
- Authentication.setAuthenticatedUserId(String.valueOf(userId));
- }
-
- public static void clearAuthenticatedUserId() {
- Authentication.setAuthenticatedUserId(null);
- }
-
- public static boolean equals(String userIdStr, Long userId) {
- return Objects.equals(userId, NumberUtils.parseLong(userIdStr));
- }
-
- // ========== BPMN XML 相关 ==========
-
- /**
- * 构建对应的 BPMN Model
- *
- * @param bpmnBytes 原始的 BPMN XML 字节数组
- * @return BPMN Model
- */
- public static BpmnModel buildBpmnModel(byte[] bpmnBytes) {
- // 转换成 BpmnModel 对象
- BpmnXMLConverter converter = new BpmnXMLConverter();
- return converter.convertToBpmnModel(new BytesStreamSource(bpmnBytes), true, true);
- }
-
- /**
- * 获得 BPMN 流程中,指定的元素们
- *
- * @param model
- * @param clazz 指定元素。例如说,{@link org.activiti.bpmn.model.UserTask}、{@link org.activiti.bpmn.model.Gateway} 等等
- * @return 元素们
- */
- public static List getBpmnModelElements(BpmnModel model, Class clazz) {
- List result = new ArrayList<>();
- model.getProcesses().forEach(process -> {
- process.getFlowElements().forEach(flowElement -> {
- if (flowElement.getClass().isAssignableFrom(clazz)) {
- result.add((T) flowElement);
- }
- });
- });
- return result;
- }
-
- public static String getBpmnXml(BpmnModel model) {
- if (model == null) {
- return null;
- }
- return StrUtil.utf8Str(getBpmnBytes(model));
- }
-
- public static byte[] getBpmnBytes(BpmnModel model) {
- if (model == null) {
- return new byte[0];
- }
- BpmnXMLConverter converter = new BpmnXMLConverter();
- return converter.convertToXML(model);
- }
-
- public static boolean equals(BpmnModel oldModel, BpmnModel newModel) {
- // 由于 BpmnModel 未提供 equals 方法,所以只能转成字节数组,进行比较
- return Arrays.equals(getBpmnBytes(oldModel), getBpmnBytes(newModel));
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/web/ActivitiWebFilter.java b/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/web/ActivitiWebFilter.java
deleted file mode 100644
index cb190f1fa..000000000
--- a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/web/ActivitiWebFilter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package cn.iocoder.yudao.framework.activiti.core.web;
-
-import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils;
-import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
-import org.springframework.web.filter.OncePerRequestFilter;
-
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-/**
- * Activiti Web 过滤器,将 userId 设置到 {@link org.activiti.engine.impl.identity.Authentication} 中
- *
- * @author 芋道源码
- */
-public class ActivitiWebFilter extends OncePerRequestFilter {
-
- @Override
- protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
- throws ServletException, IOException {
- try {
- // 设置工作流的用户
- Long userId = SecurityFrameworkUtils.getLoginUserId();
- if (userId != null) {
- ActivitiUtils.setAuthenticatedUserId(userId);
- }
- // 过滤
- chain.doFilter(request, response);
- } finally {
- // 清理
- ActivitiUtils.clearAuthenticatedUserId();
- }
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/package-info.java b/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/package-info.java
deleted file mode 100644
index c49d90f93..000000000
--- a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/package-info.java
+++ /dev/null
@@ -1 +0,0 @@
-package cn.iocoder.yudao.framework.activiti;
diff --git a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/resources/META-INF/spring.factories b/yudao-framework/yudao-spring-boot-starter-activiti/src/main/resources/META-INF/spring.factories
deleted file mode 100644
index 2f091cd70..000000000
--- a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/resources/META-INF/spring.factories
+++ /dev/null
@@ -1,2 +0,0 @@
-org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
- cn.iocoder.yudao.framework.activiti.config.YudaoActivitiConfiguration
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-dict/src/main/java/cn/iocoder/yudao/framework/dict/core/util/DictFrameworkUtils.java b/yudao-framework/yudao-spring-boot-starter-biz-dict/src/main/java/cn/iocoder/yudao/framework/dict/core/util/DictFrameworkUtils.java
index e56139514..68fe2f107 100644
--- a/yudao-framework/yudao-spring-boot-starter-biz-dict/src/main/java/cn/iocoder/yudao/framework/dict/core/util/DictFrameworkUtils.java
+++ b/yudao-framework/yudao-spring-boot-starter-biz-dict/src/main/java/cn/iocoder/yudao/framework/dict/core/util/DictFrameworkUtils.java
@@ -2,7 +2,6 @@ package cn.iocoder.yudao.framework.dict.core.util;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.core.KeyValue;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.cache.CacheUtils;
import cn.iocoder.yudao.module.system.api.dict.DictDataApi;
import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO;
@@ -28,7 +27,7 @@ public class DictFrameworkUtils {
/**
* 针对 {@link #getDictDataLabel(String, String)} 的缓存
*/
- private static final LoadingCache, DictDataRespDTO> getDictDataCache = CacheUtils.buildAsyncReloadingCache(
+ private static final LoadingCache, DictDataRespDTO> GET_DICT_DATA_CACHE = CacheUtils.buildAsyncReloadingCache(
Duration.ofMinutes(1L), // 过期时间 1 分钟
new CacheLoader, DictDataRespDTO>() {
@@ -43,7 +42,7 @@ public class DictFrameworkUtils {
/**
* 针对 {@link #parseDictDataValue(String, String)} 的缓存
*/
- private static final LoadingCache, DictDataRespDTO> parseDictDataCache = CacheUtils.buildAsyncReloadingCache(
+ private static final LoadingCache, DictDataRespDTO> PARSE_DICT_DATA_CACHE = CacheUtils.buildAsyncReloadingCache(
Duration.ofMinutes(1L), // 过期时间 1 分钟
new CacheLoader, DictDataRespDTO>() {
@@ -62,12 +61,12 @@ public class DictFrameworkUtils {
@SneakyThrows
public static String getDictDataLabel(String dictType, String value) {
- return getDictDataCache.get(new KeyValue<>(dictType, value)).getLabel();
+ return GET_DICT_DATA_CACHE.get(new KeyValue<>(dictType, value)).getLabel();
}
@SneakyThrows
public static String parseDictDataValue(String dictType, String label) {
- return parseDictDataCache.get(new KeyValue<>(dictType, label)).getValue();
+ return PARSE_DICT_DATA_CACHE.get(new KeyValue<>(dictType, label)).getValue();
}
}
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-pay/pom.xml b/yudao-framework/yudao-spring-boot-starter-biz-pay/pom.xml
index 20c2879dc..dbb521fa0 100644
--- a/yudao-framework/yudao-spring-boot-starter-biz-pay/pom.xml
+++ b/yudao-framework/yudao-spring-boot-starter-biz-pay/pom.xml
@@ -52,12 +52,18 @@
com.alipay.sdk
alipay-sdk-java
- 4.17.9.ALL
+ 4.31.72.ALL
+
+
+ org.bouncycastle
+ bcprov-jdk15on
+
+
com.github.binarywang
weixin-java-pay
- 4.1.9.B
+ 4.3.8.B
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/AbstractPayClient.java b/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/AbstractPayClient.java
index 292b6cf01..3253709c8 100644
--- a/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/AbstractPayClient.java
+++ b/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/AbstractPayClient.java
@@ -1,6 +1,5 @@
package cn.iocoder.yudao.framework.pay.core.client.impl;
-import cn.hutool.extra.validation.ValidationUtil;
import cn.iocoder.yudao.framework.pay.core.client.AbstractPayCodeMapping;
import cn.iocoder.yudao.framework.pay.core.client.PayClient;
import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
@@ -10,6 +9,8 @@ import cn.iocoder.yudao.framework.pay.core.client.dto.PayRefundUnifiedReqDTO;
import cn.iocoder.yudao.framework.pay.core.client.dto.PayRefundUnifiedRespDTO;
import lombok.extern.slf4j.Slf4j;
+import javax.validation.Validation;
+
import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
/**
@@ -79,7 +80,7 @@ public abstract class AbstractPayClient implemen
@Override
public final PayCommonResult> unifiedOrder(PayOrderUnifiedReqDTO reqDTO) {
- ValidationUtil.validate(reqDTO);
+ Validation.buildDefaultValidatorFactory().getValidator().validate(reqDTO);
// 执行短信发送
PayCommonResult> result;
try {
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-pay/src/test/java/cn.iocoder.yudao.framework.pay.core.client.impl/alipay/AlipayQrPayClientTest.java b/yudao-framework/yudao-spring-boot-starter-biz-pay/src/test/java/cn.iocoder.yudao.framework.pay.core.client.impl/alipay/AlipayQrPayClientTest.java
index a4c14f634..6267ee614 100644
--- a/yudao-framework/yudao-spring-boot-starter-biz-pay/src/test/java/cn.iocoder.yudao.framework.pay.core.client.impl/alipay/AlipayQrPayClientTest.java
+++ b/yudao-framework/yudao-spring-boot-starter-biz-pay/src/test/java/cn.iocoder.yudao.framework.pay.core.client.impl/alipay/AlipayQrPayClientTest.java
@@ -53,9 +53,8 @@ public class AlipayQrPayClientTest extends BaseMockitoUnitTest {
"lrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZ" +
"ikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB");
- // TODO @tina:= 前后要有空格哈
@InjectMocks
- AlipayQrPayClient client=new AlipayQrPayClient(10L,config);
+ AlipayQrPayClient client = new AlipayQrPayClient(10L, config);
@Mock
private DefaultAlipayClient defaultAlipayClient;
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-weixin/pom.xml b/yudao-framework/yudao-spring-boot-starter-biz-weixin/pom.xml
index a2a73b1e3..09c414d02 100644
--- a/yudao-framework/yudao-spring-boot-starter-biz-weixin/pom.xml
+++ b/yudao-framework/yudao-spring-boot-starter-biz-weixin/pom.xml
@@ -35,7 +35,7 @@
com.github.binarywang
wx-java-mp-spring-boot-starter
- 4.1.9.B
+ 4.3.8.B
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/pom.xml b/yudao-framework/yudao-spring-boot-starter-captcha/pom.xml
new file mode 100644
index 000000000..4bc948fe1
--- /dev/null
+++ b/yudao-framework/yudao-spring-boot-starter-captcha/pom.xml
@@ -0,0 +1,39 @@
+
+
+
+ cn.iocoder.cloud
+ yudao-framework
+ ${revision}
+
+ 4.0.0
+ yudao-spring-boot-starter-captcha
+ jar
+
+ ${project.artifactId}
+ 验证码拓展
+ 1. 基于 aj-captcha 实现滑块验证码,文档:https://ajcaptcha.beliefteam.cn/captcha-doc/
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-redis
+
+
+
+
+ com.anji-plus
+ spring-boot-starter-captcha
+
+
+
+
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/config/YudaoCaptchaConfiguration.java b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/config/YudaoCaptchaConfiguration.java
new file mode 100644
index 000000000..0f47b0844
--- /dev/null
+++ b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/config/YudaoCaptchaConfiguration.java
@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.framework.captcha.config;
+
+import cn.hutool.core.util.ClassUtil;
+import cn.iocoder.yudao.framework.captcha.core.enums.CaptchaRedisKeyConstants;
+import cn.iocoder.yudao.framework.captcha.core.service.RedisCaptchaServiceImpl;
+import com.anji.captcha.service.CaptchaCacheService;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.core.StringRedisTemplate;
+
+@Configuration
+public class YudaoCaptchaConfiguration {
+
+ static {
+ // 手动加载 Lock4jRedisKeyConstants 类,因为它不会被使用到
+ // 如果不加载,会导致 Redis 监控,看到它的 Redis Key 枚举
+ ClassUtil.loadClass(CaptchaRedisKeyConstants.class.getName());
+ }
+
+ @Bean
+ public CaptchaCacheService captchaCacheService(StringRedisTemplate stringRedisTemplate) {
+ return new RedisCaptchaServiceImpl(stringRedisTemplate);
+ }
+
+}
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/core/enums/CaptchaRedisKeyConstants.java b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/core/enums/CaptchaRedisKeyConstants.java
new file mode 100644
index 000000000..db051ca69
--- /dev/null
+++ b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/core/enums/CaptchaRedisKeyConstants.java
@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.framework.captcha.core.enums;
+
+import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine;
+import com.anji.captcha.model.vo.PointVO;
+
+import java.time.Duration;
+
+import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.STRING;
+
+/**
+ * 验证码 Redis Key 枚举类
+ *
+ * @author 芋道源码
+ */
+public interface CaptchaRedisKeyConstants {
+
+ RedisKeyDefine AJ_CAPTCHA_REQ_LIMIT = new RedisKeyDefine("验证码的请求限流",
+ "AJ.CAPTCHA.REQ.LIMIT-%s-%s",
+ STRING, Integer.class, Duration.ofSeconds(60)); // 例如说:验证失败 5 次,get 接口锁定
+
+ RedisKeyDefine AJ_CAPTCHA_RUNNING = new RedisKeyDefine("验证码的坐标",
+ "RUNNING:CAPTCHA:%s", // AbstractCaptchaService.REDIS_CAPTCHA_KEY
+ STRING, PointVO.class, Duration.ofSeconds(120)); // {"secretKey":"PP1w2Frr2KEejD2m","x":162,"y":5}
+
+}
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/core/service/RedisCaptchaServiceImpl.java b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/core/service/RedisCaptchaServiceImpl.java
new file mode 100644
index 000000000..c14901efb
--- /dev/null
+++ b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/core/service/RedisCaptchaServiceImpl.java
@@ -0,0 +1,54 @@
+package cn.iocoder.yudao.framework.captcha.core.service;
+
+import com.anji.captcha.service.CaptchaCacheService;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+import lombok.RequiredArgsConstructor;
+import org.springframework.data.redis.core.StringRedisTemplate;
+
+import javax.annotation.Resource;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 基于 Redis 实现验证码的存储
+ *
+ * @author 星语
+ */
+@NoArgsConstructor // 保证 aj-captcha 的 SPI 创建
+@AllArgsConstructor
+public class RedisCaptchaServiceImpl implements CaptchaCacheService {
+
+ @Resource // 保证 aj-captcha 的 SPI 创建时的注入
+ private StringRedisTemplate stringRedisTemplate;
+
+ @Override
+ public String type() {
+ return "redis";
+ }
+
+ @Override
+ public void set(String key, String value, long expiresInSeconds) {
+ stringRedisTemplate.opsForValue().set(key, value, expiresInSeconds, TimeUnit.SECONDS);
+ }
+
+ @Override
+ public boolean exists(String key) {
+ return Boolean.TRUE.equals(stringRedisTemplate.hasKey(key));
+ }
+
+ @Override
+ public void delete(String key) {
+ stringRedisTemplate.delete(key);
+ }
+
+ @Override
+ public String get(String key) {
+ return stringRedisTemplate.opsForValue().get(key);
+ }
+
+ @Override
+ public Long increment(String key, long val) {
+ return stringRedisTemplate.opsForValue().increment(key,val);
+ }
+
+}
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/package-info.java b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/package-info.java
new file mode 100644
index 000000000..e78d9eab2
--- /dev/null
+++ b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/package-info.java
@@ -0,0 +1,7 @@
+/**
+ * 验证码拓展
+ * 1. 基于 aj-captcha 实现滑块验证码,文档:https://ajcaptcha.beliefteam.cn/captcha-doc/
+ *
+ * @author 星语
+ */
+package cn.iocoder.yudao.framework.captcha;
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/META-INF/services/com.anji.captcha.service.CaptchaCacheService b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/META-INF/services/com.anji.captcha.service.CaptchaCacheService
new file mode 100644
index 000000000..afede97de
--- /dev/null
+++ b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/META-INF/services/com.anji.captcha.service.CaptchaCacheService
@@ -0,0 +1 @@
+cn.iocoder.yudao.framework.captcha.core.service.RedisCaptchaServiceImpl
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/META-INF/spring.factories b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/META-INF/spring.factories
new file mode 100644
index 000000000..ed8b528ff
--- /dev/null
+++ b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+ cn.iocoder.yudao.framework.captcha.config.YudaoCaptchaConfiguration
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg1.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg1.png
new file mode 100644
index 000000000..c48145769
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg1.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg2.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg2.png
new file mode 100644
index 000000000..bf8fb38ff
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg2.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg3.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg3.png
new file mode 100644
index 000000000..f871d3d12
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg3.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg4.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg4.png
new file mode 100644
index 000000000..2e3d87166
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg4.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg5.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg5.png
new file mode 100644
index 000000000..fe383b720
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg5.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg6.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg6.png
new file mode 100644
index 000000000..5024ceb22
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg6.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg7.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg7.png
new file mode 100644
index 000000000..efe76f8de
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg7.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg8.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg8.png
new file mode 100644
index 000000000..2727aa324
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg8.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg9.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg9.png
new file mode 100644
index 000000000..4463aa2fb
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg9.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/1.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/1.png
new file mode 100644
index 000000000..ef1132471
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/1.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/10.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/10.png
new file mode 100644
index 000000000..297e44cf4
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/10.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/11.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/11.png
new file mode 100644
index 000000000..d9b1da8d7
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/11.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/12.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/12.png
new file mode 100644
index 000000000..07e7313b4
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/12.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/13.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/13.png
new file mode 100644
index 000000000..82c3dd969
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/13.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/14.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/14.png
new file mode 100644
index 000000000..0b9a86615
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/14.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/15.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/15.png
new file mode 100644
index 000000000..86b0d1cf1
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/15.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/16.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/16.png
new file mode 100644
index 000000000..e90a6e292
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/16.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/17.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/17.png
new file mode 100644
index 000000000..a82cbc7c4
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/17.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/18.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/18.png
new file mode 100644
index 000000000..d3f3cfd03
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/18.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/19.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/19.png
new file mode 100644
index 000000000..eb2855bd8
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/19.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/8.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/8.png
new file mode 100644
index 000000000..3cb5ce1c8
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/8.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/9.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/9.png
new file mode 100644
index 000000000..384d35415
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/9.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/2.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/2.png
new file mode 100644
index 000000000..baf3f06d7
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/2.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/3.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/3.png
new file mode 100644
index 000000000..ccaf61723
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/3.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/4.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/4.png
new file mode 100644
index 000000000..7dab16223
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/4.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg1.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg1.png
new file mode 100644
index 000000000..14e73454a
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg1.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg10.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg10.png
new file mode 100644
index 000000000..1ea1d6d59
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg10.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg2.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg2.png
new file mode 100644
index 000000000..0edb32937
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg2.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg3.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg3.png
new file mode 100644
index 000000000..91679960f
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg3.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg4.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg4.png
new file mode 100644
index 000000000..e8e8e6c0c
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg4.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg5.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg5.png
new file mode 100644
index 000000000..66a3181e7
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg5.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg6.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg6.png
new file mode 100644
index 000000000..9b0f5d8c1
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg6.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg7.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg7.png
new file mode 100644
index 000000000..db41c74a0
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg7.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg8.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg8.png
new file mode 100644
index 000000000..349681306
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg8.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg9.png b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg9.png
new file mode 100644
index 000000000..4e7b47752
Binary files /dev/null and b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg9.png differ
diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/type/JsonLongSetTypeHandler.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/type/JsonLongSetTypeHandler.java
index ed6d81baa..052c7232e 100644
--- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/type/JsonLongSetTypeHandler.java
+++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/type/JsonLongSetTypeHandler.java
@@ -16,11 +16,11 @@ import java.util.Set;
*/
public class JsonLongSetTypeHandler extends AbstractJsonTypeHandler