From 1fcd08582091ed3365358545ed3212f6e9b91e9e Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <773861846@qq.com> Date: Wed, 18 May 2022 06:58:33 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ontroller.java => ResourceController.java} | 18 +++++----- .../controller/front/UserController.java | 5 +-- .../novel/core/constant/ApiRouterConsts.java | 8 ++--- .../novel/dto/req/UserRegisterReqDto.java | 7 ++-- .../novel/dto/resp/ImgVerifyCodeRespDto.java | 25 ++++++++++++++ .../novel/manager/VerifyCodeManager.java | 17 +++++++--- .../xxyopen/novel/service/FileService.java | 19 ----------- .../novel/service/ResourceService.java | 21 ++++++++++++ .../novel/service/impl/FileServiceImpl.java | 26 -------------- .../service/impl/ResourceServiceImpl.java | 34 +++++++++++++++++++ .../novel/service/impl/UserServiceImpl.java | 5 ++- 11 files changed, 115 insertions(+), 70 deletions(-) rename src/main/java/io/github/xxyopen/novel/controller/front/{FileController.java => ResourceController.java} (55%) create mode 100644 src/main/java/io/github/xxyopen/novel/dto/resp/ImgVerifyCodeRespDto.java delete mode 100644 src/main/java/io/github/xxyopen/novel/service/FileService.java create mode 100644 src/main/java/io/github/xxyopen/novel/service/ResourceService.java delete mode 100644 src/main/java/io/github/xxyopen/novel/service/impl/FileServiceImpl.java create mode 100644 src/main/java/io/github/xxyopen/novel/service/impl/ResourceServiceImpl.java diff --git a/src/main/java/io/github/xxyopen/novel/controller/front/FileController.java b/src/main/java/io/github/xxyopen/novel/controller/front/ResourceController.java similarity index 55% rename from src/main/java/io/github/xxyopen/novel/controller/front/FileController.java rename to src/main/java/io/github/xxyopen/novel/controller/front/ResourceController.java index 8339dca..496af37 100644 --- a/src/main/java/io/github/xxyopen/novel/controller/front/FileController.java +++ b/src/main/java/io/github/xxyopen/novel/controller/front/ResourceController.java @@ -1,10 +1,9 @@ package io.github.xxyopen.novel.controller.front; import io.github.xxyopen.novel.core.common.resp.RestResp; -import io.github.xxyopen.novel.core.common.util.IpUtils; import io.github.xxyopen.novel.core.constant.ApiRouterConsts; -import io.github.xxyopen.novel.service.FileService; -import jakarta.servlet.http.HttpServletRequest; +import io.github.xxyopen.novel.dto.resp.ImgVerifyCodeRespDto; +import io.github.xxyopen.novel.service.ResourceService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -13,24 +12,25 @@ import org.springframework.web.bind.annotation.RestController; import java.io.IOException; /** - * 文件相关 控制器 + * 资源(图片/视频/文档)相关 控制器 * * @author xiongxiaoyang * @date 2022/5/17 */ @RestController -@RequestMapping(ApiRouterConsts.API_FRONT_FILE_URL_PREFIX) +@RequestMapping(ApiRouterConsts.API_FRONT_RESOURCE_URL_PREFIX) @RequiredArgsConstructor -public class FileController { +public class ResourceController { - private final FileService fileService; + private final ResourceService resourceService; /** * 获取图片验证码接口 + * @return */ @GetMapping("imgVerifyCode") - public RestResp getImgVerifyCode(HttpServletRequest request) throws IOException { - return RestResp.ok(fileService.getImgVerifyCode(IpUtils.getRealIp(request))); + public RestResp getImgVerifyCode() throws IOException { + return resourceService.getImgVerifyCode(); } } diff --git a/src/main/java/io/github/xxyopen/novel/controller/front/UserController.java b/src/main/java/io/github/xxyopen/novel/controller/front/UserController.java index 6b78762..b06851a 100644 --- a/src/main/java/io/github/xxyopen/novel/controller/front/UserController.java +++ b/src/main/java/io/github/xxyopen/novel/controller/front/UserController.java @@ -1,7 +1,6 @@ package io.github.xxyopen.novel.controller.front; import io.github.xxyopen.novel.core.common.resp.RestResp; -import io.github.xxyopen.novel.core.common.util.IpUtils; import io.github.xxyopen.novel.core.constant.ApiRouterConsts; import io.github.xxyopen.novel.core.constant.SystemConfigConsts; import io.github.xxyopen.novel.core.util.JwtUtils; @@ -10,7 +9,6 @@ import io.github.xxyopen.novel.dto.req.UserLoginReqDto; import io.github.xxyopen.novel.dto.req.UserRegisterReqDto; import io.github.xxyopen.novel.dto.resp.UserLoginRespDto; import io.github.xxyopen.novel.service.UserService; -import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -34,8 +32,7 @@ public class UserController { * 用户注册接口 */ @PostMapping("register") - public RestResp register(@Valid UserRegisterReqDto dto, HttpServletRequest request) { - dto.setUserKey(IpUtils.getRealIp(request)); + public RestResp register(@Valid UserRegisterReqDto dto) { return userService.register(dto); } diff --git a/src/main/java/io/github/xxyopen/novel/core/constant/ApiRouterConsts.java b/src/main/java/io/github/xxyopen/novel/core/constant/ApiRouterConsts.java index ebbbd6a..8f09ec1 100644 --- a/src/main/java/io/github/xxyopen/novel/core/constant/ApiRouterConsts.java +++ b/src/main/java/io/github/xxyopen/novel/core/constant/ApiRouterConsts.java @@ -53,9 +53,9 @@ public class ApiRouterConsts { public static final String USER_URL_PREFIX = "/user"; /** - * 文件模块请求路径前缀 + * 资源(图片/视频/文档)模块请求路径前缀 * */ - public static final String FILE_URL_PREFIX = "/file"; + public static final String RESOURCE_URL_PREFIX = "/resource"; /** * 前台门户首页API请求路径前缀 @@ -78,8 +78,8 @@ public class ApiRouterConsts { public static final String API_FRONT_USER_URL_PREFIX = API_FRONT_URL_PREFIX + USER_URL_PREFIX; /** - * 前台门户文件相关API请求路径前缀 + * 前台门户资源(图片/视频/文档)相关API请求路径前缀 */ - public static final String API_FRONT_FILE_URL_PREFIX = API_FRONT_URL_PREFIX + FILE_URL_PREFIX; + public static final String API_FRONT_RESOURCE_URL_PREFIX = API_FRONT_URL_PREFIX + RESOURCE_URL_PREFIX; } diff --git a/src/main/java/io/github/xxyopen/novel/dto/req/UserRegisterReqDto.java b/src/main/java/io/github/xxyopen/novel/dto/req/UserRegisterReqDto.java index bdfbe31..d2793ba 100644 --- a/src/main/java/io/github/xxyopen/novel/dto/req/UserRegisterReqDto.java +++ b/src/main/java/io/github/xxyopen/novel/dto/req/UserRegisterReqDto.java @@ -3,6 +3,7 @@ package io.github.xxyopen.novel.dto.req; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Pattern; import lombok.Data; +import org.hibernate.validator.constraints.Length; /** * 用户注册 请求DTO @@ -25,8 +26,10 @@ public class UserRegisterReqDto { private String velCode; /** - * 请求用户标识,用来表明图形验证码属于哪个用户 + * 请求会话标识,用来标识图形验证码属于哪个会话 * */ - private String userKey; + @NotBlank + @Length(min = 32,max = 32) + private String sessionId; } diff --git a/src/main/java/io/github/xxyopen/novel/dto/resp/ImgVerifyCodeRespDto.java b/src/main/java/io/github/xxyopen/novel/dto/resp/ImgVerifyCodeRespDto.java new file mode 100644 index 0000000..635bd2a --- /dev/null +++ b/src/main/java/io/github/xxyopen/novel/dto/resp/ImgVerifyCodeRespDto.java @@ -0,0 +1,25 @@ +package io.github.xxyopen.novel.dto.resp; + +import lombok.Builder; +import lombok.Data; + +/** + * 图像验证码 响应DTO + * @author xiongxiaoyang + * @date 2022/5/18 + */ +@Data +@Builder +public class ImgVerifyCodeRespDto { + + /** + * 当前会话ID,用于标识改图形验证码属于哪个会话 + * */ + private String sessionId; + + /** + * Base64 编码的验证码图片 + * */ + private String img; + +} diff --git a/src/main/java/io/github/xxyopen/novel/manager/VerifyCodeManager.java b/src/main/java/io/github/xxyopen/novel/manager/VerifyCodeManager.java index ec467d6..b76708e 100644 --- a/src/main/java/io/github/xxyopen/novel/manager/VerifyCodeManager.java +++ b/src/main/java/io/github/xxyopen/novel/manager/VerifyCodeManager.java @@ -27,10 +27,10 @@ public class VerifyCodeManager { /** * 生成图片验证码,并放入缓存中 */ - public String genImgVerifyCode(String userKey) throws IOException { + public String genImgVerifyCode(String sessionId) throws IOException { String verifyCode = ImgVerifyCodeUtils.getRandomVerifyCode(4); String img = ImgVerifyCodeUtils.genVerifyCodeImg(verifyCode); - stringRedisTemplate.opsForValue().set(CacheConsts.IMG_VERIFY_CODE_CACHE_KEY + userKey + stringRedisTemplate.opsForValue().set(CacheConsts.IMG_VERIFY_CODE_CACHE_KEY + sessionId , verifyCode, Duration.ofMinutes(5)); return img; } @@ -38,10 +38,17 @@ public class VerifyCodeManager { /** * 校验图片验证码 */ - public boolean imgVerifyCodeOk(String userKey, String verifyCode) { + public boolean imgVerifyCodeOk(String sessionId, String verifyCode) { return Objects.equals( - stringRedisTemplate.opsForValue().get(CacheConsts.IMG_VERIFY_CODE_CACHE_KEY + userKey) - ,verifyCode); + stringRedisTemplate.opsForValue().get(CacheConsts.IMG_VERIFY_CODE_CACHE_KEY + sessionId) + , verifyCode); + } + + /** + * 删除验证码 + */ + public void removeImgVerifyCode(String sessionId) { + stringRedisTemplate.delete(CacheConsts.IMG_VERIFY_CODE_CACHE_KEY + sessionId); } } diff --git a/src/main/java/io/github/xxyopen/novel/service/FileService.java b/src/main/java/io/github/xxyopen/novel/service/FileService.java deleted file mode 100644 index 4dd71fb..0000000 --- a/src/main/java/io/github/xxyopen/novel/service/FileService.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.github.xxyopen.novel.service; - -import java.io.IOException; - -/** - * 文件相关服务类 - * - * @author xiongxiaoyang - * @date 2022/5/17 - */ -public interface FileService { - - /** - * 获取图片验证码 - * @param userKey 请求用户的标识,表明该验证码属于谁 - * @return Base64编码的图片 - * */ - String getImgVerifyCode(String userKey) throws IOException; -} diff --git a/src/main/java/io/github/xxyopen/novel/service/ResourceService.java b/src/main/java/io/github/xxyopen/novel/service/ResourceService.java new file mode 100644 index 0000000..6fdec46 --- /dev/null +++ b/src/main/java/io/github/xxyopen/novel/service/ResourceService.java @@ -0,0 +1,21 @@ +package io.github.xxyopen.novel.service; + +import io.github.xxyopen.novel.core.common.resp.RestResp; +import io.github.xxyopen.novel.dto.resp.ImgVerifyCodeRespDto; + +import java.io.IOException; + +/** + * 资源(图片/视频/文档)相关服务类 + * + * @author xiongxiaoyang + * @date 2022/5/17 + */ +public interface ResourceService { + + /** + * 获取图片验证码 + * @return Base64编码的图片 + * */ + RestResp getImgVerifyCode() throws IOException; +} diff --git a/src/main/java/io/github/xxyopen/novel/service/impl/FileServiceImpl.java b/src/main/java/io/github/xxyopen/novel/service/impl/FileServiceImpl.java deleted file mode 100644 index 23dc07e..0000000 --- a/src/main/java/io/github/xxyopen/novel/service/impl/FileServiceImpl.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.github.xxyopen.novel.service.impl; - -import io.github.xxyopen.novel.manager.VerifyCodeManager; -import io.github.xxyopen.novel.service.FileService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.io.IOException; - -/** - * 文件相关服务实现类 - * - * @author xiongxiaoyang - * @date 2022/5/17 - */ -@Service -@RequiredArgsConstructor -public class FileServiceImpl implements FileService { - - private final VerifyCodeManager verifyCodeManager; - - @Override - public String getImgVerifyCode(String userKey) throws IOException { - return verifyCodeManager.genImgVerifyCode(userKey); - } -} diff --git a/src/main/java/io/github/xxyopen/novel/service/impl/ResourceServiceImpl.java b/src/main/java/io/github/xxyopen/novel/service/impl/ResourceServiceImpl.java new file mode 100644 index 0000000..6eedc07 --- /dev/null +++ b/src/main/java/io/github/xxyopen/novel/service/impl/ResourceServiceImpl.java @@ -0,0 +1,34 @@ +package io.github.xxyopen.novel.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import io.github.xxyopen.novel.core.common.resp.RestResp; +import io.github.xxyopen.novel.dto.resp.ImgVerifyCodeRespDto; +import io.github.xxyopen.novel.manager.VerifyCodeManager; +import io.github.xxyopen.novel.service.ResourceService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.io.IOException; + +/** + * 资源(图片/视频/文档)相关服务实现类 + * + * @author xiongxiaoyang + * @date 2022/5/17 + */ +@Service +@RequiredArgsConstructor +public class ResourceServiceImpl implements ResourceService { + + private final VerifyCodeManager verifyCodeManager; + + @Override + public RestResp getImgVerifyCode() throws IOException { + String sessionId = IdWorker.get32UUID(); + return RestResp.ok(ImgVerifyCodeRespDto.builder() + .sessionId(sessionId) + .img(verifyCodeManager.genImgVerifyCode(sessionId)) + .build()); + } + +} diff --git a/src/main/java/io/github/xxyopen/novel/service/impl/UserServiceImpl.java b/src/main/java/io/github/xxyopen/novel/service/impl/UserServiceImpl.java index 92cab2f..33ac948 100644 --- a/src/main/java/io/github/xxyopen/novel/service/impl/UserServiceImpl.java +++ b/src/main/java/io/github/xxyopen/novel/service/impl/UserServiceImpl.java @@ -46,7 +46,7 @@ public class UserServiceImpl implements UserService { @Override public RestResp register(UserRegisterReqDto dto) { // 校验图形验证码是否正确 - if (!verifyCodeManager.imgVerifyCodeOk(dto.getUserKey(), dto.getVelCode())) { + if (!verifyCodeManager.imgVerifyCodeOk(dto.getSessionId(), dto.getVelCode())) { // 图形验证码校验失败 throw new BusinessException(ErrorCodeEnum.USER_VERIFY_CODE_ERROR); } @@ -71,6 +71,9 @@ public class UserServiceImpl implements UserService { userInfo.setSalt("0"); userInfoMapper.insert(userInfo); + // 删除验证码 + verifyCodeManager.removeImgVerifyCode(dto.getSessionId()); + // 生成JWT 并返回 return RestResp.ok(jwtUtils.generateToken(userInfo.getId(), SystemConfigConsts.NOVEL_FRONT_KEY)); }