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 aafc12a60..8cec3e925 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 @@ -92,7 +92,6 @@ public interface MenuServiceApi { */ List buildAuthorities(Integer menuFrontType); - /** * 获取角色绑定菜单和按钮权限的树 * @@ -101,4 +100,12 @@ public interface MenuServiceApi { */ List getRoleMenuAndButtons(SysRoleRequest sysRoleRequest); + /** + * 获取角色绑定的菜单列表 + * + * @author fengshuonan + * @date 2022/9/28 16:06 + */ + List getRoleBindMenuList(SysRoleRequest sysRoleRequest); + } diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/enums/AntdvFrontTypeEnum.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/enums/AntdvFrontTypeEnum.java new file mode 100644 index 000000000..a8fea704b --- /dev/null +++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/enums/AntdvFrontTypeEnum.java @@ -0,0 +1,62 @@ +/* + * Copyright [2020-2030] [https://www.stylefeng.cn] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Guns源码头部的版权声明。 + * 3.请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns + * 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns + * 6.若您的项目无法满足以上几点,可申请商业授权 + */ +package cn.stylefeng.roses.kernel.system.api.enums; + +import lombok.Getter; + +/** + * 前台还是后台菜单:1-前台,2-后台,3-前后台都显示 + * + * @author fengshuonan + * @date 2022/9/28 16:54 + */ +@Getter +public enum AntdvFrontTypeEnum { + + /** + * 1-前台 + */ + FRONT(1, "前台"), + + /** + * 2-后台 + */ + BACKEND(2, "后台"), + + /** + * 3-前后台都显示 + */ + TOTAL_SHOW(2, "前后台都显示"); + + private final Integer code; + + private final String message; + + AntdvFrontTypeEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + +} diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/pojo/role/request/SysRoleRequest.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/pojo/role/request/SysRoleRequest.java index da0b26420..e51546c07 100644 --- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/pojo/role/request/SysRoleRequest.java +++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/pojo/role/request/SysRoleRequest.java @@ -50,8 +50,8 @@ public class SysRoleRequest extends BaseRequest { /** * 主键 */ - @NotNull(message = "roleId不能为空", groups = {edit.class, delete.class, detail.class, updateStatus.class, grantResource.class, - grantResourceV2.class, grantDataScope.class, grantMenuButton.class, grantMenu.class, grantButton.class, grantMenusAndButtons.class}) + @NotNull(message = "roleId不能为空", groups = {edit.class, delete.class, detail.class, updateStatus.class, grantResource.class, grantResourceV2.class, grantDataScope.class, + grantMenuButton.class, grantMenu.class, grantButton.class, grantMenusAndButtons.class, roleBindMenuList.class}) @ChineseDescription("主键") private Long roleId; @@ -66,13 +66,7 @@ public class SysRoleRequest extends BaseRequest { * 角色编码 */ @NotBlank(message = "角色编码不能为空", groups = {add.class, edit.class}) - @TableUniqueValue( - message = "角色编码存在重复", - groups = {add.class, edit.class}, - tableName = "sys_role", - columnName = "role_code", - idFieldName = "role_id", - excludeLogicDeleteItems = true) + @TableUniqueValue(message = "角色编码存在重复", groups = {add.class, edit.class}, tableName = "sys_role", columnName = "role_code", idFieldName = "role_id", excludeLogicDeleteItems = true) @ChineseDescription("角色编码") private String roleCode; @@ -236,4 +230,9 @@ public class SysRoleRequest extends BaseRequest { } + /** + * 获取角色绑定的菜单列表 + */ + public @interface roleBindMenuList { + } } 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 47e99c313..f63880a6b 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 @@ -205,4 +205,16 @@ public class SysMenuController { return new SuccessResponseData<>(treeResponseList); } + /** + * 获取角色分配菜单界面,绑定情况列表 + * + * @author fengshuonan + * @date 2022/9/28 16:04 + */ + @GetResource(name = "获取角色分配菜单界面,绑定情况列表", path = "/sysMenu/roleBindMenuList") + public ResponseData> roleBindMenuList(@Validated(SysRoleRequest.roleBindMenuList.class) SysRoleRequest sysRoleRequest) { + List treeResponseList = menuServiceApi.getRoleBindMenuList(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 0e912d410..32bfd0272 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 @@ -178,6 +178,34 @@ public class AntdMenusFactory { return result; } + /** + * 菜单集合转化成角色分配菜单的集合 + *

+ * 转化过程中包含menu的子集 + * + * @author fengshuonan + * @date 2022/9/28 16:42 + */ + public static List parseMenuAndButtonTreeResponseWithChildren(List sysMenuList, List roleBindMenus) { + + // 先转化第一层级的菜单 + List menuAndButtonTreeResponses = parseMenuAndButtonTreeResponse(sysMenuList, roleBindMenus); + + // 转化菜单的子集 + for (SysMenu sysMenu : sysMenuList) { + if (ObjectUtil.isNotEmpty(sysMenu.getChildren())) { + for (MenuAndButtonTreeResponse menuAndButtonTreeRespons : menuAndButtonTreeResponses) { + if (sysMenu.getMenuId().equals(menuAndButtonTreeRespons.getId())) { + List subLevelItems = parseMenuAndButtonTreeResponse(sysMenuList, roleBindMenus); + menuAndButtonTreeRespons.setChildren(subLevelItems); + } + } + } + } + + 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 06c87bbfa..f57cc88c0 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 @@ -42,6 +42,7 @@ import cn.stylefeng.roses.kernel.rule.tree.ztree.ZTreeNode; import cn.stylefeng.roses.kernel.system.api.AppServiceApi; import cn.stylefeng.roses.kernel.system.api.MenuServiceApi; import cn.stylefeng.roses.kernel.system.api.RoleServiceApi; +import cn.stylefeng.roses.kernel.system.api.enums.AntdvFrontTypeEnum; import cn.stylefeng.roses.kernel.system.api.enums.MenuFrontTypeEnum; import cn.stylefeng.roses.kernel.system.api.exception.SystemModularException; import cn.stylefeng.roses.kernel.system.api.exception.enums.menu.SysMenuExceptionEnum; @@ -436,8 +437,6 @@ public class SysMenuServiceImpl extends ServiceImpl impl @Override @Transactional(isolation = Isolation.READ_UNCOMMITTED) public List getRoleMenuAndButtons(SysRoleRequest sysRoleRequest) { - List menuTreeNodeList = CollectionUtil.newArrayList(); - // 查询未删除的启用的菜单列表 LambdaQueryWrapper menuWrapper = new LambdaQueryWrapper<>(); menuWrapper.eq(SysMenu::getDelFlag, YesOrNotEnum.N.getCode()); @@ -479,6 +478,48 @@ public class SysMenuServiceImpl extends ServiceImpl impl return new DefaultTreeBuildFactory().doTreeBuild(menuAndButtonTreeResponses); } + @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); + + // 获取角色绑定的菜单 + 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(sysMenuList, roleMenuList); + } + @Override public List getCurrentUserMenus(List appCodeList, Boolean layuiVisibleFlag, Integer antdvFrontType) {