天天看點

一二三級目錄的增删改查

 Controller

@RestController
@CrossOrigin
@RequestMapping("/itemCat")
public class ItemCatController {
    @Autowired
    private ItemCatService itemCatService;
    /**
     * 需求: 查詢3級商品分類清單資訊
     * URL:  /itemCat/findItemCatList/{level}
     * 參數:  level 查詢的層級
     * 傳回值: SysResult對象(List<ItemCat>)
     */
    @GetMapping("/findItemCatList/{level}")
    public SysResult findItemCatList(@PathVariable Integer level){

        List<ItemCat> itemCatList = itemCatService.findItemCatList(level);
        return SysResult.success(itemCatList);
    }

    /**
     * 業務需求: 實作狀态的修改
     * 1.URL: /itemCat/status/{id}/{status}
     * 2.請求類型: put
     * 3.傳回值: SysResult對象
     */
    @PutMapping("/status/{id}/{status}")
    public SysResult updateStatus(ItemCat itemCat){

        itemCatService.updateStatus(itemCat);
        return SysResult.success();
    }


    /**
     * 需求: 實作商品分類入庫
     * URL: /itemCat/saveItemCat
     * 類型: post類型
     * 參數: itemCat對象~~~JSON
     * 傳回值: SysResult
     */
    @PostMapping("/saveItemCat")
    public SysResult saveItemCat(@RequestBody ItemCat itemCat){

        itemCatService.saveItemCat(itemCat);
        return SysResult.success();
    }

    /**
     * 商品分類删除操作
     * URL:  /itemCat/deleteItemCat?id=1&level=3
     * 類型:  delete
     * 參數:  id/level
     * 傳回值: SysResult對象
     */
    @DeleteMapping("/deleteItemCat")
    public SysResult deleteItemCat(Integer id,Integer level){

        itemCatService.deleteItemCat(id,level);
        return SysResult.success();
    }


}
           

 Service

@Service
public class ItemCatServiceImpl implements ItemCatService {
    @Autowired
    private ItemCatMapper itemCatMapper;

    /**
     * 1.封裝Map集合   Map<Key=父級ID,value=List<ItemCat對象>>
     * 2.說明:  将所有的資料庫的父子關系,進行封裝.(沒有嵌套!!!!)
     * 3.優勢:  隻查詢一次資料庫,就可以完成父子關系的封裝.
     政策:
     *      1. key不存在, 準備一個新List集合,将自己當作第一個元素追加
     *      2. key存在,  擷取原有list集合,将自己追加.
     *
     */
    public Map<Integer,List<ItemCat>> initMap(){
        //Map中包含了所有的父子級關系.
        Map<Integer,List<ItemCat>> map = new HashMap<>();
        //1.查詢item_cat表中的所有的記錄(1/2/3級菜單)
        List<ItemCat> itemCatList = itemCatMapper.selectList(null);
        //2.實作資料的封裝
        for(ItemCat itemCat : itemCatList){
            int key = itemCat.getParentId();
            if(map.containsKey(key)){ //存在
                List<ItemCat> list = map.get(key);
                //将自己追加到其中
                list.add(itemCat);
            }else{  //不存在: 準備List集合,将自己作為第一個元素封裝
                List<ItemCat> list = new ArrayList<>();
                list.add(itemCat);
                map.put(key,list);
            }
        }
        //将封裝的資料進行傳回.
        return map;
    }

    /**
     * level 1 隻查詢一級商品分類
     *       2 查詢一級/二級  嵌套封裝
     *       3 查詢一級/二級/三級   嵌套封裝
     * @param level
     * @return
     */
    @Override
    public List<ItemCat> findItemCatList(Integer level) {
        long startTime = System.currentTimeMillis();
        //Map集合裡邊封裝的是所有的父子級關系.
        Map<Integer,List<ItemCat>> map = initMap();
        if(level == 1){ //隻擷取1級菜單. parent_id = 0
            return map.get(0);
        }
        //使用者查詢1/2級商品分類資訊
        if(level == 2){
            return getLevel2List(map);
        }

        //如果程式執行到這裡,則說明使用者查詢的是1-2-3級菜單
        List<ItemCat> list = getLevel3List(map);
        long endTime = System.currentTimeMillis();
        System.out.println("耗時:"+(endTime-startTime)+"毫秒");
        return list;
    }

    @Override
    @Transactional
    public void updateStatus(ItemCat itemCat) {//id/status

        itemCatMapper.updateById(itemCat);
    }

    @Override
    @Transactional
    public void saveItemCat(ItemCat itemCat) {

        itemCat.setStatus(true);
        itemCatMapper.insert(itemCat);
    }

    /**
     * 1.易用性,性能高
     *
     * @param id
     * @param level
     */
    @Override
    @Transactional  //添加事務的控制
    public void deleteItemCat(Integer id, Integer level) {
        if(level == 3){
            itemCatMapper.deleteById(id);
        }

        if(level == 2){
            //1.先删除3級菜單
            QueryWrapper queryWrapper = new QueryWrapper();
            queryWrapper.eq("parent_id",id);
            itemCatMapper.delete(queryWrapper);
            //2.再删除2級菜單
            itemCatMapper.deleteById(id);
        }

        //如果程式執行到這一行 則需要先删除3級/再删除2級/最後删除1級
        if(level == 1){
            List<Integer> ids = new ArrayList<>();
            //1.查詢所有的二級菜單
            QueryWrapper queryWrapper = new QueryWrapper();
            queryWrapper.eq("parent_id",id);
            List<ItemCat> twoList = itemCatMapper.selectList(queryWrapper);
            for (ItemCat twoItemCat : twoList){
                //删除3級菜單
                queryWrapper.clear();
                queryWrapper.eq("parent_id",twoItemCat.getId());
                //delete from item_cat where parent_id = "二級ID"
                itemCatMapper.delete(queryWrapper);
                //擷取需要删除的ID資訊
                ids.add(twoItemCat.getId());
            }
            //将所有的二級/一級ID封裝到List集合中
            ids.add(id);
            itemCatMapper.deleteBatchIds(ids);
        }
    }

    public List<ItemCat> getLevel3List(Map<Integer, List<ItemCat>> map) {
        //1.先查詢1-2級
        List<ItemCat> oneList = getLevel2List(map);

        //2.周遊集合
        for(ItemCat oneItemCat : oneList){
            //擷取二級集合資訊
            List<ItemCat> twoList = oneItemCat.getChildren();
            if(twoList == null || twoList.size() ==0){
                //目前一級菜單沒有二級元素.結束本次循環,開始下一次!!!
                continue;
            }
            //該元素有二級,應該查詢三級.
            for(ItemCat twoItemCat : twoList){
                List<ItemCat> threeList = map.get(twoItemCat.getId());
                twoItemCat.setChildren(threeList);
            }
        }
        return oneList;
    }

    //查詢一級和二級資訊
    public List<ItemCat> getLevel2List(Map<Integer, List<ItemCat>> map) {
        //思路: 先查詢一級,之後循環周遊,再次封裝2級
        //1.擷取一級
        List<ItemCat> oneList = map.get(0);
        for(ItemCat oneItemCat : oneList){
            //2.如何根據一級查詢二級? 通過Map集合擷取
            List<ItemCat> twoList = map.get(oneItemCat.getId());
            //3.實作了一級二級的封裝
            oneItemCat.setChildren(twoList);
        }
        return oneList;
    }




    /**
         * 業務: 查詢3級商品分類資訊
         *      1. 一級中嵌套二級集合
         *      2. 二級菜單嵌套三級集合.
         *
         * 1.0版本: for循環嵌套結構  暫時不考慮level 最好了解的
         * 常識:
         *      1.使用者第一次查詢資料庫 需要建立連結.
         *      2.第二次查詢 從連結池中動态擷取連結 是以速度更快!!!
         *
         *  思考: 該業務查詢了多少次資料庫??? 第一層循環10個  第二層循環10 總查詢數=10*10=100次
         *       如何優化查詢政策!!!!
         * @param level
         * @return
         */
    /* @Override
    public List<ItemCat> findItemCatList(Integer level) {
        //性能問題:!!!!!
        long startTime = System.currentTimeMillis();

        //1.查詢一級商品分類資訊
        QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("parent_id", 0);
        List<ItemCat> oneList = itemCatMapper.selectList(queryWrapper);

        //2.查詢二級商品分類資訊  周遊一級集合
        for(ItemCat oneItemCat : oneList){
            queryWrapper.clear();   //清空條件
            queryWrapper.eq("parent_id", oneItemCat.getId());
            List<ItemCat> twoList = itemCatMapper.selectList(queryWrapper);

            //3.查詢三級商品分類資訊  周遊
            for(ItemCat twoItemCat : twoList){
                queryWrapper.clear();
                queryWrapper.eq("parent_id", twoItemCat.getId());
                List<ItemCat> threeList = itemCatMapper.selectList(queryWrapper);
                //将三級封裝給二級
                twoItemCat.setChildren(threeList);
            }
            //3.将二級記錄封裝給一級
            oneItemCat.setChildren(twoList);
        }

        //記錄程式的結束時間
        long endTime = System.currentTimeMillis();
        System.out.println("查詢耗時:"+(endTime - startTime)+"毫秒");
        return oneList;
    }*/
}