springboot生成树的流程及相关代码,直接用于vue调用

1、新建树的类CatagaryTree。

public class CatagaryTree extends BaseEntity {
    private static final long serialVersionUID = 1L;

    private Integer id;
    private Integer parentID;
    private String catagoryName;
    private List<CatagaryTree> children = new ArrayList<>();
    private Boolean isLeaf=false;
    private String ancestors;
   //针对前端调用需要,如果以上字段不足,可以在此补充
   
    public void setId(Integer id)
    {
        this.id = id;
    }

    public Integer getId()
    {
        return id;
    }
    
    public void setParentID(Integer parentID)
    {
        this.parentID = parentID;
    }

    public Integer getParentID()
    {
        return parentID;
    }

    public void setCatagoryName(String catagoryName)
    {
        this.catagoryName = catagoryName;
    }

    public String getCatagoryName()
    {
        return catagoryName;
    }
    public void setChildren(List<CatagaryTree> children)
    {
        this.children = children;
    }
    public List<CatagaryTree> getChildren()
    {
        return children;
    }
    public void setIsLeaf(Boolean isLeaf)
    {
        this.isLeaf = isLeaf;
    }

    public Boolean getIsLeaf()
    {
        return isLeaf;
    }
}

2、获取与树相关的所有数据列表,包括数据来自于两个或多个表的情况,并将数据循环放入List<CatagaryTree>。我的数据来自于两个表。

public List<Map<String, Object>> querySubDataList(Map map){

List<Map<String, Object>> result = new LinkedList<>();

//(1)存储从数据库中获取的与树呈现相关的数据
List<SubCatagory> subCatagorys = subCatagoryMapper.querySubCatagoryList(map);
List<SubjectData> subjectDatas = subjectDataMapper.querySubDataByUserID(0);
List<CatagaryTree> resultList = new ArrayList<>();
//树中添加类型
for(SubCatagory subCatagory:subCatagorys){
    CatagaryTree catagaryTree = new CatagaryTree();
    catagaryTree.setDataID(subCatagory.getId());
    catagaryTree.setParentID(subCatagory.getParentID());
    catagaryTree.setCatagoryName(subCatagory.getName());
    catagaryTree.setPrj(subCatagory.getPrj());
    String[] str = subCatagory.getAncestors().split(",");
    String resultStr = "";
    if(subCatagory.getParentID()==0){
        catagaryTree.setNodeID(String.format("%02d",subCatagory.getId()));
    }else{
        for(int i=0;i<str.length;i++){
            int num = Integer.valueOf(str[i]);
            if(num!=0){
                resultStr+=String.format("%02d",num);
            }
        }
        catagaryTree.setNodeID(resultStr+String.format("%02d",subCatagory.getId()));
    }
    catagaryTree.setDataType("类别");
    resultList.add(catagaryTree);
}
//树中添加数据列表
for(SubjectData subjectData:subjectDatas){
    CatagaryTree catagaryTree = new CatagaryTree();
    catagaryTree.setDataID(subjectData.getId());
    catagaryTree.setParentID(subjectData.getCatagoryID());
    catagaryTree.setCatagoryName(subjectData.getLabel());
    catagaryTree.setPrj(subjectData.getPrj());
    catagaryTree.setStandard(subjectData.getStandard());//数据存在的字段
    catagaryTree.setDataType("数据");
    catagaryTree.setType(subjectData.getDataType());
    resultList.add(catagaryTree);
}
//(2)获取树的所有节点
result = getChildInfo(0,resultList);
resultList=null;
return result;
}

2、根据List<CatagaryTree>元素的pID递归获取所有孩子节点,将具有父子结构关系的数据存入List<Map<String,Object>>,通过接口由前端调用。

public List<Map<String,Object>> getChildInfo(Integer pID,List<CatagaryTree> allList){
    List<Map<String,Object>> childList = new LinkedList<>();//用于保存子节点的list

    for(CatagaryTree catagaryTree:allList){
        //如果是孩子,则附加到结果列表
        //树由类别和数据两种情况
         if(pID == catagaryTree.getParentID()&&catagaryTree.getDataType()=="类别"){
             Map<String,Object> map = new LinkedHashMap<>();
             map.put("id",catagaryTree.getDataID());
             map.put("name",catagaryTree.getCatagoryName());
             map.put("dataType",catagaryTree.getDataType());
             map.put("isLeaf",true);
             map.put("children",new Object[]{});
             childList.add(map);//加入孩子节点
         }

        if(pID == catagaryTree.getParentID()&&catagaryTree.getDataType()=="数据"){
            Map<String,Object> map = new LinkedHashMap<>();
            map.put("id",catagaryTree.getDataID());
            map.put("name",catagaryTree.getCatagoryName());
            map.put("dataType",catagaryTree.getType());
            map.put("isLeaf",true);
            childList.add(map);//加入孩子节点
        }
    }
    //遍历子节点,继续递归判断每个子节点是否还含有子节点
    for(Map<String,Object> child:childList){
        if(child.get("dataType")=="类别"){
            List<Map<String,Object>> tList = getChildInfo(Integer.valueOf(String.valueOf(child.get("id"))), allList);
            if(!tList.isEmpty()){
                child.put("isLeaf",false);
            }
            child.put("children",tList);
        }
    }
    return childList;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值