2.品牌管理和JSR303校验和品牌分类关联

前端:brand.vue
后端:BrandController Brandservice BrandEntity

1.查询品牌列表 分页查询
前端发送请求:

    // 获取数据列表
    getDataList() {
    
    
      this.dataListLoading = true;
      this.$http({
    
    
        url: this.$http.adornUrl("/gulimallproduct/brand/list"),
        method: "get",
        params: this.$http.adornParams({
    
    
          page: this.pageIndex,
          limit: this.pageSize,
          key: this.dataForm.key,
        }),

后端接收

    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params){
    
    
        PageUtils page = brandService.queryPage(params);

        return R.ok().put("page", page);
    }

返回R R中包含key为“page”的value ,也就是PageUtils类型的数据 ,此类为自定义类,有当前页 每页记录数 总记录数等属性
queryPage方法

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
    
    
        //需要先判断是不是带有条件 依据就是前端如果带条件,请求就会带一个key属性。
//http://localhost:88/api/gulimallproduct/brand/list?t=1636852820475&page=1&limit=10&key=aa
        //查询条件
        QueryWrapper<BrandEntity> queryWrapper = new QueryWrapper<>();
        //从请求参数中获取到key
        String key = (String) params.get("key");
        //如果key不为空,就开始封装条件,eq相等,like模糊查询。
        if(!StringUtils.isEmpty(key)){
    
    
            queryWrapper.eq("brand_id",key).or().like("name",key);
        }
        //查询
        IPage<BrandEntity> page = this.page(
                new Query<BrandEntity>().getPage(params),
                queryWrapper
        );
        return new PageUtils(page);
    }

如果带有条件需要先根据条件查询
在这里插入图片描述

此处调用ServiceImpl的方法 page 返回mybatisplus的IPage接口类型,传入IPage类型和QueryWrapper类型。此处通过自定义的类Query 获取到IPage类型
在这里插入图片描述
其他增删改查都是调用基础方法,修改和保存需要进行数据校验(前端和后端),此处采用JSR303校验。
使用步骤:
1.pom引入依赖

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>

2.在需要校验的字段加上注解(@NotNull,@NotEmpty,@NotBlank),可以指定错误返回信息
​ @NotNull 可以接收任何类型 数据不能为空
​ @NotEmpty 字段不能为null或"",可以接收字符串,数组,集合
​ @NotBlank 只能接收字符,字段不能为空,必须有一个非空字符
在这里插入图片描述
3.在请求方法中加入validated注解
在这里插入图片描述
4.测试结果
在这里插入图片描述
5.返回结果不符合要求,必须是我们自定义的返回结果
在这里插入图片描述
6.这种是针对于该请求设置了一个内容校验,如果针对于每个请求都单独进行配置,显然不是太合适,实际上可以统一的对于异常进行处理。方法:抽取一个异常处理类
在这里插入图片描述
7.测试
在这里插入图片描述
8.分组校验
(1)给校验注解加上groups
在这里插入图片描述
(2) 业务方法使用@validated注解
在这里插入图片描述
9自定义校验器和校验注解
(1)校验器
在这里插入图片描述
(2)自定义校验注解
在这里插入图片描述
(3)使用
在这里插入图片描述
**品牌分类关联 数据库表名:pms_category_brand_relation
在这里插入图片描述
比如华为品牌,可以关联手机电视等分类
(1)查询关联列表
前端请求:

    getCateRelation() {
    
    
      this.$http({
    
    
        url: this.$http.adornUrl("/gulimallproduct/categorybrandrelation/catelog/list"),
        method: "get",
        params: this.$http.adornParams({
    
    
          brandId: this.brandId
        })

后端接收:

    /**
     * 根据当前的品牌id获取所有关联的分类
     */
    @GetMapping("/catelog/list")
    //@RequiresPermissions("product:categorybrandrelation:list")
    public R cateloglist(@RequestParam("brandId")Long brandId){
    
    
        List<CategoryBrandRelationEntity> data = categoryBrandRelationService.list(
                new QueryWrapper<CategoryBrandRelationEntity>().eq("brand_id",brandId)
        );
        return R.ok().put("data", data);
    }

(2)新增品牌分类关联
前端请求:

      this.$http({
    
    
        url: this.$http.adornUrl("/gulimallproduct/categorybrandrelation/save"),
        method: "post",
        data: this.$http.adornData({
    
    brandId:this.brandId,catelogId:this.catelogPath[this.catelogPath.length-1]}, false)
      }).then(({
    
     data }) => {
    
    
        this.getCateRelation();
      });
    },

后端接收:

    /**
     * 保存 品牌分类关联
     */
    @RequestMapping("/save")
    public R save(@RequestBody CategoryBrandRelationEntity categoryBrandRelation){
    
    
		categoryBrandRelationService.saveDetail(categoryBrandRelation);
        return R.ok();
    }

saveDetail方法:

    @Override
    public void saveDetail(CategoryBrandRelationEntity categoryBrandRelation) {
    
    
        Long brandId = categoryBrandRelation.getBrandId();
        Long catelogId = categoryBrandRelation.getCatelogId();
        //1、查询详细名字
        BrandEntity brandEntity = brandDao.selectById(brandId);
        CategoryEntity categoryEntity = categoryDao.selectById(catelogId);
        categoryBrandRelation.setBrandName(brandEntity.getName());
        categoryBrandRelation.setCatelogName(categoryEntity.getName());
        this.save(categoryBrandRelation);
    }

先获取到品牌id和分类id,根据id查询品牌和分类名,然后保存。
在这里插入图片描述
此处表中两个名字为冗余字段,避免关联查询,(关联查询对数据库影响比较大)
所以保存的时候,把名字也查出来进行保存。
这样带来一个问题,就是修改品牌名或分类名时,该表中的数据要同步更新,保证冗余字段的数据一致性
CatrgoryServiceImpl中:

    @Override
    public void updateDetail(BrandEntity brand) {
    
    
        //保证冗余字段的数据一致
        this.updateById(brand);
        //如果修改了名字 ,品牌分类关联表也要修改
        if(!StringUtils.isEmpty(brand.getName())){
    
    
            //同步更新其他关联表中的数据
            categoryBrandRelationService.updateBrand(brand.getBrandId(),brand.getName());
        }
        //TODO 更新其他关联
    }

CategoryServiceImpl中:

    @Transactional
    @Override
    public void updateCascade(CategoryEntity category) {
    
    
        this.updateById(category);
        categoryBrandRelationService.updateCategory(category.getCatId(),category.getName());
    }

更新的同时都要更新关联表的名字
CategoryBrandRelationServiceImpl中:

    @Override
    public void updateCategory(Long catId, String name) {
    
    
        //两种方式 一种是创建实体类,然后调用this.update进行更新
		//第二种mapper.xml中写sql语句
        this.baseMapper.updateCategory(catId,name);
    }
    
    @Override
    public void updateBrand(Long brandId, String name) {
    
    
        CategoryBrandRelationEntity categoryBrandRelationEntity = new CategoryBrandRelationEntity();
        categoryBrandRelationEntity.setBrandId(brandId);
        categoryBrandRelationEntity.setBrandName(name);
        this.update(categoryBrandRelationEntity,new UpdateWrapper<CategoryBrandRelationEntity>().eq("brand_id",brandId));
    }    

猜你喜欢

转载自blog.csdn.net/weixin_46666822/article/details/121309895