package com.youlai.system.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.system.common.constant.SystemConstants; import com.youlai.system.common.enums.MenuTypeEnum; 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.converter.MenuConverter; import com.youlai.system.mapper.SysMenuMapper; import com.youlai.system.pojo.entity.SysMenu; import com.youlai.system.pojo.bo.RouteBO; import com.youlai.system.pojo.query.MenuQuery; import com.youlai.system.pojo.vo.MenuVO; import com.youlai.system.pojo.vo.RouteVO; import com.youlai.system.service.SysMenuService; import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.util.*; import java.util.stream.Collectors; /** * 菜单业务实现类 * * @author haoxr * @date 2020/11/06 */ @Service @RequiredArgsConstructor public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { private final MenuConverter menuConverter; /** * 菜单列表 */ @Override public List listMenus(MenuQuery queryParams) { List menus = this.list(new LambdaQueryWrapper() .like(StrUtil.isNotBlank(queryParams.getKeywords()), SysMenu::getName, queryParams.getKeywords()) .orderByAsc(SysMenu::getSort) ); Set cacheMenuIds = menus.stream() .map(menu -> menu.getId()) .collect(Collectors.toSet()); List list = menus.stream().map(menu -> { Long parentId = menu.getParentId(); // parentId不在当前菜单ID的列表,说明为顶级菜单ID,根据此ID作为递归的开始节点 if (!cacheMenuIds.contains(parentId)) { cacheMenuIds.add(parentId); return recurMenus(parentId, menus); } return new LinkedList(); }).collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll); return list; } /** * 保存菜单 */ @Override public boolean saveMenu(MenuForm menuForm) { String path = menuForm.getPath(); MenuTypeEnum menuType = menuForm.getType(); // 菜单类型 switch (menuType) { case CATALOG: // 目录 Assert.isTrue(path.startsWith("/"), "目录路由路径格式错误,必须以/开始"); menuForm.setComponent("Layout"); break; case EXTLINK: // 外链 menuForm.setComponent(null); break; } SysMenu entity = menuConverter.form2Entity(menuForm); boolean result = this.saveOrUpdate(entity); return result; } /** * 菜单下拉数据 */ @Override public List