电商系统:用户模块之注册功能

一、功能描述

用户输入账号、密码、邮箱进行注册,接口如下

img

二、Controller层

1、专门定义一个form包下的UserForm类用于接收请求参数,通过@valid进行参数验证,确保参数不能为空,否则返回错误信息

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {

    @Autowired
    IUserService userService;

    @PostMapping("/register")
    public ResponseVO register(@Valid @RequestBody UserForm userForm, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            log.info("注册提交的参数有误,{}", bindingResult.getFieldError().getDefaultMessage());
            return ResponseVO.error(ResponseEnum.PARAM_ERROR, bindingResult);
        }
        User user = new User();
        BeanUtils.copyProperties(userForm, user);
        return userService.register(user);
    }
}

2、专门定义了一个vo包下的ResponseVO类用于响应请求

@Data
@JsonInclude(value = JsonInclude.Include.NON_NULL)
public class ResponseVO<T> {

    private Integer status;

    private String msg;

    private T data;

    public ResponseVO(Integer status, String msg) {
        this.status = status;
        this.msg = msg;
    }

    public static <T> ResponseVO<T> success(){
        return new ResponseVO<T>(ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getDesc());
    }

    public static <T> ResponseVO<T> error(ResponseEnum responseEnum){
        return new ResponseVO<T>(responseEnum.getCode(), responseEnum.getDesc());
    }

    public static <T> ResponseVO<T> error(ResponseEnum responseEnum, String msg){
        return new ResponseVO<T>(responseEnum.getCode(), msg);
    }

    public static <T> ResponseVO<T> error(ResponseEnum responseEnum, BindingResult bindingResult){
        return new ResponseVO<T>(responseEnum.getCode(), bindingResult.getFieldError().getDefaultMessage());
    }
}

3、专门定义了一个响应状态枚举用于处理各种情况

@Getter
public enum ResponseEnum {

    ERROR(-1, "服务端异常"),

    SUCCESS(0, "成功"),

    PASSWORD_ERROR(1, "密码错误"),

    USERNAME_EXIST(2, "用户名已存在"),

    PARAM_ERROR(3, "参数错误"),

    EMAIL_EXIST(4, "邮箱已存在"),

    NEED_LOGIN(10, "用户未登录"),

    ;

    Integer code;

    String desc;

    ResponseEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}

三、Service层

1、判断用户名、邮箱是否重复

2、对密码进行MD5加密
MD5相关参考:

https://blog.csdn.net/scotteperk/article/details/82251299

https://www.cnblogs.com/second-tomorrow/p/9129043.html

3、写入数据库

@Override
    public ResponseVO register(User user) {
        //用户名不能重复
        int countByUsername = userMapper.countByUsername(user.getUsername());
        if(countByUsername > 0){
            return ResponseVO.error(ResponseEnum.USERNAME_EXIST);
        }

        //邮箱不能重复
        int countByEmail = userMapper.countByEmail(user.getEmail());
        if(countByEmail > 0){
            return ResponseVO.error(ResponseEnum.EMAIL_EXIST);
        }

        //MD5加密
        user.setPassword(DigestUtils.md5DigestAsHex(user.getPassword().getBytes(StandardCharsets.UTF_8)));

        //日期
        Date date = new Date();
        user.setCreateTime(date);
        user.setUpdateTime(date);
        user.setRole(RoleEnum.CUSTOMER.getCode());

        //写入数据库
        int resultCont = userMapper.insertSelective(user);
        if(resultCont == 0)
            return ResponseVO.error(ResponseEnum.ERROR);
        return ResponseVO.success();
    }

四、Dao层

1、通过生成器生成用户表相关的po类、映射、xml

2、自定义一些数据库操作

  <select id="countByUsername" parameterType="java.lang.String" resultType="java.lang.Integer">
    select
    count(1)
    from mall_user
    where username = #{username,jdbcType=VARCHAR}
  </select>

3、控制台打印sql

在配置中加入如下配置:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

mybatis:
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:mapper/*.xml

五、统一异常处理

1、@ControllerAdvice,是Spring3.2提供的新注解,它是一个Controller增强器,可对controller中被 @RequestMapping注解的方法加一些逻辑处理,相当于所有加了@RequestMapping的方法都受它影响。

2、@ExceptionHandler可以用来统一处理抛出的某一类异常

@ControllerAdvice
public class RuntimeExceptionHandle {

    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    @ResponseStatus(HttpStatus.FORBIDDEN)
    public ResponseVO handle(RuntimeException e){
        return ResponseVO.error(ERROR, e.getMessage());
    }
}

发表评论

后才能评论