樹形圖後端代碼

添加樹形結構createTreeModel

思路:
在這裏插入圖片描述
關鍵代碼:

@Override
    public boolean createTreeModel(List<QuestionClassifyModel> questionClassifyModelList) {

		// 分解試題分類集合
        List<QuestionClassifyModel> models = resolveQuestionClassify(questionClassifyModelList);
        // 實例化一個ArrayList集合teQuestionClassifyList
        List<TeQuestionClassify> teQuestionClassifyList = new ArrayList<>();
        // copyroperties model到questionClassifyEntity值
        for (QuestionClassifyModel model : models) {
            TeQuestionClassify teQuestionClassify = new TeQuestionClassify();
            // 將model 賦值給實體teQuestionClassify
            BeanUtils.copyProperties(model, teQuestionClassify);
            // 父id爲空,賦值0
            if (StringUtils.isEmpty(teQuestionClassify.getParentId())) {
                teQuestionClassify.setParentId("0");
            }
            // 實體id爲空,重新賦值
            if (StringUtils.isEmpty(teQuestionClassify.getId())) {
                teQuestionClassify.setId(IdWorker.getIdStr());
            }
            // 把實體添加到集合裏
            teQuestionClassifyList.add(teQuestionClassify);

        }
        // 保存到數據庫
        return questionClassifyService.saveBatch(teQuestionClassifyList);
    }



private List<QuestionClassifyModel> resolveQuestionClassify(List<QuestionClassifyModel> questionClassifyModelList) {
        // 實例化集合classifyModelList
        List<QuestionClassifyModel> classifyModelList = new ArrayList<>();
        // 通過增強for循環將試題分類集合賦值給model
        for (QuestionClassifyModel model : questionClassifyModelList){
            // 設置id
            model.setId(IdWorker.getIdStr());
            // 去掉null值
            model.getQuestionClassifyModel().remove(null);
            if (model.getQuestionClassifyModel() != null){
                for (QuestionClassifyModel sonModel : model.getQuestionClassifyModel()) {
                    // 子類設置父id
                    sonModel.setParentId(model.getId());
                }
                // 遞歸循環添加子類試題分類集合到實例化的集合classifyModelList,子類試題分類集合空遞歸結束
                classifyModelList.addAll(resolveQuestionClassify(model.getQuestionClassifyModel()));
            }
            classifyModelList.add(model);
        }
        return classifyModelList;
    }

在這裏插入圖片描述

在這裏插入圖片描述

關鍵代碼:

@Override
    public TeQuestionClassify createTreeNode(QuestionClassifyModel questionClassifyModel) {
        
        TeQuestionClassify teQuestionClassify = new TeQuestionClassify();
        // 將questionClassifyModel賦值給teQuestionClassify
        BeanUtils.copyProperties(questionClassifyModel, teQuestionClassify);
        // 實體父id爲空賦值0
        if (StringUtils.isEmpty(teQuestionClassify.getParentId())) {
            teQuestionClassify.setParentId("0");
        }
        // teQuestionClassify實體id爲空,重新賦值
        if (StringUtils.isEmpty(teQuestionClassify.getId())) {
            teQuestionClassify.setId(IdWorker.getIdStr());
        }
        // 通過父id查詢實體
        TeQuestionClassify teQuestionClassify1 = this.getById(questionClassifyModel.getParentId());
        // 實體爲空或父id爲0則賦值默認值Level爲0
        if (teQuestionClassify1 == null || "0".equals(teQuestionClassify1.getParentId())) {
            teQuestionClassify.setLevel(0);
        } else {
            // 設置等級+1
            teQuestionClassify.setLevel(teQuestionClassify.getLevel() + 1);
        }
        // 插入實體到數據庫
        questionClassifyDao.insert(teQuestionClassify);
        return teQuestionClassify;
    }

刪除:
baseMapper的removeById(id)刪除;

修改:
將參數QuestionClassifyModel賦值給實體
調用baseMapper的updateById(實體)方法修改;

查詢:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
關鍵代碼:

@Override
    public List<QuestionTypeClassifyModel> getQuestionClassify(String questionTypeId, String courseId, String operator) {

        /**
         * 1.查詢該課程下所有該題型的所有分類
         * 2.將無子節點試題分類先放入集合中
         * 3.將所有parent_id去重得到一個父ids數組
         * 4.根據父id和當前結構遞歸調用方法查詢試題分類的樹形結構
         */
        List<QuestionTypeClassifyModel> treeList = new ArrayList<>();
        List<QuestionTypeClassifyModel> questionTypeClassifyModelList = questionClassifyDao.getQuestionClassify(questionTypeId, courseId, operator);
        // TODO: 換種方式-xsh
        List<QuestionTypeClassifyModel> listParent = questionTypeClassifyModelList.stream().filter(a -> "0".equals(a.getParentId())).collect(Collectors.toList());
        treeList.addAll(listParent);
        List<String> parentIdList = questionTypeClassifyModelList.stream().map(QuestionTypeClassifyModel::getParentId).collect(Collectors.toList());
        List<QuestionTypeClassifyModel> treeListChildren = getTreeQuestionClassify(questionTypeClassifyModelList, parentIdList, courseId);
        // 將子結構放入父結構數組中
        treeList.addAll(treeListChildren);
        return treeList;
    }



private List<QuestionTypeClassifyModel> getTreeQuestionClassify(List<QuestionTypeClassifyModel> questionTypeClassifyModelList, List<String> parentIdList, String courseId) {

        List<QuestionTypeClassifyModel> treeList = new ArrayList<>();
        HashSet<String> hs = new HashSet<>(parentIdList);
        parentIdList.clear();
        parentIdList.addAll(hs);

        parentIdList.remove(null);
        parentIdList.remove("0");

        if (!CollectionUtils.isEmpty(parentIdList)) {
            List<QuestionTypeClassifyModel> questionClassifyTree = questionClassifyDao.getQuestionClassifyTree(parentIdList, courseId);
            parentIdList.forEach(y->{
                if (!"0".equals(y)) {
                    List<QuestionTypeClassifyModel> listChildren = questionTypeClassifyModelList.stream().filter(a -> y.equals(a.getParentId())).collect(Collectors.toList());
                    // Option容器接收用於避免空指針異常
                    Optional<QuestionTypeClassifyModel> parent = questionClassifyTree.stream().filter(a -> y.equals(a.getKey())).findFirst();
                    parent.orElse(new QuestionTypeClassifyModel()).setChildren(listChildren);
                    treeList.add(parent.orElse(null));
                }
            });

            parentIdList = questionClassifyTree.stream().map(QuestionTypeClassifyModel::getParentId).collect(Collectors.toList());

            parentIdList.remove("0");
            // 遞歸此方法,出口爲所有parentId爲0,最上層節點出去
            return getTreeQuestionClassify(treeList, parentIdList, courseId);
        } else {
            // 當父id集合爲空時,返回
            return questionTypeClassifyModelList;
        }
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章