diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/MenuController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/MenuController.java index f68a4e30..d197d5db 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/MenuController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/MenuController.java @@ -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> get() { return CzgResult.success(menuService.getMenu()); } + /** + * 获取所有菜单 + * @return 菜单结构 + */ + @SaAdminCheckRole("管理员") + @SaAdminCheckPermission("menu:list") + @GetMapping("/list") + public CzgResult> all(String title, String startTime, String endTime) { + return CzgResult.success(menuService.getAll(title, startTime, endTime)); + } + + /** + * 菜单详情 + * @return 菜单结构 + */ + @SaAdminCheckRole("管理员") + @SaAdminCheckPermission("menu:detail") + @GetMapping("/detail") + public CzgResult detail(@RequestParam Integer id) { + return CzgResult.success(menuService.getById(id)); + } + + /** + * 菜单添加 + * @return 是否成功 + */ + @SaAdminCheckRole("管理员") + @SaAdminCheckPermission("menu:add") + @PostMapping + public CzgResult add(@RequestBody @Validated MenuAddDTO menuAddDTO) { + return CzgResult.success(menuService.add(menuAddDTO)); + } + + /** + * 菜单修改 + * @return 是否成功 + */ + @SaAdminCheckRole("管理员") + @SaAdminCheckPermission("menu:edit") + @PutMapping() + public CzgResult edit(@RequestBody @Validated MenuEditDTO menuEditDTO) { + return CzgResult.success(menuService.edit(menuEditDTO)); + } + + /** + * 菜单删除 + * @return 是否成功 + */ + @SaAdminCheckRole("管理员") + @SaAdminCheckPermission("menu:del") + @DeleteMapping() + public CzgResult edit(@RequestBody @Validated MenuDelDTO menuDelDTO) { + return CzgResult.success(menuService.removeById(menuDelDTO.getId())); + } + } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/menu/MenuAddDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/menu/MenuAddDTO.java new file mode 100644 index 00000000..5ec77a40 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/menu/MenuAddDTO.java @@ -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; +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/menu/MenuDelDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/menu/MenuDelDTO.java new file mode 100644 index 00000000..86e3fbe6 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/menu/MenuDelDTO.java @@ -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; +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/menu/MenuEditDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/menu/MenuEditDTO.java new file mode 100644 index 00000000..e8e91757 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/menu/MenuEditDTO.java @@ -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; +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/service/SysMenuService.java b/cash-common/cash-common-service/src/main/java/com/czg/account/service/SysMenuService.java index a6444502..01f2f56a 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/service/SysMenuService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/SysMenuService.java @@ -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 { - Object getMenu(); + List getMenu(); + + List getAll(String title, String startTime, String endTime); + + Boolean add(MenuAddDTO menuAddDTO); + + Boolean edit(MenuEditDTO menuEditDTO); + } diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SysMenuServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SysMenuServiceImpl.java index 1832e5d1..fe3ec199 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SysMenuServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SysMenuServiceImpl.java @@ -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 implements SysMenuService { @Override - public Object getMenu() { + public List getMenu() { long sysUserId = StpKit.USER.getLoginIdAsLong(); List allMenus = mapper.selectByUserId(sysUserId, null); - List rootMenus = new ArrayList<>(); - List 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 menuVos = allMenus.stream() + .map(menu -> BeanUtil.copyProperties(menu, MenuVO.class)) + .collect(Collectors.toList()); + return buildMenuWithPermissions(menuVos); } - // 递归构建子菜单,按钮放在 permissions 中 - private void buildSubMenus(MenuVO parentMenu, List allMenus) { - List children = new ArrayList<>(); - // 存储该菜单的按钮权限 - List permissions = new ArrayList<>(); + @Override + public List 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 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 buildMenuTree(List allMenus) { + List menuVos = allMenus.stream() + .map(menu -> BeanUtil.copyProperties(menu, MenuVO.class)) + .collect(Collectors.toList()); + return buildSubMenus(null, menuVos, false); + } + + private List buildMenuWithPermissions(List allMenus) { + return buildSubMenus(null, allMenus, true); + } + + private List buildSubMenus(Long parentId, List allMenus, boolean includePermissions) { + List 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 permissions = new ArrayList<>(); + List 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 getPermissionsForMenu(SysMenu menu) { + private List getPermissionsForMenu(MenuVO menu) { List 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; } } - - -