From d1cf9e161db9068ec9c23f325ff86bf8e82cdf88 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Tue, 9 Apr 2024 17:10:14 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8F=9C=E5=8D=95=E7=9A=84=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=EF=BC=8C=E5=88=A0=E9=99=A4=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/feign/FeatureResourceApi.java | 14 ++++ .../model/res/FeatureResourceDetailResp.java | 7 ++ .../permission/FeatureResourceController.java | 24 ++++++- .../service/SaasFeatureResourceService.java | 10 +++ .../impl/SaasFeatureResourceServiceImpl.java | 65 +++++++++++++++++++ 5 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceDetailResp.java 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 0763bdb1..bd9abd36 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 @@ -34,4 +34,18 @@ public interface FeatureResourceApi { @PostMapping("/api/featureResource/saveOrUpdate") ApiResult saveMenu(@RequestBody FeatureResourceTreeSaveReq req); + + /** 删除菜单/页面/组件 **/ + @PostMapping("/api/featureResource/delete") + ApiResult deleteFeatureResource(@RequestParam Long featureId, @RequestParam Long operatorId); + + + /** 重排序菜单/页面/组件 **/ + @PostMapping("/api/featureResource/reorder") + ApiResult reorderFeatureTree(@RequestParam Long featureId, @RequestParam Integer offset); + + + /** 获取菜单/页面/组件 及子孙节点 **/ + @PostMapping("/api/featureResource/list") + ApiResult> listFeatureDescendant(@RequestParam Long featureId); } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceDetailResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceDetailResp.java new file mode 100644 index 00000000..e33d08eb --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceDetailResp.java @@ -0,0 +1,7 @@ +package cn.axzo.tyr.client.model.res; + +public class FeatureResourceDetailResp { + + + +} 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 e3fab73d..7c551a11 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 @@ -48,10 +48,28 @@ public class FeatureResourceController implements FeatureResourceApi { @Override public ApiResult saveMenu(FeatureResourceTreeSaveReq req) { - log.info("save feature resouce req : " + req.toString()); - + log.info("save feature resource req : " + req.toString()); featureResourceService.saveOrUpdateMenu(req); - return ApiResult.ok(); } + + @Override + public ApiResult deleteFeatureResource(Long featureId, Long operatorId) { + log.info("deleteFeatureResource featureId : {}, operatorId : {}", featureId, operatorId); + featureResourceService.deleteMenuFeature(featureId, operatorId); + return ApiResult.ok(); + } + + @Override + public ApiResult reorderFeatureTree(Long featureId, Integer offset) { + log.info("reorderFeatureTree featureId : {}, offset : {}", featureId, offset); + featureResourceService.reorderMenuFeature(featureId, offset); + return ApiResult.ok(); + } + + @Override + public ApiResult> listFeatureDescendant(Long featureId) { + + return null; + } } 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 d8edafaf..e9e3d214 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 @@ -17,6 +17,16 @@ import java.util.List; public interface SaasFeatureResourceService { void saveOrUpdateMenu(FeatureResourceTreeSaveReq req); + + /**递归的**/ + List listDescendant(Long featureId); + + /**删除指定菜单**/ + void deleteMenuFeature(Long featureId, Long operatorId); + + /**菜单重排序**/ + void reorderMenuFeature(Long featureId, Integer offset); + /** 根据ID查询导航菜单页面信息 仅可显示 - 限制查询字段 **/ List listNavByIds(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 e7b0d226..6363050b 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 @@ -1,6 +1,7 @@ package cn.axzo.tyr.server.service.impl; import cn.axzo.basics.common.BeanMapper; +import cn.axzo.basics.common.model.IBaseTree; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.pokonyan.config.redis.RedisClient; import cn.axzo.tyr.client.common.enums.FeatureResourceAuthType; @@ -14,16 +15,23 @@ import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.BooleanUtil; +import io.swagger.models.auth.In; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.util.Collections; import java.util.Comparator; +import java.util.Iterator; import java.util.List; +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.common.constants.CacheConstant.KEY_AUTH_FREE; @@ -186,4 +194,61 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } } } + + // 查询resource节点及子节点 + @Override + public List listDescendant(Long featureId) { + return featureResourceDao.lambdaQuery() + .eq(BaseEntity::getIsDelete,0) + .apply("FIND_IN_SET('" + featureId + "', path)") + .list(); + } + + @Override + public void deleteMenuFeature(Long featureId, Long operatorId) { + // 删除自己及自己的子集 + featureResourceDao.lambdaUpdate() + .eq(BaseEntity::getIsDelete,0) + .apply("FIND_IN_SET('" + featureId + "', path)") + .set(SaasFeatureResource::getUpdateBy, operatorId) + .set(BaseEntity::getIsDelete,1); + } + + @Override + public void reorderMenuFeature(Long featureId, Integer offset) { + // 删除自己及自己的子集 + SaasFeatureResource resource = featureResourceDao.lambdaQuery() + .eq(BaseEntity::getIsDelete,0) + .eq(SaasFeatureResource::getId, featureId) + .one(); + Assert.notNull(resource, "菜单不存在"); + + List parallelFeature = featureResourceDao.lambdaQuery() + .eq(BaseEntity::getIsDelete,0) + .eq(SaasFeatureResource::getParentId, resource.getParentId()) + .orderByAsc(SaasFeatureResource::getDisplayOrder) + .list(); + List parallelIds = parallelFeature.stream().map(SaasFeatureResource::getId).collect(Collectors.toList()); + int index = parallelIds.indexOf(featureId); + Assert.isTrue(index >= 0, "未查询到元素下标"); + Integer offsetIndex = index + offset; + if (offsetIndex < 0) { + offsetIndex = 0; + } + if (offsetIndex > parallelFeature.size() - 1) { + offsetIndex = parallelFeature.size() - 1; + } + // 要交换和当前下标一致,代表不需要交换,比如下标为0时上移,下标最大时下移 + if (offsetIndex.equals(index)) { + return; + } + Assert.isTrue(index >= 0, "移动下班"); + Collections.swap(parallelFeature, index, offsetIndex); + for (int i = 0; i < parallelFeature.size(); i++) { + SaasFeatureResource featureResource = parallelFeature.get(i); + featureResource.setDisplayOrder(i); + } + featureResourceDao.updateBatchById(parallelFeature); + } + }