✨ 全局:简化 captcha 组件,融合到 system 模块
| @@ -98,11 +98,6 @@ | ||||
|             <artifactId>yudao-spring-boot-starter-excel</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-captcha</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.boot</groupId> | ||||
|             <artifactId>spring-boot-starter-mail</artifactId> | ||||
| @@ -135,6 +130,11 @@ | ||||
|             <groupId>com.tencentcloudapi</groupId> | ||||
|             <artifactId>tencentcloud-sdk-java-sms</artifactId> <!-- 短信(腾讯云) --> | ||||
|         </dependency> | ||||
|  | ||||
|         <dependency> | ||||
|             <groupId>com.xingyuv</groupId> | ||||
|             <artifactId>spring-boot-starter-captcha-plus</artifactId> <!-- 验证码,一般用于登录使用 --> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
|  | ||||
| </project> | ||||
|   | ||||
| @@ -0,0 +1,29 @@ | ||||
| package cn.iocoder.yudao.module.system.framework.captcha.config; | ||||
|  | ||||
| import cn.iocoder.yudao.module.system.framework.captcha.core.RedisCaptchaServiceImpl; | ||||
| import com.xingyuv.captcha.properties.AjCaptchaProperties; | ||||
| import com.xingyuv.captcha.service.CaptchaCacheService; | ||||
| import com.xingyuv.captcha.service.impl.CaptchaServiceFactory; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| import org.springframework.data.redis.core.StringRedisTemplate; | ||||
|  | ||||
| /** | ||||
|  * 验证码的配置类 | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| @Configuration(proxyBeanMethods = false) | ||||
| public class YudaoCaptchaConfiguration { | ||||
|  | ||||
|     @Bean | ||||
|     public CaptchaCacheService captchaCacheService(AjCaptchaProperties config, | ||||
|                                                    StringRedisTemplate stringRedisTemplate) { | ||||
|         CaptchaCacheService captchaCacheService = CaptchaServiceFactory.getCache(config.getCacheType().name()); | ||||
|         if (captchaCacheService instanceof RedisCaptchaServiceImpl) { | ||||
|             ((RedisCaptchaServiceImpl) captchaCacheService).setStringRedisTemplate(stringRedisTemplate); | ||||
|         } | ||||
|         return captchaCacheService; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,49 @@ | ||||
| package cn.iocoder.yudao.module.system.framework.captcha.core; | ||||
|  | ||||
| import com.xingyuv.captcha.service.CaptchaCacheService; | ||||
| import lombok.Setter; | ||||
| import org.springframework.data.redis.core.StringRedisTemplate; | ||||
|  | ||||
| import java.util.concurrent.TimeUnit; | ||||
|  | ||||
| /** | ||||
|  * 基于 Redis 实现验证码的存储 | ||||
|  * | ||||
|  * @author 星语 | ||||
|  */ | ||||
| @Setter | ||||
| public class RedisCaptchaServiceImpl implements CaptchaCacheService { | ||||
|  | ||||
|     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); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,8 @@ | ||||
| /** | ||||
|  * 验证码拓展 | ||||
|  * | ||||
|  * 基于 aj-captcha 实现滑块验证码,文档:https://ajcaptcha.beliefteam.cn/captcha-doc/ | ||||
|  * | ||||
|  * @author 星语 | ||||
|  */ | ||||
| package cn.iocoder.yudao.module.system.framework.captcha; | ||||
| @@ -0,0 +1 @@ | ||||
| cn.iocoder.yudao.module.system.framework.captcha.core.RedisCaptchaServiceImpl | ||||
| After Width: | Height: | Size: 17 KiB | 
| After Width: | Height: | Size: 28 KiB | 
| After Width: | Height: | Size: 25 KiB | 
| After Width: | Height: | Size: 27 KiB | 
| After Width: | Height: | Size: 24 KiB | 
| After Width: | Height: | Size: 19 KiB | 
| After Width: | Height: | Size: 21 KiB | 
| After Width: | Height: | Size: 30 KiB | 
| After Width: | Height: | Size: 26 KiB | 
| After Width: | Height: | Size: 2.1 KiB | 
| After Width: | Height: | Size: 1.6 KiB | 
| After Width: | Height: | Size: 1.6 KiB | 
| After Width: | Height: | Size: 1.6 KiB | 
| After Width: | Height: | Size: 1.8 KiB | 
| After Width: | Height: | Size: 1.8 KiB | 
| After Width: | Height: | Size: 1.8 KiB | 
| After Width: | Height: | Size: 1.8 KiB | 
| After Width: | Height: | Size: 1.8 KiB | 
| After Width: | Height: | Size: 1.8 KiB | 
| After Width: | Height: | Size: 1.8 KiB | 
| After Width: | Height: | Size: 1.6 KiB | 
| After Width: | Height: | Size: 1.6 KiB | 
| After Width: | Height: | Size: 2.2 KiB | 
| After Width: | Height: | Size: 2.2 KiB | 
| After Width: | Height: | Size: 2.2 KiB | 
| After Width: | Height: | Size: 24 KiB | 
| After Width: | Height: | Size: 27 KiB | 
| After Width: | Height: | Size: 28 KiB | 
| After Width: | Height: | Size: 23 KiB | 
| After Width: | Height: | Size: 25 KiB | 
| After Width: | Height: | Size: 16 KiB | 
| After Width: | Height: | Size: 23 KiB | 
| After Width: | Height: | Size: 26 KiB | 
| After Width: | Height: | Size: 27 KiB | 
| After Width: | Height: | Size: 29 KiB | 
| @@ -207,8 +207,8 @@ public class AdminAuthServiceImplTest extends BaseDbUnitTest { | ||||
|     public void testSmsLogin_success() { | ||||
|         // 准备参数 | ||||
|         String mobile = randomString(); | ||||
|         String scene = randomString(); | ||||
|         AuthSmsLoginReqVO reqVO = new AuthSmsLoginReqVO(mobile, scene); | ||||
|         String code = randomString(); | ||||
|         AuthSmsLoginReqVO reqVO = new AuthSmsLoginReqVO(mobile, code); | ||||
|         // mock 方法(用户信息) | ||||
|         AdminUserDO user = randomPojo(AdminUserDO.class, o -> o.setId(1L)); | ||||
|         when(userService.getUserByMobile(eq(mobile))).thenReturn(user); | ||||
|   | ||||
 YunaiV
					YunaiV