diff --git a/README.md b/README.md index 812666d..09bde85 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![index]( https://s1.ax1x.com/2022/04/27/LLVXqJ.png )]( https://curl.qcloud.com/kgMaOjoq ) +[![index]( https://s1.ax1x.com/2022/05/17/O5KOpR.png )]( https://curl.qcloud.com/kgMaOjoq ) [![Github stars](https://img.shields.io/github/stars/201206030/novel?logo=github)](https://github.com/201206030/novel) [![Github forks](https://img.shields.io/github/forks/201206030/novel?logo=github)](https://github.com/201206030/novel) 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 new file mode 100644 index 0000000..a035bd8 --- /dev/null +++ b/src/main/java/io/github/xxyopen/novel/controller/front/UserController.java @@ -0,0 +1,37 @@ +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.dto.req.UserRegisterReqDto; +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.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 会员模块相关 控制器 + * + * @author xiongxiaoyang + * @date 2022/5/17 + */ +@RestController +@RequestMapping(ApiRouterConsts.API_FRONT_USER_URL_PREFIX) +@RequiredArgsConstructor +public class UserController { + + private final UserService userService; + + /** + * 用户注册接口 + */ + @PostMapping("register") + public RestResp register(@Valid UserRegisterReqDto dto, HttpServletRequest request) { + dto.setUserKey(IpUtils.getRealIp(request)); + return userService.getImgVerifyCode(dto); + } + +} diff --git a/src/main/java/io/github/xxyopen/novel/core/common/constant/ErrorCodeEnum.java b/src/main/java/io/github/xxyopen/novel/core/common/constant/ErrorCodeEnum.java index 96c496d..740cc38 100644 --- a/src/main/java/io/github/xxyopen/novel/core/common/constant/ErrorCodeEnum.java +++ b/src/main/java/io/github/xxyopen/novel/core/common/constant/ErrorCodeEnum.java @@ -38,15 +38,25 @@ public enum ErrorCodeEnum { USER_REGISTER_ERROR("A0100","用户注册错误"), /** - * 二级宏观错误码,用户未同意隐私协议 + * 用户未同意隐私协议 * */ USER_NO_AGREE_PRIVATE_ERROR("A0101","用户未同意隐私协议"), /** - * 二级宏观错误码,注册国家或地区受限 + * 注册国家或地区受限 * */ USER_REGISTER_AREA_LIMIT_ERROR("A0102","注册国家或地区受限"), + /** + * 用户验证码错误 + * */ + USER_VERIFY_CODE_ERROR("A0240","用户验证码错误"), + + /** + * 用户名已存在 + * */ + USER_NAME_EXIST("A0111","用户名已存在"), + /** * 二级宏观错误码,用户请求参数错误 * */ diff --git a/src/main/java/io/github/xxyopen/novel/core/constant/DatabaseConsts.java b/src/main/java/io/github/xxyopen/novel/core/constant/DatabaseConsts.java index 03a61f4..0fca87f 100644 --- a/src/main/java/io/github/xxyopen/novel/core/constant/DatabaseConsts.java +++ b/src/main/java/io/github/xxyopen/novel/core/constant/DatabaseConsts.java @@ -10,8 +10,29 @@ import lombok.Getter; */ public class DatabaseConsts { + /** - * 小说类别 + * 用户信息表 + */ + public static class UserInfoTable { + + @Getter + public enum ColumnEnum { + + USERNAME("username"); + + private String name; + + ColumnEnum(String name) { + this.name = name; + } + + } + + } + + /** + * 小说类别表 */ public static class BookCategoryTable { 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 0a24417..bdfbe31 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 @@ -24,6 +24,9 @@ public class UserRegisterReqDto { @Pattern(regexp="^\\d{4}$",message="验证码格式不正确!") private String velCode; - + /** + * 请求用户标识,用来表明图形验证码属于哪个用户 + * */ + private String userKey; } diff --git a/src/main/java/io/github/xxyopen/novel/dto/resp/UserLoginRespDto.java b/src/main/java/io/github/xxyopen/novel/dto/resp/UserLoginRespDto.java new file mode 100644 index 0000000..626a13c --- /dev/null +++ b/src/main/java/io/github/xxyopen/novel/dto/resp/UserLoginRespDto.java @@ -0,0 +1,16 @@ +package io.github.xxyopen.novel.dto.resp; + +import lombok.Data; + +/** + * 用户登录 响应DTO + * @author xiongxiaoyang + * @date 2022/5/17 + */ +@Data +public class UserLoginRespDto { + + private String nickName; + + private String jwt; +} diff --git a/src/main/java/io/github/xxyopen/novel/service/UserService.java b/src/main/java/io/github/xxyopen/novel/service/UserService.java new file mode 100644 index 0000000..a231cc7 --- /dev/null +++ b/src/main/java/io/github/xxyopen/novel/service/UserService.java @@ -0,0 +1,20 @@ +package io.github.xxyopen.novel.service; + +import io.github.xxyopen.novel.core.common.resp.RestResp; +import io.github.xxyopen.novel.dto.req.UserRegisterReqDto; + +/** + * 会员模块 服务类 + * + * @author xiongxiaoyang + * @date 2022/5/17 + */ +public interface UserService { + + /** + * 用户注册 + * @param dto 注册参数 + * @return JWT + * */ + RestResp getImgVerifyCode(UserRegisterReqDto dto); +} 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 new file mode 100644 index 0000000..1af15ac --- /dev/null +++ b/src/main/java/io/github/xxyopen/novel/service/impl/UserServiceImpl.java @@ -0,0 +1,69 @@ +package io.github.xxyopen.novel.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.github.xxyopen.novel.core.common.constant.ErrorCodeEnum; +import io.github.xxyopen.novel.core.common.exception.BusinessException; +import io.github.xxyopen.novel.core.common.resp.RestResp; +import io.github.xxyopen.novel.core.constant.DatabaseConsts; +import io.github.xxyopen.novel.core.constant.SystemConfigConsts; +import io.github.xxyopen.novel.core.util.JwtUtils; +import io.github.xxyopen.novel.dao.entity.UserInfo; +import io.github.xxyopen.novel.dao.mapper.UserInfoMapper; +import io.github.xxyopen.novel.dto.req.UserRegisterReqDto; +import io.github.xxyopen.novel.manager.VerifyCodeManager; +import io.github.xxyopen.novel.service.UserService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; + +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; + +/** + * 会员模块 服务实现类 + * + * @author xiongxiaoyang + * @date 2022/5/17 + */ +@Service +@RequiredArgsConstructor +public class UserServiceImpl implements UserService { + + private final UserInfoMapper userInfoMapper; + + private final VerifyCodeManager verifyCodeManager; + + private final JwtUtils jwtUtils; + + @Override + public RestResp getImgVerifyCode(UserRegisterReqDto dto) { + // 校验图形验证码是否正确 + if (!verifyCodeManager.imgVerifyCodeOk(dto.getUserKey(), dto.getVelCode())) { + // 图形验证码校验失败 + throw new BusinessException(ErrorCodeEnum.USER_VERIFY_CODE_ERROR); + } + + // 校验手机号是否已注册 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq(DatabaseConsts.UserInfoTable.ColumnEnum.USERNAME.getName() + , dto.getUsername()) + .last(DatabaseConsts.SqlEnum.LIMIT_1.getSql()); + if (userInfoMapper.selectCount(queryWrapper) > 0) { + // 手机号已注册 + throw new BusinessException(ErrorCodeEnum.USER_NAME_EXIST); + } + + // 注册成功,保存用户信息 + UserInfo userInfo = new UserInfo(); + userInfo.setPassword(DigestUtils.md5DigestAsHex(dto.getPassword().getBytes(StandardCharsets.UTF_8))); + userInfo.setUsername(dto.getUsername()); + userInfo.setNickName(dto.getUsername()); + userInfo.setCreateTime(LocalDateTime.now()); + userInfo.setUpdateTime(LocalDateTime.now()); + userInfo.setSalt("0"); + userInfoMapper.insert(userInfo); + + // 生成JWT 并返回 + return RestResp.ok(jwtUtils.generateToken(userInfo.getId(), SystemConfigConsts.NOVEL_FRONT_KEY)); + } +}