package com.bizmatics.service.system.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.bizmatics.common.core.exception.BusinessException; import com.bizmatics.common.core.util.StringUtils; import com.bizmatics.common.mvc.utils.ServletUtils; import com.bizmatics.model.PlatformArea; import com.bizmatics.model.base.TreeSelect; import com.bizmatics.model.constants.Constants; import com.bizmatics.model.constants.UserConstants; import com.bizmatics.model.system.SysMenu; import com.bizmatics.model.system.SysRole; import com.bizmatics.model.system.SysUser; import com.bizmatics.model.vo.*; import com.bizmatics.persistence.mapper.system.SysMenuMapper; import com.bizmatics.persistence.mapper.system.SysRoleMapper; import com.bizmatics.persistence.mapper.system.SysRoleMenuMapper; import com.bizmatics.persistence.mapper.system.SysUserMapper; import com.bizmatics.service.config.security.LoginUser; import com.bizmatics.service.impl.DeviceServiceImpl; import com.bizmatics.service.system.ISysMenuService; import com.bizmatics.service.util.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; import java.util.stream.Collectors; /** * 菜单 业务层处理 * * @author yq */ @Service public class SysMenuServiceImpl implements ISysMenuService { public static final String PREMISSION_STRING = "perms[\"{0}\"]"; @Autowired private SysMenuMapper menuMapper; @Autowired private SysRoleMapper roleMapper; @Autowired private SysRoleMenuMapper roleMenuMapper; @Autowired private ISysMenuService menuService; @Autowired private TokenService tokenService; @Autowired private SysUserMapper userMapper; /** * 根据用户查询系统菜单列表 * * @param userId 用户ID * @return 菜单列表 */ @Override public List selectMenuList(Long userId) { return selectMenuList(new SysMenu(), userId); } /** * 查询系统菜单列表 * * @param menu 菜单信息 * @return 菜单列表 */ @Override public List selectMenuList(SysMenu menu, Long userId) { List menuList = null; // 管理员显示所有菜单信息 if (SysUser.isAdmin(userId)) { menuList = menuMapper.selectMenuList(menu); } else { menu.getParams().put("userId", userId); menuList = menuMapper.selectMenuListByUserId(menu); } return menuList; } /** * 根据用户ID查询权限 * * @param userId 用户ID * @return 权限列表 */ @Override public Set selectMenuPermsByUserId(Long userId) { List perms = menuMapper.selectMenuPermsByUserId(userId); Set permsSet = new HashSet<>(); for (String perm : perms) { if (StringUtils.isNotBlank(perm)) { permsSet.addAll(Arrays.asList(perm.trim().split(","))); } } return permsSet; } /** * 根据用户ID查询菜单 * * @param userId 用户名称 * @return 菜单列表 */ @Override public List selectMenuTreeByUserId(Long userId) { List menus = null; if (SecurityUtils.isAdmin(userId)) { menus = menuMapper.selectMenuTreeAll(); } else { menus = menuMapper.selectMenuTreeByUserId(userId); } return getChildPerms(menus, 0); } /** * 根据角色ID查询菜单树信息 * * @param roleId 角色ID * @return 选中菜单列表 */ @Override public List selectMenuListByRoleId(Long roleId) { SysRole role = roleMapper.selectRoleById(roleId); return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly()); } /** * 构建前端路由所需要的菜单 * * @param menus 菜单列表 * @return 路由列表 */ @Override public List buildMenus(List menus) { List routers = new LinkedList(); for (SysMenu menu : menus) { RouterVo router = new RouterVo(); router.setHidden("1".equals(menu.getVisible())); router.setName(getRouteName(menu)); router.setPath(getRouterPath(menu)); router.setComponent(getComponent(menu)); router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); List cMenus = menu.getChildren(); if (!cMenus.isEmpty() && cMenus.size() > 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType())) { router.setAlwaysShow(true); //TODO List routerVos = buildMenus(cMenus); router.setChildren(routerVos); router.setRedirect(routerVos.get(0).getPath()); if (router.getMeta().getTitle().equals(routerVos.get(0).getMeta().getTitle())) { routerVos.get(0).setHidden(true); } } else if (isMenuFrame(menu)) { router.setMeta(null); List childrenList = new ArrayList(); RouterVo children = new RouterVo(); children.setPath(menu.getPath()); children.setComponent(menu.getComponent()); children.setName(StringUtils.capitalize(menu.getPath())); children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); childrenList.add(children); router.setChildren(childrenList); } else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) { router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); router.setPath("/inner"); List childrenList = new ArrayList(); RouterVo children = new RouterVo(); String routerPath = StringUtils.replaceEach(menu.getPath(), new String[]{Constants.HTTP, Constants.HTTPS}, new String[]{"", ""}); children.setPath(routerPath); children.setComponent(UserConstants.INNER_LINK); children.setName(StringUtils.capitalize(routerPath)); children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath())); childrenList.add(children); router.setChildren(childrenList); } routers.add(router); } return routers; } @Override public List buildMenusNew(List menus) { List routers = new LinkedList(); RouterVo routerOne; for (SysMenu menu : menus) { List routesList = new LinkedList(); routerOne = checkParent(menu, menus.indexOf(menu), true); RouterVo routerVo; for (SysMenu sysMenu : menu.getChildren()) { routerVo = checkParent(sysMenu, 1, false); routesList.add(routerVo); } routerOne.setChildren(routesList); routers.add(routerOne); } return routers; } public RouterVo checkParent(SysMenu menu, Integer affix, Boolean isParent) { RouterVo router = new RouterVo(); MetaVo metaVo = new MetaVo(); router.setPath(menu.getPath()); List cMenus = menu.getChildren(); if (isParent) { String redirect = cMenus.get(0).getComponent(); Integer index = redirect.indexOf("/", 2); redirect = redirect.substring(index, redirect.length()); if (!menu.getMenuName().equals("告警管理")) { redirect = redirect.replaceAll("/index", ""); } router.setRedirect(redirect); if (0 == affix) { metaVo.setAffix(true); } } router.setComponent(menu.getComponent()); metaVo.setTitle(menu.getMenuName()); metaVo.setIcon(menu.getIcon()); router.setMeta(metaVo); return router; } public static void main(String[] args) { String url = "@/a/b/c/d/e"; Integer index = url.indexOf("/", 2); url = url.substring(index, url.length()); System.out.println(url); } /** * 构建前端所需要树结构 * * @param menus 菜单列表 * @return 树结构列表 */ @Override public List buildMenuTree(List menus) { List returnList = new ArrayList(); List tempList = new ArrayList(); for (SysMenu dept : menus) { tempList.add(dept.getMenuId()); } for (Iterator iterator = menus.iterator(); iterator.hasNext(); ) { SysMenu menu = (SysMenu) iterator.next(); // 如果是顶级节点, 遍历该父节点的所有子节点 if (!tempList.contains(menu.getParentId())) { recursionFn(menus, menu); returnList.add(menu); } } if (returnList.isEmpty()) { returnList = menus; } return returnList; } /** * 构建前端所需要下拉树结构 * * @param menus 菜单列表 * @return 下拉树结构列表 */ @Override public List buildMenuTreeSelect(List menus) { List menuTrees = buildMenuTree(menus); return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); } @Override public List getAuthority(Long roleId) { // SysUser user = SecurityUtils.getLoginUser().getUser(); LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); List menuList = null; List sysMenuListTwo = new ArrayList<>(); List sysMenuListOne = new ArrayList<>(); List sysMenuListThree = new ArrayList<>(); List sysMenuListFour = new ArrayList<>(); if (SysUser.isAdmin(loginUser.getUser().getUserId())) { //全部目录查询 sysMenuListTwo = menuMapper.getSysMenuList("M"); //全部菜单查询 sysMenuListOne = menuMapper.getSysMenuList("C"); //全部按钮列表 sysMenuListThree = menuMapper.getSysMenuList("F"); } else { //全部目录查询 sysMenuListTwo = menuMapper.getMenuListOne(loginUser.getUser().getUserId(), "M"); //全部菜单查询 sysMenuListOne = menuMapper.getMenuListOne(loginUser.getUser().getUserId(), "C"); //全部按钮列表 sysMenuListThree = menuMapper.getMenuListOne(loginUser.getUser().getUserId(), "F"); } if (roleId==1){ //已选中按钮列表 sysMenuListFour = menuMapper.getSysMenuList("F"); }else { //已选中按钮列表 sysMenuListFour = menuMapper.getButtonlistTwo(0L, null, roleId); } List sysMenuVoListOne = new ArrayList<>(); List SysMenuVoList = new ArrayList<>(); List SysMenuVoListOne = new ArrayList<>(); List list = new ArrayList<>(); // if (sysMenuListFour.size()>0){ for (int i = 0; i < sysMenuListThree.size(); i++) { SysMenuTwoVo sysMenuTwoVo = new SysMenuTwoVo(); sysMenuTwoVo.setId(sysMenuListThree.get(i).getMenuId()); sysMenuTwoVo.setName(sysMenuListThree.get(i).getMenuName()); sysMenuTwoVo.setFid(sysMenuListThree.get(i).getParentId()); long Id = sysMenuListThree.get(i).getMenuId(); sysMenuTwoVo.setChecked(false); if (sysMenuListFour.size() > 0) { for (int j = 0; j < sysMenuListFour.size(); j++) { long MenuId = sysMenuListFour.get(j).getMenuId(); if (Id == MenuId) { sysMenuTwoVo.setChecked(true); } } } else { sysMenuTwoVo.setChecked(false); } sysMenuVoListOne.add(sysMenuTwoVo); } for (int i = 0; i < sysMenuListOne.size(); i++) { SysMenuOneVo sysMenuOneVo = new SysMenuOneVo(); sysMenuOneVo.setId(sysMenuListOne.get(i).getMenuId()); sysMenuOneVo.setMenu(sysMenuListOne.get(i).getMenuName()); sysMenuOneVo.setFid(sysMenuListOne.get(i).getParentId()); long id = sysMenuListOne.get(i).getMenuId(); List sysMenuVoListTwo = new ArrayList<>(); for (int j = 0; j < sysMenuVoListOne.size(); j++) { long FId = sysMenuVoListOne.get(j).getFid(); if (id == FId) { sysMenuVoListTwo.add(sysMenuVoListOne.get(j)); } } sysMenuOneVo.setAuthority(sysMenuVoListTwo); SysMenuVoList.add(sysMenuOneVo); } for (int i = 0; i < sysMenuListTwo.size(); i++) { SysMenuVo sysMenuVo = new SysMenuVo(); sysMenuVo.setId(sysMenuListTwo.get(i).getMenuId()); sysMenuVo.setMenu(sysMenuListTwo.get(i).getMenuName()); sysMenuVo.setFid(sysMenuListTwo.get(i).getParentId()); long id = sysMenuListTwo.get(i).getMenuId(); List SysMenuVoListThree = new ArrayList<>(); for (int j = 0; j < SysMenuVoList.size(); j++) { long FId = SysMenuVoList.get(j).getFid(); if (id == FId) { SysMenuVoListThree.add(SysMenuVoList.get(j)); } } sysMenuVo.setChildren(SysMenuVoListThree); SysMenuVoListOne.add(sysMenuVo); } for (int i = 0; i < SysMenuVoListOne.size(); i++) { String name = SysMenuVoListOne.get(i).getMenu(); if (name.equals("数据管理") || name.equals("电能质量") || name.equals("系统管理")) { list.add(SysMenuVoListOne.get(i)); } else { for (int j = 0; j < SysMenuVoList.size(); j++) { String name2 = SysMenuVoList.get(j).getMenu(); if (name.equals(name2)) { list.add(SysMenuVoList.get(j)); } } } } // } return list; } /** * 根据菜单ID查询信息 * * @param menuId 菜单ID * @return 菜单信息 */ @Override public SysMenu selectMenuById(Long menuId) { return menuMapper.selectMenuById(menuId); } /** * 是否存在菜单子节点 * * @param menuId 菜单ID * @return 结果 */ @Override public boolean hasChildByMenuId(Long menuId) { int result = menuMapper.hasChildByMenuId(menuId); return result > 0 ? true : false; } /** * 查询菜单使用数量 * * @param menuId 菜单ID * @return 结果 */ @Override public boolean checkMenuExistRole(Long menuId) { int result = roleMenuMapper.checkMenuExistRole(menuId); return result > 0 ? true : false; } /** * 新增保存菜单信息 * * @param menu 菜单信息 * @return 结果 */ @Override public int insertMenu(SysMenu menu) { return menuMapper.insertMenu(menu); } /** * 修改保存菜单信息 * * @param menu 菜单信息 * @return 结果 */ @Override public int updateMenu(SysMenu menu) { return menuMapper.updateMenu(menu); } /** * 删除菜单管理信息 * * @param menuId 菜单ID * @return 结果 */ @Override public int deleteMenuById(Long menuId) { return menuMapper.deleteMenuById(menuId); } /** * 校验菜单名称是否唯一 * * @param menu 菜单信息 * @return 结果 */ @Override public String checkMenuNameUnique(SysMenu menu) { Long menuId = Objects.isNull(menu.getMenuId()) ? -1L : menu.getMenuId(); SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId()); if (Objects.nonNull(info) && info.getMenuId().longValue() != menuId.longValue()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; } /** * 根据菜单查询按钮 * * @param menuName 菜单名称 * @return */ @Override public List getButtonlist(String menuName) { SysUser user = SecurityUtils.getLoginUser().getUser(); List sysMenuList = new ArrayList<>(); if (SecurityUtils.isAdmin(user.getUserId())) { sysMenuList = menuMapper.getButtonlistOne(menuName); } else { sysMenuList = menuMapper.getButtonlist(user.getUserId(), menuName, 0L); } return sysMenuList; } /** * 获取路由名称 * * @param menu 菜单信息 * @return 路由名称 */ public String getRouteName(SysMenu menu) { String routerName = StringUtils.capitalize(menu.getPath()); // 非外链并且是一级目录(类型为目录) if (isMenuFrame(menu)) { routerName = StringUtils.EMPTY; } return routerName; } /** * 获取路由地址 * * @param menu 菜单信息 * @return 路由地址 */ public String getRouterPath(SysMenu menu) { String routerPath = menu.getPath(); // 内链打开外网方式 if (menu.getParentId().intValue() != 0 && isInnerLink(menu)) { routerPath = StringUtils.replaceEach(routerPath, new String[]{Constants.HTTP, Constants.HTTPS}, new String[]{"", ""}); } // 非外链并且是一级目录(类型为目录) if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType()) && UserConstants.NO_FRAME.equals(menu.getIsFrame())) { routerPath = "/" + menu.getPath(); } // 非外链并且是一级目录(类型为菜单) else if (isMenuFrame(menu)) { routerPath = "/"; } return routerPath; } /** * 获取组件信息 * * @param menu 菜单信息 * @return 组件信息 */ public String getComponent(SysMenu menu) { String component = UserConstants.LAYOUT; if (StringUtils.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu)) { component = menu.getComponent(); } else if (StringUtils.isEmpty(menu.getComponent()) && menu.getParentId().intValue() != 0 && isInnerLink(menu)) { component = UserConstants.INNER_LINK; } else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu)) { component = UserConstants.PARENT_VIEW; } return component; } /** * 是否为菜单内部跳转 * * @param menu 菜单信息 * @return 结果 */ public boolean isMenuFrame(SysMenu menu) { return menu.getParentId().intValue() == 0 && UserConstants.TYPE_MENU.equals(menu.getMenuType()) && menu.getIsFrame().equals(UserConstants.NO_FRAME); } /** * 是否为内链组件 * * @param menu 菜单信息 * @return 结果 */ public boolean isInnerLink(SysMenu menu) { return menu.getIsFrame().equals(UserConstants.NO_FRAME) && StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS); } /** * 是否为parent_view组件 * * @param menu 菜单信息 * @return 结果 */ public boolean isParentView(SysMenu menu) { return menu.getParentId().intValue() != 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType()); } /** * 根据父节点的ID获取所有子节点 * * @param list 分类表 * @param parentId 传入的父节点ID * @return String */ public List getChildPerms(List list, int parentId) { List returnList = new ArrayList(); for (Iterator iterator = list.iterator(); iterator.hasNext(); ) { SysMenu t = (SysMenu) iterator.next(); // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 if (t.getParentId() == parentId) { recursionFn(list, t); returnList.add(t); } } return returnList; } /** * 递归列表 * * @param list * @param t */ private void recursionFn(List list, SysMenu t) { // 得到子节点列表 List childList = getChildList(list, t); t.setChildren(childList); for (SysMenu tChild : childList) { if (hasChild(list, tChild)) { recursionFn(list, tChild); } } } /** * 得到子节点列表 */ private List getChildList(List list, SysMenu t) { List tlist = new ArrayList(); Iterator it = list.iterator(); while (it.hasNext()) { SysMenu n = (SysMenu) it.next(); if (n.getParentId().longValue() == t.getMenuId().longValue()) { tlist.add(n); } } return tlist; } /** * 判断是否有子节点 */ private boolean hasChild(List list, SysMenu t) { return getChildList(list, t).size() > 0 ? true : false; } /** * 权限管理-列表查询(租户) * @param roleId * @return */ @Override public List getAuthority1(Long roleId) { LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); List tenantDaya = userMapper.getTenantId(loginUser.getUser().getUserId()); if (tenantDaya.size()<0) { throw new BusinessException("无此租户,请联系管理员"); } List menuList = null; //全部目录查询 List sysMenuListTwo = sysMenuListTwo = menuMapper.getMenuListTwo(loginUser.getUser().getUserId(), "M",tenantDaya.get(0).getTenantId()); //全部菜单查询 List sysMenuListOne = sysMenuListOne = menuMapper.getMenuListTwo(loginUser.getUser().getUserId(), "C",tenantDaya.get(0).getTenantId()); //全部按钮列表 List sysMenuListThree = sysMenuListThree = menuMapper.getMenuListTwo(loginUser.getUser().getUserId(), "F",tenantDaya.get(0).getTenantId()); //已选中按钮列表 List sysMenuListFour = sysMenuListFour = menuMapper.getButtonlistTwo(0L, null, roleId); List sysMenuVoListOne = new ArrayList<>(); List SysMenuVoList = new ArrayList<>(); List SysMenuVoListOne = new ArrayList<>(); List list = new ArrayList<>(); // if (sysMenuListFour.size()>0){ for (int i = 0; i < sysMenuListThree.size(); i++) { SysMenuTwoVo sysMenuTwoVo = new SysMenuTwoVo(); sysMenuTwoVo.setId(sysMenuListThree.get(i).getMenuId()); sysMenuTwoVo.setName(sysMenuListThree.get(i).getMenuName()); sysMenuTwoVo.setFid(sysMenuListThree.get(i).getParentId()); long Id = sysMenuListThree.get(i).getMenuId(); sysMenuTwoVo.setChecked(false); if (sysMenuListFour.size() > 0) { for (int j = 0; j < sysMenuListFour.size(); j++) { long MenuId = sysMenuListFour.get(j).getMenuId(); if (Id == MenuId) { sysMenuTwoVo.setChecked(true); } } } else { sysMenuTwoVo.setChecked(false); } sysMenuVoListOne.add(sysMenuTwoVo); } for (int i = 0; i < sysMenuListOne.size(); i++) { SysMenuOneVo sysMenuOneVo = new SysMenuOneVo(); sysMenuOneVo.setId(sysMenuListOne.get(i).getMenuId()); sysMenuOneVo.setMenu(sysMenuListOne.get(i).getMenuName()); sysMenuOneVo.setFid(sysMenuListOne.get(i).getParentId()); long id = sysMenuListOne.get(i).getMenuId(); List sysMenuVoListTwo = new ArrayList<>(); for (int j = 0; j < sysMenuVoListOne.size(); j++) { long FId = sysMenuVoListOne.get(j).getFid(); if (id == FId) { sysMenuVoListTwo.add(sysMenuVoListOne.get(j)); } } sysMenuOneVo.setAuthority(sysMenuVoListTwo); SysMenuVoList.add(sysMenuOneVo); } for (int i = 0; i < sysMenuListTwo.size(); i++) { SysMenuVo sysMenuVo = new SysMenuVo(); sysMenuVo.setId(sysMenuListTwo.get(i).getMenuId()); sysMenuVo.setMenu(sysMenuListTwo.get(i).getMenuName()); sysMenuVo.setFid(sysMenuListTwo.get(i).getParentId()); long id = sysMenuListTwo.get(i).getMenuId(); List SysMenuVoListThree = new ArrayList<>(); for (int j = 0; j < SysMenuVoList.size(); j++) { long FId = SysMenuVoList.get(j).getFid(); if (id == FId) { SysMenuVoListThree.add(SysMenuVoList.get(j)); } } sysMenuVo.setChildren(SysMenuVoListThree); SysMenuVoListOne.add(sysMenuVo); } for (int i = 0; i < SysMenuVoListOne.size(); i++) { String name = SysMenuVoListOne.get(i).getMenu(); if (name.equals("数据管理") || name.equals("电能质量") || name.equals("系统管理")) { list.add(SysMenuVoListOne.get(i)); } else { for (int j = 0; j < SysMenuVoList.size(); j++) { String name2 = SysMenuVoList.get(j).getMenu(); if (name.equals(name2)) { list.add(SysMenuVoList.get(j)); } } } } // } return list; } }