package com.youlai.system.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.NumberUtil; 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.common.enums.MenuTypeEnum; import com.youlai.common.enums.StatusEnum; import com.youlai.system.converter.MenuConverter; import com.youlai.system.mapper.SysMenuMapper; import com.youlai.system.model.bo.RouteBO; import com.youlai.system.model.entity.SysMenu; import com.youlai.system.model.form.MenuForm; import com.youlai.system.model.query.MenuQuery; import com.youlai.system.model.vo.MenuVO; import com.youlai.common.web.model.Option; import com.youlai.system.model.vo.RouteVO; import com.youlai.system.service.SysMenuService; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * 菜单业务实现类 * * @author haoxr * @since 2020/11/06 */ @Service @RequiredArgsConstructor public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { private final MenuConverter menuConverter; /** * 菜单列表 * * @param queryParams {@link MenuQuery} */ @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 parentIds = menus.stream() .map(SysMenu::getParentId) .collect(Collectors.toSet()); Set menuIds = menus.stream() .map(SysMenu::getId) .collect(Collectors.toSet()); List rootIds = CollectionUtil.subtractToList(parentIds, menuIds); // 求差集,得到 parentIds 中 menuIds 没有的元素 List list = new ArrayList<>(); for (Long rootId : rootIds) { list.addAll(recurMenus(rootId, menus)); // 递归 } return list; } /** * 保存菜单 */ @Override public boolean saveMenu(MenuForm menuForm) { String path = menuForm.getPath(); MenuTypeEnum menuType = menuForm.getType(); // 菜单类型 switch (menuType) { case CATALOG -> { // 目录 if (NumberUtil.equals(menuForm.getParentId(), 0) && !path.startsWith("/")) { menuForm.setPath("/" + path); // 一级目录需以 / 开头 } menuForm.setComponent("Layout"); } case EXTLINK -> // 外链 menuForm.setComponent(null); } SysMenu entity = menuConverter.form2Entity(menuForm); String treePath = generateMenuTreePath(menuForm.getParentId()); entity.setTreePath(treePath); return this.saveOrUpdate(entity); } /** * 菜单下拉数据 */ @Override public List