电商系统:用户模块之注册功能
一、功能描述
用户输入账号、密码、邮箱进行注册,接口如下

二、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());
}
}