springboot开发银行秒杀后端系统——用户篇(上篇)

「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」。

之前我们已经实现了通过docker部署数据库->文章链接点此处,不会docker想具体了解一下的可以看我的这篇文章:Docker使用指南

接下来就是用户模块的开发,这里我直接用mybatis-plus自动生成了项目,所以一些简单的crud就直接用mybatis-plus就行了,因为只是做个模型可以演示学习就行了。 注册就是很简单的填信息然后写表,这里我采用了@Valid注解来做信息校验

@PostMapping("/reg")
@Operation(summary = "用户注册")
public Map insert(@RequestBody @Valid SysUser entity, BindingResult bindingResult) {
    if (bindingResult.hasErrors())
        throw new RuntimeException(bindingResult.getFieldError().getDefaultMessage());//抛出校验错误信息
    return sysUserService.insertUser(entity);
}
复制代码

在传参的实体类前面加上@Valid注解,BindingResult是配合这个注解使用的,可以将一些校验错误的信息输出返回给前端,我这里直接当作异常抛出因为我配置了全局异常处理器和统一格式返回,参考了这篇文章—>SpringBoot 如何统一后端返回格式。然后我们要在实体类上添加我们需要的注解来完成校验

/**
* 密码
*/
@NotNull(message = "密码不能为空")
private String passWord;
复制代码

比如我在passWord字段上加了一个@NotNull(message = "密码不能为空"),就表示这个字段在前端传过来然后进行校验时不能为空,message可以自定义错误信息用于返回给前端,除了@NotNull还有很多其他功能的注解可以自行搜索,相关文章有很多,这里我想再说一下自定义的注解校验。

我们可以仿照@NotNull的源代码来写自己需求的验证逻辑

image.png 首先是编写注解,我这里以手机号码格式校验为例,把一些不必要的去掉以后如下,这里我加了一个required()用来判断这个参数是否是必填的,默认是true。

@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {IsMobileValidator.class})
public @interface IsMobile {
    boolean required() default true; //需要校验的参数是否是必填的
​
    String message() default "手机号码格式错误"; //默认的错误返回信息
​
    Class<?>[] groups() default {};
​
    Class<? extends Payload>[] payload() default {};
}
复制代码

然后我们要去实现@Constraint(validatedBy = {IsMobileValidator.class})中我们自己定义的校验类IsMobileValidator。这个校验类是通过ConstraintValidator来实现的,然后重写了一个初始化的方法和一个校验的方法,初始化的时候先读取我们之前定义的require(),然后在校验的时候判断,如果参数是必填的就直接判断手机号格式,如果是非必填的参数则先判断该参数是否为空,如果是空的也返回校验正确,如果不是空的就去判断手机号格式再返回。

public class IsMobileValidator implements ConstraintValidator<IsMobile, String> {
    private boolean required = false;
​
    @Override
    public void initialize(IsMobile constraintAnnotation) {
        required = constraintAnnotation.required();
    }
​
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (required) {
            return validatorUtil.isMobile(value);//手机号校验工具类
        } else {
            if (StringUtils.isEmpty(value)) {
                return true;
            } else {
                return validatorUtil.isMobile(value);
            }
        }
    }
}
复制代码

手机号的校验有很多工具类,我用的是这个:

private static final String REGEX_MOBILE ="((\+86|0086)?\s*)((134[0-8]\d{7})|(((13([0-3]|[5-9]))|(14[5-9])|15([0-3]|[5-9])|(16(2|[5-7]))|17([0-3]|[5-8])|18[0-9]|19(1|[8-9]))\d{8})|(14(0|1|4)0\d{7})|(1740([0-5]|[6-9]|[10-12])\d{7}))";
​
    /**
     * 判断是否是手机号
     * @param tel 手机号
     * @return boolean true:是  false:否
     */
    public static boolean isMobile(String tel) {
        if (StringUtils.isEmpty(tel)){ return false;}
        return Pattern.matches(REGEX_MOBILE, tel);
    }
复制代码

可以根据自己需求再编写其他的自定义校验,我还写了一个判断身份证的,详见GitHub。参数校验部分都在validator包中

image.png

扫描二维码关注公众号,回复: 13672844 查看本文章

编写完成后再测试一下,首先再我们的实体类上加上自定义的注解

image.png

然后在controller层的传参实体上加上@Valid注解

image.png

bindingResult.getFieldError().getDefaultMessage()返回的是校验失败的错误信息,用postman测试一下

image.png

输入正确的手机号后就可以成功注册

image.png

猜你喜欢

转载自juejin.im/post/7055169784257708068