feat:(REQ-2699) 修改产品权限缓存,增加版本,类型等

This commit is contained in:
lilong 2024-08-09 10:43:38 +08:00
parent 9e0e09f805
commit 202d0797dc
13 changed files with 181 additions and 54 deletions

View File

@ -65,6 +65,21 @@ public class IdentityAuthReq {
@Builder.Default
private boolean useCache = true;
/**
* app类型APP:原生H5:h5页面
*/
private String appType;
/**
* 项目codeH5会拉取项目下所有的元素
*/
private String itemCode;
/**
* 客户端版本号
*/
private Integer versionMax;
public IdentityAuthRes toEmpty() {
IdentityAuthRes result = new IdentityAuthRes();
result.setIdentity(this.getIdentityId());

View File

@ -0,0 +1,34 @@
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.foundation.page.IPageReq;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Set;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PageElementReq implements IPageReq {
@CriteriaField(ignore = true)
Integer page;
@CriteriaField(ignore = true)
Integer pageSize;
/**
* 排序使用示例createTime__DESC
*/
@CriteriaField(ignore = true)
List<String> sort;
@CriteriaField(field = "code", operator = Operator.IN)
private Set<String> codes;
}

View File

@ -73,6 +73,9 @@ public class PageSaasFeatureResourceReq implements IPageReq {
@CriteriaField(field = "terminal", operator = Operator.IN)
private Set<String> terminals;
@CriteriaField(ignore = true)
private Boolean needPageElement;
public PageResp toEmpty() {
return PageResp.builder()
.current(this.getPage())

View File

@ -63,6 +63,8 @@ public class PageElementResp {
*/
private Boolean selected;
private String itemCode;
/**
* 子元素只包含一级
*/

View File

@ -11,6 +11,7 @@ import lombok.NoArgsConstructor;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
@ -148,6 +149,11 @@ public class SaasFeatureResourceResp {
*/
private String uniCode;
/**
* 页面元素信息
*/
private List<PageElementResp> saasPageElements;
public Set<Long> resolvePath() {
return Optional.ofNullable(this.getPath())
.map(e -> Arrays.stream(e.split(",")).map(Long::valueOf).collect(Collectors.toSet()))

View File

@ -712,6 +712,11 @@ public class PrivateController {
return rolePermissionCacheService.list(request);
}
@PostMapping("/api/private/productPermissionCached/list")
public Object productPermissionCached(@RequestBody ProductPermissionCacheService.ListProductPermissionParam request) {
return productPermissionCacheService.list(request);
}
@Data
@Builder
@NoArgsConstructor

View File

@ -14,7 +14,6 @@ import cn.axzo.tyr.server.service.ProductFeatureRelationService;
import cn.axzo.tyr.server.service.ProductPermissionCacheService;
import cn.axzo.tyr.server.service.SaasFeatureResourceService;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.InitializingBean;
@ -27,7 +26,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -205,20 +203,21 @@ public class CacheProductPermissionHandler implements InitializingBean {
if (Objects.isNull(featureResource)) {
return null;
}
Set<String> featureCodes = Optional.ofNullable(featureResource.getFeatureCodes())
.orElseGet(() -> Sets.newHashSet(featureResource.getUniCode()));
if (CollectionUtils.isEmpty(featureCodes)) {
if (CollectionUtils.isEmpty(featureResource.getSaasPageElements())) {
return null;
}
List<ProductPermissionCacheService.PermissionDTO> permissionDTOS = featureCodes.stream()
.map(featureCode -> ProductPermissionCacheService.PermissionDTO.builder()
List<ProductPermissionCacheService.PermissionDTO> permissionDTOS = featureResource.getSaasPageElements().stream()
.map(pageElement -> ProductPermissionCacheService.PermissionDTO.builder()
.featureId(featureResource.getId())
.featureCode(featureCode)
.featureCode(pageElement.getCode())
.featureType(featureResource.getFeatureType())
.terminal(featureResource.getTerminal())
.cooperateType(relation.getDictCode())
.itemCode(pageElement.getItemCode())
.version(pageElement.getVersion())
.appType(pageElement.getAppType())
.build())
.collect(Collectors.toList());
@ -226,20 +225,20 @@ public class CacheProductPermissionHandler implements InitializingBean {
.map(parentFeatureResources::get)
.filter(Objects::nonNull)
.map(f -> {
Set<String> parentFeatureCodes = Optional.ofNullable(f.getFeatureCodes())
.orElseGet(() -> Sets.newHashSet(f.getUniCode()));
if (CollectionUtils.isEmpty(parentFeatureCodes)) {
if (CollectionUtils.isEmpty(f.getSaasPageElements())) {
return null;
}
return parentFeatureCodes.stream()
.map(featureCode -> ProductPermissionCacheService.PermissionDTO.builder()
return f.getSaasPageElements().stream()
.map(pageElement -> ProductPermissionCacheService.PermissionDTO.builder()
.featureId(f.getId())
.featureCode(featureCode)
.featureCode(pageElement.getCode())
.featureType(f.getFeatureType())
.terminal(f.getTerminal())
.cooperateType(relation.getDictCode())
.itemCode(pageElement.getItemCode())
.version(pageElement.getVersion())
.appType(pageElement.getAppType())
.build())
.collect(Collectors.toList());
})
@ -266,7 +265,7 @@ public class CacheProductPermissionHandler implements InitializingBean {
PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder()
.ids(featureIds)
.needFeatureCodes(true)
.needPageElement(true)
.build();
return saasFeatureResourceService.list(pageSaasFeatureResourceReq).stream()
.collect(Collectors.toMap(SaasFeatureResourceResp::getId, Function.identity(), (f, s) -> s));
@ -284,10 +283,9 @@ public class CacheProductPermissionHandler implements InitializingBean {
return Collections.emptyMap();
}
// 存在pre环境更改了节点的父节点可能导致产品没有父节点的权限这里补齐父节点的权限
PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder()
.ids(parentIds)
.needFeatureCodes(true)
.needPageElement(true)
.build();
return saasFeatureResourceService.list(pageSaasFeatureResourceReq).stream()
.collect(Collectors.toMap(SaasFeatureResourceResp::getId, Function.identity(), (f, s) -> s));

View File

@ -2,8 +2,6 @@ package cn.axzo.tyr.server.event.inner;
import cn.axzo.framework.rocketmq.Event;
import cn.axzo.framework.rocketmq.EventConsumer;
import cn.axzo.framework.rocketmq.EventHandler;
import cn.axzo.tyr.client.model.req.PageProductFeatureRelationReq;
import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq;
import cn.axzo.tyr.client.model.res.SaasFeatureResourceResp;
import cn.axzo.tyr.client.model.res.SaasPermissionRelationRes;
@ -12,12 +10,10 @@ import cn.axzo.tyr.server.event.payload.PageElementFeatureResourceUpsertPayload;
import cn.axzo.tyr.server.event.payload.RolePermissionCreatedPayload;
import cn.axzo.tyr.server.repository.dao.SaasFeatureDao;
import cn.axzo.tyr.server.repository.entity.SaasFeature;
import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation;
import cn.axzo.tyr.server.service.RolePermissionCacheService;
import cn.axzo.tyr.server.service.RoleService;
import cn.axzo.tyr.server.service.SaasFeatureResourceService;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.InitializingBean;
@ -30,7 +26,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -192,17 +187,15 @@ public class CacheRolePermissionHandler implements InitializingBean {
if (Objects.isNull(featureResource)) {
return null;
}
Set<String> featureCodes = Optional.ofNullable(featureResource.getFeatureCodes())
.orElseGet(() -> Sets.newHashSet(featureResource.getUniCode()));
if (CollectionUtils.isEmpty(featureCodes)) {
if (CollectionUtils.isEmpty(featureResource.getSaasPageElements())) {
return null;
}
List<RolePermissionCacheService.PermissionDTO> permissionDTOS = featureCodes.stream()
.map(featureCode -> RolePermissionCacheService.PermissionDTO.builder()
List<RolePermissionCacheService.PermissionDTO> permissionDTOS = featureResource.getSaasPageElements().stream()
.map(pageElement -> RolePermissionCacheService.PermissionDTO.builder()
.featureId(featureResource.getId())
.featureCode(featureCode)
.featureCode(pageElement.getCode())
.featureType(featureResource.getFeatureType())
.terminal(featureResource.getTerminal())
.build())
@ -213,16 +206,14 @@ public class CacheRolePermissionHandler implements InitializingBean {
.filter(Objects::nonNull)
.map(f -> {
Set<String> parentFeatureCodes = Optional.ofNullable(f.getFeatureCodes())
.orElseGet(() -> Sets.newHashSet(f.getUniCode()));
if (CollectionUtils.isEmpty(parentFeatureCodes)) {
if (CollectionUtils.isEmpty(featureResource.getSaasPageElements())) {
return null;
}
return parentFeatureCodes.stream()
.map(featureCode -> RolePermissionCacheService.PermissionDTO.builder()
return featureResource.getSaasPageElements().stream()
.map(pageElement -> RolePermissionCacheService.PermissionDTO.builder()
.featureId(f.getId())
.featureCode(featureCode)
.featureCode(pageElement.getCode())
.featureType(f.getFeatureType())
.terminal(f.getTerminal())
.build())
@ -256,7 +247,7 @@ public class CacheRolePermissionHandler implements InitializingBean {
PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder()
.ids(featureIds)
.needFeatureCodes(true)
.needPageElement(true)
.build();
return saasFeatureResourceService.list(pageSaasFeatureResourceReq).stream()
.collect(Collectors.toMap(SaasFeatureResourceResp::getId, Function.identity(), (f, s) -> s));
@ -277,7 +268,7 @@ public class CacheRolePermissionHandler implements InitializingBean {
// 存在pre环境更改了节点的父节点可能导致产品没有父节点的权限这里补齐父节点的权限
PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder()
.ids(parentIds)
.needFeatureCodes(true)
.needPageElement(true)
.build();
return saasFeatureResourceService.list(pageSaasFeatureResourceReq).stream()
.collect(Collectors.toMap(SaasFeatureResourceResp::getId, Function.identity(), (f, s) -> s));

View File

@ -86,5 +86,20 @@ public interface ProductPermissionCacheService {
private String terminal;
private Integer featureType;
/**
* app类型APP:原生H5:h5页面
*/
private String appType;
/**
* 项目codeH5会拉取项目下所有的元素
*/
private String itemCode;
/**
* 客户端版本号
*/
private Integer version;
}
}

View File

@ -1,7 +1,12 @@
package cn.axzo.tyr.server.service;
import cn.axzo.framework.domain.page.PageResp;
import cn.axzo.tyr.client.model.req.*;
import cn.axzo.tyr.client.model.req.GetPageElementReq;
import cn.axzo.tyr.client.model.req.GetUserHasPermissionPageElementReq;
import cn.axzo.tyr.client.model.req.ModifyPageElementRelationDTO;
import cn.axzo.tyr.client.model.req.PageElementReportReq;
import cn.axzo.tyr.client.model.req.PageElementReq;
import cn.axzo.tyr.client.model.req.PageQueryElementReq;
import cn.axzo.tyr.client.model.res.GetUserHasPermissionPageElementResp;
import cn.axzo.tyr.client.model.res.PageElementBasicDTO;
import cn.axzo.tyr.client.model.res.PageElementResp;
@ -70,4 +75,9 @@ public interface SaasPageElementService {
* @return
*/
GetUserHasPermissionPageElementResp getUserHasPermissionPageElement(GetUserHasPermissionPageElementReq request);
List<PageElementResp> list(PageElementReq param);
cn.axzo.foundation.page.PageResp<PageElementResp> page(PageElementReq param);
}

View File

@ -22,11 +22,13 @@ import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq;
import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq;
import cn.axzo.tyr.client.model.req.ModifyPageElementRelationDTO;
import cn.axzo.tyr.client.model.req.PageElementFeatureResourceRelationReq;
import cn.axzo.tyr.client.model.req.PageElementReq;
import cn.axzo.tyr.client.model.req.PagePgroupPermissionRelationReq;
import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq;
import cn.axzo.tyr.client.model.res.FeatureResourceDTO;
import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode;
import cn.axzo.tyr.client.model.res.PageElementBasicDTO;
import cn.axzo.tyr.client.model.res.PageElementResp;
import cn.axzo.tyr.client.model.res.SaasFeatureResourceResp;
import cn.axzo.tyr.server.common.util.Throws;
import cn.axzo.tyr.server.config.MqProducer;
@ -73,7 +75,7 @@ import org.springframework.data.redis.core.SessionCallback;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
@ -81,6 +83,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.axzo.tyr.server.config.exception.BizResultCode.FEATURE_RESOURCE_NOT_FOUND;
@ -588,15 +591,22 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
Map<String, Set<String>> uniCodeFeatureCodeMap = listFeatureCodes(param, page.getRecords());
return PageConverter.toResp(page, e -> from(e, uniCodeFeatureCodeMap));
Map<String, List<PageElementResp>> pageElements = listPageElements(param, page.getRecords());
return PageConverter.toResp(page, e -> from(e,
uniCodeFeatureCodeMap,
pageElements));
}
private SaasFeatureResourceResp from(SaasFeatureResource featureResource,
Map<String, Set<String>> uniCodeFeatureCodeMap) {
Map<String, Set<String>> uniCodeFeatureCodeMap,
Map<String, List<PageElementResp>> pageElements) {
SaasFeatureResourceResp saasFeatureResourceResp = SaasFeatureResourceResp.builder().build();
BeanUtils.copyProperties(featureResource, saasFeatureResourceResp);
saasFeatureResourceResp.setFeatureCodes(uniCodeFeatureCodeMap.get(featureResource.getUniCode()));
saasFeatureResourceResp.setSaasPageElements(pageElements.get(saasFeatureResourceResp.getUniCode()));
return saasFeatureResourceResp;
}
@ -617,6 +627,41 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
.stream()
.collect(Collectors.groupingBy(SaasPageElementFeatureResourceRelation::getFeatureResourceUniCode,
Collectors.mapping(SaasPageElementFeatureResourceRelation::getPageElementCode, Collectors.toSet())));
}
private Map<String, List<PageElementResp>> listPageElements(PageSaasFeatureResourceReq param,
List<SaasFeatureResource> saasFeatureResources) {
if (CollectionUtils.isEmpty(saasFeatureResources) || BooleanUtils.isNotTrue(param.getNeedPageElement())) {
return Collections.emptyMap();
}
Set<String> uniCodes = saasFeatureResources.stream()
.map(SaasFeatureResource::getUniCode)
.collect(Collectors.toSet());
PageElementFeatureResourceRelationReq pageElementFeatureResourceRelationReq = PageElementFeatureResourceRelationReq.builder()
.featureResourceUniCodes(uniCodes)
.build();
List<SaasPageElementFeatureResourceRelation> pageElementFeatureResourceRelations = saasPageElementFeatureResourceRelationService.list(pageElementFeatureResourceRelationReq);
if (CollectionUtils.isEmpty(pageElementFeatureResourceRelations)) {
return Collections.emptyMap();
}
Set<String> elementCodes = pageElementFeatureResourceRelations.stream()
.map(SaasPageElementFeatureResourceRelation::getPageElementCode)
.collect(Collectors.toSet());
PageElementReq pageElementReq = PageElementReq.builder()
.codes(elementCodes)
.build();
Map<String, PageElementResp> elementMap = saasPageElementService.list(pageElementReq).stream()
.collect(Collectors.toMap(PageElementResp::getCode, Function.identity()));
return pageElementFeatureResourceRelations.stream()
.collect(Collectors.groupingBy(SaasPageElementFeatureResourceRelation::getFeatureResourceUniCode,
Collectors.mapping(e -> elementMap.get(e.getPageElementCode()), Collectors.toList())));
}

View File

@ -466,4 +466,14 @@ public class SaasPageElementServiceImpl implements SaasPageElementService {
saasPgroupPermissionRelationOperateLogService.batchSave(Lists.newArrayList(operateLog));
}
@Override
public List<PageElementResp> list(PageElementReq param) {
return null;
}
@Override
public cn.axzo.foundation.page.PageResp<PageElementResp> page(PageElementReq param) {
return null;
}
}

View File

@ -2,7 +2,6 @@ package cn.axzo.tyr.server.service.impl;
import cn.axzo.apollo.workspace.common.enums.TableIsDeleteEnum;
import cn.axzo.basics.common.BeanMapper;
import cn.axzo.basics.common.util.StopWatchUtil;
import cn.axzo.framework.domain.ServiceException;
import cn.axzo.pokonyan.util.TraceSupplier;
import cn.axzo.thrones.client.saas.ServicePkgClient;
@ -85,7 +84,6 @@ import cn.hutool.core.lang.Pair;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
@ -1503,19 +1501,11 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService {
* @return
*/
private IdentityAuthRes findIdentityAuthV2(IdentityAuthReq identityAuthReq) {
StopWatch watch = StopWatch.create("redis:");
watch.start("redis:query workspaceProductPermission");
Map<Long, List<WorkspaceProductService.ProductPermission>> workspaceProductPermissions = listWorkspaceProductPermission(identityAuthReq);
watch.stop();
watch.start("redis:query userRole");
List<SaasRoleUserV2DTO> saasRoleUsers = listRoleUserRelationsV2(identityAuthReq);
log.info("redis:saasRoleUsers:", JSON.toJSONString(saasRoleUsers));
watch.stop();
watch.start("redis:query rolePermission");
Map<Long, List<RolePermissionCacheService.PermissionDTO>> rolePermissions = listRolePermission(identityAuthReq, saasRoleUsers);
watch.stop();
Map<String, List<SaasRoleUserV2DTO.SaasRole>> workspaceRoles = saasRoleUsers.stream()
.collect(Collectors.groupingBy(e -> e.getSaasRoleUser().buildOuWorkspaceKey(),
@ -1530,7 +1520,6 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService {
// CMPCMS新旧菜单树id不会重复
List<SaasFeatureResourceService.SaasFeatureResourceCache> allFeatures = listSaasFeatureCaches(terminals);
watch.start("redis:resolve permission");
List<IdentityAuthRes.WorkspacePermission> permissions = identityAuthReq.getWorkspaceOusPairs().stream()
.map(workspaceOuPair -> {
List<ProductPermissionCacheService.PermissionDTO> productPermissions = Optional.ofNullable(workspaceProductPermissions.get(workspaceOuPair.getWorkspaceId()))
@ -1538,6 +1527,12 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService {
.map(WorkspaceProductService.ProductPermission::getPermissions)
.filter(f -> !CollectionUtils.isEmpty(f))
.flatMap(Collection::stream)
.filter(f -> StringUtils.isBlank(identityAuthReq.getItemCode())
|| Objects.equals(identityAuthReq.getItemCode(), f.getItemCode()))
.filter(f -> StringUtils.isBlank(identityAuthReq.getAppType())
|| Objects.equals(identityAuthReq.getAppType(), f.getAppType()))
.filter(f -> Objects.isNull(identityAuthReq.getVersionMax())
|| identityAuthReq.getVersionMax().compareTo(f.getVersion()) < 1)
.collect(Collectors.toList()))
.orElse(null);
@ -1553,8 +1548,6 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService {
return buildPermissionsV2(workspaceOuPair, productPermissions, saasRoles, rolePermissions, allFeatures);
})
.collect(Collectors.toList());
watch.stop();
watch.prettyPrint(TimeUnit.MILLISECONDS);
IdentityAuthRes result = new IdentityAuthRes();
result.setIdentity(identityAuthReq.getIdentityId());