前面一篇博客大致讲了后台动态获取权限树,可是以前考虑的并不完善,那样简单的作法可能须要前台作更多的循环判断,因此这一篇博客将改变一下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; } }