通過登錄人userId獲取對應角色 再獲取對應角色下的權限菜單(用戶角色關聯表,角色菜單關聯表) 1,構建遞歸獲取父節點方法 (因為角色菜單關聯表中保存的只有菜單的葉子節點 所以要遞歸獲取父節點) private void getUserMenus(HashMap<String, SysMenu> parentAndChildren, SysMenu sysMenu) { if (!parentAndChildren.containsKey(sysMenu.getRowId())) { parentAndChildren.put(sysMenu.getRowId(), sysMenu); } if (!parentAndChildren.containsKey(sysMenu.getParentId())) { SysMenu p = sysMenuMapper.find(sysMenu.getParentId()); if (p != null) { getUserMenus(parentAndChildren, p); } } } 2,遞歸獲取子節點 private void getTreeStructure(SysMenuDto root, List<SysMenu> orgs) { for (SysMenu org : orgs) { if (org.getParentId().equals(root.getId())) { SysMenuDto s = SysMenuDto.convertSysMenuEntity(org); getTreeStructure(s, orgs); if (root.getChildrens() == null) { root.setChildrens(new ArrayList<>()); } root.getChildrens().add(s); } } } 3,構建樹形數據結構 public List<SysMenuDto> getSysMenuTreeDataByAdmin(String userId,String did) { List<SysMenuDto> list = new ArrayList<>(); //查詢所有的菜單列表 List<SysMenu> sysMenuList = sysRoleMapper.findListVisible(); //查詢所有的菜單編碼列表 List<String> sysMenuIdList = sysRoleMapper.findListId(); //獲取收藏的菜單 List<SysUserFavoriteMenu> sysUserFavoriteMenuList = sysUserFavoriteMenuMapper.getSysUserFavoriteMenu(userId, did); //遍歷判斷是否是收藏的 for(SysMenu sysMenu : sysMenuList){ SysUserFavoriteMenu sysUserFavoriteMenu = sysUserFavoriteMenuMapper.getFavoriteMenu(userId,did,sysMenu.getRowId()); if(sysUserFavoriteMenu != null){ //是否收藏標志設置為收藏 sysMenu.setIsFavorite("1"); }else{ sysMenu.setIsFavorite("0"); } } for(SysUserFavoriteMenu sysUserFavoriteMenu : sysUserFavoriteMenuList){ //判斷收藏的菜單在所有的菜單中是否存在 不存在就把這個用戶收藏的菜單移除 if(!sysMenuIdList.contains(sysUserFavoriteMenu.getMenuId())){ sysUserFavoriteMenuMapper.deleteFavoriteMenu(sysUserFavoriteMenu.getMenuId()); } } //獲取該經銷商默認設置的系統菜單版本 String verdion=null; //獲取頂級菜單 List<SysMenu> topMenuList = sysRoleMapper.selectTopMenu(verdion); if (null == topMenuList) { return null; } for (SysMenu menu : topMenuList) { SysMenuDto s = SysMenuDto.convertSysMenuEntity(menu); getTreeStructure(s, sysMenuList); list.add(s); }
//排序 list.sort((SysMenuDto s1,SysMenuDto s2) -> s1.getSort() >= s2.getSort() ? 1 : -1); logger.info("獲取最終菜單:{}", JsonUtil.obj2String(list)); return list; }