• 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();
        }
    };
  • 相关阅读:
    Redis持久化机制
    Java动态代理
    FFmpeg视频处理
    Redis集群
    解决vscode无法提示golang的问题
    解决vscode无法安装golang相关插件的问题
    近期小结
    近期小结
    稍稍解读下ThreadPoolExecutor
    响应式编程笔记三:一个简单的HTTP服务器
  • 原文地址:https://www.cnblogs.com/hbhb/p/14538217.html
Copyright © 2020-2023  润新知