From d1f63a5aebc20a3605c120f5231d75605c9a247c Mon Sep 17 00:00:00 2001 From: lilong Date: Fri, 12 Apr 2024 16:59:44 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat:(REQ-2227)=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=A7=92=E8=89=B2=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/client/feign/TyrSaasRoleApi.java | 5 +- .../tyr/client/model/vo/DeleteRoleVO.java | 36 ++++++ .../controller/role/SaasRoleController.java | 13 +- .../axzo/tyr/server/service/RoleService.java | 10 +- .../server/service/impl/RoleServiceImpl.java | 117 ++++++++++++------ 5 files changed, 136 insertions(+), 45 deletions(-) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/DeleteRoleVO.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java index 98518200..511e0286 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java @@ -11,7 +11,6 @@ import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; import cn.axzo.tyr.client.model.req.TreeRoleReq; -import cn.axzo.tyr.client.model.req.UpdateRoleGroupOffsetReq; import cn.axzo.tyr.client.model.req.UpdateRoleOffsetReq; import cn.axzo.tyr.client.model.res.FeatureRoleRelationResp; import cn.axzo.tyr.client.model.res.IsSuperAdminRes; @@ -20,6 +19,7 @@ import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; import cn.axzo.tyr.client.model.res.RoleTreeRes; import cn.axzo.tyr.client.model.res.RoleWithUserRes; import cn.axzo.tyr.client.model.res.SaasRoleRes; +import cn.axzo.tyr.client.model.vo.DeleteRoleVO; import cn.axzo.tyr.client.model.vo.SaasRoleAndGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; import cn.axzo.tyr.client.model.vo.SaasRoleGroupCodeVO; @@ -77,8 +77,7 @@ public interface TyrSaasRoleApi { * 删除 */ @PostMapping("/api/saasRole/delete") - @Deprecated - ApiResult delete(@RequestBody List id); + ApiResult delete(@RequestBody DeleteRoleVO request); /** diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/DeleteRoleVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/DeleteRoleVO.java new file mode 100644 index 00000000..96f0c10d --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/DeleteRoleVO.java @@ -0,0 +1,36 @@ +package cn.axzo.tyr.client.model.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeleteRoleVO { + /** + * 待删除角色集合 + */ + @NotEmpty(message = "roleIds不能为空") + private List roleIds; + + /** + * 待删除角色所属workSpaceId 历史接口需要 + */ + private Long workSpaceId; + + /** + * 待删除角色所属单位ID 历史接口需要 + */ + private Long outId; + + /** + * 历史接口对已经有user绑定到role有进行check,不能删除 + */ + private boolean needUsedCheck; +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index 985a3469..d2667ed0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -25,6 +25,7 @@ import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; import cn.axzo.tyr.client.model.res.RoleTreeRes; import cn.axzo.tyr.client.model.res.RoleWithUserRes; import cn.axzo.tyr.client.model.res.SaasRoleRes; +import cn.axzo.tyr.client.model.vo.DeleteRoleVO; import cn.axzo.tyr.client.model.vo.SaasRoleAndGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; import cn.axzo.tyr.client.model.vo.SaasRoleGroupCodeVO; @@ -135,13 +136,21 @@ public class SaasRoleController implements TyrSaasRoleApi { @Override public ApiResult deleteRole(List roleIds, Long workSpaceId, Long outId) { - roleService.deleteRole(roleIds, workSpaceId, outId); + DeleteRoleVO deleteRoleParam = DeleteRoleVO.builder() + .roleIds(roleIds) + .workSpaceId(workSpaceId) + .outId(outId) + .needUsedCheck(true) + .build(); + roleService.deleteRole(deleteRoleParam); permissionCacheService.markTempDisable(PermissionCacheKey.builder().disableAll(true).build()); return ApiResult.ok(); } @Override - public ApiResult delete(List roleIds) { + public ApiResult delete(DeleteRoleVO reqeust) { + roleService.deleteRole(reqeust); + permissionCacheService.markTempDisable(PermissionCacheKey.builder().disableAll(true).build()); return ApiResult.ok(); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java index 69af777c..8e7631aa 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java @@ -17,6 +17,7 @@ import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; import cn.axzo.tyr.client.model.res.RoleWithUserRes; import cn.axzo.tyr.client.model.res.SaasRoleRes; +import cn.axzo.tyr.client.model.vo.DeleteRoleVO; import cn.axzo.tyr.client.model.vo.SaasRoleAndGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; import cn.axzo.tyr.client.model.vo.SaasRoleGroupCodeVO; @@ -100,11 +101,9 @@ public interface RoleService extends IService { /** * 删除角色列表 - * @param roleIds 待删除角色集合 - * @param workSpaceId 待删除角色所属workSpaceId - * @param outId 待删除角色所属单位ID + * @param deleteRoleParam */ - void deleteRole(List roleIds,Long workSpaceId,Long outId); + void deleteRole(DeleteRoleVO deleteRoleParam); List queryRoleByFeatures(Set matchedFeatureIds); @@ -142,6 +141,9 @@ public interface RoleService extends IService { @CriteriaField(field = "isDisplay", operator = Operator.EQ) private Boolean isDisplay; + @CriteriaField(field = "roleCode", operator = Operator.EQ) + private String roleCode; + @CriteriaField(ignore = true) private Boolean needPermission; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 6ac8177d..9bcc3fe8 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -27,6 +27,7 @@ import cn.axzo.tyr.client.model.res.RoleWithUserRes; import cn.axzo.tyr.client.model.res.SaasPermissionRes; import cn.axzo.tyr.client.model.res.SaasRoleGroupRes; import cn.axzo.tyr.client.model.res.SaasRoleRes; +import cn.axzo.tyr.client.model.vo.DeleteRoleVO; import cn.axzo.tyr.client.model.vo.SaasPermissionGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleAndGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; @@ -459,12 +460,39 @@ public class RoleServiceImpl extends ServiceImpl return saasRoleDao.listRoleUserByPermissionGroup(permissionGroupIdList, workspaceIds); } + private void checkRoleCode(SaveOrUpdateRoleVO saveOrUpdateRole) { + + if (StringUtils.isBlank(saveOrUpdateRole.getRoleCode())) { + return; + } + List oldSaasRoles = this.list(ListSaasRoleParam.builder() + .roleCode(saveOrUpdateRole.getRoleCode()) + .build()); + if (CollectionUtils.isNotEmpty(oldSaasRoles)) { + throw new ServiceException("角色编码已存在"); + } + } + + /** + * roleType = 自定义,common,workspaceType = saveOrUpdateRole.workspaceType + * 其他就从角色组取,没有就saveOrUpdateRole.workspaceType + * @param saveOrUpdateRole + * @return + */ + private Integer resolveWorkspaceType(SaveOrUpdateRoleVO saveOrUpdateRole) { + if (COMMON_ROLE_TYPES.contains(saveOrUpdateRole.getRoleType()) || CollectionUtils.isEmpty(saveOrUpdateRole.getGroupTree())) { + return saveOrUpdateRole.getWorkspaceType(); + } + return Integer.parseInt(saveOrUpdateRole.getGroupTree().get(0).getWorkspaceTypeCode()); + } + private SaasRole validAndBuildRole(SaveOrUpdateRoleVO saveOrUpdateRole, Date now) { SaasRole saasRole; if (Objects.isNull(saveOrUpdateRole.getId())) { saasRole = new SaasRole(); saasRole.setCreateBy(saveOrUpdateRole.getOperatorId()); saasRole.setCreateAt(now); + checkRoleCode(saveOrUpdateRole); } else { saasRole = saasRoleDao.getById(saveOrUpdateRole.getId()); if (Objects.isNull(saasRole)) { @@ -479,14 +507,9 @@ public class RoleServiceImpl extends ServiceImpl saasRole.setRoleType(saveOrUpdateRole.getRoleType()); saasRole.setWorkspaceId(saveOrUpdateRole.getWorkspaceId()); saasRole.setOwnerOuId(saveOrUpdateRole.getOwnerOuId()); - // roleType = 自定义,common,workspaceType = saveOrUpdateRole.workspaceType - // 其他就从角色组取,没有就saveOrUpdateRole.workspaceType - Integer workspaceType = null; - if (COMMON_ROLE_TYPES.contains(saveOrUpdateRole.getRoleType()) || CollectionUtils.isEmpty(saveOrUpdateRole.getGroupTree())) { - workspaceType = saveOrUpdateRole.getWorkspaceType(); - } else { - workspaceType = Integer.parseInt(saveOrUpdateRole.getGroupTree().get(0).getWorkspaceTypeCode()); - } + Integer workspaceType = resolveWorkspaceType(saveOrUpdateRole); + saasRole.setWorkspaceType(workspaceType); + if (CollectionUtils.isNotEmpty(saveOrUpdateRole.getGroupTree())) { saasRole.setProductUnitType(setProductUnitType(saveOrUpdateRole.getGroupTree().get(0))); } else { @@ -509,6 +532,7 @@ public class RoleServiceImpl extends ServiceImpl systemAndCustomWorkspaceCodes.add(Long.valueOf(workspaceType)); systemAndCustomWorkspaceCodes.add(-1L); + List systemAndCustomOuIds = new ArrayList<>(); systemAndCustomOuIds.add(saveOrUpdateRole.getOwnerOuId()); systemAndCustomOuIds.add(-1L); @@ -542,14 +566,19 @@ public class RoleServiceImpl extends ServiceImpl } }); } - saasRole.setSort(saveOrUpdateRole.getSort()); assembleSort(saveOrUpdateRole, saasRole); return saasRole; } private void assembleSort(SaveOrUpdateRoleVO saveOrUpdateRole, SaasRole saasRole) { - if (saasRole.getSort() != null || saasRole.getId() != null || CollectionUtils.isEmpty(saveOrUpdateRole.getGroupTree())) { + if (saveOrUpdateRole.getSort() != null) { + saasRole.setSort(saveOrUpdateRole.getSort()); + return; + } + + // 新增时且没有传sort时,才自动维护一个最大的sort + if (saasRole.getId() != null || CollectionUtils.isEmpty(saveOrUpdateRole.getGroupTree())) { return; } @@ -834,20 +863,26 @@ public class RoleServiceImpl extends ServiceImpl @Override @Transactional(rollbackFor = Exception.class) - public void deleteRole(List roleIds, Long workSpaceId, Long ouId) { - List saasRoleUserRelations = roleUserRelationDao.lambdaQuery() - .in(CollectionUtil.isNotEmpty(roleIds), SaasRoleUserRelation::getRoleId, roleIds) - .eq(workSpaceId != null, SaasRoleUserRelation::getWorkspaceId, workSpaceId) - .eq(ouId != null, SaasRoleUserRelation::getOuId, ouId) - .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value) - .list(); + public void deleteRole(DeleteRoleVO deleteRoleParam) { - if (CollectionUtil.isNotEmpty(saasRoleUserRelations)) { - throw new cn.axzo.basics.common.exception.ServiceException("当前角色已被用户使用,无法删除!"); + if (BooleanUtils.isTrue(deleteRoleParam.isNeedUsedCheck())) { + List saasRoleUserRelations = roleUserRelationDao.lambdaQuery() + .in(CollectionUtil.isNotEmpty(deleteRoleParam.getRoleIds()), SaasRoleUserRelation::getRoleId, deleteRoleParam.getRoleIds()) + .eq(deleteRoleParam.getWorkSpaceId() != null, SaasRoleUserRelation::getWorkspaceId, deleteRoleParam.getWorkSpaceId()) + .eq(deleteRoleParam.getOutId() != null, SaasRoleUserRelation::getOuId, deleteRoleParam.getOutId()) + .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .list(); + + if (CollectionUtil.isNotEmpty(saasRoleUserRelations)) { + throw new cn.axzo.basics.common.exception.ServiceException("当前角色已被用户使用,无法删除!"); + } } - saasRoleDao.delete(roleIds); - roleUserRelationDao.deleteByRoleId(roleIds); - roleGroupRelationDao.deleteGroupRelation(roleIds); + + saasRoleDao.delete(deleteRoleParam.getRoleIds()); + // 未根据id进行更新,会存在死锁的风险,但是角色的操作频率很低,可以先不考虑 + roleUserRelationDao.deleteByRoleId(deleteRoleParam.getRoleIds()); + roleGroupRelationDao.deleteGroupRelation(deleteRoleParam.getRoleIds()); + saasPgroupRoleRelationDao.deleteByRoleId(deleteRoleParam.getRoleIds()); } @Override @@ -1162,14 +1197,7 @@ public class RoleServiceImpl extends ServiceImpl return permissionIds.stream() .map(permissionId -> { SaasPermissionRes saasPermissionRes = resourcePermissions.get(permissionId); - if (saasPermissionRes == null) { - return null; - } - return SaasPermissionWrapper.builder() - .id(saasPermissionRes.getId()) - .featureCode(saasPermissionRes.getFeatureCode()) - .roleId(e.getRoleId()) - .build(); + return SaasPermissionWrapper.from(e, saasPermissionRes); }) .filter(Objects::nonNull) .collect(Collectors.toList()); @@ -1196,6 +1224,18 @@ public class RoleServiceImpl extends ServiceImpl private String featureCode; private Long roleId; + + public static SaasPermissionWrapper from(SaasPgroupRoleRelation saasPgroupRoleRelation, + SaasPermissionRes saasPermissionRes) { + if (saasPermissionRes == null) { + return null; + } + return SaasPermissionWrapper.builder() + .id(saasPermissionRes.getId()) + .featureCode(saasPermissionRes.getFeatureCode()) + .roleId(saasPgroupRoleRelation.getRoleId()) + .build(); + } } private Map> listRoleGroups(PageSaasRoleParam param, @@ -1220,18 +1260,23 @@ public class RoleServiceImpl extends ServiceImpl .collect(Collectors.toMap(SaasRoleGroup::getId, Function.identity())); return roleGroupRelations.stream() + .filter(e -> saasRoleGroups.get(e.getSaasRoleGroupId()) != null) .collect(Collectors.groupingBy(SaasRoleGroupRelation::getRoleId, Collectors.mapping(e -> { SaasRoleGroup saasRoleGroup = saasRoleGroups.get(e.getSaasRoleGroupId()); - if (saasRoleGroup == null) { - return null; - } - SaasRoleGroupRes saasRoleGroupRes = SaasRoleGroupRes.builder().build(); - BeanUtils.copyProperties(saasRoleGroup, saasRoleGroupRes); - return saasRoleGroupRes; + return toRoleGroupRes(saasRoleGroup); }, Collectors.toList()))); } + private SaasRoleGroupRes toRoleGroupRes(SaasRoleGroup saasRoleGroup) { + if (saasRoleGroup == null) { + return null; + } + SaasRoleGroupRes saasRoleGroupRes = SaasRoleGroupRes.builder().build(); + BeanUtils.copyProperties(saasRoleGroup, saasRoleGroupRes); + return saasRoleGroupRes; + } + @Transactional(rollbackFor = Exception.class) public void saveOrUpdateFeatureRoleRelation(List req, Long operatorId) { for (FeatureRoleRelationReq item : req) { From c54fe0e6349c1b0686ff5cb2740ca48b10814db4 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Fri, 12 Apr 2024 17:28:14 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=90=8C=E6=AD=A5=E5=88=A0=E9=99=A4=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E7=9B=B8=E5=85=B3=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/SaasPgroupPermissionRelationService.java | 2 ++ .../service/impl/SaasFeatureResourceServiceImpl.java | 5 +++-- .../impl/SaasPgroupPermissionRelationServiceImpl.java | 11 +++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupPermissionRelationService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupPermissionRelationService.java index a32f8627..21ecc4e7 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupPermissionRelationService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupPermissionRelationService.java @@ -6,4 +6,6 @@ import java.util.List; public interface SaasPgroupPermissionRelationService { void saveOrUpdate(List groupIds, List relations); + + void deleteByFeatureIds(List featureIds); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index d349f242..77b7d5c0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -26,6 +26,7 @@ import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.service.RoleService; import cn.axzo.tyr.server.service.SaasCommonDictService; import cn.axzo.tyr.server.service.SaasFeatureResourceService; +import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService; import cn.azxo.framework.common.utils.StringUtils; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Assert; @@ -72,7 +73,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic private final SaasFeatureResourceCacheService saasFeatureResourceCacheService; private final SaasCommonDictService saasCommonDictService; - private final PermissionGroupImpl roleService; + private final SaasPgroupPermissionRelationService pgroupPermissionRelationService; @Override public List listNavByIds(List featureIds) { @@ -317,7 +318,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic .apply("FIND_IN_SET('" + featureId + "', path)") .list(); List featureIds = featureDescendant.stream().map(SaasFeatureResource::getId).collect(Collectors.toList()); - + pgroupPermissionRelationService.deleteByFeatureIds(featureIds); // 删除自己及自己的子集 featureResourceDao.lambdaUpdate() .eq(BaseEntity::getIsDelete,0) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupPermissionRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupPermissionRelationServiceImpl.java index 65106522..9ad46caf 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupPermissionRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupPermissionRelationServiceImpl.java @@ -4,6 +4,7 @@ import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao; import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation; import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService; +import cn.hutool.core.collection.CollectionUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -46,4 +47,14 @@ public class SaasPgroupPermissionRelationServiceImpl implements SaasPgroupPermis saasPgroupPermissionRelationDao.removeByIds(deleteList.stream().map(SaasPgroupPermissionRelation::getId).sorted().collect(Collectors.toList())); } } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByFeatureIds(List featureIds) { + if (CollectionUtil.isEmpty(featureIds)) { + return; + } + saasPgroupPermissionRelationDao.removeByPermissionPointIds(featureIds); + + } } From 43ee7c4beae3583e97a37fe550c8a1a41fd6a8b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=86=E9=B9=8F?= Date: Fri, 12 Apr 2024 17:31:10 +0800 Subject: [PATCH 3/5] =?UTF-8?q?feat(2227-userRole):=20=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=A2=9E=E5=8A=A0=E8=BF=94=E5=9B=9E=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E5=B1=95=E7=A4=BA=E8=A7=92=E8=89=B2=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/client/model/roleuser/dto/SaasRoleUserDTO.java | 5 +++++ .../server/service/impl/SaasRoleUserRelationServiceImpl.java | 1 + 2 files changed, 6 insertions(+) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserDTO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserDTO.java index e90e314e..de34a173 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserDTO.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserDTO.java @@ -84,4 +84,9 @@ public class SaasRoleUserDTO { * 资源Id */ private Long resourceId; + + /** + * 是否展示角色 + */ + private Boolean displayRole; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java index 18354252..ff99b73e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java @@ -61,6 +61,7 @@ public class SaasRoleUserRelationServiceImpl implements SaasRoleUserRelationServ userRole.setRoleName(role.getName()); userRole.setDescription(role.getDescription()); userRole.setRoleType(RoleTypeEnum.getRoleType(role.getRoleType())); + userRole.setDisplayRole(role.getIsDisplay()); return userRole; }).collect(Collectors.toList()); } From 6a10e43dd6ed2c69b03e90a068cdf58f7ae2fdee Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Mon, 15 Apr 2024 10:27:58 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E8=A7=92=E8=89=B2=E6=94=B9=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=8D=95=E4=B8=AA=E9=A1=B5=E9=9D=A2=E7=9A=84=EF=BC=8C?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E6=8E=A5=E5=8F=A3=E8=BF=94=E5=9B=9EId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/feign/FeatureResourceApi.java | 2 +- .../axzo/tyr/client/feign/TyrSaasRoleApi.java | 2 +- .../permission/FeatureResourceController.java | 7 ++-- .../controller/role/SaasRoleController.java | 2 +- .../axzo/tyr/server/service/RoleService.java | 2 +- .../service/SaasFeatureResourceService.java | 4 +- .../server/service/impl/RoleServiceImpl.java | 39 ++++++++----------- .../impl/SaasFeatureResourceServiceImpl.java | 14 ++++++- 8 files changed, 41 insertions(+), 31 deletions(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java index 3b9c4267..72f9f84d 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java @@ -36,7 +36,7 @@ public interface FeatureResourceApi { ApiResult syncFromBase(@RequestBody @Valid ResourceSyncReq req); @PostMapping("/api/featureResource/saveOrUpdate") - ApiResult saveMenu(@RequestBody FeatureResourceTreeSaveReq req); + ApiResult saveMenu(@RequestBody FeatureResourceTreeSaveReq req); /** 查询功能资源树 **/ @PostMapping("/api/featureResource/getTree") diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java index 511e0286..f897b06a 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java @@ -57,7 +57,7 @@ public interface TyrSaasRoleApi { /** 角色和组件页面的关联关系 **/ @PostMapping("/api/saasRoleGroup/relation/query") - ApiResult> queryFeatureRoleRelation(@RequestParam Long featureId); + ApiResult queryFeatureRoleRelation(@RequestParam Long featureId); /** * 根据id查询详情 diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java index f987f67e..5b3f736e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java @@ -49,10 +49,11 @@ public class FeatureResourceController implements FeatureResourceApi { } @Override - public ApiResult saveMenu(FeatureResourceTreeSaveReq req) { + public ApiResult saveMenu(FeatureResourceTreeSaveReq req) { log.info("save feature resource req : " + req.toString()); - featureResourceService.saveOrUpdateMenu(req); - return ApiResult.ok(); + Long featureId = featureResourceService.saveOrUpdateMenu(req); + log.info("save feature resource resp : " + featureId.toString()); + return ApiResult.ok(featureId); } @Override diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index d2667ed0..5a5905dc 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -112,7 +112,7 @@ public class SaasRoleController implements TyrSaasRoleApi { } @Override - public ApiResult> queryFeatureRoleRelation(Long featureId) { + public ApiResult queryFeatureRoleRelation(Long featureId) { return ApiResult.ok(roleService.queryFeatureRoleRelation(featureId)); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java index 8e7631aa..db295c7b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java @@ -124,7 +124,7 @@ public interface RoleService extends IService { void saveOrUpdateFeatureRoleRelation(List req, Long operatorId); - List queryFeatureRoleRelation(Long featureId); + FeatureRoleRelationResp queryFeatureRoleRelation(Long featureId); @SuperBuilder @Data diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java index c5d29eab..c4a612a9 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -19,13 +19,15 @@ import java.util.List; */ public interface SaasFeatureResourceService { - void saveOrUpdateMenu(FeatureResourceTreeSaveReq req); + Long saveOrUpdateMenu(FeatureResourceTreeSaveReq req); void updateFeatureAuthType(Long featureId, Integer authType); /**递归的**/ List listDescendant(Long featureId); + SaasFeatureResource featureResourceById(Long featureId); + FeatureResourceTreeNode getTreeFeatureDescendant(Long featureId); /**删除指定菜单**/ diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 9bcc3fe8..b413f6c2 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -68,6 +68,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -92,6 +93,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -1277,6 +1279,7 @@ public class RoleServiceImpl extends ServiceImpl return saasRoleGroupRes; } + @Override @Transactional(rollbackFor = Exception.class) public void saveOrUpdateFeatureRoleRelation(List req, Long operatorId) { for (FeatureRoleRelationReq item : req) { @@ -1314,30 +1317,22 @@ public class RoleServiceImpl extends ServiceImpl } @Override - public List queryFeatureRoleRelation(Long featureId) { - List list = saasFeatureResourceService.listDescendant(featureId); - List featureIds = list.stream().map(SaasFeatureResource::getId).collect(Collectors.toList()); - - List pgroupPermissionRelations = saasPgroupPermissionRelationDao.queryByFeatureIds(featureIds); - Map> permissionMap = pgroupPermissionRelations.stream().collect(Collectors.groupingBy(SaasPgroupPermissionRelation::getFeatureId)); - List groupIds = pgroupPermissionRelations.stream().map(SaasPgroupPermissionRelation::getGroupId).collect(Collectors.toList()); - List relations = saasPgroupRoleRelationDao.listByGroupIds(groupIds); - - List resps = new ArrayList<>(); - list.forEach(item -> { - FeatureRoleRelationResp resp = new FeatureRoleRelationResp(); - resp.setFeatureId(item.getId()); - resp.setAuthType(item.getAuthType()); - List groups = permissionMap.get(item.getId()); - if (CollectionUtil.isNotEmpty(groups)) { - List itemGroupIds = groups.stream().map(SaasPgroupPermissionRelation::getGroupId).collect(Collectors.toList()); - List itemRoles = relations.stream().filter(role -> itemGroupIds.contains(role.getGroupId())).collect(Collectors.toList()); - List roleIds = itemRoles.stream().map(SaasPgroupRoleRelation::getRoleId).collect(Collectors.toList()); + public FeatureRoleRelationResp queryFeatureRoleRelation(Long featureId) { + SaasFeatureResource featureResource = saasFeatureResourceService.featureResourceById(featureId); + Assert.notNull(featureResource, "菜单不存在"); + FeatureRoleRelationResp resp = new FeatureRoleRelationResp(); + resp.setFeatureId(featureId); + resp.setAuthType(featureResource.getAuthType()); + List pgroupPermissionRelations = saasPgroupPermissionRelationDao.queryByFeatureIds(Collections.singletonList(featureId)); + if (CollectionUtil.isNotEmpty(pgroupPermissionRelations)) { + List groupIds = pgroupPermissionRelations.stream().map(SaasPgroupPermissionRelation::getGroupId).collect(Collectors.toList()); + List relations = saasPgroupRoleRelationDao.listByGroupIds(groupIds); + if (CollectionUtil.isNotEmpty(relations)) { + List roleIds = relations.stream().map(SaasPgroupRoleRelation::getRoleId).collect(Collectors.toList()); resp.setRoleIds(roleIds); } - resps.add(resp); - }); - return resps; + } + return resp; } private void validPermission(Set permissionIds) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 77b7d5c0..98d49f94 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -192,7 +192,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic @Override @Transactional(rollbackFor = Exception.class) @CacheEvict(value = SaasFeatureResourceCacheService.CACHE_FEATURE_RESOURCE_TREE,allEntries = true) - public void saveOrUpdateMenu(FeatureResourceTreeSaveReq req) { + public Long saveOrUpdateMenu(FeatureResourceTreeSaveReq req) { SaasFeatureResource baseResource = BeanMapper.copyBean(req, SaasFeatureResource.class); baseResource.setUpdateBy(req.getOperatorId()); // 新增时候 @@ -223,6 +223,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } else { deleteComponentRecursionById(baseResource.getId(), null, req.getOperatorId()); } + return baseResource.getId(); } @Override @@ -306,6 +307,17 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic .list(); } + @Override + public SaasFeatureResource featureResourceById(Long featureId) { + if (featureId == null) { + return null; + } + return featureResourceDao.lambdaQuery() + .eq(BaseEntity::getIsDelete,0) + .eq(SaasFeatureResource::getId, featureId) + .one(); + } + @Override @Transactional(rollbackFor = Exception.class) @CacheEvict(value = SaasFeatureResourceCacheService.CACHE_FEATURE_RESOURCE_TREE,allEntries = true) From b33f5d10d343a505423c9f069bd5a215c1a697d5 Mon Sep 17 00:00:00 2001 From: lilong Date: Mon, 15 Apr 2024 11:18:56 +0800 Subject: [PATCH 5/5] =?UTF-8?q?feat:(REQ-2227)=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=B8=85=E6=B4=97=E8=A7=92=E8=89=B2=E3=80=81=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E7=BB=84=E9=A1=BA=E5=BA=8F=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/controller/PrivateController.java | 151 ++++++++++++++++++ .../server/service/SaasRoleGroupService.java | 4 +- .../impl/SaasRoleGroupServiceImpl.java | 5 +- 3 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java new file mode 100644 index 00000000..865ae3c8 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java @@ -0,0 +1,151 @@ +package cn.axzo.tyr.server.controller; + +import cn.axzo.tyr.client.model.req.CommonDictQueryReq; +import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; +import cn.axzo.tyr.client.model.res.CommonDictResp; +import cn.axzo.tyr.client.model.res.SaasRoleRes; +import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; +import cn.axzo.tyr.server.repository.dao.SaasRoleGroupRelationDao; +import cn.axzo.tyr.server.repository.entity.SaasRole; +import cn.axzo.tyr.server.repository.entity.SaasRoleGroup; +import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; +import cn.axzo.tyr.server.service.RoleService; +import cn.axzo.tyr.server.service.SaasCommonDictService; +import cn.axzo.tyr.server.service.SaasRoleGroupService; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Collection; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +@RestController +@RequiredArgsConstructor +public class PrivateController { + + @Autowired + private SaasCommonDictService saasCommonDictService; + @Autowired + private SaasRoleGroupService saasRoleGroupService; + @Autowired + private SaasRoleGroupRelationDao saasRoleGroupRelationDao; + @Autowired + private RoleService roleService; + + /** + * 统一层级的roleGroup按照id升序,sort从1递增 + * @return + * @throws Exception + */ + @PostMapping("/private/role/group/sort/refresh") + public Object refreshRoleGroupSort() { + List commonDicts = saasCommonDictService.query(CommonDictQueryReq.builder() + .scope("role") + .build()); + + if (CollectionUtils.isEmpty(commonDicts)) { + return "ok"; + } + + Map> roleGroups = saasRoleGroupService.getList(QuerySaasRoleGroupReq.builder() + .workspaceTypeCode(Lists.transform(commonDicts, CommonDictResp::getDictCode)) + .build()) + .stream() + .collect(Collectors.groupingBy(SaasRoleGroupVO::getWorkspaceTypeCode)); + + roleGroups.entrySet() + .forEach(e -> { + List saasRoleGroups = e.getValue().stream() + .sorted(Comparator.comparing(SaasRoleGroupVO::getId)) + .collect(Collectors.toList()); + + List update = IntStream.range(0, saasRoleGroups.size()) + .mapToObj(i -> { + SaasRoleGroupVO saasRoleGroup = saasRoleGroups.get(i); + SaasRoleGroup result = SaasRoleGroup.builder() + .sort(i + 1) + .build(); + result.setId(saasRoleGroup.getId()); + return result; + }) + .collect(Collectors.toList()); + + saasRoleGroupService.updateBatchById(update); + }); + + return "ok"; + } + + /** + * 刷新role的sort, + * @return + * @throws Exception + */ + @PostMapping("/private/role/sort/refresh") + public Object refreshRoleSort() { + List commonDicts = saasCommonDictService.query(CommonDictQueryReq.builder() + .scope("role") + .build()); + + if (CollectionUtils.isEmpty(commonDicts)) { + return "ok"; + } + + List roleGroups = saasRoleGroupService.getList(QuerySaasRoleGroupReq.builder() + .workspaceTypeCode(Lists.transform(commonDicts, CommonDictResp::getDictCode)) + .build()); + + List roleGroupIds = roleGroups.stream().map(SaasRoleGroupVO::getId).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(roleGroupIds)) { + return "ok"; + } + + List saasRoleGroupRelations = saasRoleGroupRelationDao.getByGroupIds(roleGroupIds); + if (CollectionUtils.isEmpty(saasRoleGroupRelations)) { + return "ok"; + } + + Map saasRoles = roleService.list(RoleService.ListSaasRoleParam.builder() + .roleIds(Lists.transform(saasRoleGroupRelations, SaasRoleGroupRelation::getRoleId)) + .build()) + .stream() + .collect(Collectors.toMap(SaasRoleRes::getId, Function.identity())); + + List updateSaasRoles = saasRoleGroupRelations.stream() + .collect(Collectors.groupingBy(SaasRoleGroupRelation::getSaasRoleGroupId)) + .values() + .stream() + .map(e -> { + List sortedRoles = e.stream() + .map(rr -> saasRoles.get(rr.getRoleId())) + .filter(Objects::nonNull) + .sorted(Comparator.comparing(SaasRoleRes::getId)) + .collect(Collectors.toList()); + + List update = IntStream.range(0, sortedRoles.size()) + .mapToObj(i -> { + SaasRoleRes saasRole = sortedRoles.get(i); + SaasRole result = new SaasRole(); + result.setSort(i + 1); + result.setId(saasRole.getId()); + return result; + }) + .collect(Collectors.toList()); + return update; + }) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + + roleService.updateBatchById(updateSaasRoles); + return "ok"; + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java index 29936bef..653745b7 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java @@ -2,6 +2,8 @@ package cn.axzo.tyr.server.service; import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; +import cn.axzo.tyr.server.repository.entity.SaasRoleGroup; +import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; /** @@ -10,7 +12,7 @@ import java.util.List; * @description * @date 2023/12/1 16:37 */ -public interface SaasRoleGroupService { +public interface SaasRoleGroupService extends IService { List getList(QuerySaasRoleGroupReq req); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java index 7ccc9388..9087e0b0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java @@ -8,8 +8,10 @@ import cn.axzo.tyr.server.repository.dao.SaasRoleGroupDao; import cn.axzo.tyr.server.repository.dao.SaasRoleGroupRelationDao; import cn.axzo.tyr.server.repository.entity.SaasRoleGroup; import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; +import cn.axzo.tyr.server.repository.mapper.SaasRoleGroupMapper; import cn.axzo.tyr.server.service.SaasRoleGroupService; import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -28,7 +30,8 @@ import java.util.stream.Collectors; @Slf4j @RequiredArgsConstructor @Service -public class SaasRoleGroupServiceImpl implements SaasRoleGroupService { +public class SaasRoleGroupServiceImpl extends ServiceImpl + implements SaasRoleGroupService { private final SaasRoleGroupDao saasRoleGroupDao; private final SaasRoleGroupRelationDao saasRoleGroupRelationDao;