菜单接口增删改查
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user