From ec22f6306d3831c64a2984ca29f675f9fdb30a54 Mon Sep 17 00:00:00 2001 From: stylefeng Date: Fri, 24 Jan 2025 13:47:05 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=908.3.3=E3=80=91=E3=80=90role=E3=80=91?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=B8=AA=E6=8E=A5=E5=8F=A3=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E8=A7=92=E8=89=B2=E5=88=86=E7=B1=BB=E5=92=8C=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E7=BB=84=E6=88=90=E7=9A=84=E6=A0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sys/api/pojo/role/SysRoleTreeDTO.java | 99 +++++++++++++++++++ .../role/enums/RoleTreeNodeTypeEnum.java | 82 +++++++++++++++ .../modular/role/factory/RoleTreeFactory.java | 63 ++++++++++++ .../role/service/RoleCategoryService.java | 9 ++ .../service/impl/RoleCategoryServiceImpl.java | 30 ++++++ 5 files changed, 283 insertions(+) create mode 100644 kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/role/SysRoleTreeDTO.java create mode 100644 kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/enums/RoleTreeNodeTypeEnum.java create mode 100644 kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/factory/RoleTreeFactory.java diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/role/SysRoleTreeDTO.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/role/SysRoleTreeDTO.java new file mode 100644 index 000000000..695203047 --- /dev/null +++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/role/SysRoleTreeDTO.java @@ -0,0 +1,99 @@ +/* + * 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.sys.api.pojo.role; + +import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription; +import cn.stylefeng.roses.kernel.rule.tree.factory.base.AbstractTreeNode; +import lombok.Data; + +import java.util.List; + +/** + * 角色和角色类型组成的机构树的传输bean + * + * @author fengshuonan + * @since 2025/1/24 11:16 + */ +@Data +public class SysRoleTreeDTO implements AbstractTreeNode { + + /** + * 角色分类id或者角色id + */ + @ChineseDescription("角色分类id或者角色id") + private Long roleTreeNodeId; + + /** + * 上级id + */ + @ChineseDescription("上级id") + private Long roleTreeParentNodeId; + + /** + * 角色分类名称或者角色名称 + */ + @ChineseDescription("角色分类名称或者角色名称") + private String roleTreeNodeName; + + /** + * 节点类型:1-角色分类,2-角色 + */ + @ChineseDescription("节点类型:1-角色分类,2-角色") + private Integer nodeType; + + /** + * 角色类型:10-系统角色,15-业务角色,20-公司角色 + */ + @ChineseDescription("角色类型:10-系统角色,15-业务角色,20-公司角色") + private Integer roleType; + + /** + * 子节点 + */ + @ChineseDescription("子节点") + private List children; + + @Override + public String getNodeId() { + if (roleTreeNodeId == null) { + return ""; + } + return roleTreeNodeId.toString(); + } + + @Override + public String getNodeParentId() { + if (roleTreeParentNodeId == null) { + return ""; + } + return roleTreeParentNodeId.toString(); + } + + @Override + public void setChildrenNodes(List childrenNodes) { + this.children = childrenNodes; + } + +} diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/enums/RoleTreeNodeTypeEnum.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/enums/RoleTreeNodeTypeEnum.java new file mode 100644 index 000000000..de235613a --- /dev/null +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/enums/RoleTreeNodeTypeEnum.java @@ -0,0 +1,82 @@ +/* + * 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.sys.modular.role.enums; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import cn.stylefeng.roses.kernel.rule.base.ReadableEnum; +import lombok.Getter; + +/** + * 角色分类组成的树节点 + * + * @author fengshuonan + * @since 2025/1/24 13:36 + */ +@Getter +public enum RoleTreeNodeTypeEnum implements ReadableEnum { + + /** + * 角色分类 + */ + ROLE_CATEGORY(1, "角色分类"), + + /** + * 角色 + */ + ROLE(2, "角色"); + + private final Integer code; + + private final String message; + + RoleTreeNodeTypeEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + @Override + public Object getKey() { + return this.code; + } + + @Override + public Object getName() { + return this.message; + } + + @Override + public RoleTreeNodeTypeEnum parseToEnum(String originValue) { + if (ObjectUtil.isEmpty(originValue)) { + return null; + } + for (RoleTreeNodeTypeEnum value : RoleTreeNodeTypeEnum.values()) { + if (value.code.equals(Convert.toInt(originValue))) { + return value; + } + } + return null; + } +} diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/factory/RoleTreeFactory.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/factory/RoleTreeFactory.java new file mode 100644 index 000000000..cd1736084 --- /dev/null +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/factory/RoleTreeFactory.java @@ -0,0 +1,63 @@ +package cn.stylefeng.roses.kernel.sys.modular.role.factory; + +import cn.hutool.core.util.ObjectUtil; +import cn.stylefeng.roses.kernel.rule.constants.TreeConstants; +import cn.stylefeng.roses.kernel.sys.api.pojo.role.SysRoleTreeDTO; +import cn.stylefeng.roses.kernel.sys.modular.role.entity.RoleCategory; +import cn.stylefeng.roses.kernel.sys.modular.role.entity.SysRole; +import cn.stylefeng.roses.kernel.sys.modular.role.enums.RoleTreeNodeTypeEnum; + +import java.util.ArrayList; +import java.util.List; + +/** + * 角色树构建工厂 + * + * @author fengshuonan + * @since 2025/1/24 12:27 + */ +public class RoleTreeFactory { + + /** + * 创建角色和角色分类组成的树结构 + * + * @author fengshuonan + * @since 2025/1/24 13:33 + */ + public static List createRoleTree(List roleCategoryList, List sysRoleList) { + + List roleTreeList = new ArrayList<>(); + + // 先将角色分类放入到树结构中 + for (RoleCategory roleCategory : roleCategoryList) { + SysRoleTreeDTO roleTree = new SysRoleTreeDTO(); + roleTree.setRoleTreeNodeId(roleCategory.getId()); + roleTree.setRoleTreeParentNodeId(roleCategory.getCategoryParentId()); + roleTree.setRoleTreeNodeName(roleCategory.getRoleCategoryName()); + roleTree.setNodeType(RoleTreeNodeTypeEnum.ROLE_CATEGORY.getCode()); + roleTree.setRoleType(roleCategory.getCategoryType()); + roleTreeList.add(roleTree); + } + + // 将角色放在树结构中 + for (SysRole sysRole : sysRoleList) { + SysRoleTreeDTO roleTree = new SysRoleTreeDTO(); + roleTree.setRoleTreeNodeId(sysRole.getRoleId()); + + // 角色如果有分类,则设置角色的父级id为角色分类id,如果没有,则直接个挂载根下边 + if (ObjectUtil.isNotEmpty(sysRole.getRoleCategoryId())) { + roleTree.setRoleTreeParentNodeId(sysRole.getRoleCategoryId()); + } else { + roleTree.setRoleTreeParentNodeId(TreeConstants.DEFAULT_PARENT_ID); + } + + roleTree.setRoleTreeNodeName(sysRole.getRoleName()); + roleTree.setNodeType(RoleTreeNodeTypeEnum.ROLE.getCode()); + roleTree.setRoleType(sysRole.getRoleType()); + roleTreeList.add(roleTree); + } + + return roleTreeList; + } + +} diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/RoleCategoryService.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/RoleCategoryService.java index eb42edd28..832a6add8 100644 --- a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/RoleCategoryService.java +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/RoleCategoryService.java @@ -1,5 +1,6 @@ package cn.stylefeng.roses.kernel.sys.modular.role.service; +import cn.stylefeng.roses.kernel.sys.api.pojo.role.SysRoleTreeDTO; import cn.stylefeng.roses.kernel.sys.modular.role.entity.RoleCategory; import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.RoleCategoryRequest; import com.baomidou.mybatisplus.extension.service.IService; @@ -60,4 +61,12 @@ public interface RoleCategoryService extends IService { */ RoleCategory detail(RoleCategoryRequest roleCategoryRequest); + /** + * 获取角色分类和角色组成的树结构 + * + * @author fengshuonan + * @since 2025/1/24 11:10 + */ + List roleCategoryAndRoleTreeList(Integer roleType, Long companyId); + } diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/RoleCategoryServiceImpl.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/RoleCategoryServiceImpl.java index cdf81b1f7..bdd3f82fa 100644 --- a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/RoleCategoryServiceImpl.java +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/RoleCategoryServiceImpl.java @@ -8,11 +8,15 @@ import cn.stylefeng.roses.kernel.rule.pidset.CalcParentIdListUtil; import cn.stylefeng.roses.kernel.rule.pidset.callback.PidGetterService; import cn.stylefeng.roses.kernel.rule.pidset.pojo.ParentIdInfoPojo; import cn.stylefeng.roses.kernel.rule.tree.factory.DefaultTreeBuildFactory; +import cn.stylefeng.roses.kernel.sys.api.pojo.role.SysRoleTreeDTO; import cn.stylefeng.roses.kernel.sys.modular.role.entity.RoleCategory; +import cn.stylefeng.roses.kernel.sys.modular.role.entity.SysRole; import cn.stylefeng.roses.kernel.sys.modular.role.enums.RoleCategoryExceptionEnum; +import cn.stylefeng.roses.kernel.sys.modular.role.factory.RoleTreeFactory; import cn.stylefeng.roses.kernel.sys.modular.role.mapper.RoleCategoryMapper; import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.RoleCategoryRequest; import cn.stylefeng.roses.kernel.sys.modular.role.service.RoleCategoryService; +import cn.stylefeng.roses.kernel.sys.modular.role.service.SysRoleService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -36,6 +40,9 @@ public class RoleCategoryServiceImpl extends ServiceImpl treeList(RoleCategoryRequest roleCategoryRequest) { LambdaQueryWrapper wrapper = this.createWrapper(roleCategoryRequest); @@ -104,6 +111,29 @@ public class RoleCategoryServiceImpl extends ServiceImpl roleCategoryAndRoleTreeList(Integer roleType, Long companyId) { + + // 根据业务类型或者公司类型,获取所有的角色分类列表 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(RoleCategory::getCategoryType, roleType); + if (ObjectUtil.isNotEmpty(companyId)) { + queryWrapper.eq(RoleCategory::getCompanyId, companyId); + } + List roleCategoryList = this.list(queryWrapper); + + // 根据业务类型,获取所有的角色列表 + LambdaQueryWrapper roleQueryWrapper = new LambdaQueryWrapper<>(); + roleQueryWrapper.eq(SysRole::getRoleType, roleType); + if (ObjectUtil.isNotEmpty(companyId)) { + roleQueryWrapper.eq(SysRole::getRoleCompanyId, companyId); + } + List sysRoleList = this.sysRoleService.list(roleQueryWrapper); + + // 将角色类型和角色树组成一颗完整的树 + return RoleTreeFactory.createRoleTree(roleCategoryList, sysRoleList); + } + /** * 获取信息 *