菜单接口增删改查
This commit is contained in:
parent
1fb085498a
commit
462b62b524
|
|
@ -1,11 +1,19 @@
|
||||||
package com.czg.controller.admin;
|
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.service.SysMenuService;
|
||||||
|
import com.czg.account.vo.MenuVO;
|
||||||
|
import com.czg.annotation.SaAdminCheckPermission;
|
||||||
|
import com.czg.annotation.SaAdminCheckRole;
|
||||||
import com.czg.resp.CzgResult;
|
import com.czg.resp.CzgResult;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 菜单管理
|
* 菜单管理
|
||||||
|
|
@ -23,8 +31,63 @@ public class MenuController {
|
||||||
* @return 菜单结构
|
* @return 菜单结构
|
||||||
*/
|
*/
|
||||||
@GetMapping
|
@GetMapping
|
||||||
public CzgResult<?> get() {
|
public CzgResult<List<MenuVO>> get() {
|
||||||
return CzgResult.success(menuService.getMenu());
|
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;
|
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.entity.SysMenu;
|
||||||
|
import com.czg.account.vo.MenuVO;
|
||||||
import com.mybatisflex.core.service.IService;
|
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> {
|
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;
|
package com.czg.service.account.service.impl;
|
||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
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.entity.SysMenu;
|
||||||
import com.czg.account.service.SysMenuService;
|
import com.czg.account.service.SysMenuService;
|
||||||
import com.czg.account.vo.MenuVO;
|
import com.czg.account.vo.MenuVO;
|
||||||
|
import com.czg.exception.ApiNotPrintException;
|
||||||
import com.czg.sa.StpKit;
|
import com.czg.sa.StpKit;
|
||||||
import com.czg.service.account.mapper.SysMenuMapper;
|
import com.czg.service.account.mapper.SysMenuMapper;
|
||||||
|
import com.mybatisflex.core.query.QueryWrapper;
|
||||||
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 系统菜单 服务层实现。
|
* 系统菜单 服务层实现。
|
||||||
*
|
|
||||||
* @author Administrator
|
* @author Administrator
|
||||||
* @since 2025-02-10
|
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {
|
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object getMenu() {
|
public List<MenuVO> getMenu() {
|
||||||
long sysUserId = StpKit.USER.getLoginIdAsLong();
|
long sysUserId = StpKit.USER.getLoginIdAsLong();
|
||||||
List<SysMenu> allMenus = mapper.selectByUserId(sysUserId, null);
|
List<SysMenu> allMenus = mapper.selectByUserId(sysUserId, null);
|
||||||
List<MenuVO> rootMenus = new ArrayList<>();
|
List<MenuVO> menuVos = allMenus.stream()
|
||||||
List<MenuVO> allMenuVos = new ArrayList<>();
|
.map(menu -> BeanUtil.copyProperties(menu, MenuVO.class))
|
||||||
|
.collect(Collectors.toList());
|
||||||
// 分类菜单和按钮,并处理按钮的权限
|
return buildMenuWithPermissions(menuVos);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 递归构建子菜单,按钮放在 permissions 中
|
@Override
|
||||||
private void buildSubMenus(MenuVO parentMenu, List<MenuVO> allMenus) {
|
public List<MenuVO> getAll(String title, String startTime, String endTime) {
|
||||||
List<MenuVO> children = new ArrayList<>();
|
QueryWrapper queryWrapper = new QueryWrapper();
|
||||||
// 存储该菜单的按钮权限
|
if (StrUtil.isNotBlank(title)) {
|
||||||
List<String> permissions = new ArrayList<>();
|
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) {
|
for (MenuVO menu : allMenus) {
|
||||||
// 如果是菜单且父级菜单ID匹配,加入子菜单
|
if ((menu.getPid() == null && parentId == null) || (menu.getPid() != null && menu.getPid().equals(parentId))) {
|
||||||
if (menu.getPid() != null && menu.getPid().equals(parentMenu.getMenuId()) && menu.getType() != 2) {
|
List<String> permissions = new ArrayList<>();
|
||||||
children.add(menu);
|
List<MenuVO> children = buildSubMenus(menu.getMenuId(), allMenus, includePermissions);
|
||||||
// 递归查找子菜单
|
|
||||||
buildSubMenus(menu, allMenus);
|
if (includePermissions) {
|
||||||
}
|
for (MenuVO child : new ArrayList<>(children)) {
|
||||||
// 如果是按钮类型,直接放到权限集合中
|
if (child.getType() == 2) {
|
||||||
if (menu.getPid() != null && menu.getPid().equals(parentMenu.getMenuId()) && menu.getType() == 2) {
|
permissions.addAll(getPermissionsForMenu(child));
|
||||||
// 将按钮的权限标识加入权限列表
|
children.remove(child);
|
||||||
permissions.addAll(getPermissionsForMenu(menu));
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
menu.setChildren(children);
|
||||||
|
if (includePermissions) {
|
||||||
|
menu.setPermissions(permissions);
|
||||||
|
}
|
||||||
|
resultMenus.add(menu);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return resultMenus;
|
||||||
// 设置当前菜单的子菜单和权限
|
|
||||||
parentMenu.setChildren(children);
|
|
||||||
// 将按钮权限标识添加到菜单的权限中
|
|
||||||
parentMenu.setPermissions(permissions);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据菜单获取权限标识(这里假设你有权限标识的获取逻辑)
|
private List<String> getPermissionsForMenu(MenuVO menu) {
|
||||||
private List<String> getPermissionsForMenu(SysMenu menu) {
|
|
||||||
List<String> permissions = new ArrayList<>();
|
List<String> permissions = new ArrayList<>();
|
||||||
// 你可以根据需求从数据库或其他地方获取权限标识
|
|
||||||
// 例如,假设菜单表中有权限字段
|
|
||||||
if (menu.getPermission() != null) {
|
if (menu.getPermission() != null) {
|
||||||
String[] permissionArray = menu.getPermission().split(",");
|
permissions.addAll(Arrays.asList(menu.getPermission().split(",")));
|
||||||
permissions.addAll(Arrays.asList(permissionArray));
|
|
||||||
}
|
}
|
||||||
return permissions;
|
return permissions;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue