jfinal后台怎么动态获取菜单树,考虑多级菜单,不止是二级菜单
2017-09-06 00:00
190 查看
前面一篇博客大体讲了后台动态获取权限树,但是之前考虑的并不完善,那样简单的做法可能需要前台做更多的循环判断,所以这一篇博客将改变一下jfianl动态获取权限树的思路,除了获取权限树的方法改变,其他思路基本一样。说实话,要将权限菜单动态的显示在前台,并不是一件容易的事情,我今天花了一整天的时间去写后台动态获取权限树的方法,试了多种思路,最后实现过程如下:
1、获取系统所有的菜单权限
2、获取登陆用户拥有的菜单权限
3、结合以上两个,获取可以显示在页面的所有菜单,即用户拥有的菜单权限要在系统有才会显示在页面,如果没有则不会显示。
4、最后将可以显示在页面的菜单权限转换为菜单树,转换过程如下:
(1)获取用户拥有的菜单权限里的所有一级菜单,再通过递归调用获取每一个一级菜单下的菜单树
(2)最后返回包含了多个一级菜单树的List到前台解析,代码如下:
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; } }
相关文章推荐
- 【ASP.NET】js动态生成的控件,在后台获取不到怎么办?
- 后台 菜单栏 css 嵌套ul 动态二级菜单
- 在ASP.NET中怎么获取动态文本框的值(在程序的后台获取)
- DropDownList 触发回发报JS错误 ,updatePanel无刷新,前台JS获取后台动态值
- 前端页面动态获取后台执行sql的执行条数(超实用)
- js左侧多级菜单动态的解决方案
- 书籍:超实用的javascript代码段:下拉框二级联动效果(解析笔记)附带后台循环查询多级分类下的原理
- 飞火龙在天解说百度Echarts的应用,如何从后台获取动态数据并生成图表的
- 关于Jfinal上传多个文件后台获取变量的问题
- jfinal后台获取权限树,以供前台展示
- 后台伸缩二级菜单
- asp.net checkboxlist 后台动态绑定,前台jquery获取value
- Echarts折线图动态获取数据实例(附java后台代码)
- JS怎么取后台获取的值
- ASP.NET 后台动态生成CheckBOx控件并获取选中的值
- Js 怎么遍历json对象所有key及根据动态key获取值
- 动态加载菜单(仅支持二级菜单)
- 二级动态菜单的实现
- easyui-tree动态获取后台数据成为书结构的操作
- Select标签后台获取动态数据