package com.ruoyi.system.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.ruoyi.common.base.Ztree; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.system.domain.SysMenu; import com.ruoyi.system.domain.SysRole; import com.ruoyi.system.domain.SysUser; import com.ruoyi.system.mapper.SysMenuMapper; import com.ruoyi.system.mapper.SysRoleMenuMapper; import com.ruoyi.system.service.ISysMenuService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.text.MessageFormat; import java.util.*; /** * 菜单 业务层处理 * * @author ruoyi */ @Service public class SysMenuServiceImpl implements ISysMenuService { private static final String PREMISSION_STRING = "perms[\"{0}\"]" ; private final SysMenuMapper menuMapper; private final SysRoleMenuMapper roleMenuMapper; @Autowired public SysMenuServiceImpl(SysMenuMapper menuMapper, SysRoleMenuMapper roleMenuMapper) { this.menuMapper = menuMapper; this.roleMenuMapper = roleMenuMapper; } /** * 根据用户查询菜单 * * @param user 用户信息 * @return 菜单列表 */ @Override public List<SysMenu> selectMenusByUser(SysUser user) { List<SysMenu> menus; // 管理员显示所有菜单信息 if (user.isAdmin()) { menus = menuMapper.selectMenuNormalAll(); } else { menus = menuMapper.selectMenusByUserId(user.getUserId()); } return getChildPerms(menus, 0); } /** * 查询菜单集合 * * @param userId 用户ID * @return 所有菜单信息 */ @Override public List<SysMenu> selectMenuList(SysMenu menu, Long userId) { List<SysMenu> menuList; if (SysUser.isAdmin(userId)){ menuList = menuMapper.selectMenuList(menu); }else{ menu.getParams().put("userId", userId); menuList = menuMapper.selectMenuListByUserId(menu); } return menuList; } /** * 查询菜单集合 * * @param userId 用户ID * @return 所有菜单信息 */ @Override public List<SysMenu> selectMenuAll(Long userId) { List<SysMenu> menuList; if (SysUser.isAdmin(userId)){ menuList = menuMapper.selectMenuAll(); }else{ menuList = menuMapper.selectMenuAllByUserId(userId); } return menuList; } /** * 根据用户ID查询权限 * * @param userId 用户ID * @return 权限列表 */ @Override public Set<String> selectPermsByUserId(Long userId) { List<String> perms = menuMapper.selectPermsByUserId(userId); Set<String> permsSet = new HashSet<>(); perms.stream().filter(StrUtil::isNotEmpty).forEach(perm -> permsSet.addAll(Arrays.asList(perm.trim().split(",")))); return permsSet; } /** * 根据角色ID查询菜单 * * @param role 角色对象 * @param userId 用户ID * @return 菜单列表 */ @Override public List<Ztree> roleMenuTreeData(SysRole role, Long userId) { Long roleId = role.getRoleId(); List<Ztree> ztrees; List<SysMenu> menuList = selectMenuAll(userId); if (ObjectUtil.isNotNull(roleId)) { List<String> roleMenuList = menuMapper.selectMenuTree(roleId); ztrees = initZtree(menuList, roleMenuList, true); } else { ztrees = initZtree(menuList, null, true); } return ztrees; } /** * 查询所有菜单 * * @param userId 用户ID * @return 菜单列表 */ @Override public List<Ztree> menuTreeData(Long userId) { List<SysMenu> menuList = selectMenuAll(userId); return initZtree(menuList); } /** * 对象转菜单树 * * @param menuList 菜单列表 * @return 树结构列表 */ private List<Ztree> initZtree(List<SysMenu> menuList) { return initZtree(menuList, null, false); } /** * 查询系统所有权限 * * @param userId 用户ID * @return 权限列表 */ @Override public Map<String, String> selectPermsAll(Long userId) { LinkedHashMap<String, String> section = new LinkedHashMap<>(); List<SysMenu> permissions = selectMenuAll(userId); if (!CollectionUtils.isEmpty(permissions)) { permissions.forEach(menu -> section.put(menu.getUrl(), MessageFormat.format(PREMISSION_STRING, menu.getPerms()))); } return section; } /** * 对象转菜单树 * * @param menuList 菜单列表 * @param roleMenuList 角色已存在菜单列表 * @param permsFlag 是否需要显示权限标识 * @return 菜单树 */ private List<Ztree> initZtree(List<SysMenu> menuList, List<String> roleMenuList, boolean permsFlag){ List<Ztree> ztrees = new ArrayList<>(); boolean isCheck = CollectionUtil.isNotEmpty(roleMenuList); if(CollectionUtil.isNotEmpty(menuList)){ menuList.forEach(menu ->{ Ztree ztree = new Ztree(); ztree.setId(menu.getMenuId()); ztree.setPId(menu.getParentId()); ztree.setName(transMenuName(menu, permsFlag)); ztree.setTitle(menu.getMenuName()); if (isCheck){ ztree.setChecked(roleMenuList.contains(menu.getMenuId() + menu.getPerms())); } ztrees.add(ztree); }); } return ztrees; } private String transMenuName(SysMenu menu, boolean permsFlag) { StringBuilder sb = new StringBuilder(); sb.append(menu.getMenuName()); if (permsFlag) { sb.append("<font color=\"#888\"> ").append(menu.getPerms()).append("</font>"); } return sb.toString(); } /** * 删除菜单管理信息 * * @param menuId 菜单ID * @return 结果 */ @Override public int deleteMenuById(Long menuId) { return menuMapper.deleteMenuById(menuId); } /** * 根据菜单ID查询信息 * * @param menuId 菜单ID * @return 菜单信息 */ @Override public SysMenu selectMenuById(Long menuId) { return menuMapper.selectMenuById(menuId); } /** * 查询子菜单数量 * * @param parentId 父级菜单ID * @return 结果 */ @Override public int selectCountMenuByParentId(Long parentId) { return menuMapper.selectCountMenuByParentId(parentId); } /** * 查询菜单使用数量 * * @param menuId 菜单ID * @return 结果 */ @Override public int selectCountRoleMenuByMenuId(Long menuId) { return roleMenuMapper.selectCountRoleMenuByMenuId(menuId); } /** * 新增保存菜单信息 * * @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 menu 菜单信息 * @return 结果 */ @Override public String checkMenuNameUnique(SysMenu menu) { SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId()); if (ObjectUtil.isNotNull(info) && !info.getMenuId().equals(menu.getMenuId())) { return UserConstants.MENU_NAME_NOT_UNIQUE; } return UserConstants.MENU_NAME_UNIQUE; } /** * 根据父节点的ID获取所有子节点 * * @param list 分类表 * @param parentId 传入的父节点ID * @return String */ private List<SysMenu> getChildPerms(List<SysMenu> list, int parentId) { List<SysMenu> returnList = new ArrayList<>(); list.stream().filter(t -> t.getParentId() == parentId).forEach(t -> { recursionFn(list, t); returnList.add(t); }); return returnList; } /** * 递归列表 * * @param list 菜单列表 */ private void recursionFn(List<SysMenu> list, SysMenu t) { // 得到子节点列表 List<SysMenu> childList = getChildList(list, t); t.setChildren(childList); for (SysMenu tChild : childList) { if (hasChild(list, tChild)) { // 判断是否有子节点 for (SysMenu n : childList) { recursionFn(list, n); } } } } /** * 得到子节点列表 */ private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t) { List<SysMenu> tlist = new ArrayList<>(); list.stream().filter(sysMenu -> sysMenu.getParentId().equals(t.getMenuId())).forEach(tlist::add); return tlist; } /** * 判断是否有子节点 */ private boolean hasChild(List<SysMenu> list, SysMenu t) { return !CollectionUtils.isEmpty(getChildList(list, t)); } }