菜单接口增删改查

This commit is contained in:
张松
2025-02-15 16:07:58 +08:00
parent 1fb085498a
commit 462b62b524
6 changed files with 312 additions and 64 deletions

View File

@@ -1,97 +1,137 @@
package com.czg.service.account.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.czg.account.dto.menu.MenuAddDTO;
import com.czg.account.dto.menu.MenuEditDTO;
import com.czg.account.entity.SysMenu;
import com.czg.account.service.SysMenuService;
import com.czg.account.vo.MenuVO;
import com.czg.exception.ApiNotPrintException;
import com.czg.sa.StpKit;
import com.czg.service.account.mapper.SysMenuMapper;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.Arrays;
/**
* 系统菜单 服务层实现。
*
* @author Administrator
* @since 2025-02-10
*/
@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {
@Override
public Object getMenu() {
public List<MenuVO> getMenu() {
long sysUserId = StpKit.USER.getLoginIdAsLong();
List<SysMenu> allMenus = mapper.selectByUserId(sysUserId, null);
List<MenuVO> rootMenus = new ArrayList<>();
List<MenuVO> allMenuVos = new ArrayList<>();
// 分类菜单和按钮,并处理按钮的权限
for (SysMenu menu : allMenus) {
MenuVO menuVO = BeanUtil.copyProperties(menu, MenuVO.class);
// 如果是按钮类型,添加权限标识集合到 permissions
if (menu.getType() == 2) {
// 获取按钮的权限标识集合
menuVO.setPermissions(getPermissionsForMenu(menu));
}
// 分类根菜单与所有菜单
if (menu.getPid() == null || menu.getPid() == 0) {
rootMenus.add(menuVO);
}
allMenuVos.add(menuVO);
}
// 给每个根菜单设置子菜单,同时把按钮权限标识加入到 permissions 中
for (MenuVO rootMenu : rootMenus) {
buildSubMenus(rootMenu, allMenuVos);
}
return rootMenus;
List<MenuVO> menuVos = allMenus.stream()
.map(menu -> BeanUtil.copyProperties(menu, MenuVO.class))
.collect(Collectors.toList());
return buildMenuWithPermissions(menuVos);
}
// 递归构建子菜单,按钮放在 permissions 中
private void buildSubMenus(MenuVO parentMenu, List<MenuVO> allMenus) {
List<MenuVO> children = new ArrayList<>();
// 存储该菜单的按钮权限
List<String> permissions = new ArrayList<>();
@Override
public List<MenuVO> getAll(String title, String startTime, String endTime) {
QueryWrapper queryWrapper = new QueryWrapper();
if (StrUtil.isNotBlank(title)) {
queryWrapper.like(SysMenu::getTitle, title);
}
if (StrUtil.isNotBlank(startTime)) {
queryWrapper.ge(SysMenu::getCreateTime, DateUtil.parse(startTime));
}
if (StrUtil.isNotBlank(endTime)) {
queryWrapper.le(SysMenu::getCreateTime, DateUtil.parse(endTime));
}
List<SysMenu> allMenus;
if (queryWrapper.hasCondition()) {
allMenus = list(queryWrapper);
return allMenus.stream()
.map(item -> BeanUtil.copyProperties(item, MenuVO.class))
.collect(Collectors.toList());
}else {
allMenus = list();
return buildMenuTree(allMenus);
}
}
@Override
public Boolean add(MenuAddDTO menuAddDTO) {
if (menuAddDTO.getType() == 2 && menuAddDTO.getPid() == null) {
throw new ApiNotPrintException("二级菜单必须传递父id");
}
if (menuAddDTO.getType() == 3 && menuAddDTO.getPid() == null) {
throw new ApiNotPrintException("父id不为空");
}
if (menuAddDTO.getType() == 3 && menuAddDTO.getPermission() == null) {
throw new ApiNotPrintException("权限不为空");
}
return save(BeanUtil.copyProperties(menuAddDTO, SysMenu.class));
}
@Override
public Boolean edit(MenuEditDTO menuEditDTO) {
SysMenu menu = getById(menuEditDTO.getId());
if (menu == null) {
throw new ApiNotPrintException("菜单不存在");
}
BeanUtil.copyProperties(menuEditDTO, menu);
return updateById(menu);
}
private List<MenuVO> buildMenuTree(List<SysMenu> allMenus) {
List<MenuVO> menuVos = allMenus.stream()
.map(menu -> BeanUtil.copyProperties(menu, MenuVO.class))
.collect(Collectors.toList());
return buildSubMenus(null, menuVos, false);
}
private List<MenuVO> buildMenuWithPermissions(List<MenuVO> allMenus) {
return buildSubMenus(null, allMenus, true);
}
private List<MenuVO> buildSubMenus(Long parentId, List<MenuVO> allMenus, boolean includePermissions) {
List<MenuVO> resultMenus = new ArrayList<>();
for (MenuVO menu : allMenus) {
// 如果是菜单且父级菜单ID匹配加入子菜单
if (menu.getPid() != null && menu.getPid().equals(parentMenu.getMenuId()) && menu.getType() != 2) {
children.add(menu);
// 递归查找子菜单
buildSubMenus(menu, allMenus);
}
// 如果是按钮类型,直接放到权限集合中
if (menu.getPid() != null && menu.getPid().equals(parentMenu.getMenuId()) && menu.getType() == 2) {
// 将按钮的权限标识加入权限列表
permissions.addAll(getPermissionsForMenu(menu));
if ((menu.getPid() == null && parentId == null) || (menu.getPid() != null && menu.getPid().equals(parentId))) {
List<String> permissions = new ArrayList<>();
List<MenuVO> children = buildSubMenus(menu.getMenuId(), allMenus, includePermissions);
if (includePermissions) {
for (MenuVO child : new ArrayList<>(children)) {
if (child.getType() == 2) {
permissions.addAll(getPermissionsForMenu(child));
children.remove(child);
}
}
}
menu.setChildren(children);
if (includePermissions) {
menu.setPermissions(permissions);
}
resultMenus.add(menu);
}
}
// 设置当前菜单的子菜单和权限
parentMenu.setChildren(children);
// 将按钮权限标识添加到菜单的权限中
parentMenu.setPermissions(permissions);
return resultMenus;
}
// 根据菜单获取权限标识(这里假设你有权限标识的获取逻辑)
private List<String> getPermissionsForMenu(SysMenu menu) {
private List<String> getPermissionsForMenu(MenuVO menu) {
List<String> permissions = new ArrayList<>();
// 你可以根据需求从数据库或其他地方获取权限标识
// 例如,假设菜单表中有权限字段
if (menu.getPermission() != null) {
String[] permissionArray = menu.getPermission().split(",");
permissions.addAll(Arrays.asList(permissionArray));
permissions.addAll(Arrays.asList(menu.getPermission().split(",")));
}
return permissions;
}
}