菜单的排序,删除等

This commit is contained in:
lvshaohua 2024-04-09 17:10:14 +08:00
parent 672c7d96c7
commit d1cf9e161d
5 changed files with 117 additions and 3 deletions

View File

@ -34,4 +34,18 @@ public interface FeatureResourceApi {
@PostMapping("/api/featureResource/saveOrUpdate")
ApiResult<Void> saveMenu(@RequestBody FeatureResourceTreeSaveReq req);
/** 删除菜单/页面/组件 **/
@PostMapping("/api/featureResource/delete")
ApiResult<Void> deleteFeatureResource(@RequestParam Long featureId, @RequestParam Long operatorId);
/** 重排序菜单/页面/组件 **/
@PostMapping("/api/featureResource/reorder")
ApiResult<Void> reorderFeatureTree(@RequestParam Long featureId, @RequestParam Integer offset);
/** 获取菜单/页面/组件 及子孙节点 **/
@PostMapping("/api/featureResource/list")
ApiResult<List<FeatureResourceTreeNode>> listFeatureDescendant(@RequestParam Long featureId);
}

View File

@ -0,0 +1,7 @@
package cn.axzo.tyr.client.model.res;
public class FeatureResourceDetailResp {
}

View File

@ -48,10 +48,28 @@ public class FeatureResourceController implements FeatureResourceApi {
@Override
public ApiResult<Void> 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<Void> deleteFeatureResource(Long featureId, Long operatorId) {
log.info("deleteFeatureResource featureId : {}, operatorId : {}", featureId, operatorId);
featureResourceService.deleteMenuFeature(featureId, operatorId);
return ApiResult.ok();
}
@Override
public ApiResult<Void> reorderFeatureTree(Long featureId, Integer offset) {
log.info("reorderFeatureTree featureId : {}, offset : {}", featureId, offset);
featureResourceService.reorderMenuFeature(featureId, offset);
return ApiResult.ok();
}
@Override
public ApiResult<List<FeatureResourceTreeNode>> listFeatureDescendant(Long featureId) {
return null;
}
}

View File

@ -17,6 +17,16 @@ import java.util.List;
public interface SaasFeatureResourceService {
void saveOrUpdateMenu(FeatureResourceTreeSaveReq req);
/**递归的**/
List<SaasFeatureResource> listDescendant(Long featureId);
/**删除指定菜单**/
void deleteMenuFeature(Long featureId, Long operatorId);
/**菜单重排序**/
void reorderMenuFeature(Long featureId, Integer offset);
/** 根据ID查询导航菜单页面信息 仅可显示 - 限制查询字段 **/
List<SaasFeatureResource> listNavByIds(List<Long> featureIds);

View File

@ -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<SaasFeatureResource> 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<SaasFeatureResource> parallelFeature = featureResourceDao.lambdaQuery()
.eq(BaseEntity::getIsDelete,0)
.eq(SaasFeatureResource::getParentId, resource.getParentId())
.orderByAsc(SaasFeatureResource::getDisplayOrder)
.list();
List<Long> 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);
}
}