diff --git a/win-dependencies/pom.xml b/win-dependencies/pom.xml index 6b98e54e..fd388be8 100644 --- a/win-dependencies/pom.xml +++ b/win-dependencies/pom.xml @@ -69,9 +69,9 @@ 4.6.3 2.2.1 3.1.758 - 1.0.4 1.6.1 2.12.2 + 2.3.3 @@ -543,6 +543,19 @@ ${jsoup.version} + + + pro.fessional + kaptcha + ${kaptcha.version} + + + javax.servlet + servlet-api + + + + com.squareup.okio @@ -593,12 +606,6 @@ - - com.xingyuv - spring-boot-starter-justauth - ${justauth.version} - - org.jeecgframework.jimureport diff --git a/win-framework/win-spring-boot-starter-captcha/pom.xml b/win-framework/win-spring-boot-starter-captcha/pom.xml index 943b44bf..1deabd59 100644 --- a/win-framework/win-spring-boot-starter-captcha/pom.xml +++ b/win-framework/win-spring-boot-starter-captcha/pom.xml @@ -17,10 +17,12 @@ + - com.xingyuv - spring-boot-starter-captcha-plus + pro.fessional + kaptcha + org.springframework.boot diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/CaptchaProperties.java b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/CaptchaProperties.java new file mode 100644 index 00000000..d8f3ed4e --- /dev/null +++ b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/CaptchaProperties.java @@ -0,0 +1,24 @@ +package com.win.framework.captcha.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties(prefix = "win.captcha") +@Data +public class CaptchaProperties { + + /** + * 验证码的开关 + */ + private Boolean enable; + + /** + * 验证码类型 math 数组计算 char 字符验证 + */ + private String captchaType; + + /** + * 验证码有效期 + */ + private Integer captchaExpiration; +} diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/WinCaptchaConfiguration.java b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/WinCaptchaConfiguration.java index c0259b58..cdc01096 100644 --- a/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/WinCaptchaConfiguration.java +++ b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/WinCaptchaConfiguration.java @@ -1,29 +1,77 @@ package com.win.framework.captcha.config; -import com.win.framework.captcha.core.service.RedisCaptchaServiceImpl; -import com.xingyuv.captcha.properties.AjCaptchaProperties; -import com.xingyuv.captcha.service.CaptchaCacheService; -import com.xingyuv.captcha.service.impl.CaptchaServiceFactory; +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.data.redis.core.StringRedisTemplate; -import javax.annotation.Resource; +import java.util.Properties; + +import static com.google.code.kaptcha.Constants.*; @AutoConfiguration public class WinCaptchaConfiguration { - - @Resource - private StringRedisTemplate stringRedisTemplate; - - @Bean - public CaptchaCacheService captchaCacheService(AjCaptchaProperties config) { - // 缓存类型 redis/local/.... - CaptchaCacheService ret = CaptchaServiceFactory.getCache(config.getCacheType().name()); - if (ret instanceof RedisCaptchaServiceImpl) { - ((RedisCaptchaServiceImpl) ret).setStringRedisTemplate(stringRedisTemplate); - } - return ret; + @Bean(name = "captchaProducer") + public DefaultKaptcha getKaptchaBean() { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 是否有边框 默认为true 我们可以自己设置yes,no + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 验证码文本字符颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); + // 验证码图片宽度 默认为200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 验证码图片高度 默认为50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 验证码文本字符大小 默认为40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); + // 验证码文本字符长度 默认为5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); + // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; } + @Bean(name = "captchaProducerMath") + public DefaultKaptcha getKaptchaBeanMath() { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 是否有边框 默认为true 我们可以自己设置yes,no + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 边框颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90"); + // 验证码文本字符颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue"); + // 验证码图片宽度 默认为200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 验证码图片高度 默认为50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 验证码文本字符大小 默认为40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath"); + // 验证码文本生成器 + properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.win.tms.framework.config.KaptchaTextCreator"); + // 验证码文本字符间距 默认为2 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3"); + // 验证码文本字符长度 默认为5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6"); + // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 验证码噪点颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_NOISE_COLOR, "white"); + // 干扰实现类 + properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise"); + // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } } diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/core/enums/CaptchaRedisKeyConstants.java b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/core/enums/CaptchaRedisKeyConstants.java deleted file mode 100644 index 5577db76..00000000 --- a/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/core/enums/CaptchaRedisKeyConstants.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.framework.captcha.core.enums; - -/** - * 验证码 Redis Key 枚举类 - * - * @author 闻荫源码 - */ -public interface CaptchaRedisKeyConstants { - - /** - * 验证码的请求限流 - * - * KEY 格式:AJ.CAPTCHA.REQ.LIMIT-%s-%s - * VALUE 数据类型:String // 例如说:验证失败 5 次,get 接口锁定 - * 过期时间:60 秒 - */ - String AJ_CAPTCHA_REQ_LIMIT = "AJ.CAPTCHA.REQ.LIMIT-%s-%s"; - - /** - * 验证码的坐标 - * - * KEY 格式:RUNNING:CAPTCHA:%s // AbstractCaptchaService.REDIS_CAPTCHA_KEY - * VALUE 数据类型:String // PointVO.class {"secretKey":"PP1w2Frr2KEejD2m","x":162,"y":5} - * 过期时间:120 秒 - */ - String AJ_CAPTCHA_RUNNING = "RUNNING:CAPTCHA:%s"; - -} diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/core/service/RedisCaptchaServiceImpl.java b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/core/service/RedisCaptchaServiceImpl.java deleted file mode 100644 index 6f3b0ff1..00000000 --- a/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/core/service/RedisCaptchaServiceImpl.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.win.framework.captcha.core.service; - -import com.xingyuv.captcha.service.CaptchaCacheService; -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -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"; - } - - public void setStringRedisTemplate(StringRedisTemplate stringRedisTemplate) { - this.stringRedisTemplate = stringRedisTemplate; - } - - @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/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/enums/CaptchaRedisKeyConstants.java b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/enums/CaptchaRedisKeyConstants.java new file mode 100644 index 00000000..507c5e6e --- /dev/null +++ b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/enums/CaptchaRedisKeyConstants.java @@ -0,0 +1,15 @@ +package com.win.framework.captcha.enums; + +/** + * 验证码 Redis Key 枚举类 + * + * @author 闻荫源码 + */ +public interface CaptchaRedisKeyConstants { + + /** + * 验证码 redis key + */ + String CAPTCHA_CODE_KEY = "captcha_codes:"; + +} diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaCacheService b/win-framework/win-spring-boot-starter-captcha/src/main/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaCacheService deleted file mode 100644 index 91abb11f..00000000 --- a/win-framework/win-spring-boot-starter-captcha/src/main/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaCacheService +++ /dev/null @@ -1 +0,0 @@ -com.win.framework.captcha.core.service.RedisCaptchaServiceImpl diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-captcha/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 005d8442..36daddcf 100644 --- a/win-framework/win-spring-boot-starter-captcha/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/win-framework/win-spring-boot-starter-captcha/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1,2 @@ +com.win.framework.captcha.config.CaptchaProperties com.win.framework.captcha.config.WinCaptchaConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg1.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg1.png deleted file mode 100644 index c4814576..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg1.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg2.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg2.png deleted file mode 100644 index bf8fb38f..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg2.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg3.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg3.png deleted file mode 100644 index f871d3d1..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg3.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg4.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg4.png deleted file mode 100644 index 2e3d8716..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg4.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg5.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg5.png deleted file mode 100644 index fe383b72..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg5.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg6.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg6.png deleted file mode 100644 index 5024ceb2..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg6.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg7.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg7.png deleted file mode 100644 index efe76f8d..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg7.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg8.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg8.png deleted file mode 100644 index 2727aa32..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg8.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg9.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg9.png deleted file mode 100644 index 4463aa2f..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/original/bg9.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/1.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/1.png deleted file mode 100644 index ef113247..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/1.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/10.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/10.png deleted file mode 100644 index 297e44cf..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/10.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/11.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/11.png deleted file mode 100644 index d9b1da8d..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/11.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/12.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/12.png deleted file mode 100644 index 07e7313b..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/12.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/13.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/13.png deleted file mode 100644 index 82c3dd96..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/13.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/14.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/14.png deleted file mode 100644 index 0b9a8661..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/14.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/15.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/15.png deleted file mode 100644 index 86b0d1cf..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/15.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/16.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/16.png deleted file mode 100644 index e90a6e29..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/16.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/17.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/17.png deleted file mode 100644 index a82cbc7c..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/17.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/18.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/18.png deleted file mode 100644 index d3f3cfd0..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/18.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/19.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/19.png deleted file mode 100644 index eb2855bd..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/19.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/8.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/8.png deleted file mode 100644 index 3cb5ce1c..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/8.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/9.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/9.png deleted file mode 100644 index 384d3541..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/11/9.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/2.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/2.png deleted file mode 100644 index baf3f06d..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/2.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/3.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/3.png deleted file mode 100644 index ccaf6172..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/3.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/4.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/4.png deleted file mode 100644 index 7dab1622..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/jigsaw/slidingBlock/4.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg1.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg1.png deleted file mode 100644 index 14e73454..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg1.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg10.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg10.png deleted file mode 100644 index 1ea1d6d5..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg10.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg2.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg2.png deleted file mode 100644 index 0edb3293..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg2.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg3.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg3.png deleted file mode 100644 index 91679960..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg3.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg4.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg4.png deleted file mode 100644 index e8e8e6c0..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg4.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg5.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg5.png deleted file mode 100644 index 66a3181e..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg5.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg6.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg6.png deleted file mode 100644 index 9b0f5d8c..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg6.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg7.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg7.png deleted file mode 100644 index db41c74a..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg7.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg8.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg8.png deleted file mode 100644 index 34968130..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg8.png and /dev/null differ diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg9.png b/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg9.png deleted file mode 100644 index 4e7b4775..00000000 Binary files a/win-framework/win-spring-boot-starter-captcha/src/main/resources/images/pic-click/bg9.png and /dev/null differ diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/redis/RedisCache.java b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/util/RedisCache.java similarity index 99% rename from win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/redis/RedisCache.java rename to win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/util/RedisCache.java index d7105aaf..c4630073 100644 --- a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/redis/RedisCache.java +++ b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/util/RedisCache.java @@ -1,4 +1,4 @@ -package com.win.module.system.util.redis; +package com.win.framework.redis.util; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundSetOperations; diff --git a/win-framework/win-spring-boot-starter-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 28b34586..bdb84a69 100644 --- a/win-framework/win-spring-boot-starter-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/win-framework/win-spring-boot-starter-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,2 +1,3 @@ com.win.framework.redis.config.WinRedisAutoConfiguration -com.win.framework.redis.config.WinCacheAutoConfiguration \ No newline at end of file +com.win.framework.redis.config.WinCacheAutoConfiguration +com.win.framework.redis.util.RedisCache \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/pom.xml b/win-module-infra/win-module-infra-biz/pom.xml index f8d0cd02..25986c03 100644 --- a/win-module-infra/win-module-infra-biz/pom.xml +++ b/win-module-infra/win-module-infra-biz/pom.xml @@ -79,7 +79,6 @@ - com.win win-spring-boot-starter-excel diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java index 0f440d60..02597519 100644 --- a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java @@ -74,6 +74,9 @@ public interface ErrorCodeConstants { // ========== 通知公告 1-002-008-000 ========== ErrorCode NOTICE_NOT_FOUND = new ErrorCode(1_002_008_001, "当前通知公告不存在"); + // ========== 登陆 1-002-009-000 ========== + ErrorCode GENERATE_IMAGE_ERROR = new ErrorCode(1_002_008_001, "生成图片错误"); + // ========== 短信渠道 1-002-011-000 ========== ErrorCode SMS_CHANNEL_NOT_EXISTS = new ErrorCode(1_002_011_000, "短信渠道不存在"); ErrorCode SMS_CHANNEL_DISABLE = new ErrorCode(1_002_011_001, "短信渠道不处于开启状态,不允许选择"); @@ -114,11 +117,6 @@ public interface ErrorCodeConstants { ErrorCode ERROR_CODE_NOT_EXISTS = new ErrorCode(1_002_017_000, "错误码不存在"); ErrorCode ERROR_CODE_DUPLICATE = new ErrorCode(1_002_017_001, "已经存在编码为【{}】的错误码"); - // ========== 社交用户 1-002-018-000 ========== - ErrorCode SOCIAL_USER_AUTH_FAILURE = new ErrorCode(1_002_018_000, "社交授权失败,原因是:{}"); - ErrorCode SOCIAL_USER_UNBIND_NOT_SELF = new ErrorCode(1_002_018_001, "社交解绑失败,非当前用户绑定"); - ErrorCode SOCIAL_USER_NOT_FOUND = new ErrorCode(1_002_018_002, "社交授权失败,找不到对应的用户"); - // ========== 系统敏感词 1-002-019-000 ========= ErrorCode SENSITIVE_WORD_NOT_EXISTS = new ErrorCode(1_002_019_000, "系统敏感词在所有标签中都不存在"); ErrorCode SENSITIVE_WORD_EXISTS = new ErrorCode(1_002_019_001, "系统敏感词已在标签中存在"); diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginResultEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginResultEnum.java index 8248e4dc..d237a06a 100644 --- a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginResultEnum.java +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginResultEnum.java @@ -13,7 +13,7 @@ public enum LoginResultEnum { SUCCESS(0), // 成功 BAD_CREDENTIALS(10), // 账号或密码不正确 USER_DISABLED(20), // 用户被禁用 - CAPTCHA_NOT_FOUND(30), // 图片验证码不存在 + CAPTCHA_EXPIRE(30), // 验证码超期 CAPTCHA_CODE_ERROR(31), // 图片验证码不正确 ; diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthLoginReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthLoginReqVO.java index 7297e03e..16b0217f 100644 --- a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthLoginReqVO.java +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthLoginReqVO.java @@ -28,16 +28,19 @@ public class AuthLoginReqVO { @Length(min = 4, max = 16, message = "密码长度为 4-16 位") private String password; - // ========== 图片验证码相关 ========== + // ========== 验证码相关 ========== - @Schema(description = "验证码,验证码开启时,需要传递", requiredMode = Schema.RequiredMode.REQUIRED, - example = "PfcH6mgr8tpXuMWFjvW6YVaqrswIuwmWI5dsVZSg7sGpWtDCUbHuDEXl3cFB1+VvCC/rAkSwK8Fad52FSuncVg==") - @NotEmpty(message = "验证码不能为空", groups = CodeEnableGroup.class) - private String captchaVerification; + /** + * 验证码 + */ + @Schema(description = "验证码", requiredMode = Schema.RequiredMode.REQUIRED, example = "12") + @NotEmpty(message = "验证码不能为空") + private String code; /** - * 开启验证码的 Group + * 唯一标识 */ - public interface CodeEnableGroup {} + @NotEmpty(message = "uuid不能为空") + private String uuid; } \ No newline at end of file diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/captcha/CaptchaController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/captcha/CaptchaController.java index 4eb5d6f3..ef13c971 100644 --- a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/captcha/CaptchaController.java +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/captcha/CaptchaController.java @@ -1,61 +1,83 @@ package com.win.module.system.controller.admin.captcha; -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.util.servlet.ServletUtils; -import com.win.framework.operatelog.core.annotations.OperateLog; -import com.xingyuv.captcha.model.common.ResponseModel; -import com.xingyuv.captcha.model.vo.CaptchaVO; -import com.xingyuv.captcha.service.CaptchaService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.util.IdUtil; +import com.google.code.kaptcha.Producer; +import com.win.framework.captcha.config.CaptchaProperties; +import com.win.framework.captcha.enums.CaptchaRedisKeyConstants; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.redis.util.RedisCache; +import com.win.module.system.enums.ErrorCodeConstants; +import org.springframework.util.FastByteArrayOutputStream; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; -import javax.annotation.security.PermitAll; -import javax.servlet.http.HttpServletRequest; +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import static com.win.framework.common.pojo.CommonResult.error; +import static com.win.framework.common.pojo.CommonResult.success; /** - * 验证码 - * - * @author 闻荫源码 + * 验证码操作处理 + * + * @author win */ -@Tag(name = "管理后台 - 验证码") -@RestController("adminCaptchaController") -@RequestMapping("/system/captcha") +@RestController public class CaptchaController { - + @Resource(name = "captchaProducer") + private Producer captchaProducer; @Resource - private CaptchaService captchaService; - - @PostMapping({"/get"}) - @Operation(summary = "获得验证码") - @PermitAll - @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 - public ResponseModel get(@RequestBody CaptchaVO data, HttpServletRequest request) { - assert request.getRemoteHost() != null; - data.setBrowserInfo(getRemoteId(request)); - return captchaService.get(data); - } - - @PostMapping("/check") - @Operation(summary = "校验验证码") - @PermitAll - @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 - public ResponseModel check(@RequestBody CaptchaVO data, HttpServletRequest request) { - data.setBrowserInfo(getRemoteId(request)); - return captchaService.check(data); - } + private RedisCache redisCache; + @Resource(name = "captchaProducerMath") + private Producer captchaProducerMath; + @Resource + private CaptchaProperties captchaProperties; - public static String getRemoteId(HttpServletRequest request) { - String ip = ServletUtils.getClientIP(request); - String ua = request.getHeader("user-agent"); - if (StrUtil.isNotBlank(ip)) { - return ip + ua; + /** + * 生成验证码 + */ + @GetMapping("/captchaImage") + public CommonResult getCode(HttpServletResponse response) throws IOException { + Map data = new HashMap<>(); + boolean captchaEnabled = captchaProperties.getEnable(); + data.put("captchaEnabled", captchaEnabled); + if (!captchaEnabled) { + return success(data); + } + // 保存验证码信息 + String uuid = IdUtil.simpleUUID(); + String verifyKey = CaptchaRedisKeyConstants.CAPTCHA_CODE_KEY + uuid; + String capStr; + String code = null; + BufferedImage image = null; + // 生成验证码 + String captchaType = captchaProperties.getCaptchaType(); + if ("math".equals(captchaType)) { + String capText = captchaProducerMath.createText(); + capStr = capText.substring(0, capText.lastIndexOf("@")); + code = capText.substring(capText.lastIndexOf("@") + 1); + image = captchaProducerMath.createImage(capStr); + } else if ("char".equals(captchaType)) { + capStr = code = captchaProducer.createText(); + image = captchaProducer.createImage(capStr); } - return request.getRemoteAddr() + ua; + redisCache.setCacheObject(verifyKey, code, captchaProperties.getCaptchaExpiration(), TimeUnit.MINUTES); + // 转换流信息写出 + FastByteArrayOutputStream os = new FastByteArrayOutputStream(); + try { + ImageIO.write(image, "jpg", os); + } catch (IOException e) { + return error(ErrorCodeConstants.GENERATE_IMAGE_ERROR); + } + data.put("uuid", uuid); + data.put("img", Base64.encode(os.toByteArray())); + return success(data); } - } diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthServiceImpl.java index 4f15b2f7..40a5891f 100644 --- a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthServiceImpl.java +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthServiceImpl.java @@ -1,12 +1,13 @@ package com.win.module.system.service.auth; import cn.hutool.core.util.ObjectUtil; -import com.google.common.annotations.VisibleForTesting; +import com.win.framework.captcha.config.CaptchaProperties; +import com.win.framework.captcha.enums.CaptchaRedisKeyConstants; import com.win.framework.common.enums.CommonStatusEnum; import com.win.framework.common.enums.UserTypeEnum; import com.win.framework.common.util.monitor.TracerUtils; import com.win.framework.common.util.servlet.ServletUtils; -import com.win.framework.common.util.validation.ValidationUtils; +import com.win.framework.redis.util.RedisCache; import com.win.module.system.api.logger.dto.LoginLogCreateReqDTO; import com.win.module.system.api.sms.SmsCodeApi; import com.win.module.system.controller.admin.auth.vo.AuthLoginReqVO; @@ -21,10 +22,8 @@ import com.win.module.system.service.logger.LoginLogService; import com.win.module.system.service.member.MemberService; import com.win.module.system.service.oauth2.OAuth2TokenService; import com.win.module.system.service.user.AdminUserService; -import com.xingyuv.captcha.model.common.ResponseModel; -import com.xingyuv.captcha.model.vo.CaptchaVO; -import com.xingyuv.captcha.service.CaptchaService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -55,9 +54,11 @@ public class AdminAuthServiceImpl implements AdminAuthService { @Resource private Validator validator; @Resource - private CaptchaService captchaService; - @Resource private SmsCodeApi smsCodeApi; + @Resource + private CaptchaProperties captchaProperties; + @Resource + private RedisCache redisCache; /** * 验证码的开关,默认为 true @@ -89,15 +90,14 @@ public class AdminAuthServiceImpl implements AdminAuthService { @Override public AuthLoginRespVO login(AuthLoginReqVO reqVO) { // 校验验证码 - validateCaptcha(reqVO); + validateCaptcha(reqVO.getUsername(), reqVO.getCode(), reqVO.getUuid()); // 使用账号密码,进行登录 AdminUserDO user = authenticate(reqVO.getUsername(), reqVO.getPassword()); // 创建 Token 令牌,记录登录日志 return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME); } - private void createLoginLog(Long userId, String username, - LoginLogTypeEnum logTypeEnum, LoginResultEnum loginResult) { + private void createLoginLog(Long userId, String username, LoginLogTypeEnum logTypeEnum, LoginResultEnum loginResult) { // 插入登录日志 LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); reqDTO.setLogType(logTypeEnum.getType()); @@ -115,22 +115,25 @@ public class AdminAuthServiceImpl implements AdminAuthService { } } - @VisibleForTesting - void validateCaptcha(AuthLoginReqVO reqVO) { - // 如果验证码关闭,则不进行校验 - if (!captchaEnable) { - return; + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + * @return 结果 + */ + public void validateCaptcha(String username, String code, String uuid) { + String verifyKey = CaptchaRedisKeyConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, ""); + String captcha = redisCache.getCacheObject(verifyKey); + redisCache.deleteObject(verifyKey); + if (captcha == null) { + createLoginLog(null, username, LoginLogTypeEnum.LOGIN_USERNAME, LoginResultEnum.CAPTCHA_EXPIRE); + throw exception(AUTH_LOGIN_CAPTCHA_CODE_ERROR); } - // 校验验证码 - ValidationUtils.validate(validator, reqVO, AuthLoginReqVO.CodeEnableGroup.class); - CaptchaVO captchaVO = new CaptchaVO(); - captchaVO.setCaptchaVerification(reqVO.getCaptchaVerification()); - ResponseModel response = captchaService.verification(captchaVO); - // 验证不通过 - if (!response.isSuccess()) { - // 创建登录失败日志(验证码不正确) - createLoginLog(null, reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME, LoginResultEnum.CAPTCHA_CODE_ERROR); - throw exception(AUTH_LOGIN_CAPTCHA_CODE_ERROR, response.getRepMsg()); + if (!code.equalsIgnoreCase(captcha)) { + createLoginLog(null, username, LoginLogTypeEnum.LOGIN_USERNAME, LoginResultEnum.CAPTCHA_CODE_ERROR); + throw exception(AUTH_LOGIN_CAPTCHA_CODE_ERROR); } } diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberServiceImpl.java index 233a5da9..50eca497 100644 --- a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberServiceImpl.java +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberServiceImpl.java @@ -2,6 +2,7 @@ package com.win.module.system.service.serialnumber; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.win.framework.common.pojo.PageResult; +import com.win.framework.redis.util.RedisCache; import com.win.module.system.controller.admin.serialnumber.vo.SerialNumberCreateReqVO; import com.win.module.system.controller.admin.serialnumber.vo.SerialNumberExportReqVO; import com.win.module.system.controller.admin.serialnumber.vo.SerialNumberPageReqVO; @@ -9,7 +10,6 @@ import com.win.module.system.controller.admin.serialnumber.vo.SerialNumberUpdate import com.win.module.system.convert.serialnumber.SerialNumberConvert; import com.win.module.system.dal.dataobject.serialnumber.SerialNumberDO; import com.win.module.system.dal.mysql.serialnumber.SerialNumberMapper; -import com.win.module.system.util.redis.RedisCache; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; diff --git a/win-server/src/main/resources/application.yaml b/win-server/src/main/resources/application.yaml index 5838c593..507f5867 100644 --- a/win-server/src/main/resources/application.yaml +++ b/win-server/src/main/resources/application.yaml @@ -91,24 +91,6 @@ spring: redis: repositories: enabled: false # 项目未使用到 Spring Data Redis 的 Repository,所以直接禁用,保证启动速度 ---- #################### 验证码相关配置 #################### - -aj: - captcha: - jigsaw: classpath:images/jigsaw # 滑动验证,底图路径,不配置将使用默认图片;以 classpath: 开头,取 resource 目录下路径 - pic-click: classpath:images/pic-click # 滑动验证,底图路径,不配置将使用默认图片;以 classpath: 开头,取 resource 目录下路径 - cache-type: redis # 缓存 local/redis... - cache-number: 1000 # local 缓存的阈值,达到这个值,清除缓存 - timing-clear: 180 # local定时清除过期缓存(单位秒),设置为0代表不执行 - type: blockPuzzle # 验证码类型 default两种都实例化。 blockPuzzle 滑块拼图 clickWord 文字点选 - water-mark: 闻荫源码 # 右下角水印文字(我的水印),可使用 https://tool.chinaz.com/tools/unicode.aspx 中文转 Unicode,Linux 可能需要转 unicode - interference-options: 0 # 滑动干扰项(0/1/2) - req-frequency-limit-enable: false # 接口请求次数一分钟限制是否开启 true|false - req-get-lock-limit: 5 # 验证失败 5 次,get接口锁定 - req-get-lock-seconds: 10 # 验证失败后,锁定时间间隔 - req-get-minute-limit: 30 # get 接口一分钟内请求数限制 - req-check-minute-limit: 60 # check 接口一分钟内请求数限制 - req-verify-minute-limit: 60 # verify 接口一分钟内请求数限制 --- #################### 闻荫相关配置 #################### @@ -137,6 +119,8 @@ win: license-url: https://gitee.com/zhijiantianya/ruoyi-vue-pro/blob/master/LICENSE captcha: enable: true # 验证码的开关,默认为 true + captchaType: math # 验证码类型 math 数组计算 char 字符验证 + captchaExpiration: 2 # 验证码有效期分众 codegen: base-package: ${win.info.base-package} db-schemas: ${spring.datasource.dynamic.datasource.master.name}