diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/MenuServiceApi.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/MenuServiceApi.java index 8cec3e925..59c2a0a42 100644 --- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/MenuServiceApi.java +++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/MenuServiceApi.java @@ -108,4 +108,12 @@ public interface MenuServiceApi { */ List getRoleBindMenuList(SysRoleRequest sysRoleRequest); + /** + * 获取角色绑定的操作权限列表 + * + * @author fengshuonan + * @date 2022/9/28 17:26 + */ + List getRoleBindOperateList(SysRoleRequest sysRoleRequest); + } diff --git a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/controller/SysMenuController.java b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/controller/SysMenuController.java index f63880a6b..391bb7507 100644 --- a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/controller/SysMenuController.java +++ b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/controller/SysMenuController.java @@ -217,4 +217,16 @@ public class SysMenuController { return new SuccessResponseData<>(treeResponseList); } + /** + * 获取角色分配操作权限,绑定情况列表 + * + * @author fengshuonan + * @date 2022/9/28 17:23 + */ + @GetResource(name = "获取角色分配操作权限,绑定情况列表", path = "/sysMenu/roleBindOperateList") + public ResponseData> roleBindOperateList(@Validated(SysRoleRequest.roleBindMenuList.class) SysRoleRequest sysRoleRequest) { + List treeResponseList = menuServiceApi.getRoleBindOperateList(sysRoleRequest); + return new SuccessResponseData<>(treeResponseList); + } + } diff --git a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/factory/AntdMenusFactory.java b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/factory/AntdMenusFactory.java index bbef94663..574d6600b 100644 --- a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/factory/AntdMenusFactory.java +++ b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/factory/AntdMenusFactory.java @@ -41,10 +41,8 @@ import cn.stylefeng.roses.kernel.system.modular.menu.entity.SysMenu; import cn.stylefeng.roses.kernel.system.modular.menu.entity.SysMenuButton; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** * 针对于antd vue版本的前端菜单的组装 @@ -246,6 +244,52 @@ public class AntdMenusFactory { } } + /** + * 将按钮集成到菜单列表里,并且只返回一级结构 + * + * @param sysMenuList 菜单集合,包含一级菜单,一级菜单内 + * @param buttonList 菜单下的操作权限集合 + * @author fengshuonan + * @date 2022/9/28 18:00 + */ + public static List fillButtons(List sysMenuList, List buttonList) { + List result = new ArrayList<>(); + + for (SysMenu sysMenu : sysMenuList) { + + MenuAndButtonTreeResponse menuAndButtonTreeResponse = new MenuAndButtonTreeResponse(); + menuAndButtonTreeResponse.setId(sysMenu.getMenuId()); + menuAndButtonTreeResponse.setName(sysMenu.getMenuName()); + menuAndButtonTreeResponse.setCode(sysMenu.getMenuCode()); + menuAndButtonTreeResponse.setPid(sysMenu.getMenuParentId()); + menuAndButtonTreeResponse.setChecked(false); + + // 获取当前菜单下的所有菜单id + List children = sysMenu.getChildren(); + Set totalMenusIds = children.stream().map(SysMenu::getMenuId).collect(Collectors.toSet()); + totalMenusIds.add(sysMenu.getMenuId()); + + // 转化按钮的所属菜单id + ArrayList buttons = new ArrayList<>(); + for (SysMenuButton sysMenuButton : buttonList) { + for (Long menuIdItem : totalMenusIds) { + if (sysMenuButton.getMenuId().equals(menuIdItem)) { + MenuAndButtonTreeResponse buttonItem = new MenuAndButtonTreeResponse(); + buttonItem.setId(sysMenuButton.getButtonId()); + buttonItem.setName(sysMenuButton.getButtonName()); + buttonItem.setCode(sysMenuButton.getButtonCode()); + buttonItem.setChecked(false); + buttons.add(buttonItem); + } + } + } + menuAndButtonTreeResponse.setButtons(buttons); + result.add(menuAndButtonTreeResponse); + } + + return result; + } + /** * 获取分类过的用户菜单,返回一个menus数组,并且第一个是激活的应用 * @@ -329,4 +373,26 @@ public class AntdMenusFactory { return antdSysMenuDTO; } + /** + * 填充按钮的选中标识 + * + * @author fengshuonan + * @date 2022/9/28 18:19 + */ + public static List fillButtonsChecked(List menuAndButtonTreeResponses, List roleMenuButtonList) { + + // 遍历所有菜单中的按钮,将选中标识加上 + for (MenuAndButtonTreeResponse menuAndButtonTreeResponse : menuAndButtonTreeResponses) { + List buttons = menuAndButtonTreeResponse.getButtons(); + for (MenuAndButtonTreeResponse button : buttons) { + for (SysRoleMenuButtonDTO sysRoleMenuButtonDTO : roleMenuButtonList) { + if (sysRoleMenuButtonDTO.getButtonId().equals(button.getId())) { + button.setChecked(true); + } + } + } + } + + return menuAndButtonTreeResponses; + } } diff --git a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/service/impl/SysMenuServiceImpl.java b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/service/impl/SysMenuServiceImpl.java index 9ffaf23c3..3012c19f4 100644 --- a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/service/impl/SysMenuServiceImpl.java +++ b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/service/impl/SysMenuServiceImpl.java @@ -481,43 +481,33 @@ public class SysMenuServiceImpl extends ServiceImpl impl @Override public List getRoleBindMenuList(SysRoleRequest sysRoleRequest) { - // 查询所有菜单列表,根据前台传递参数,可选择前台还是后台菜单 - LambdaQueryWrapper menuWrapper = new LambdaQueryWrapper<>(); - menuWrapper.eq(SysMenu::getDelFlag, YesOrNotEnum.N.getCode()); - menuWrapper.eq(SysMenu::getStatusFlag, StatusEnum.ENABLE.getCode()); - menuWrapper.eq(SysMenu::getAntdvFrontType, AntdvFrontTypeEnum.FRONT.getCode()); - List sysMenuList = this.list(menuWrapper); + // 获取所有一级菜单,子菜单包含在children内 + List sysMenus = totalMenusWithOneLevel(); // 获取角色绑定的菜单 List roleMenuList = roleServiceApi.getRoleMenuList(Collections.singletonList(sysRoleRequest.getRoleId())); - // 将所有节点转化成树结构,整体只要两级结构,一级是一级菜单,第二级是所有以下菜单 - Map firstLevelMenus = new HashMap<>(); - - // 找到所有第一级的菜单 - for (SysMenu sysMenu : sysMenuList) { - if (TreeConstants.DEFAULT_PARENT_ID.equals(sysMenu.getMenuParentId())) { - firstLevelMenus.put(sysMenu.getMenuId(), sysMenu); - } - } - - // 找到所有二级和以下菜单,并添加到一级菜单以下 - for (Map.Entry menuEntry : firstLevelMenus.entrySet()) { - SysMenu firstLevelMenuItem = menuEntry.getValue(); - List children = firstLevelMenuItem.getChildren(); - if (children == null) { - children = new ArrayList<>(); - firstLevelMenuItem.setChildren(children); - } - for (SysMenu sysMenu : sysMenuList) { - if (sysMenu.getMenuPids().contains("[" + firstLevelMenuItem.getMenuId() + "]")) { - children.add(sysMenu); - } - } - } - // 将组装好的一级菜单和里边的children都转化为响应对象,并填充checked标识 - return AntdMenusFactory.parseMenuAndButtonTreeResponseWithChildren(ListUtil.toList(firstLevelMenus.values()), roleMenuList); + return AntdMenusFactory.parseMenuAndButtonTreeResponseWithChildren(sysMenus, roleMenuList); + } + + @Override + public List getRoleBindOperateList(SysRoleRequest sysRoleRequest) { + + // 获取所有一级菜单,子菜单包含在children内 + List sysMenus = totalMenusWithOneLevel(); + + // 查询这些菜单对应的所有按钮 + LambdaQueryWrapper buttonWrapper = new LambdaQueryWrapper<>(); + buttonWrapper.eq(SysMenuButton::getDelFlag, YesOrNotEnum.N.getCode()); + List buttonList = sysMenuButtonService.list(buttonWrapper); + + // 将组装好的一级菜单和里边的children都转化为响应对象 + List menuAndButtonTreeResponses = AntdMenusFactory.fillButtons(sysMenus, buttonList); + + // 填充checked对象 + List roleMenuButtonList = roleServiceApi.getRoleMenuButtonList(Collections.singletonList(sysRoleRequest.getRoleId())); + return AntdMenusFactory.fillButtonsChecked(menuAndButtonTreeResponses, roleMenuButtonList); } @Override @@ -818,4 +808,46 @@ public class SysMenuServiceImpl extends ServiceImpl impl return newPids; } + /** + * 获取所有的菜单,以一级菜单的形式展示 + * + * @author fengshuonan + * @date 2022/9/28 17:46 + */ + private List totalMenusWithOneLevel() { + // 查询所有菜单列表,根据前台传递参数,可选择前台还是后台菜单 + LambdaQueryWrapper menuWrapper = new LambdaQueryWrapper<>(); + menuWrapper.eq(SysMenu::getDelFlag, YesOrNotEnum.N.getCode()); + menuWrapper.eq(SysMenu::getStatusFlag, StatusEnum.ENABLE.getCode()); + menuWrapper.eq(SysMenu::getAntdvFrontType, AntdvFrontTypeEnum.FRONT.getCode()); + List sysMenuList = this.list(menuWrapper); + + // 将所有节点转化成树结构,整体只要两级结构,一级是一级菜单,第二级是所有以下菜单 + Map firstLevelMenus = new HashMap<>(); + + // 找到所有第一级的菜单 + for (SysMenu sysMenu : sysMenuList) { + if (TreeConstants.DEFAULT_PARENT_ID.equals(sysMenu.getMenuParentId())) { + firstLevelMenus.put(sysMenu.getMenuId(), sysMenu); + } + } + + // 找到所有二级和以下菜单,并添加到一级菜单以下 + for (Map.Entry menuEntry : firstLevelMenus.entrySet()) { + SysMenu firstLevelMenuItem = menuEntry.getValue(); + List children = firstLevelMenuItem.getChildren(); + if (children == null) { + children = new ArrayList<>(); + firstLevelMenuItem.setChildren(children); + } + for (SysMenu sysMenu : sysMenuList) { + if (sysMenu.getMenuPids().contains("[" + firstLevelMenuItem.getMenuId() + "]")) { + children.add(sysMenu); + } + } + } + + return ListUtil.toList(firstLevelMenus.values()); + } + }