day5 业务开发中较有用代码

逻辑删除

删除操作若不想数据库中数据真正被删除 而是用一个标志位字段来判断
yml中配置
mybatis-plus:
  mapper-locations: classpath:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto
      logic-delete-value: 1 #逻辑删除位值
      logic-not-delete-value: 0    #逻辑不删除值

entity类中的标志位加上注解
    @TableLogic(value = "1",delval = "0")
    private Integer showStatus;

//默认已删除的标志位是1 没删除是0
//必须要有@TableLogic注解 注解中()的value显示 delval不显示 与yml相反

后端请求数据校验

1)引入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2)pojo加上注解
如@Email,@NotNull
@NotBlank(message = "品牌名必须非空")

3)controller中加上注解@Valid 开启校验
@RequestMapping("/save")
public R save(@Valid @RequestBody BrandEntity brand){
    brandService.save(brand);
    return R.ok();
}

//---------------------------------------------------------------
如上若校验失败 返回的内容不是走自定义的R 
可以将@Valid校验的方法加个入参BindingResult
获取异常信息再放到 return返回

@RequestMapping("/save")
public R save(@Valid @RequestBody BrandEntity brand, BindingResult result){
    if( result.hasErrors()){
        Map<String,String> map=new HashMap<>();
        //1.获取错误的校验结果
        result.getFieldErrors().forEach((item)->{
            //获取发生错误时的message
            String message = item.getDefaultMessage();
            //获取发生错误的字段
            String field = item.getField();
            map.put(field,message);
        });
        return R.error(400,"提交的数据不合法").put("data",map);
    }else {
    }
    brandService.save(brand);

    return R.ok();
}


//-------------------------------------------------------------
上面的异常处理每个接口都写一遍不方便 还能把上述异常处理统一放到@controlleradvice中
如
@Slf4j
@RestControllerAdvice(basePackages = "com.atguigu.gulimall.product.controller")
public class GulimallExceptionControllerAdvice {

    @ExceptionHandler(value = Exception.class) // 也可以返回ModelAndView
    public R handleValidException(MethodArgumentNotValidException exception){
        Map<String,String> map=new HashMap<>();
        // 获取数据校验的错误结果
        BindingResult bindingResult = exception.getBindingResult();
        bindingResult.getFieldErrors().forEach(fieldError -> {
            String message = fieldError.getDefaultMessage();
            String field = fieldError.getField();
            map.put(field,message);
        });
        log.error("数据校验出现问题{},异常类型{}",exception.getMessage(),exception.getClass());
        return R.error(400,"数据校验出现问题").put("data",map);
    }
}

 分组数据校验

实际开发中 增/改接口使用的参数校验规则是不一样的 
如增接口id为空 修改接口id不为空
针对不同请求对valit校验分组

//pojo类权限校验注解中定义分组空接口 如AddGroup.class接口是一个啥都没有的空接口
//controller中对使用的分组加@Validated(AddGroup.class) 
//@Null(message = "新增不能指定id", groups = {AddGroup.class})只有controller中定义@Validated(AddGroup.class)才会生效 定义@Valit或其它分组都不会生效
如
@NotNull(message = "修改必须定制品牌id", groups = {UpdateGroup.class})
@Null(message = "新增不能指定id", groups = {AddGroup.class})
@TableId
private Long brandId;

@RequestMapping("/save")
public R save(@Validated(AddGroup.class) @RequestBody BrandEntity brand) {
    brandService.save(brand);
    return R.ok();
}

vue element-ui数据校验

<el-form :rules="dataRule" ...>
 <el-form-item label="bean名称" prop="beanName">
        <el-input ...></el-input>
</el-form-item>
</el-form>

//表单中先定义:rules指定方法
//prop定义需校验的字段名称
//js return中定义校验规则
    return{
        dataRule: {
          beanName: [
            { required: true, message: '用户名不能为空', trigger: 'blur' }
          ]
        }
或者通过validator定义校验方法
    return{
        dataRule: {
          beanName: [
            { validator: validatePass2,trigger: 'blur' }
          ]
        }

var validatePass2 = (rule, value, callback) => {
    if (value === '') {
        callback(new Error('请再次输入密码'));
    } else if (value !== this.ruleForm.pass) {
        callback(new Error('两次输入密码不一致!'));
    } else {
        callback();
    }
};
原文地址:https://www.cnblogs.com/hbhb/p/14538217.html