生成樹形菜單
阿新 • • 發佈:2017-08-02
bject ech ret 關閉 name get lose 父節點 葉子節點
題記------學習別人的精髓,並加以總結,消化吸收,這就是提高!!!
動態生成樹形菜單,前臺用easyui實現,非常簡單不贅述,主要給出後臺java的邏輯代碼
1 package com.gongli.util.entity.treeMenu; 2 3 4 5 /* 6 * 用於封裝樹形菜單,無具體表與之對應,根節點為-1,節點0,然後父節點0,節點001,父節點001,節點001001,001002,001...依次類推 7 */ 8 public class TreeMenu { 9 private String parentId;//父節點id 10 privateString nodeId;//後代節點id 11 private String perName;//權限名 12 private String icon;//顯示節點的圖標 13 private String url;//點擊樹形菜單的葉子節點時,請求的url路徑 14 public String getParentId() { 15 return parentId; 16 } 17 public void setParentId(String parentId) { 18 this.parentId = parentId;19 } 20 public String getNodeId() { 21 return nodeId; 22 } 23 public void setNodeId(String nodeId) { 24 this.nodeId = nodeId; 25 } 26 public String getPerName() { 27 return perName; 28 } 29 public void setPerName(String perName) { 30 this.perName = perName; 31 } 32 public String getIcon() { 33 return icon; 34 } 35 public void setIcon(String icon) { 36 this.icon = icon; 37 } 38 public String getUrl() { 39 return url; 40 } 41 public void setUrl(String url) { 42 this.url = url; 43 } 44 45 46 47 48 49 50 51 }
1 package com.gongli.util.treeMenu; 2 3 import java.util.List; 4 import java.util.Map; 5 6 import com.gongli.util.entity.treeMenu.TreeMenu; 7 /** 8 *樹形菜單工具類接口 9 *使用前綴編碼,每級增加三個數字,如:第一級 001,第二級001001,第三級001001001,目錄根節點為0,目錄根節點的父節點為-1 10 */ 11 public interface TreeMenuInteferce { 12 /** 13 * 將樹形菜單封裝成樹 14 * @param list 為樹形菜單 15 * @param fid 父id 16 */ 17 public List<Map<String,Object>> createTree(List<TreeMenu> list, String fid); 18 /** 19 * 遞歸設置TreeMenu樹 20 * @param list 21 * @param fid 22 * @return 23 */ 24 public List<Map<String, Object>> createChildren(List<TreeMenu> list, String fid); 25 26 }
1 package com.gongli.util.impl.treeMenu; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Map; 7 8 import com.gongli.util.entity.treeMenu.TreeMenu; 9 import com.gongli.util.treeMenu.TreeMenuInteferce; 10 11 public class TreeMenuInteferceImpl implements TreeMenuInteferce{ 12 13 /** 14 * 將樹形菜單封裝成樹 15 * @param list 為樹形菜單 16 * @param fid 父id 17 */ 18 @Override 19 public List<Map<String,Object>> createTree(List<TreeMenu> list, String fid) { 20 //存放轉換後數據的集合 21 List<Map<String,Object>> comboTreeList = new ArrayList<Map<String,Object>>(); 22 for (int i = 0; i < list.size(); i++) { 23 Map<String, Object> map = null; 24 TreeMenu treeMenu = (TreeMenu) list.get(i); 25 if (treeMenu.getParentId().equals(fid)) { 26 map = new HashMap<String, Object>(); 27 //這裏必須要將對象角色的id、name轉換成Tree在頁面的顯示形式id、text 28 map.put("id", list.get(i).getNodeId()); //id 29 map.put("text",list.get(i).getPerName()); //權限名 30 map.put("url", list.get(i).getUrl()); 31 map.put("iconCls", list.get(i).getIcon()); 32 map.put("children", createChildren(list, treeMenu.getNodeId())); 33 } 34 if (map != null) 35 comboTreeList.add(map); 36 } 37 return comboTreeList; 38 } 39 40 /** 41 * 遞歸設置TreeMenu樹 42 * @param list 43 * @param fid 44 * @return 45 */ 46 @Override 47 public List<Map<String, Object>> createChildren(List<TreeMenu> list, String fid) { 48 List<Map<String, Object>> childList = new ArrayList<Map<String, Object>>(); 49 for (int j = 0; j < list.size(); j++) { 50 Map<String, Object> map = null; 51 TreeMenu treeChild = (TreeMenu) list.get(j); 52 if (treeChild.getParentId().equals(fid)) { 53 map = new HashMap<String, Object>(); 54 map.put("id", list.get(j).getNodeId()); 55 map.put("text", list.get(j).getPerName()); 56 map.put("url", list.get(j).getUrl()); 57 map.put("iconCls", list.get(j).getIcon()); 58 List<Map<String, Object>> list2 = createChildren(list, treeChild.getNodeId()); 59 //此處一定要註意,easyui中當節點為葉子節點時並且state為closed,該葉子節點會加載整個tree,形成死循環,所以要排除 60 //給葉子節點賦值state:closed,但給非葉子節點賦值state:closed,則默認關閉除了第一個根節點以外的所有節點 61 if(list2.size()>0){ 62 map.put("state", "closed"); 63 } 64 map.put("children", createChildren(list, treeChild.getNodeId())); 65 } 66 if (map != null) 67 childList.add(map); 68 } 69 return childList; 70 } 71 72 73 74 }
生成樹形菜單