菜单接口增删改查

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,11 +1,19 @@
package com.czg.controller.admin;
import com.czg.account.dto.menu.MenuAddDTO;
import com.czg.account.dto.menu.MenuDelDTO;
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.annotation.SaAdminCheckPermission;
import com.czg.annotation.SaAdminCheckRole;
import com.czg.resp.CzgResult;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 菜单管理
@ -23,8 +31,63 @@ public class MenuController {
* @return 菜单结构
*/
@GetMapping
public CzgResult<?> get() {
public CzgResult<List<MenuVO>> get() {
return CzgResult.success(menuService.getMenu());
}
/**
* 获取所有菜单
* @return 菜单结构
*/
@SaAdminCheckRole("管理员")
@SaAdminCheckPermission("menu:list")
@GetMapping("/list")
public CzgResult<List<MenuVO>> all(String title, String startTime, String endTime) {
return CzgResult.success(menuService.getAll(title, startTime, endTime));
}
/**
* 菜单详情
* @return 菜单结构
*/
@SaAdminCheckRole("管理员")
@SaAdminCheckPermission("menu:detail")
@GetMapping("/detail")
public CzgResult<SysMenu> detail(@RequestParam Integer id) {
return CzgResult.success(menuService.getById(id));
}
/**
* 菜单添加
* @return 是否成功
*/
@SaAdminCheckRole("管理员")
@SaAdminCheckPermission("menu:add")
@PostMapping
public CzgResult<Boolean> add(@RequestBody @Validated MenuAddDTO menuAddDTO) {
return CzgResult.success(menuService.add(menuAddDTO));
}
/**
* 菜单修改
* @return 是否成功
*/
@SaAdminCheckRole("管理员")
@SaAdminCheckPermission("menu:edit")
@PutMapping()
public CzgResult<Boolean> edit(@RequestBody @Validated MenuEditDTO menuEditDTO) {
return CzgResult.success(menuService.edit(menuEditDTO));
}
/**
* 菜单删除
* @return 是否成功
*/
@SaAdminCheckRole("管理员")
@SaAdminCheckPermission("menu:del")
@DeleteMapping()
public CzgResult<Boolean> edit(@RequestBody @Validated MenuDelDTO menuDelDTO) {
return CzgResult.success(menuService.removeById(menuDelDTO.getId()));
}
}

View File

@ -0,0 +1,63 @@
package com.czg.account.dto.menu;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* @author Administrator
*/
@Data
public class MenuAddDTO {
/**
* 菜单类型 0 菜单 1按钮 2接口
*/
@NotNull(message = "菜单类型不为空")
@Min(0)
@Max(2)
private Integer type;
/**
* 图标
*/
private String icon;
/**
* 是否外链
*/
private byte iFrame = 0;
/**
* 是否隐藏
*/
private byte hidden = 0;
/**
* 是否缓存
*/
private byte cache;
@NotEmpty(message = "菜单名称不为空")
private String title;
/**
* 链接地址
*/
private String path;
/**
* 组件
*/
private String component;
/**
* 菜单排序
*/
private Integer menuSort;
/**
* 上级菜单不传递则为顶级菜单
*/
private Long pid;
/**
* 是否选中父级菜单
*/
private String activeMenu;
/**
* 权限表示
*/
private String permission;
}

View File

@ -0,0 +1,13 @@
package com.czg.account.dto.menu;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* @author Administrator
*/
@Data
public class MenuDelDTO {
@NotNull(message = "菜单id不为空")
private Integer id;
}

View File

@ -0,0 +1,57 @@
package com.czg.account.dto.menu;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* @author Administrator
*/
@Data
public class MenuEditDTO {
@NotNull(message = "菜单id不为空")
private Integer id;
/**
* 图标
*/
private String icon;
/**
* 是否外链
*/
private byte iFrame = 0;
/**
* 是否隐藏
*/
private byte hidden = 0;
/**
* 是否缓存
*/
private byte cache;
private String title;
/**
* 链接地址
*/
private String path;
/**
* 组件
*/
private String component;
/**
* 菜单排序
*/
private Integer menuSort;
/**
* 上级菜单不传递则为顶级菜单
*/
private Long pid;
/**
* 是否选中父级菜单
*/
private String activeMenu;
/**
* 权限表示
*/
private String permission;
}

View File

@ -1,8 +1,13 @@
package com.czg.account.service;
import com.czg.account.dto.menu.MenuAddDTO;
import com.czg.account.dto.menu.MenuEditDTO;
import com.czg.account.entity.SysMenu;
import com.czg.account.vo.MenuVO;
import com.mybatisflex.core.service.IService;
import java.util.List;
/**
* 系统菜单 服务层
*
@ -11,5 +16,12 @@ import com.mybatisflex.core.service.IService;
*/
public interface SysMenuService extends IService<SysMenu> {
Object getMenu();
List<MenuVO> getMenu();
List<MenuVO> getAll(String title, String startTime, String endTime);
Boolean add(MenuAddDTO menuAddDTO);
Boolean edit(MenuEditDTO menuEditDTO);
}

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));
List<MenuVO> menuVos = allMenus.stream()
.map(menu -> BeanUtil.copyProperties(menu, MenuVO.class))
.collect(Collectors.toList());
return buildMenuWithPermissions(menuVos);
}
// 分类根菜单与所有菜单
if (menu.getPid() == null || menu.getPid() == 0) {
rootMenus.add(menuVO);
}
allMenuVos.add(menuVO);
@Override
public List<MenuVO> getAll(String title, String startTime, String endTime) {
QueryWrapper queryWrapper = new QueryWrapper();
if (StrUtil.isNotBlank(title)) {
queryWrapper.like(SysMenu::getTitle, title);
}
// 给每个根菜单设置子菜单同时把按钮权限标识加入到 permissions
for (MenuVO rootMenu : rootMenus) {
buildSubMenus(rootMenu, allMenuVos);
if (StrUtil.isNotBlank(startTime)) {
queryWrapper.ge(SysMenu::getCreateTime, DateUtil.parse(startTime));
}
return rootMenus;
if (StrUtil.isNotBlank(endTime)) {
queryWrapper.le(SysMenu::getCreateTime, DateUtil.parse(endTime));
}
// 递归构建子菜单按钮放在 permissions
private void buildSubMenus(MenuVO parentMenu, List<MenuVO> allMenus) {
List<MenuVO> children = new ArrayList<>();
// 存储该菜单的按钮权限
List<String> permissions = new ArrayList<>();
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));
}
}
// 设置当前菜单的子菜单和权限
parentMenu.setChildren(children);
// 将按钮权限标识添加到菜单的权限中
parentMenu.setPermissions(permissions);
}
// 根据菜单获取权限标识这里假设你有权限标识的获取逻辑
private List<String> getPermissionsForMenu(SysMenu 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);
}
}
return resultMenus;
}
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;
}
}