feat: (feature/REQ-2595) 角色查询、菜单查询支持权限tags过滤

This commit is contained in:
lilong 2024-10-28 10:53:13 +08:00
parent 0d18367995
commit 8ab50f4cb9
7 changed files with 96 additions and 47 deletions

View File

@ -1,11 +1,13 @@
package cn.axzo.tyr.client.model.req;
import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import java.util.Set;
@Data
@Builder
@ -26,4 +28,9 @@ public class DetailFeatureResourceReq {
private Boolean needChildren;
private Boolean needPageElement;
/**
* 只有当needRole = true才有效果这里查询有指定标签权限的角色信息
*/
private Set<RolePermissionTagEnum> tags;
}

View File

@ -3,6 +3,7 @@ package cn.axzo.tyr.client.model.req;
import cn.axzo.foundation.dao.support.wrapper.CriteriaField;
import cn.axzo.foundation.dao.support.wrapper.Operator;
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum;
import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam;
import lombok.AllArgsConstructor;
import lombok.Data;
@ -80,6 +81,13 @@ public class ListRoleReq {
@CriteriaField(ignore = true)
private Boolean needPermission;
/**
* 根据权限标签去过滤角色对应的权限
* 只有在needPermission = true时才生效
*/
@CriteriaField(ignore = true)
private Set<RolePermissionTagEnum> permissionTags;
/**
* 是否需要角色对应的角色分组信息
*/

View File

@ -4,12 +4,14 @@ import cn.axzo.foundation.dao.support.wrapper.CriteriaField;
import cn.axzo.foundation.dao.support.wrapper.Operator;
import cn.axzo.foundation.page.IPageReq;
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Set;
@Data
@Builder
@ -58,4 +60,7 @@ public class PagePgroupPermissionRelationReq implements IPageReq {
*/
@CriteriaField(ignore = true)
private List<FeatureIdPair> featureIdPairs;
@CriteriaField(ignore = true)
private Set<RolePermissionTagEnum> tags;
}

View File

@ -1,10 +1,13 @@
package cn.axzo.tyr.client.model.res;
import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Set;
@Data
@Builder
@NoArgsConstructor
@ -23,4 +26,6 @@ public class SaasPermissionRes {
*/
private String terminal;
private Set<RolePermissionTagEnum> tags;
}

View File

@ -1430,38 +1430,37 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
return Collections.emptyMap();
}
List<SaasPgroupPermissionRelation> saasPgroupPermissionRelations = saasPgroupPermissionRelationDao.lambdaQuery()
.in(SaasPgroupPermissionRelation::getGroupId, Lists.transform(saasPgroupRoleRelations, SaasPgroupRoleRelation::getGroupId))
.eq(SaasPgroupPermissionRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value)
.in(CollectionUtils.isNotEmpty(param.getFeatureIds()), SaasPgroupPermissionRelation::getFeatureId, param.getFeatureIds())
.eq(SaasPgroupPermissionRelation::getType, NEW_FEATURE)
.list();
List<SaasPgroupPermissionRelation> saasPgroupPermissionRelations = saasPgroupPermissionRelationService.list(PagePgroupPermissionRelationReq.builder()
.groupIds(Lists.transform(saasPgroupRoleRelations, SaasPgroupRoleRelation::getGroupId))
.featureIds(param.getFeatureIds())
.type(NEW_FEATURE)
.tags(param.getPermissionTags())
.terminal(param.getTerminal())
.build());
if (CollectionUtils.isEmpty(saasPgroupPermissionRelations)) {
return Collections.emptyMap();
}
Map<Long, SaasPermissionRes> resourcePermissions = saasFeatureResourceService.permissionQuery(ResourcePermissionQueryDTO.builder()
Map<Long, ResourcePermission> resourcePermissions = saasFeatureResourceService.permissionQuery(ResourcePermissionQueryDTO.builder()
.ids(Lists.transform(saasPgroupPermissionRelations, SaasPgroupPermissionRelation::getFeatureId))
.build())
.stream()
.map(e -> SaasPermissionRes.builder().id(e.getId()).featureCode(e.getFeatureCode()).build())
.collect(Collectors.toMap(SaasPermissionRes::getId, Function.identity()));
.collect(Collectors.toMap(ResourcePermission::getId, Function.identity()));
Map<Long, List<Long>> pgroupPermissions = saasPgroupPermissionRelations.stream()
.collect(Collectors.groupingBy(SaasPgroupPermissionRelation::getGroupId,
Collectors.mapping(SaasPgroupPermissionRelation::getFeatureId, Collectors.toList())));
Map<Long, List<SaasPgroupPermissionRelation>> pgroupPermissions = saasPgroupPermissionRelations.stream()
.collect(Collectors.groupingBy(SaasPgroupPermissionRelation::getGroupId));
return saasPgroupRoleRelations.stream()
.map(e -> {
List<Long> permissionIds = pgroupPermissions.get(e.getGroupId());
if (CollectionUtils.isEmpty(permissionIds)) {
List<SaasPgroupPermissionRelation> permissions = pgroupPermissions.get(e.getGroupId());
if (CollectionUtils.isEmpty(permissions)) {
return null;
}
return permissionIds.stream()
.map(permissionId -> {
SaasPermissionRes saasPermissionRes = resourcePermissions.get(permissionId);
return SaasPermissionWrapper.from(e, saasPermissionRes);
return permissions.stream()
.map(permission -> {
ResourcePermission saasPermissionRes = resourcePermissions.get(permission.getFeatureId());
return SaasPermissionWrapper.from(e, saasPermissionRes, permission);
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
@ -1469,7 +1468,12 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
.filter(Objects::nonNull)
.flatMap(Collection::stream)
.collect(Collectors.groupingBy(SaasPermissionWrapper::getRoleId,
Collectors.mapping(e -> SaasPermissionRes.builder().id(e.getId()).featureCode(e.getFeatureCode()).build(),
Collectors.mapping(e -> SaasPermissionRes.builder()
.id(e.getId())
.featureCode(e.getFeatureCode())
.tags(e.getTags())
.terminal(e.getTerminal())
.build(),
Collectors.toList())));
}
@ -1489,8 +1493,16 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
private Long roleId;
private Set<RolePermissionTagEnum> tags;
/**
* 资源所属端
*/
private String terminal;
public static SaasPermissionWrapper from(SaasPgroupRoleRelation saasPgroupRoleRelation,
SaasPermissionRes saasPermissionRes) {
ResourcePermission saasPermissionRes,
SaasPgroupPermissionRelation saasPgroupPermissionRelation) {
if (saasPermissionRes == null) {
return null;
}
@ -1498,6 +1510,8 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
.id(saasPermissionRes.getId())
.featureCode(saasPermissionRes.getFeatureCode())
.roleId(saasPgroupRoleRelation.getRoleId())
.tags(saasPgroupPermissionRelation.getTags())
.terminal(saasPermissionRes.getTerminal())
.build();
}
}
@ -1730,41 +1744,45 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
return Collections.emptyMap();
}
List<SaasPgroupPermissionRelation> saasPgroupPermissionRelations = saasPgroupPermissionRelationDao.lambdaQuery()
.in(SaasPgroupPermissionRelation::getGroupId, Lists.transform(saasPgroupRoleRelations, SaasPgroupRoleRelation::getGroupId))
.in(CollectionUtils.isNotEmpty(param.getFeatureIds()), SaasPgroupPermissionRelation::getFeatureId, param.getFeatureIds())
.eq(SaasPgroupPermissionRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value)
.eq(SaasPgroupPermissionRelation::getType, OLD_FEATURE)
.list();
List<SaasPgroupPermissionRelation> saasPgroupPermissionRelations = saasPgroupPermissionRelationService.list(PagePgroupPermissionRelationReq.builder()
.groupIds(Lists.transform(saasPgroupRoleRelations, SaasPgroupRoleRelation::getGroupId))
.featureIds(param.getFeatureIds())
.type(OLD_FEATURE)
.tags(param.getPermissionTags())
.build());
if (CollectionUtils.isEmpty(saasPgroupPermissionRelations)) {
return Collections.emptyMap();
}
List<Long> featureIds = Lists.transform(saasPgroupPermissionRelations, SaasPgroupPermissionRelation::getFeatureId);
Map<Long, SaasPermissionRes> resourcePermissions = saasFeatureDao.listByIds(featureIds).stream()
.map(e -> SaasPermissionRes.builder()
.id(e.getId())
.featureCode(e.getFeatureCode())
.terminal(e.getTerminal())
.build())
.collect(Collectors.toMap(SaasPermissionRes::getId, Function.identity()));
Map<Long, SaasFeature> resourcePermissions = saasFeatureDao.listByIds(featureIds).stream()
.collect(Collectors.toMap(SaasFeature::getId, Function.identity()));
Map<Long, List<Long>> pgroupPermissions = saasPgroupPermissionRelations.stream()
.collect(Collectors.groupingBy(SaasPgroupPermissionRelation::getGroupId,
Collectors.mapping(SaasPgroupPermissionRelation::getFeatureId, Collectors.toList())));
Map<Long, List<SaasPgroupPermissionRelation>> pgroupPermissions = saasPgroupPermissionRelations.stream()
.collect(Collectors.groupingBy(SaasPgroupPermissionRelation::getGroupId));
return saasPgroupRoleRelations.stream()
.map(e -> {
List<Long> permissionIds = pgroupPermissions.get(e.getGroupId());
if (CollectionUtils.isEmpty(permissionIds)) {
List<SaasPgroupPermissionRelation> permissions = pgroupPermissions.get(e.getGroupId());
if (CollectionUtils.isEmpty(permissions)) {
return null;
}
return permissionIds.stream()
.map(permissionId -> {
SaasPermissionRes saasPermissionRes = resourcePermissions.get(permissionId);
return SaasPermissionWrapper.from(e, saasPermissionRes);
return permissions.stream()
.map(permission -> {
SaasFeature saasFeature = resourcePermissions.get(permission.getFeatureId());
if (Objects.isNull(saasFeature)) {
return null;
}
return SaasPermissionWrapper.builder()
.id(saasFeature.getId())
.featureCode(saasFeature.getFeatureCode())
.roleId(e.getRoleId())
.terminal(saasFeature.getTerminal())
.tags(permission.getTags())
.build();
})
.filter(Objects::nonNull)
.collect(Collectors.toList());

View File

@ -260,6 +260,7 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
List<SaasPgroupPermissionRelation> relations = saasPgroupPermissionRelationService.list(PagePgroupPermissionRelationReq.builder()
.featureIds(Lists.transform(descendants, SaasFeatureResource::getId))
.tags(detailFeatureResourceReq.getTags())
.build());
if (CollectionUtils.isEmpty(relations)) {
return Collections.emptyMap();

View File

@ -4,8 +4,8 @@ import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum;
import cn.axzo.foundation.dao.support.converter.PageConverter;
import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.framework.auth.domain.TerminalInfo;
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum;
import cn.axzo.tyr.client.model.req.PagePgroupPermissionRelationReq;
import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation;
@ -84,10 +84,15 @@ public class SaasPgroupPermissionRelationServiceImpl
// 目前只有新版本的CMS端产品配置时才冗余了terminal
if (Objects.equals(NEW_FEATURE, param.getType()) && StringUtils.hasLength(param.getTerminal())) {
TerminalInfo terminalInfo = new TerminalInfo(param.getTerminal());
if (terminalInfo.isCMS()) {
wrapper.eq("terminal", param.getTerminal());
}
wrapper.eq("terminal", param.getTerminal());
}
if (CollectionUtils.isNotEmpty(param.getTags())) {
wrapper.and(j -> {
for (RolePermissionTagEnum tag : param.getTags()) {
j.or(k -> k.apply("json_contains(tags, '\"" + tag + "\"')"));
}
});
}
IPage<SaasPgroupPermissionRelation> page = this.page(PageConverter.toMybatis(param, SaasPgroupPermissionRelation.class), wrapper);