jfinal后台怎么动态获取菜单树,考虑多级菜单,不止是二级菜单

前面一篇博客大体讲了后台动态获取权限树,但是之前考虑的并不完善,那样简单的做法可能需要前台做更多的循环判断,所以这一篇博客将改变一下jfianl动态获取权限树的思路,除了获取权限树的方法改变,其他思路基本一样。说实话,要将权限菜单动态的显示在前台,并不是一件容易的事情,我今天花了一整天的时间去写后台动态获取权限树的方法,试了多种思路,最后实现过程如下:

1、获取系统所有的菜单权限

2、获取登陆用户拥有的菜单权限

3、结合以上两个,获取可以显示在页面的所有菜单,即用户拥有的菜单权限要在系统有才会显示在页面,如果没有则不会显示。

4、最后将可以显示在页面的菜单权限转换为菜单树,转换过程如下:

(1)获取用户拥有的菜单权限里的所有一级菜单,再通过递归调用获取每一个一级菜单下的菜单树

(2)最后返回包含了多个一级菜单树的List到前台解析,代码如下:

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;
 }

}

转载于:https://my.oschina.net/u/2427561/blog/1530294

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值