fix: 删除部门附加删除子部门

This commit is contained in:
haoxr
2023-03-07 23:55:41 +08:00
parent 1d3395bbc3
commit 9a1c1088f1
2 changed files with 71 additions and 85 deletions

View File

@@ -1,11 +1,11 @@
package com.youlai.system.service; package com.youlai.system.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.youlai.system.pojo.form.MenuForm;
import com.youlai.system.pojo.vo.Option; import com.youlai.system.pojo.vo.Option;
import com.youlai.system.pojo.entity.SysMenu; import com.youlai.system.pojo.entity.SysMenu;
import com.youlai.system.pojo.query.MenuQuery; import com.youlai.system.pojo.query.MenuQuery;
import com.youlai.system.pojo.vo.MenuVO; import com.youlai.system.pojo.vo.MenuVO;
import com.youlai.system.pojo.vo.ResourceVO;
import com.youlai.system.pojo.vo.RouteVO; import com.youlai.system.pojo.vo.RouteVO;
import java.util.List; import java.util.List;
@@ -40,12 +40,7 @@ public interface SysMenuService extends IService<SysMenu> {
* @param menu * @param menu
* @return * @return
*/ */
boolean saveMenu(SysMenu menu); boolean saveMenu(MenuForm menu);
/**
* 清理路由缓存
*/
void cleanCache();
/** /**
* 获取路由列表 * 获取路由列表
@@ -54,13 +49,6 @@ public interface SysMenuService extends IService<SysMenu> {
*/ */
List<RouteVO> listRoutes(); List<RouteVO> listRoutes();
/**
* 资源(菜单+权限)树形列表
*
* @return
*/
List<ResourceVO> listResources();
/** /**
* 修改菜单显示状态 * 修改菜单显示状态
* *
@@ -77,4 +65,20 @@ public interface SysMenuService extends IService<SysMenu> {
* @return * @return
*/ */
Set<String> listRolePerms(Set<String> roles); Set<String> listRolePerms(Set<String> roles);
/**
* 获取菜单表单数据
*
* @param id 菜单ID
* @return
*/
MenuForm getMenuForm(Long id);
/**
* 删除菜单
*
* @param id
* @return
*/
boolean deleteMenu(Long id);
} }

View File

@@ -9,6 +9,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.system.common.constant.SystemConstants; import com.youlai.system.common.constant.SystemConstants;
import com.youlai.system.common.enums.MenuTypeEnum; import com.youlai.system.common.enums.MenuTypeEnum;
import com.youlai.system.common.enums.StatusEnum; import com.youlai.system.common.enums.StatusEnum;
import com.youlai.system.pojo.entity.SysDept;
import com.youlai.system.pojo.form.MenuForm;
import com.youlai.system.pojo.vo.Option; import com.youlai.system.pojo.vo.Option;
import com.youlai.system.converter.MenuConverter; import com.youlai.system.converter.MenuConverter;
import com.youlai.system.mapper.SysMenuMapper; import com.youlai.system.mapper.SysMenuMapper;
@@ -16,18 +18,15 @@ import com.youlai.system.pojo.entity.SysMenu;
import com.youlai.system.pojo.bo.RouteBO; import com.youlai.system.pojo.bo.RouteBO;
import com.youlai.system.pojo.query.MenuQuery; import com.youlai.system.pojo.query.MenuQuery;
import com.youlai.system.pojo.vo.MenuVO; import com.youlai.system.pojo.vo.MenuVO;
import com.youlai.system.pojo.vo.ResourceVO;
import com.youlai.system.pojo.vo.RouteVO; import com.youlai.system.pojo.vo.RouteVO;
import com.youlai.system.service.SysMenuService; import com.youlai.system.service.SysMenuService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* 菜单业务实现类 * 菜单业务实现类
* *
@@ -40,7 +39,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
private final MenuConverter menuConverter; private final MenuConverter menuConverter;
/** /**
* 菜单表格树形列表 * 菜单列表
*/ */
@Override @Override
public List<MenuVO> listMenus(MenuQuery queryParams) { public List<MenuVO> listMenus(MenuQuery queryParams) {
@@ -49,11 +48,13 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
.orderByAsc(SysMenu::getSort) .orderByAsc(SysMenu::getSort)
); );
Set<Long> cacheMenuIds = menus.stream().map(menu -> menu.getId()).collect(Collectors.toSet()); Set<Long> cacheMenuIds = menus.stream()
.map(menu -> menu.getId())
.collect(Collectors.toSet());
List<MenuVO> list = menus.stream().map(menu -> { List<MenuVO> list = menus.stream().map(menu -> {
Long parentId = menu.getParentId(); Long parentId = menu.getParentId();
// parentId不在当前菜单ID的列表说明为顶级菜单ID根据此ID作为递归的开始条件节点 // parentId不在当前菜单ID的列表说明为顶级菜单ID根据此ID作为递归的开始节点
if (!cacheMenuIds.contains(parentId)) { if (!cacheMenuIds.contains(parentId)) {
cacheMenuIds.add(parentId); cacheMenuIds.add(parentId);
return recurMenus(parentId, menus); return recurMenus(parentId, menus);
@@ -67,21 +68,22 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
* 保存菜单 * 保存菜单
*/ */
@Override @Override
public boolean saveMenu(SysMenu menu) { public boolean saveMenu(MenuForm menuForm) {
String path = menu.getPath(); String path = menuForm.getPath();
MenuTypeEnum menuType = menu.getType(); // 菜单类型 MenuTypeEnum menuType = menuForm.getType(); // 菜单类型
switch (menuType) { switch (menuType) {
case CATALOG: // 目录 case CATALOG: // 目录
Assert.isTrue(path.startsWith("/"), "目录路由路径格式错误,必须以/开始"); Assert.isTrue(path.startsWith("/"), "目录路由路径格式错误,必须以/开始");
menu.setComponent("Layout"); menuForm.setComponent("Layout");
break; break;
case EXTLINK: // 外链 case EXTLINK: // 外链
menu.setComponent(null); menuForm.setComponent(null);
break; break;
} }
SysMenu entity = menuConverter.form2Entity(menuForm);
boolean result = this.saveOrUpdate(menu); boolean result = this.saveOrUpdate(entity);
return result; return result;
} }
@@ -119,9 +121,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
.filter(menu -> menu.getParentId().equals(parentId)) .filter(menu -> menu.getParentId().equals(parentId))
.forEach(menu -> { .forEach(menu -> {
RouteVO routeVO = new RouteVO(); RouteVO routeVO = new RouteVO();
MenuTypeEnum menuTypeEnum = menu.getType(); MenuTypeEnum menuTypeEnum = menu.getType();
if (MenuTypeEnum.MENU.equals(menuTypeEnum)) { if (MenuTypeEnum.MENU.equals(menuTypeEnum)) {
routeVO.setName(menu.getPath()); // 根据name路由跳转 this.$router.push({name:xxx}) routeVO.setName(menu.getPath()); // 根据name路由跳转 this.$router.push({name:xxx})
} }
@@ -135,35 +135,16 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
meta.setRoles(menu.getRoles()); meta.setRoles(menu.getRoles());
meta.setHidden(StatusEnum.DISABLE.getValue().equals(menu.getVisible())); meta.setHidden(StatusEnum.DISABLE.getValue().equals(menu.getVisible()));
meta.setKeepAlive(true); meta.setKeepAlive(true);
routeVO.setMeta(meta); routeVO.setMeta(meta);
List<RouteVO> children = recurRoutes(menu.getId(), menuList);
// 含有子节点的目录设置为可见
boolean alwaysShow = CollectionUtil.isNotEmpty(children) && children.stream().anyMatch(item -> item.getMeta().getHidden().equals(false));
meta.setAlwaysShow(alwaysShow);
routeVO.setChildren(children);
List<RouteVO> children = recurRoutes(menu.getId(), menuList);
routeVO.setChildren(children);
list.add(routeVO); list.add(routeVO);
})); }));
return list; return list;
} }
/**
* 获取菜单资源树形列表
*
* @return
*/
@Override
public List<ResourceVO> listResources() {
List<SysMenu> menuList = this.list(new LambdaQueryWrapper<SysMenu>()
.orderByAsc(SysMenu::getSort));
List<ResourceVO> resources = recurResources(SystemConstants.ROOT_NODE_ID, menuList);
return resources;
}
/** /**
* 修改菜单显示状态 * 修改菜单显示状态
* *
@@ -180,12 +161,48 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
return result; return result;
} }
/**
* 获取角色权限集合
*
* @param roles
* @return
*/
@Override @Override
public Set<String> listRolePerms(Set<String> roles) { public Set<String> listRolePerms(Set<String> roles) {
Set<String> perms = this.baseMapper.listRolePerms(roles); Set<String> perms = this.baseMapper.listRolePerms(roles);
return perms; return perms;
} }
/**
* 获取菜单表单数据
*
* @param id 菜单ID
* @return
*/
@Override
public MenuForm getMenuForm(Long id) {
SysMenu entity = this.getById(id);
MenuForm menuForm = menuConverter.entity2Form(entity);
return menuForm;
}
/**
* 删除菜单
*
* @param id 菜单ID
* @return
*/
@Override
public boolean deleteMenu(Long id) {
if (id != null) {
this.remove(new LambdaQueryWrapper<SysMenu>()
.eq(SysMenu::getId, id)
.or()
.apply("CONCAT (',',tree_path,',') LIKE CONCAT('%,',{0},',%')", id));
}
return true;
}
/** /**
* 递归生成菜单列表 * 递归生成菜单列表
* *
@@ -201,7 +218,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
List<MenuVO> menus = menuList.stream() List<MenuVO> menus = menuList.stream()
.filter(menu -> menu.getParentId().equals(parentId)) .filter(menu -> menu.getParentId().equals(parentId))
.map(entity -> { .map(entity -> {
MenuVO menuVO = menuConverter.entity2VO(entity); MenuVO menuVO = menuConverter.entity2Vo(entity);
List<MenuVO> children = recurMenus(entity.getId(), menuList); List<MenuVO> children = recurMenus(entity.getId(), menuList);
menuVO.setChildren(children); menuVO.setChildren(children);
return menuVO; return menuVO;
@@ -228,40 +245,5 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
return menus; return menus;
} }
/**
* 递归生成资源(菜单+权限)树形列表
*
* @param parentId 父级ID
* @param menuList 菜单列表
* @return
*/
private static List<ResourceVO> recurResources(Long parentId, List<SysMenu> menuList) {
if (CollectionUtil.isEmpty(menuList)) {
return Collections.EMPTY_LIST;
}
List<ResourceVO> menus = menuList.stream()
.filter(menu -> menu.getParentId().equals(parentId))
.map(menu -> {
ResourceVO resourceVO = new ResourceVO();
resourceVO.setValue(menu.getId());
resourceVO.setLabel(menu.getName());
List<ResourceVO> children = recurResources(menu.getId(), menuList);
resourceVO.setChildren(children);
return resourceVO;
}).collect(Collectors.toList());
return menus;
}
/**
* 清理路由缓存
*/
@Override
@CacheEvict(cacheNames = "system", key = "'routes'")
public void cleanCache() {
}
} }