菜单接口增删改查
This commit is contained in:
parent
1fb085498a
commit
462b62b524
|
|
@ -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()));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue