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