From c0080ddec7d986dcd1e8919e67a79f9eb5658464 Mon Sep 17 00:00:00 2001 From: xiang Date: Thu, 4 Sep 2025 23:06:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E9=AA=8C=E8=AF=81=E7=A0=81=EF=BC=88?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E5=9B=BE=E5=BD=A2=E9=AA=8C=E8=AF=81=E7=A0=81?= =?UTF-8?q?=EF=BC=89=E6=8E=A5=E5=8F=A3=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/api/dto/req/CaptchaImageRequest.java | 15 +++ .../auth/api/dto/resp/CaptchaDTO.java | 24 ++++ .../auth/api/dto/resp/XCaptchaImageDTO.java | 25 ++++ .../controller/CaptchaImageController.java | 41 ------ .../controller/ValidationCodeController.java | 59 +++++++++ .../auth/service/constants/RedisConstant.java | 2 + .../service/convert/XCaptchaImageConvert.java | 17 +++ .../auth/service/entity/XCaptchaImage.java | 57 ++++++++ .../auth/service/entity/XCaptchaType.java | 62 +++++++++ .../auth/service/enums/CaptchaTypeEnum.java | 5 +- .../mapper/XCaptchaImageMapper.java | 15 +++ .../repository/mapper/XCaptchaTypeMapper.java | 16 +++ .../auth/service/service/ICaptchaService.java | 4 +- ...ory.java => ValidCodeGenerateFactory.java} | 4 +- .../impl/captcha/ImageChooseCaptcha.java | 75 +++++++++++ .../impl/captcha/NormalCaptchaImage.java | 16 ++- .../impl/captcha/NumberCaptchaCode.java | 33 +++++ .../mapper/user/XCaptchaImageMapper.xml | 96 ++++++++++++++ .../mapper/user/XCaptchaTypeMapper.xml | 122 ++++++++++++++++++ 19 files changed, 637 insertions(+), 51 deletions(-) create mode 100644 xs-api/src/main/java/com/xiang/xservice/auth/api/dto/req/CaptchaImageRequest.java create mode 100644 xs-api/src/main/java/com/xiang/xservice/auth/api/dto/resp/CaptchaDTO.java create mode 100644 xs-api/src/main/java/com/xiang/xservice/auth/api/dto/resp/XCaptchaImageDTO.java delete mode 100644 xs-server/src/main/java/com/xiang/xservice/auth/server/controller/CaptchaImageController.java create mode 100644 xs-server/src/main/java/com/xiang/xservice/auth/server/controller/ValidationCodeController.java create mode 100644 xs-service/src/main/java/com/xiang/xservice/auth/service/convert/XCaptchaImageConvert.java create mode 100644 xs-service/src/main/java/com/xiang/xservice/auth/service/entity/XCaptchaImage.java create mode 100644 xs-service/src/main/java/com/xiang/xservice/auth/service/entity/XCaptchaType.java create mode 100644 xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XCaptchaImageMapper.java create mode 100644 xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XCaptchaTypeMapper.java rename xs-service/src/main/java/com/xiang/xservice/auth/service/service/{CaptchaGenerateFactory.java => ValidCodeGenerateFactory.java} (89%) create mode 100644 xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/captcha/ImageChooseCaptcha.java create mode 100644 xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/captcha/NumberCaptchaCode.java create mode 100644 xs-service/src/main/resources/mapper/user/XCaptchaImageMapper.xml create mode 100644 xs-service/src/main/resources/mapper/user/XCaptchaTypeMapper.xml diff --git a/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/req/CaptchaImageRequest.java b/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/req/CaptchaImageRequest.java new file mode 100644 index 0000000..1240a0a --- /dev/null +++ b/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/req/CaptchaImageRequest.java @@ -0,0 +1,15 @@ +package com.xiang.xservice.auth.api.dto.req; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CaptchaImageRequest { + + private String username; + + private Integer number; +} diff --git a/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/resp/CaptchaDTO.java b/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/resp/CaptchaDTO.java new file mode 100644 index 0000000..54c6b73 --- /dev/null +++ b/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/resp/CaptchaDTO.java @@ -0,0 +1,24 @@ +package com.xiang.xservice.auth.api.dto.resp; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CaptchaDTO { + /** + * 图片验证码url集合 + */ + private List captchaCode; + /** + * 正确的图片id集合 + */ + private List captchaIds; + private String questions; + private String captchaImageCode; + +} diff --git a/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/resp/XCaptchaImageDTO.java b/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/resp/XCaptchaImageDTO.java new file mode 100644 index 0000000..13e0ec5 --- /dev/null +++ b/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/resp/XCaptchaImageDTO.java @@ -0,0 +1,25 @@ +package com.xiang.xservice.auth.api.dto.resp; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class XCaptchaImageDTO { + /** + * 主键id + */ + private Long id; + + /** + * 类型id + */ + private Long typeId; + + /** + * 图片地址url + */ + private String imageUrl; +} diff --git a/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/CaptchaImageController.java b/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/CaptchaImageController.java deleted file mode 100644 index 25f91bf..0000000 --- a/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/CaptchaImageController.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.xiang.xservice.auth.server.controller; - -import com.xiang.xservice.auth.service.enums.CaptchaTypeEnum; -import com.xiang.xservice.auth.service.service.CaptchaGenerateFactory; -import com.xiang.xservice.basic.common.resp.Result; -import com.xiang.xservice.basic.utils.RandomCodeUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RestController; - -@Slf4j -@RestController -@RequiredArgsConstructor -public class CaptchaImageController { - - private final CaptchaGenerateFactory captchaGenerateFactory; - - @PostMapping("/public/captchaImage") - public Result getCaptchaImage() { - try { - String randomCode = RandomCodeUtils.getNumberRandomCode(1); - String captchaImage; - if (StringUtils.isBlank(randomCode)) { - captchaImage = captchaGenerateFactory.get(CaptchaTypeEnum.NORMAL_CAPTCHA_IMAGE.getType()).getCaptchaImage(); - } else { - try { - int i = Integer.parseInt(randomCode); - captchaImage = captchaGenerateFactory.get(i).getCaptchaImage(); - } catch (Exception e) { - captchaImage = captchaGenerateFactory.get(CaptchaTypeEnum.NORMAL_CAPTCHA_IMAGE.getType()).getCaptchaImage(); - } - } - return Result.success(captchaImage); - } catch (Exception e) { - log.error("获取验证码失败", e); - } - return Result.error(); - } -} diff --git a/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/ValidationCodeController.java b/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/ValidationCodeController.java new file mode 100644 index 0000000..96f9dbf --- /dev/null +++ b/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/ValidationCodeController.java @@ -0,0 +1,59 @@ +package com.xiang.xservice.auth.server.controller; + +import com.xiang.xservice.auth.api.dto.req.CaptchaImageRequest; +import com.xiang.xservice.auth.api.dto.resp.CaptchaDTO; +import com.xiang.xservice.auth.service.enums.CaptchaTypeEnum; +import com.xiang.xservice.auth.service.service.ValidCodeGenerateFactory; +import com.xiang.xservice.basic.common.resp.Result; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class ValidationCodeController { + + private final ValidCodeGenerateFactory validCodeGenerateFactory; + + @PostMapping("/public/captchaImage") + public Result getCaptchaImage(@RequestBody @NotNull(message = "请求参数不能为空") @Valid CaptchaImageRequest request) { + try { +// String randomCode = RandomCodeUtils.getNumberRandomCode(1); + String randomCode = "1"; + CaptchaDTO captchaImage; + if (StringUtils.isBlank(randomCode)) { + captchaImage = validCodeGenerateFactory.get(CaptchaTypeEnum.NORMAL_CAPTCHA_IMAGE.getType()).getCaptchaImage(request); + } else { + try { + int i = Integer.parseInt(randomCode); + captchaImage = validCodeGenerateFactory.get(i).getCaptchaImage(request); + } catch (Exception e) { + log.error("获取验证码失败,获取默认验证码", e); + captchaImage = validCodeGenerateFactory.get(CaptchaTypeEnum.NORMAL_CAPTCHA_IMAGE.getType()).getCaptchaImage(request); + } + } + return Result.success(captchaImage); + } catch (Exception e) { + log.error("获取验证码失败", e); + } + return Result.error(); + } + + @PostMapping("/public/getSmsCode") + public Result getSmsCode(@RequestBody @NotNull(message = "请求参数不能为空") @Valid CaptchaImageRequest request) { + try { + validCodeGenerateFactory.get(CaptchaTypeEnum.NUMBER_CAPTCHA_CODE.getType()).getCaptchaImage(request); + return Result.success(); + } catch (Exception e) { + log.error("获取验证码失败", e); + } + return Result.error(); + } +} diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/constants/RedisConstant.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/constants/RedisConstant.java index 9fea9f1..c7ccfd0 100644 --- a/xs-service/src/main/java/com/xiang/xservice/auth/service/constants/RedisConstant.java +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/constants/RedisConstant.java @@ -3,4 +3,6 @@ package com.xiang.xservice.auth.service.constants; public class RedisConstant { public static final String XS_PERMISSION_ROLE = "auth:permission:role"; + public static final String XS_SMS_CODE_KEY = "auth:sms:code:key:"; + public static final String XS_CAPTCHA_CODE_KEY = "auth:captcha:code:key:"; } diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/convert/XCaptchaImageConvert.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/convert/XCaptchaImageConvert.java new file mode 100644 index 0000000..bc7ef1c --- /dev/null +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/convert/XCaptchaImageConvert.java @@ -0,0 +1,17 @@ +package com.xiang.xservice.auth.service.convert; + +import com.xiang.xservice.auth.api.dto.resp.XCaptchaImageDTO; +import com.xiang.xservice.auth.service.entity.XCaptchaImage; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper(componentModel = "spring") +public interface XCaptchaImageConvert { + XDeptConvert INSTANCE = Mappers.getMapper(XDeptConvert.class); + + XCaptchaImageDTO toDTO(XCaptchaImage captchaImage); + List toDTOList(List captchaImage); + +} diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/entity/XCaptchaImage.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/entity/XCaptchaImage.java new file mode 100644 index 0000000..91eb27f --- /dev/null +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/entity/XCaptchaImage.java @@ -0,0 +1,57 @@ +package com.xiang.xservice.auth.service.entity; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class XCaptchaImage implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + private Long id; + + /** + * 类型id + */ + private Long typeId; + + /** + * 图片地址url + */ + private String imageUrl; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 创建人 + */ + private String createBy; + + /** + * 是否删除(0:否 1:是) + */ + private Integer delFlag; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * 修改人 + */ + private String updateBy; +} diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/entity/XCaptchaType.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/entity/XCaptchaType.java new file mode 100644 index 0000000..ad8e2e3 --- /dev/null +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/entity/XCaptchaType.java @@ -0,0 +1,62 @@ +package com.xiang.xservice.auth.service.entity; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class XCaptchaType implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + private Long id; + + /** + * 图片类型 + */ + private Integer imageType; + + /** + * 类型名称 + */ + private String typeName; + + /** + * 状态(0:禁用,1:启用) + */ + private Integer status; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 修改人 + */ + private String updateBy; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * 删除标识(0:未删除 1:已删除) + */ + private Integer delFlag; +} diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/enums/CaptchaTypeEnum.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/enums/CaptchaTypeEnum.java index 40334a5..fab6e29 100644 --- a/xs-service/src/main/java/com/xiang/xservice/auth/service/enums/CaptchaTypeEnum.java +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/enums/CaptchaTypeEnum.java @@ -7,8 +7,9 @@ import lombok.Getter; @AllArgsConstructor public enum CaptchaTypeEnum { - NORMAL_CAPTCHA_IMAGE(1, "图形验证码"), - + NUMBER_CAPTCHA_CODE(-1, "数字验证码"), + NORMAL_CAPTCHA_IMAGE(0, "图形验证码"), + IMAGE_CAPTCHA_CHOOSE(1, "图形选择验证码") ; private final Integer type; diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XCaptchaImageMapper.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XCaptchaImageMapper.java new file mode 100644 index 0000000..ce66f61 --- /dev/null +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XCaptchaImageMapper.java @@ -0,0 +1,15 @@ +package com.xiang.xservice.auth.service.repository.mapper; + +import com.xiang.xservice.auth.service.entity.XCaptchaImage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@Mapper +public interface XCaptchaImageMapper { + + List getByTypeId(@Param("typeId") Long typeId); +} diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XCaptchaTypeMapper.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XCaptchaTypeMapper.java new file mode 100644 index 0000000..52f3c99 --- /dev/null +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XCaptchaTypeMapper.java @@ -0,0 +1,16 @@ +package com.xiang.xservice.auth.service.repository.mapper; + +import com.xiang.xservice.auth.service.entity.XCaptchaType; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@Mapper +public interface XCaptchaTypeMapper { + + List getCaptchaTypeList(XCaptchaType xCaptchaType); + List getAllAvailableCaptchaTypeList(); + +} diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/service/ICaptchaService.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/ICaptchaService.java index b9e10fa..c3ed572 100644 --- a/xs-service/src/main/java/com/xiang/xservice/auth/service/service/ICaptchaService.java +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/ICaptchaService.java @@ -1,10 +1,12 @@ package com.xiang.xservice.auth.service.service; +import com.xiang.xservice.auth.api.dto.req.CaptchaImageRequest; +import com.xiang.xservice.auth.api.dto.resp.CaptchaDTO; import com.xiang.xservice.auth.service.enums.CaptchaTypeEnum; public interface ICaptchaService { - String getCaptchaImage(); + CaptchaDTO getCaptchaImage(CaptchaImageRequest request); CaptchaTypeEnum getCaptchaType(); } diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/service/CaptchaGenerateFactory.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/ValidCodeGenerateFactory.java similarity index 89% rename from xs-service/src/main/java/com/xiang/xservice/auth/service/service/CaptchaGenerateFactory.java rename to xs-service/src/main/java/com/xiang/xservice/auth/service/service/ValidCodeGenerateFactory.java index c219d59..e5b95c7 100644 --- a/xs-service/src/main/java/com/xiang/xservice/auth/service/service/CaptchaGenerateFactory.java +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/ValidCodeGenerateFactory.java @@ -9,11 +9,11 @@ import java.util.Map; import java.util.Objects; @Component -public class CaptchaGenerateFactory { +public class ValidCodeGenerateFactory { private final Map strategies = Maps.newConcurrentMap(); - public CaptchaGenerateFactory(List strategyList) { + public ValidCodeGenerateFactory(List strategyList) { for (ICaptchaService captchaService : strategyList) { strategies.put(captchaService.getCaptchaType().getType(), captchaService); } diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/captcha/ImageChooseCaptcha.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/captcha/ImageChooseCaptcha.java new file mode 100644 index 0000000..419fba5 --- /dev/null +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/captcha/ImageChooseCaptcha.java @@ -0,0 +1,75 @@ +package com.xiang.xservice.auth.service.service.impl.captcha; + +import com.google.common.collect.Lists; +import com.xiang.xservice.auth.api.dto.req.CaptchaImageRequest; +import com.xiang.xservice.auth.api.dto.resp.CaptchaDTO; +import com.xiang.xservice.auth.service.convert.XCaptchaImageConvert; +import com.xiang.xservice.auth.service.entity.XCaptchaImage; +import com.xiang.xservice.auth.service.entity.XCaptchaType; +import com.xiang.xservice.auth.service.enums.CaptchaTypeEnum; +import com.xiang.xservice.auth.service.repository.mapper.XCaptchaImageMapper; +import com.xiang.xservice.auth.service.repository.mapper.XCaptchaTypeMapper; +import com.xiang.xservice.auth.service.service.ICaptchaService; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class ImageChooseCaptcha implements ICaptchaService { + private final XCaptchaTypeMapper captchaTypeMapper; + private final XCaptchaImageMapper captchaImageMapper; + private final XCaptchaImageConvert captchaImageConvert; + + + @Override + public CaptchaDTO getCaptchaImage(CaptchaImageRequest request) { + CaptchaDTO captchaDTO = new CaptchaDTO(); + List typeList = captchaTypeMapper.getAllAvailableCaptchaTypeList(); + Map typeMap = typeList.stream().collect(Collectors.toMap(XCaptchaType::getId, Function.identity(), (a, b) -> a)); + if (CollectionUtils.isNotEmpty(typeList)) { + List types = new java.util.ArrayList<>(typeList.stream().map(XCaptchaType::getId).distinct().toList()); + Collections.shuffle(types); + List result = Lists.newArrayList(); + // 第一组 + Long type = types.get(0); + XCaptchaType captchaType = typeMap.get(type); + String question = "请选择所有" + captchaType.getTypeName(); + // 问题 + captchaDTO.setQuestions(question); + List captchaImages = buildCaptchaMap(type, result); + List captchaIds = captchaImages.stream().map(XCaptchaImage::getId).toList(); + // 正确的图片id集合 + captchaDTO.setCaptchaIds(captchaIds); + + type = types.get(1); + buildCaptchaMap(type, result); + + type = types.get(2); + buildCaptchaMap(type, result); + Collections.shuffle(result); + // 所有的验证码集合 + captchaDTO.setCaptchaCode(captchaImageConvert.toDTOList(result)); + } + return captchaDTO; + } + + private List buildCaptchaMap(Long type, List result) { + List images = captchaImageMapper.getByTypeId(type); + Collections.shuffle(images); + images = images.subList(0, 2); + result.addAll(images); + return images; + } + + @Override + public CaptchaTypeEnum getCaptchaType() { + return CaptchaTypeEnum.IMAGE_CAPTCHA_CHOOSE; + } +} diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/captcha/NormalCaptchaImage.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/captcha/NormalCaptchaImage.java index 8b0c045..59bb675 100644 --- a/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/captcha/NormalCaptchaImage.java +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/captcha/NormalCaptchaImage.java @@ -1,5 +1,8 @@ package com.xiang.xservice.auth.service.service.impl.captcha; +import com.xiang.xservice.auth.api.dto.req.CaptchaImageRequest; +import com.xiang.xservice.auth.api.dto.resp.CaptchaDTO; +import com.xiang.xservice.auth.service.constants.RedisConstant; import com.xiang.xservice.auth.service.enums.CaptchaTypeEnum; import com.xiang.xservice.auth.service.service.ICaptchaService; import com.xiang.xservice.basic.utils.RandomCodeUtils; @@ -15,6 +18,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Base64; import java.util.Random; +import java.util.concurrent.TimeUnit; @Slf4j @Service @@ -27,11 +31,10 @@ public class NormalCaptchaImage implements ICaptchaService { private static final int WIDTH = 160;// 宽 private static final int HEIGHT = 40;// 高 private static final int LINE_SIZE = 30;// 干扰线数量 - private static final int STRING_NUMBER = 4;//随机产生字符的个数 @Override - public String getCaptchaImage() { + public CaptchaDTO getCaptchaImage(CaptchaImageRequest request) { // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类 BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_BGR); Graphics g = image.getGraphics(); @@ -44,11 +47,13 @@ public class NormalCaptchaImage implements ICaptchaService { drawLine(g); } String randomCode = ""; + CaptchaDTO captchaDTO = new CaptchaDTO(); // 绘制随机字符 - for (int i = 0; i < STRING_NUMBER; i++) { + for (int i = 0; i < request.getNumber(); i++) { randomCode = drawString(g, randomCode, i); } log.info("生成的随机验证码:{}", randomCode); + redisService.set(RedisConstant.XS_CAPTCHA_CODE_KEY + request.getUsername(), randomCode, 5, TimeUnit.MINUTES); g.dispose(); String base64String = ""; @@ -60,11 +65,12 @@ public class NormalCaptchaImage implements ICaptchaService { byte[] bytes = bos.toByteArray(); Base64.Encoder encoder = Base64.getEncoder(); base64String = encoder.encodeToString(bytes); - return base64String; + captchaDTO.setCaptchaImageCode(base64String); + return captchaDTO; } catch (IOException e) { log.error("IO异常,验证码异常", e); } - return base64String; + return captchaDTO; } @Override diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/captcha/NumberCaptchaCode.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/captcha/NumberCaptchaCode.java new file mode 100644 index 0000000..b26feaf --- /dev/null +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/captcha/NumberCaptchaCode.java @@ -0,0 +1,33 @@ +package com.xiang.xservice.auth.service.service.impl.captcha; + +import com.xiang.xservice.auth.api.dto.req.CaptchaImageRequest; +import com.xiang.xservice.auth.api.dto.resp.CaptchaDTO; +import com.xiang.xservice.auth.service.constants.RedisConstant; +import com.xiang.xservice.auth.service.enums.CaptchaTypeEnum; +import com.xiang.xservice.auth.service.service.ICaptchaService; +import com.xiang.xservice.basic.utils.RandomCodeUtils; +import com.xiang.xservice.cache.service.IRedisService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.concurrent.TimeUnit; + +@Service +@RequiredArgsConstructor +public class NumberCaptchaCode implements ICaptchaService { + private final IRedisService redisService; + + @Override + public CaptchaDTO getCaptchaImage(CaptchaImageRequest request) { + String randomCode = RandomCodeUtils.getMixtureRandomCode(request.getNumber()); + redisService.set(RedisConstant.XS_SMS_CODE_KEY + request.getUsername(), randomCode, 5, TimeUnit.MINUTES); + CaptchaDTO captchaDTO = new CaptchaDTO(); + captchaDTO.setCaptchaImageCode(randomCode); + return captchaDTO; + } + + @Override + public CaptchaTypeEnum getCaptchaType() { + return CaptchaTypeEnum.NUMBER_CAPTCHA_CODE; + } +} diff --git a/xs-service/src/main/resources/mapper/user/XCaptchaImageMapper.xml b/xs-service/src/main/resources/mapper/user/XCaptchaImageMapper.xml new file mode 100644 index 0000000..5d2efa1 --- /dev/null +++ b/xs-service/src/main/resources/mapper/user/XCaptchaImageMapper.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + id, + type_id, + image_url, + create_time, + create_by, + del_flag, + update_time, + update_by + + + + INSERT INTO x_captcha_image + + + type_id, + + + image_url, + + + create_time, + + + create_by, + + + del_flag, + + + update_time, + + + update_by + + + + + #{typeId}, + + + #{imageUrl}, + + + #{createTime}, + + + #{createBy}, + + + #{delFlag}, + + + #{updateTime}, + + + #{updateBy} + + + + + + UPDATE x_captcha_image + + type_id = #{typeId}, + image_url = #{imageUrl}, + create_time = #{createTime}, + create_by = #{createBy}, + del_flag = #{delFlag}, + update_time = #{updateTime}, + update_by = #{updateBy} + + WHERE id = #{id} + + + + \ No newline at end of file diff --git a/xs-service/src/main/resources/mapper/user/XCaptchaTypeMapper.xml b/xs-service/src/main/resources/mapper/user/XCaptchaTypeMapper.xml new file mode 100644 index 0000000..c815df2 --- /dev/null +++ b/xs-service/src/main/resources/mapper/user/XCaptchaTypeMapper.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + id, + image_type, + type_name, + status, + create_by, + create_time, + update_by, + update_time, + del_flag + + + + INSERT INTO x_captcha_type + + + image_type, + + + type_name, + + + status, + + + create_by, + + + create_time, + + + update_by, + + + update_time, + + + del_flag + + + + + #{imageType}, + + + #{typeName}, + + + #{status}, + + + #{createBy}, + + + #{createTime}, + + + #{updateBy}, + + + #{updateTime}, + + + #{delFlag} + + + + + + UPDATE x_captcha_type + + image_type = #{imageType}, + type_name = #{typeName}, + status = #{status}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + del_flag = #{delFlag} + + WHERE id = #{id} + + + + + + \ No newline at end of file