通过登录人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; }