前面一篇博客大致講了後臺動態獲取權限樹,可是以前考慮的並不完善,那樣簡單的作法可能須要前臺作更多的循環判斷,因此這一篇博客將改變一下jfianl動態獲取權限樹的思路,除了獲取權限樹的方法改變,其餘思路基本同樣。說實話,要將權限菜單動態的顯示在前臺,並非一件容易的事情,我今天花了一成天的時間去寫後臺動態獲取權限樹的方法,試了多種思路,最後實現過程以下:java
一、獲取系統全部的菜單權限code
二、獲取登錄用戶擁有的菜單權限遞歸
三、結合以上兩個,獲取能夠顯示在頁面的全部菜單,即用戶擁有的菜單權限要在系統有才會顯示在頁面,若是沒有則不會顯示。get
四、最後將能夠顯示在頁面的菜單權限轉換爲菜單樹,轉換過程以下:博客
(1)獲取用戶擁有的菜單權限裏的全部一級菜單,再經過遞歸調用獲取每個一級菜單下的菜單樹it
(2)最後返回包含了多個一級菜單樹的List到前臺解析,代碼以下:io
public class Menukit { /** * 獲取將要顯示在頁面的全部菜單(將全部的一級菜單樹都加到List裏面) * @return */ public List<Object> getMenusTree (){ List<Permission> allMenuPerms = ShiroMethod.findAllMenuPermission();//取得系統全部的菜單權限 List<Permission> userMenuPerms = ShiroMethod.findMenuePermissionByUserId(); //取得用戶擁有的菜單權限 List<Permission> hasAllMenuPerms = hasAllMenuPerms(allMenuPerms,userMenuPerms); //根據系統全部的菜單權限和用戶擁有的菜單權限獲取將要顯示在頁面的全部菜單 List<Object> list= MakeMenusTree(hasAllMenuPerms);//將要顯示在列表的菜單轉換爲菜單樹 return list; } /** * 獲取全部一級菜單及其下菜單樹 * @param hasAllMenuPerms用戶擁有的可顯示的菜單 * @return */ public List<Object> MakeMenusTree(List<Permission> hasAllMenuPerms ){ List<Object> menuTree = new ArrayList<>(); List<Permission> firstLevelMenuList = getFirstLevelMenuList(hasAllMenuPerms); for(Permission permission:firstLevelMenuList){ menuTree.add(getEeveryMenueTree(hasAllMenuPerms,permission)); } return menuTree; } /** * 遞歸獲取每個菜單下的菜單樹,最後獲得一個一級菜單及其包含如下的菜單樹 * @param hasAllMenuPerms 用戶擁有的菜單 * @param parentPerms 父菜單 * @return */ public HashMap<String, Object>getEeveryMenueTree(List<Permission> hasAllMenuPerms,Permission parentPerms){ HashMap<String, Object> menuTree = new HashMap<>();//存放菜單及其下的菜單樹 List<Object> subMenu = new ArrayList<>();//存放菜單下的菜單樹 List<Permission> subMenuList = subMenu(hasAllMenuPerms,parentPerms.getId());//獲取菜單下的直接子菜單 for(Permission subPermission:subMenuList){//依次循環全部子菜單 List<Permission> ssubMenuList = subMenu(hasAllMenuPerms,subPermission.getId()); if(ssubMenuList.size()>0){//若是該子菜單還有子菜單,則獲取下面的菜單樹 subMenu.add(getEeveryMenueTree(hasAllMenuPerms,subPermission)); }else{//該子菜單下沒有子菜單 subMenu.add(subPermission); } } menuTree.put(parentPerms.getId(), subMenu); return menuTree; } /** * 獲取該用戶擁有的全部一級菜單 * @param hasAllMenuPerms 用戶擁有的全部菜單 * @return */ public List<Permission> getFirstLevelMenuList(List<Permission> hasAllMenuPerms){ List<Permission> firstLevelMenuList = new ArrayList<>(); if(hasAllMenuPerms == null || hasAllMenuPerms.size() <= 0) { return firstLevelMenuList; } for(Permission permission : hasAllMenuPerms) { if(!firstLevelMenuList.contains(permission)&&permission.getMenuLevel()==1){ firstLevelMenuList.add(permission); } } return firstLevelMenuList; } /** * 獲取父菜單爲menuId的下級菜單 * @param perms 用戶擁有的全部菜單 * @param menuId 父菜單 * @return */ public static List<Permission> subMenu(List<Permission> perms, String menuId) { List<Permission> subMenuList = new ArrayList<>(); if(perms == null || perms.size() <= 0) { return subMenuList; } for(Permission permission : perms) { if(permission.getActionParentId().equalsIgnoreCase(menuId)) { subMenuList.add(permission); } } return subMenuList; } /** * 用戶擁有且包含在系統菜單權限裏的全部菜單權限,即將要顯示在頁面的菜單 * @param allMenuPerms 全部系統菜單權限 * @param userMenuPerms 用戶擁有的菜單權限 * @return */ public List<Permission> hasAllMenuPerms( List<Permission> allMenuPerms,List<Permission> userMenuPerms ){ List<Permission> hasAllMenuPerms = new ArrayList<Permission>(); for(Permission menu:userMenuPerms){ if(allMenuPerms.contains(menu)){ hasAllMenuPerms.add(menu); } } return hasAllMenuPerms; } }