day13

1.商品分类业务实现

1.1问题说明

原始代码结构:出现2层for循环,如果外层循环10个,每个内内层循环也是10个,完成这项业务需要查询100次数据库

矛盾点:多次查询数据库!!!

优化的策略:数据库只查询一次,就可以获取商品分类三级嵌套结构

程序设计:

1.数据结构 Map<父级ID,所有子集列表信息> 列表信息中不包含嵌套关系

例如: map<0,一级列表信息>  一级列表不包含2级和3级

            map<一级ID,二级列表信息>  只有2级列表 不包含3级

            map<二级ID,三级列表信息>  只有3级列表

2.根据数据结构动态根据level查询子集。

1.2 业务实现

 

  /**
     * 1.数据结构:Map<k,v>  key=parentId  value="List<ItemCat>"
     * 2.封装Map的数据类型
     * 3.如果level=1 只获取一级
     * 4.如果level=2 获取一级,一级嵌套2级
     * 5.如果level=3 获取一级,一级嵌套2级,二级嵌套3级
     * */
@Override
public List<ItemCat> findItemCatList(Integer level) {
    long start = System.currentTimeMillis();
    //1.封装Map集合
    Map<Integer,List<ItemCat>> map =getMap();
    //2.判断level的值
    if (level==1){
        return map.get(0);
    }if (level==2){
        return getTwoList(map);
    }
    long sum=System.currentTimeMillis()-start;
    System.out.println(sum);
    return getThreeList(map);


}

    private List<ItemCat> getThreeList(Map<Integer, List<ItemCat>> map) {
        //获取1级和二级
        List<ItemCat> oneList = getTwoList(map);
        for (ItemCat one :oneList){
            List<ItemCat> twoList = one.getChildren();
            if (twoList==null ||twoList.size()==0){
                continue;  //由于业务数据不合理 跳过本次循环,执行下一次
            }
            for (ItemCat two :twoList){
                List<ItemCat> threeList = map.get(two.getId());
                two.setChildren(threeList);
            }
        }
        return  oneList;
}

    private List<ItemCat> getTwoList(Map<Integer, List<ItemCat>> map) {
        //1.先获取1级的列表
        List<ItemCat> oneList = map.get(0);
        for (ItemCat one :oneList){
            Integer parentId = one.getId();
            List<ItemCat> twoList = map.get(parentId);
            one.setChildren(twoList);
        }
        return oneList;
    }

    /**
     * 1.查询所有的商品分类列表   数据库查询一次。
     * 2.循环遍历所有的数据,按照parentId,List<ItemCat>
     * 3.
     * */
    private Map<Integer, List<ItemCat>> getMap() {
        Map<Integer, List<ItemCat>> map =new HashMap();
        List<ItemCat> list = itemCatMapper.selectList(null);
        for (ItemCat l :list){
            Integer parentId = l.getParentId();
            if (map.containsKey(parentId)){
                map.get(parentId).add(l);
            }else{
            List<ItemCat> childrenList=new ArrayList();
            childrenList.add(l);
            map.put(parentId,childrenList);
            }
        }
        return map;
    }

1.3 商品分类状态修改

 async updateStatus(itemCat) {
        const {
          data: result
        } = await this.$http.put(`/itemCat/status/${itemCat.id}/${itemCat.status}`)
        if (result.status !== 200) return this.$message.error("修改状态失败")
        this.$message.success("状态修改成功")
      },

业务接口的实现

请求路径: /itemCat/status/{id}/{status}

请求类型: put

请求参数:

1.4 新增商品分类

业务说明:商品分类实现中,需要添加一级/二级/三级分类信息。但是父级下拉框中勾选1-2级菜单,因为三级菜单不能当做父级。

 代码实现:

 @PostMapping("/saveItemCat")
    @Transactional
    public SysResult addItemCat(@RequestBody ItemCat itemCat){
        itemCatService.addItemCat(itemCat);
        return SysResult.success();
    }


@Override
    public void addItemCat(ItemCat itemCat) {
        itemCat.setStatus(true);
        itemCatMapper.insert(itemCat);
    }

1.5 商品分类修改

 代码实现

 @PutMapping("/updateItemCat")
    @Transactional
    public SysResult updateItemCat(@RequestBody ItemCat itemCat){
        itemCatService.updateItemCat(itemCat);
        return SysResult.success();
    }


    @Override
    public void updateItemCat(ItemCat itemCat) {
        itemCatMapper.updateById(itemCat);
    }

1.6 商品分类删除操作

1.6.1 业务说明

规则:

      1.如果删除的商品分类是3级,可以直接删除

       2.如果商品删除分类是2级,则先删除3级再删除2级

       3.如果商品删除分类是1级,则先删除3级再删除2级最后删除1级

接口文档:

 

代码:

@DeleteMapping("/deleteItemCat")
    public SysResult deleteItemCat(ItemCat itemCat){
        itemCatService.deleteItemCat(itemCat);
        return SysResult.success();
    }


 @Transactional
    @Override
    public void deleteItemCat(ItemCat itemCat) {
        int level =itemCat.getLevel();

        if (level==3){
            //表示需要删除的数据是三级菜单,可以直接删除
            itemCatMapper.deleteById(itemCat.getId());
        }
        if(level==2){
            //表示需要删除的是二级,先删除二级下的三级
            QueryWrapper<ItemCat> queryWrapper = new QueryWrapper();
            queryWrapper.eq("parent_id", itemCat.getId())
                        .or()
                        .eq("id", itemCat.getId());
            itemCatMapper.delete(queryWrapper);
        }
        if (level==1){
            //1.必须获取二级ID
            QueryWrapper<ItemCat> queryWrapper = new QueryWrapper();
            queryWrapper.eq("parent_id",itemCat.getId());
            //获取结果的第一列字段(主键)
            List twoIdsList = itemCatMapper.selectObjs(queryWrapper);
            queryWrapper.clear();
            queryWrapper.in(twoIdsList.size()>0,"parent_id", twoIdsList)
            .or()
            .eq("parent_id",itemCat.getId())
            .or()
            .eq("id",itemCat.getId() );
            itemCatMapper.delete(queryWrapper);
        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值