java實現構造無限層級樹形菜單

繼續填上篇文章的坑,這裏來說一下後臺java如何構造多叉樹,這樣前臺就可接收到數據遞歸構造樹形菜單了。html

咱們來理一下如何實現構造多叉樹的邏輯吧,其實整個問題歸納起來就是
一、構造一個實體類,用來存儲節點,因此咱們構造的須要四個對象(id,pid,name,和chirenList)
二、構造菜單結構
三、構造子菜單,如此循環,經過pid判斷上級菜單vue

具體實現:
一、這裏構造Tree.java實體類java

package com.tcl.jr.crm.entity;

/**
 * 類名稱:Tree
 * 類描述:樹形結構
 */
public class Tree {

    private String id;
    private String pId;
    private String name;
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getpId() {
        return pId;
    }

    public void setpId(String pId) {
        this.pId = pId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Tree [id=" + id + ", pId=" + pId + ", name=" + name + "]";
    }

}

二、封裝樹形結構類,這裏我封裝成一個通用的工具類,方便項目中使用,MenuTreeUtil.java,完整代碼以下,可直接複製使用:web

package com.tcl.jr.crm.util;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.tcl.jr.crm.entity.Tree;

/**
 * 類名稱:MenuTreeUtil
 * 類描述:遞歸構造樹型結構
 */
public class MenuTreeUtil {
    
    public static Map<String,Object> mapArray = new LinkedHashMap<String, Object>();  
    public List<Tree> menuCommon;  
    public List<Object> list = new ArrayList<Object>();  
      
    public List<Object> menuList(List<Tree> menu){      
        this.menuCommon = menu;  
        for (Tree x : menu) {     
            Map<String,Object> mapArr = new LinkedHashMap<String, Object>();  
            if(x.getpId()=="0"){  
                mapArr.put("id", x.getId());  
                mapArr.put("name", x.getName());    
                mapArr.put("pid", x.getpId());    
                mapArr.put("childList", menuChild(x.getId()));    
                list.add(mapArr);  
            }  
        }     
        return list;  
    }  
   
    public List<?> menuChild(String id){  
        List<Object> lists = new ArrayList<Object>();  
        for(Tree a:menuCommon){  
            Map<String,Object> childArray = new LinkedHashMap<String, Object>();  
            if(a.getpId() == id){  
                childArray.put("id", a.getId());  
                childArray.put("name", a.getName());  
                childArray.put("pid", a.getpId());  
                childArray.put("childList", menuChild(a.getId()));
                lists.add(childArray);  
            }  
        }  
        return lists; 
    }  

}

三、最後在控制檯請求方法調用數據就好了,在controller的方法以下:ajax

/**
     * 顯示APP樹形結構
     */
    @RequestMapping(value = { "getAPPTree" }, produces = "text/html;charset=UTF-8")
    @ResponseBody
    public String getAPPTree(HttpServletRequest request, HttpServletResponse response) throws Exception {
        Map<String, Object> returnmap = new HashMap<>();
        MenuTreeUtil menuTree = new MenuTreeUtil();
        PageData pd = this.getPageData();
        try {
            //這裏的方法是根據前臺的機構類型代碼來查找數據庫數據的,這裏很少加解釋,因人而異
            List<Tree> list = dataDicService.buildTree(pd.getString("instType"));
            List<Object> menuList = menuTree.menuList(list);
            //區別於web端,這邊APP端list不能轉爲json格式,直接將list傳給前臺,轉成json對象的話vuejs前臺沒法識別渲染
            returnmap.put("list", menuList);
        } catch (Exception e) {
            logger.error(e.getMessage());
        }
        return JsonMapper.toJsonString(returnmap);
    }

四、而後前臺ajax調用第三部的接口方法就而已請求到所需的數據,如何渲染成好的前臺頁面,參照我另外一篇文章:vuejs使用遞歸組件實現樹形目錄數據庫

java構造樹形菜單數據就說到這裏啦,但願對你們有幫助,個人分享通常都是特別詳細的,除了涉及項目隱私以外,是不會對你們有所保留的喲json

相關文章
相關標籤/搜索