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.common.constant.SystemConstants; import com.youlai.system.enums.MenuTypeEnum; import com.youlai.common.enums.StatusEnum; import com.youlai.common.web.model.Option; import com.youlai.system.converter.MenuConverter; import com.youlai.system.mapper.SysMenuMapper; import com.youlai.system.pojo.bo.RouteBO; import com.youlai.system.pojo.entity.SysMenu; import com.youlai.system.pojo.query.MenuQuery; import com.youlai.system.service.SysMenuService; import com.youlai.system.pojo.vo.menu.MenuVO; import com.youlai.system.pojo.vo.menu.ResourceVO; import com.youlai.system.pojo.vo.menu.RouteVO; import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.CacheEvict; 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(SysMenu menu) { String path = menu.getPath(); MenuTypeEnum menuType = menu.getType(); // 菜单类型 switch (menuType) { case CATALOG: // 目录 Assert.isTrue(path.startsWith("/"), "目录路由路径格式错误,必须以/开始"); menu.setComponent("Layout"); break; case EXTLINK: // 外链 menu.setComponent(null); break; } boolean result = this.saveOrUpdate(menu); return result; } /** * 菜单下拉数据 */ @Override public List