package cc.mrbird.febs.server.system.service.impl; import cc.mrbird.febs.common.core.entity.MenuTree; import cc.mrbird.febs.common.core.entity.Tree; import cc.mrbird.febs.common.core.entity.constant.PageConstant; import cc.mrbird.febs.common.core.entity.constant.StringConstant; import cc.mrbird.febs.common.core.entity.router.RouterMeta; import cc.mrbird.febs.common.core.entity.router.VueRouter; import cc.mrbird.febs.common.core.entity.system.Menu; import cc.mrbird.febs.common.core.utils.TreeUtil; import cc.mrbird.febs.server.system.mapper.MenuMapper; import cc.mrbird.febs.server.system.service.IMenuService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; /** * @author MrBird */ @Slf4j @Service("menuService") @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) public class MenuServiceImpl extends ServiceImpl implements IMenuService { @Override public String findUserPermissions(String username) { List userPermissions = this.baseMapper.findUserPermissions(username); return userPermissions.stream().map(Menu::getPerms).collect(Collectors.joining(StringConstant.COMMA)); } @Override public List findUserMenus(String username) { return this.baseMapper.findUserMenus(username); } @Override public Map findMenus(Menu menu) { Map result = new HashMap<>(2); try { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.orderByAsc(Menu::getOrderNum); List menus = baseMapper.selectList(queryWrapper); List trees = new ArrayList<>(); buildTrees(trees, menus); if (StringUtils.equals(menu.getType(), Menu.TYPE_BUTTON)) { result.put(PageConstant.ROWS, trees); } else { List> menuTree = TreeUtil.build(trees); result.put(PageConstant.ROWS, menuTree); } result.put("total", menus.size()); } catch (NumberFormatException e) { log.error("查询菜单失败", e); result.put(PageConstant.ROWS, null); result.put(PageConstant.TOTAL, 0); } return result; } @Override public List> getUserRouters(String username) { List> routes = new ArrayList<>(); List menus = this.findUserMenus(username); menus.forEach(menu -> { VueRouter route = new VueRouter<>(); route.setId(menu.getMenuId().toString()); route.setParentId(menu.getParentId().toString()); route.setPath(menu.getPath()); route.setComponent(menu.getComponent()); route.setName(menu.getMenuName()); route.setMeta(new RouterMeta(menu.getMenuName(), menu.getIcon(), true)); routes.add(route); }); return TreeUtil.buildVueRouter(routes); } @Override public List findMenuList(Menu menu) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); if (StringUtils.isNotBlank(menu.getMenuName())) { queryWrapper.like(Menu::getMenuName, menu.getMenuName()); } queryWrapper.orderByAsc(Menu::getMenuId); return this.baseMapper.selectList(queryWrapper); } @Override @Transactional(rollbackFor = Exception.class) public void createMenu(Menu menu) { menu.setCreateTime(new Date()); setMenu(menu); this.save(menu); } @Override @Transactional(rollbackFor = Exception.class) public void updateMenu(Menu menu) { menu.setModifyTime(new Date()); setMenu(menu); baseMapper.updateById(menu); } @Override @Transactional(rollbackFor = Exception.class) public void deleteMeuns(String[] menuIds) { this.delete(Arrays.asList(menuIds)); } private void buildTrees(List trees, List menus) { menus.forEach(menu -> { MenuTree tree = new MenuTree(); tree.setId(menu.getMenuId().toString()); tree.setParentId(menu.getParentId().toString()); tree.setLabel(menu.getMenuName()); tree.setComponent(menu.getComponent()); tree.setIcon(menu.getIcon()); tree.setOrderNum(menu.getOrderNum()); tree.setPath(menu.getPath()); tree.setType(menu.getType()); tree.setPerms(menu.getPerms()); trees.add(tree); }); } private void setMenu(Menu menu) { if (menu.getParentId() == null) { menu.setParentId(Menu.TOP_MENU_ID); } if (Menu.TYPE_BUTTON.equals(menu.getType())) { menu.setPath(null); menu.setIcon(null); menu.setComponent(null); menu.setOrderNum(null); } } private void delete(List menuIds) { removeByIds(menuIds); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(Menu::getParentId, menuIds); List menus = baseMapper.selectList(queryWrapper); if (CollectionUtils.isNotEmpty(menus)) { List menuIdList = new ArrayList<>(); menus.forEach(m -> menuIdList.add(String.valueOf(m.getMenuId()))); this.delete(menuIdList); } } }