feat(REQ-2899):前端资源删除接口

This commit is contained in:
李昆鹏 2024-08-26 16:07:47 +08:00
parent 50e2543702
commit 4c95776eb0
8 changed files with 318 additions and 5 deletions

View File

@ -3,6 +3,7 @@ package cn.axzo.tyr.client.feign;
import cn.axzo.framework.domain.web.result.ApiPageResult;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.model.req.*;
import cn.axzo.tyr.client.model.res.FeatureResourcePageElementRelationViewResp;
import cn.axzo.tyr.client.model.res.GetUserHasPermissionPageElementResp;
import cn.axzo.tyr.client.model.res.ListPageElementCategoryResp;
import cn.axzo.tyr.client.model.res.PageElementResp;
@ -69,4 +70,8 @@ public interface PageElementApi {
/** 删除页面元素 **/
@PostMapping("/api/pageElement/delete")
ApiResult<Void> delete(@RequestBody @Valid DeletePageElementReq req);
/** 删除页面元素 **/
@PostMapping("/api/pageElement/getFeatureResourceRelations")
ApiResult<FeatureResourcePageElementRelationViewResp> getFeatureResourceRelations(@RequestBody @Valid IdReq req);
}

View File

@ -0,0 +1,25 @@
package cn.axzo.tyr.client.model.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
/**
* @author likunpeng
* @version 1.0
* @date 2024/8/21
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IdReq {
@NotNull(message = "ID不能为空")
@Min(value = 1, message = "ID有误")
private Long id;
}

View File

@ -19,6 +19,8 @@ import java.util.List;
@AllArgsConstructor
public class PageQueryElementV2Req {
private Long id;
/**
*
*/

View File

@ -0,0 +1,97 @@
package cn.axzo.tyr.client.model.res;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author likunpeng
* @version 1.0
* @date 2024/8/23
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class FeatureResourcePageElementRelationViewResp {
/** 菜单资源列表 **/
private List<FeatureResourceBasicDTO> featureResources;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class FeatureResourceBasicDTO {
private Long id;
/**
* 资源编码-权限码
*/
private String uniCode;
/**
* 资源名称
*/
private String featureName;
/**
* 资源类型1-菜单 2-页面 3-应用入口 4-组件 5-root 6-分组
*/
private Integer featureType;
/** 前端元素资源列表 **/
private PageElementBasicDTO pageElement;
private List<FeatureResourceBasicDTO> children;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class PageElementBasicDTO {
private Long id;
/**
* 元素的组编码
*/
private String groupCode;
/**
* 元素的组编码
*/
private String groupName;
/**
* 元素编码
*/
private String code;
/**
* 元素名称
*/
private String name;
/**
* 元素类型
*/
private String type;
/**
* 是否关联
*/
private Boolean hasRelation;
/**
* 1路由页面
*/
private Integer relationType;
private List<PageElementBasicDTO> children;
}
}

View File

@ -86,6 +86,11 @@ public class PageElementResp {
*/
private List<SaasFeatureResourceResp> featureResources;
/** ios挑战地址 **/
private String iosRouterUrl;
/** android挑战地址 **/
private String androidRouterUrl;
@Data
@Builder

View File

@ -4,6 +4,7 @@ import cn.axzo.framework.domain.web.result.ApiPageResult;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.feign.PageElementApi;
import cn.axzo.tyr.client.model.req.*;
import cn.axzo.tyr.client.model.res.FeatureResourcePageElementRelationViewResp;
import cn.axzo.tyr.client.model.res.GetUserHasPermissionPageElementResp;
import cn.axzo.tyr.client.model.res.ListPageElementCategoryResp;
import cn.axzo.tyr.client.model.res.PageElementResp;
@ -92,4 +93,9 @@ public class PageElementController implements PageElementApi {
saasPageElementService.delete(req);
return ApiResult.ok();
}
@Override
public ApiResult<FeatureResourcePageElementRelationViewResp> getFeatureResourceRelations(IdReq req) {
return ApiResult.ok(saasPageElementService.getFeatureResourceRelations(req.getId()));
}
}

View File

@ -2,6 +2,7 @@ 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.res.FeatureResourcePageElementRelationViewResp;
import cn.axzo.tyr.client.model.res.GetUserHasPermissionPageElementResp;
import cn.axzo.tyr.client.model.res.PageElementBasicDTO;
import cn.axzo.tyr.client.model.res.PageElementResp;
@ -83,4 +84,6 @@ public interface SaasPageElementService extends IService<SaasPageElement> {
Long saveOrUpdate(SaveOrUpdatePageElementReq req);
void delete(DeletePageElementReq req);
FeatureResourcePageElementRelationViewResp getFeatureResourceRelations(Long pageElementId);
}

View File

@ -17,11 +17,7 @@ import cn.axzo.tyr.client.common.enums.PageElementFeatureResourceRelationTypeEnu
import cn.axzo.tyr.client.common.enums.PageElementTypeEnum;
import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogSceneEnum;
import cn.axzo.tyr.client.model.req.*;
import cn.axzo.tyr.client.model.res.GetUserHasPermissionPageElementResp;
import cn.axzo.tyr.client.model.res.IdentityAuthRes;
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.client.model.res.*;
import cn.axzo.tyr.server.config.MqProducer;
import cn.axzo.tyr.server.event.payload.PageElementFeatureResourceUpsertPayload;
import cn.axzo.tyr.server.model.RelationOperateLogResourceBindElementDO;
@ -497,6 +493,7 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
@Override
public PageResp<PageElementResp> pageV2(PageQueryElementV2Req request) {
IPage<SaasPageElement> page = saasPageElementDao.lambdaQuery()
.eq(Objects.nonNull(request.getId()), SaasPageElement::getId, request.getId())
.eq(StringUtils.isNotBlank(request.getTerminal()), SaasPageElement::getTerminal, request.getTerminal())
.in(CollectionUtils.isNotEmpty(request.getElementTypes()), SaasPageElement::getType, request.getElementTypes())
.and(StringUtils.isNotBlank(request.getPageElementCodeOrName()), w -> w.like(SaasPageElement::getCode, request.getPageElementCodeOrName())
@ -508,7 +505,10 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
.orderByDesc(BaseEntity::getId)
.page(new Page<>(request.getPage(), request.getPageSize()));
List<PageElementResp> list = BeanMapper.copyList(page.getRecords(), PageElementResp.class);
// 补充元素组名
fillGroupName(list);
// 补充元素iosandroid路由地址
fillIosAndAndroidRouteUrl(list);
return PageResp.list(page.getCurrent(), page.getSize(), page.getTotal(), list);
}
@ -613,6 +613,34 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
}
}
@Override
public FeatureResourcePageElementRelationViewResp getFeatureResourceRelations(Long pageElementId) {
SaasPageElement dbPageElement = saasPageElementDao.getById(pageElementId);
AssertUtil.notNull(dbPageElement, "页面元素资源不存在");
List<SaasPageElement> pageElements = saasPageElementDao.listByGroupCodesAndExcludeIds(Lists.newArrayList(dbPageElement.getGroupCode()), null, dbPageElement.getTerminal(), null);
FeatureResourcePageElementRelationViewResp.PageElementBasicDTO elementBasic = getPageElementBasic(pageElements);
if (Objects.isNull(elementBasic)) {
return null;
}
List<SaasPageElementFeatureResourceRelation> relations = saasPageElementFeatureResourceRelationDao.lambdaQuery()
.eq(SaasPageElementFeatureResourceRelation::getIsDelete, DeleteEnum.NORMAL.getValue())
.in(SaasPageElementFeatureResourceRelation::getPageElementCode, pageElements.stream().map(SaasPageElement::getCode).collect(Collectors.toSet()))
.eq(SaasPageElementFeatureResourceRelation::getTerminal, dbPageElement.getTerminal())
.list();
if (CollectionUtils.isEmpty(relations)) {
return null;
}
List<FeatureResourcePageElementRelationViewResp.FeatureResourceBasicDTO> featureResourceBasics = getFeatureResourceBasic(relations.stream().map(SaasPageElementFeatureResourceRelation::getFeatureResourceUniCode).collect(Collectors.toList()), dbPageElement.getTerminal());
if (CollectionUtils.isEmpty(featureResourceBasics)) {
return null;
}
fillElementToResource(featureResourceBasics, relations, elementBasic);
return FeatureResourcePageElementRelationViewResp.builder().featureResources(featureResourceBasics).build();
}
private PageElementResp from(SaasPageElement saasPageElement,
Map<String, List<SaasFeatureResourceResp>> featureResources) {
PageElementResp pageElementResp = PageElementResp.builder().build();
@ -689,6 +717,19 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
return JSONObject.toJSONString(exts);
}
private void fillIosAndAndroidRouteUrl(List<PageElementResp> list) {
if (CollectionUtils.isEmpty(list)) {
return;
}
for (PageElementResp resp : list) {
if (StringUtils.isBlank(resp.getLinkExt())) {
continue;
}
resp.setIosRouterUrl(resp.resolveIosRouterUrl());
resp.setAndroidRouterUrl(resp.resolveAndroidRouterUrl());
}
}
private void saveOrUpdateOperateLog(SaveOrUpdatePageElementReq req, SaasPageElement basePageElement) {
saasPgroupPermissionRelationOperateLogService.save(PermissionOperateLogReq.builder()
.tableName(PAGE_ELEMENT_TABLE_NAME)
@ -710,4 +751,133 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
.operateData(basePageElement)
.build());
}
private FeatureResourcePageElementRelationViewResp.PageElementBasicDTO getPageElementBasic(List<SaasPageElement> pageElements) {
SaasPageElement pageTypeElement = pageElements.stream().filter(e -> PageElementTypeEnum.PAGE.getCode().equals(e.getType())).findFirst().orElse(null);
if (Objects.isNull(pageTypeElement)) {
return null;
}
return FeatureResourcePageElementRelationViewResp.PageElementBasicDTO.builder()
.id(pageTypeElement.getId())
.groupCode(pageTypeElement.getGroupCode())
.groupName(pageTypeElement.getName())
.code(pageTypeElement.getCode())
.name(pageTypeElement.getName())
.type(pageTypeElement.getType())
.children(pageElements.stream().filter(e -> PageElementTypeEnum.COMPONENT.getCode().equals(e.getType())).map(e -> FeatureResourcePageElementRelationViewResp.PageElementBasicDTO.builder()
.id(e.getId())
.groupCode(pageTypeElement.getGroupCode())
.groupName(pageTypeElement.getName())
.code(e.getCode())
.name(e.getName())
.type(e.getType()).build()).collect(Collectors.toList()))
.build();
}
private List<FeatureResourcePageElementRelationViewResp.FeatureResourceBasicDTO> getFeatureResourceBasic(List<String> uniCodes, String terminal) {
List<SaasFeatureResource> featureResources = saasFeatureResourceDao.lambdaQuery()
.eq(SaasFeatureResource::getTerminal, terminal)
.in(SaasFeatureResource::getUniCode, uniCodes)
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.getValue())
.list();
List<SaasFeatureResource> parentFrs = featureResources.stream().filter(e -> {
if (Objects.isNull(e.getFeatureType())) {
return false;
}
return FeatureResourceType.PAGE.getCode().equals(e.getFeatureType());
}).collect(Collectors.toList());
List<Long> componentAndAppEntityParentIds = featureResources.stream().filter(e -> {
if (Objects.isNull(e.getFeatureType())) {
return false;
}
return FeatureResourceType.COMPONENT.getCode().equals(e.getFeatureType()) || FeatureResourceType.APP_ENTRY.getCode().equals(e.getFeatureType());
}).map(SaasFeatureResource::getParentId).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(componentAndAppEntityParentIds)) {
List<SaasFeatureResource> parentResources = saasFeatureResourceDao.lambdaQuery()
.eq(SaasFeatureResource::getTerminal, terminal)
.in(SaasFeatureResource::getId, componentAndAppEntityParentIds)
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.getValue())
.list();
if (CollectionUtils.isNotEmpty(parentResources)) {
parentFrs.addAll(parentResources);
}
}
parentFrs = parentFrs.stream().distinct().collect(Collectors.toList());
Map<Long, List<SaasFeatureResource>> childrenMap = featureResources.stream().filter(e -> FeatureResourceType.COMPONENT.getCode().equals(e.getFeatureType())
|| FeatureResourceType.APP_ENTRY.getCode().equals(e.getFeatureType())).collect(Collectors.groupingBy(SaasFeatureResource::getParentId));
List<FeatureResourcePageElementRelationViewResp.FeatureResourceBasicDTO> allParents = parentFrs.stream().map(e -> FeatureResourcePageElementRelationViewResp.FeatureResourceBasicDTO.builder()
.id(e.getId())
.uniCode(e.getUniCode())
.featureName(e.getFeatureName())
.featureType(e.getFeatureType())
.children(Lists.newArrayList())
.build()).distinct().collect(Collectors.toList());
if (CollectionUtils.isEmpty(allParents)) {
return null;
}
for (FeatureResourcePageElementRelationViewResp.FeatureResourceBasicDTO basic : allParents) {
List<SaasFeatureResource> children = childrenMap.get(basic.getId());
if (CollectionUtils.isEmpty(children)) {
continue;
}
basic.setChildren(children.stream().map(e -> FeatureResourcePageElementRelationViewResp.FeatureResourceBasicDTO.builder()
.id(e.getId())
.uniCode(e.getUniCode())
.featureName(e.getFeatureName())
.featureType(e.getFeatureType())
.build()).collect(Collectors.toList()));
}
return allParents;
}
private void fillElementToResource(List<FeatureResourcePageElementRelationViewResp.FeatureResourceBasicDTO> resources, List<SaasPageElementFeatureResourceRelation> relations,
FeatureResourcePageElementRelationViewResp.PageElementBasicDTO elementBasic) {
Map<String, SaasPageElementFeatureResourceRelation> relationMap = relations.stream().collect(Collectors.toMap(r -> r.getFeatureResourceUniCode() + "_" + r.getPageElementCode(), Function.identity(), (v1, v2) -> v1));
for (FeatureResourcePageElementRelationViewResp.FeatureResourceBasicDTO resource : resources) {
recursiveSetElementToResource(resource, relationMap, elementBasic);
}
}
private void recursiveSetElementToResource(FeatureResourcePageElementRelationViewResp.FeatureResourceBasicDTO resource, Map<String, SaasPageElementFeatureResourceRelation> relationMap,
FeatureResourcePageElementRelationViewResp.PageElementBasicDTO elementBasic) {
if (Objects.isNull(resource)) {
return;
}
if (!FeatureResourceType.GROUP.getCode().equals(resource.getFeatureType())) {
FeatureResourcePageElementRelationViewResp.PageElementBasicDTO newPageElementBasic = FeatureResourcePageElementRelationViewResp.PageElementBasicDTO.builder()
.id(elementBasic.getId())
.groupCode(elementBasic.getGroupCode())
.groupName(elementBasic.getGroupName())
.code(elementBasic.getCode())
.name(elementBasic.getName())
.type(elementBasic.getType())
.hasRelation(Optional.ofNullable(relationMap.get(resource.getUniCode() + "_" + elementBasic.getCode())).isPresent())
.relationType(Optional.ofNullable(relationMap.get(resource.getUniCode() + "_" + elementBasic.getCode())).map(SaasPageElementFeatureResourceRelation::getType).orElse(0))
.build();
if (CollectionUtils.isNotEmpty(elementBasic.getChildren())) {
newPageElementBasic.setChildren(elementBasic.getChildren().stream().map(e -> FeatureResourcePageElementRelationViewResp.PageElementBasicDTO.builder()
.id(e.getId())
.groupCode(e.getGroupCode())
.groupName(e.getGroupName())
.code(e.getCode())
.name(e.getName())
.type(e.getType())
.hasRelation(Optional.ofNullable(relationMap.get(resource.getUniCode() + "_" + e.getCode())).isPresent())
.relationType(Optional.ofNullable(relationMap.get(resource.getUniCode() + "_" + e.getCode())).map(SaasPageElementFeatureResourceRelation::getType).orElse(0))
.build()).collect(Collectors.toList()));
}
resource.setPageElement(newPageElementBasic);
}
if (CollectionUtils.isNotEmpty(resource.getChildren())) {
resource.getChildren().forEach(e -> recursiveSetElementToResource(e, relationMap, elementBasic));
}
}
}