From db8bae85a8b2af85084baecf6e5be4f5a62a0f55 Mon Sep 17 00:00:00 2001 From: gulongcheng <474084054@qq.com> Date: Mon, 2 Feb 2026 14:29:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E5=88=9B=E5=BB=BA=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B9=E5=8F=AF=E4=BB=A5=E8=B7=B3=E8=BF=87=E6=9D=83=E9=99=90?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../req/data/BatchCreateNormalDirReq.java | 3 ++ .../impl/MinioFileIDataFileServiceImpl.java | 42 ++++++++++++------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/common/src/main/java/com/sdm/common/entity/req/data/BatchCreateNormalDirReq.java b/common/src/main/java/com/sdm/common/entity/req/data/BatchCreateNormalDirReq.java index bd230e42..9296c809 100644 --- a/common/src/main/java/com/sdm/common/entity/req/data/BatchCreateNormalDirReq.java +++ b/common/src/main/java/com/sdm/common/entity/req/data/BatchCreateNormalDirReq.java @@ -18,6 +18,9 @@ public class BatchCreateNormalDirReq { @Schema(description = "父节点对应的文件夹ID", requiredMode = Schema.RequiredMode.REQUIRED) private Long parentId; + @Schema(description = "是否跳过权限校验,默认为false", requiredMode = Schema.RequiredMode.NOT_REQUIRED) + private Boolean skipPermissionCheck = false; + @NotEmpty(message = "文件夹项列表不能为空") @Schema(description = "待创建的文件夹项列表", requiredMode = Schema.RequiredMode.REQUIRED) private List folderItems; diff --git a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java index 00349ebc..33447bcf 100644 --- a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java +++ b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java @@ -3993,8 +3993,8 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { @Override @Transactional(rollbackFor = Exception.class) public SdmResponse batchCreateNormalDirs(BatchCreateNormalDirReq req) { - log.info("开始执行批量创建普通文件夹,父目UUID: {}, folderItems数量: {}", - req.getParentUUId(), req.getFolderItems() == null ? 0 : req.getFolderItems().size()); + log.info("开始执行批量创建普通文件夹,父目录ID: {}, 父目录UUID: {}, folderItems数量: {}, 跳过权限校验: {}", + req.getParentId(), req.getParentUUId(), req.getFolderItems() == null ? 0 : req.getFolderItems().size(), req.getSkipPermissionCheck()); long startTime = System.currentTimeMillis(); // 1. 参数校验 @@ -4005,7 +4005,8 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { } // 2. 父目录校验与权限检查 - SdmResponse parentDirResult = validateParentDirAndPermission(req.getParentUUId()); + SdmResponse parentDirResult = validateParentDirAndPermission( + req.getParentId(), req.getParentUUId(), req.getSkipPermissionCheck()); if (!parentDirResult.isSuccess()) { log.error("父目录校验失败: {}", parentDirResult.getMessage()); return SdmResponse.failed(parentDirResult.getMessage()); @@ -4069,8 +4070,8 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { if (req == null) { return SdmResponse.failed("请求参数不能为空"); } - if (req.getParentUUId() == null) { - return SdmResponse.failed("父文件夹UUID不能为空"); + if (req.getParentId() == null && req.getParentUUId() == null) { + return SdmResponse.failed("父文件夹ID和UUID不能同时为空"); } if (CollectionUtils.isEmpty(req.getFolderItems())) { return SdmResponse.failed("文件夹项列表不能为空"); @@ -4081,19 +4082,32 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { /** * 验证父目录并检查权限 */ - private SdmResponse validateParentDirAndPermission(String parentUuid) { - FileMetadataInfo parentDir = fileMetadataInfoService.lambdaQuery() - .eq(FileMetadataInfo::getRelatedResourceUuid, parentUuid) - .one(); + private SdmResponse validateParentDirAndPermission(Long parentId, String parentUuid, boolean skipPermissionCheck) { + FileMetadataInfo parentDir; + + // 优先使用 parentId 查找,如果为空则使用 parentUuid + if (parentId != null) { + parentDir = fileMetadataInfoService.getById(parentId); + } else if (parentUuid != null) { + parentDir = fileMetadataInfoService.lambdaQuery() + .eq(FileMetadataInfo::getRelatedResourceUuid, parentUuid) + .one(); + } else { + return SdmResponse.failed("父文件夹ID和UUID不能同时为空"); + } + if (parentDir == null) { return SdmResponse.failed("父文件夹不存在"); } - // 权限检查(需要写入权限) - boolean hasWritePermission = fileUserPermissionService.hasFilePermission( - parentDir.getId(), ThreadLocalContext.getUserId(), FilePermissionEnum.WRITE); - if (!hasWritePermission) { - return SdmResponse.failed("没有写入权限"); + // 如果不跳过权限校验,则检查权限 + if (!skipPermissionCheck) { + // 权限检查(需要写入权限) + boolean hasWritePermission = fileUserPermissionService.hasFilePermission( + parentDir.getId(), ThreadLocalContext.getUserId(), FilePermissionEnum.WRITE); + if (!hasWritePermission) { + return SdmResponse.failed("没有写入权限"); + } } return SdmResponse.success(parentDir);