فهرست منبع

content-service/disk 更新"创建目录"和"移动文件"两个接口

reghao 6 ماه پیش
والد
کامیت
ed99576d17

+ 6 - 5
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/controller/DiskFileController.java

@@ -1,9 +1,11 @@
 package cn.reghao.tnb.content.app.disk.controller;
 
 import cn.reghao.jutil.jdk.db.PageList;
+import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.common.auth.AuthUser;
 import cn.reghao.tnb.common.auth.UserContext;
+import cn.reghao.tnb.content.app.disk.model.dto.MoveFile;
 import cn.reghao.tnb.content.app.disk.model.dto.RenameFile;
 import cn.reghao.tnb.content.app.disk.model.dto.SearchForm;
 import cn.reghao.tnb.content.app.disk.model.po.DiskFile;
@@ -94,12 +96,11 @@ public class DiskFileController {
         return WebResult.successWithMsg("尚未实现");
     }
 
-    @Operation(summary = "移动文件", description = "N")
+    @Operation(summary = "移动(多个)文件到指定目录", description = "N")
     @PostMapping(value = "/move", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String moveFiles(@RequestParam("fileId") List<String> fileIds, String pid) throws IOException {
-        /*long owner = UserContext.getUserId();
-        diskFileService.move(pid, fileIds, false, owner);*/
-        return WebResult.successWithMsg("尚未实现");
+    public String moveFiles(@RequestBody @Validated MoveFile moveFile) {
+        Result result = diskFileService.move(moveFile);
+        return WebResult.result(result);
     }
 
     @Operation(summary = "删除文件", description = "N")

+ 16 - 5
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/controller/DiskFolderController.java

@@ -1,9 +1,11 @@
 package cn.reghao.tnb.content.app.disk.controller;
 
+import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.common.auth.AuthUser;
 import cn.reghao.tnb.content.app.disk.model.dto.CreateFolder;
 import cn.reghao.tnb.content.app.disk.model.dto.RenameFile;
+import cn.reghao.tnb.content.app.disk.model.vo.FolderTree;
 import cn.reghao.tnb.content.app.disk.service.DiskFolderService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -11,6 +13,8 @@ import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2025-09-01 10:16:46
@@ -26,16 +30,23 @@ public class DiskFolderController {
         this.diskFolderService = diskFolderService;
     }
 
-    @Operation(summary = "新建目录", description = "N")
+    @Operation(summary = "当前目录下新建一个子目录", description = "N")
     @PostMapping(value = "/create", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String createFolder(@Validated CreateFolder createFolder) {
-        diskFolderService.createFolder(createFolder);
-        return WebResult.success();
+    public String createFolder(@RequestBody @Validated CreateFolder createFolder) {
+        Result result = diskFolderService.createFolder(createFolder);
+        return WebResult.result(result);
     }
 
     @Operation(summary = "重命名目录", description = "N")
     @PostMapping(value = "/rename", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String renameFolder(@Validated RenameFile renameFile) {
+    public String renameFolder(@RequestBody @Validated RenameFile renameFile) {
         return WebResult.successWithMsg("尚未实现");
     }
+
+    @Operation(summary = "获取目录树, 返回的数据格式对应 elementui 的 el-tree", description = "N")
+    @GetMapping(value = "/tree", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getFolderTree() {
+        List<FolderTree> list = diskFolderService.getFolderTree();
+        return WebResult.success(list);
+    }
 }

+ 2 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/db/mapper/DiskFileMapper.java

@@ -16,6 +16,8 @@ import java.util.List;
  */
 @Mapper
 public interface DiskFileMapper extends BaseMapper<DiskFile> {
+    void updateMoveDiskFile(DiskFile diskFile);
+
     List<DiskFileCount> findFileTypeCountByGroup(long owner);
     int countByDiskQuery(DiskQuery diskQuery);
     List<DiskFile> findDiskQueryByPage(@Param("page") Page page, @Param("diskQuery") DiskQuery diskQuery);

+ 6 - 3
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/dto/CreateFolder.java

@@ -1,6 +1,8 @@
 package cn.reghao.tnb.content.app.disk.model.dto;
 
 import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.validator.constraints.Length;
 
 import javax.validation.constraints.NotBlank;
 
@@ -8,10 +10,11 @@ import javax.validation.constraints.NotBlank;
  * @author reghao
  * @date 2025-09-01 10:19:24
  */
+@Setter
 @Getter
 public class CreateFolder {
-    @NotBlank
-    private String path;
-    @NotBlank
+    @Length(min = 1, max = 255)
+    private String parentPath;
+    @Length(min = 1, max = 255)
     private String folderName;
 }

+ 6 - 1
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/dto/MoveFile.java

@@ -1,16 +1,21 @@
 package cn.reghao.tnb.content.app.disk.model.dto;
 
 import lombok.Getter;
+import lombok.Setter;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
 import java.util.List;
 
 /**
  * @author reghao
  * @date 2023-12-24 00:39:18
  */
+@Setter
 @Getter
 public class MoveFile {
-    private Integer type;
+    @NotBlank
     private String pid;
+    @Size(min = 1, max = 100, message = "每次移动的文件不超过 100 个")
     private List<String> fileIds;
 }

+ 13 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/po/DiskFile.java

@@ -31,6 +31,19 @@ public class DiskFile extends BaseObject<Integer> {
     private Long owner;
     private transient List<DiskFile> children = new ArrayList<>();
 
+    // 网盘根节点, 系统中有且仅有一个, 由所有 owner 共享
+    public DiskFile(long owner) {
+        this.channelCode = 0;
+        this.fileId = "0";
+        this.pid = "00";
+        this.path = "/";
+        this.filename = "/";
+        this.fileType = ObjectType.Dir.getCode();
+        this.sha256sum = "0";
+        this.size = 0L;
+        this.owner = UserContext.getUserId();
+    }
+
     public DiskFile(String fileId, String pid, String path, String filename) {
         this.channelCode = 0;
         this.fileId = fileId;

+ 28 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/vo/FolderTree.java

@@ -0,0 +1,28 @@
+package cn.reghao.tnb.content.app.disk.model.vo;
+
+import cn.reghao.tnb.content.app.disk.model.po.DiskFile;
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2023-11-14 10:55:43
+ */
+@Getter
+public class FolderTree {
+    private String pid;
+    private String fileId;
+    private String label;
+    private String value;
+    private List<FolderTree> children;
+
+    public FolderTree(DiskFile diskFile) {
+        this.pid = diskFile.getPid();
+        this.fileId = diskFile.getFileId();
+        this.label = diskFile.getPath();
+        this.value = diskFile.getFilename();
+        this.children = new ArrayList<>();
+    }
+}

+ 12 - 103
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskFileService.java

@@ -16,10 +16,7 @@ import cn.reghao.tnb.content.app.disk.model.dto.CreateFile;
 import cn.reghao.tnb.content.app.disk.model.dto.MoveFile;
 import cn.reghao.tnb.content.app.disk.model.po.DiskFile;
 import cn.reghao.tnb.content.app.disk.model.query.DiskQuery;
-import cn.reghao.tnb.content.app.disk.model.vo.FileInfo;
-import cn.reghao.tnb.content.app.disk.model.vo.NamePath;
-import cn.reghao.tnb.content.app.disk.model.vo.DiskFileCount;
-import cn.reghao.tnb.content.app.disk.model.vo.DiskFileDetail;
+import cn.reghao.tnb.content.app.disk.model.vo.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.stereotype.Service;
@@ -117,7 +114,7 @@ public class DiskFileService {
                     .filter(childFile -> !childFile.getFileId().equals(fileId))
                     .forEach(childFile -> {
                         String filename = childFile.getFilename();
-                        NamePath namePath = getUniqueNamePath(newPath, filename, owner);
+                        NamePath namePath = getUniqueNamePath(newPath, filename);
 
                         childFile.setPath(namePath.getPath());
                         childFile.setFilename(namePath.getFilename());
@@ -132,15 +129,16 @@ public class DiskFileService {
         return Result.success();
     }
 
-    public Result move(MoveFile moveFile, long owner) {
+    public Result move(MoveFile moveFile) {
+        long owner = UserContext.getUserId();
         String pid = moveFile.getPid();
         List<String> fileIds = moveFile.getFileIds();
-        boolean copy = moveFile.getType() == 2;
+        boolean copy = false;
 
         DiskQuery diskQuery = new DiskQuery.Builder()
                 .fileId(pid)
                 .build();
-        Page page = new Page(1, 10);
+        Page page = new Page(1, 1);
         List<DiskFile> diskFileList = diskFileMapper.findDiskQueryByPage(page, diskQuery);
         DiskFile parentFile = diskFileList.get(0);
         if (parentFile == null) {
@@ -212,95 +210,12 @@ public class DiskFileService {
         copiedFiles.addAll(list1);
         if (!copiedFiles.isEmpty()) {
             if (copy) {
-                //diskFile1Repository.saveAll(copiedFiles);
+                 diskFileMapper.saveAll(copiedFiles);
             } else {
-                // diskFile1Repository.updateDiskFiles(copiedFiles);
+                copiedFiles.forEach(diskFileMapper::updateMoveDiskFile);
             }
         }
-        return Result.success();
-    }
 
-    public Result move(String pid, List<String> fileIds, boolean copy, long owner) {
-        DiskQuery diskQuery = new DiskQuery.Builder()
-                .fileId(pid)
-                .build();
-        Page page = new Page(1, 10);
-        List<DiskFile> diskFileList = diskFileMapper.findDiskQueryByPage(page, diskQuery);
-        DiskFile parentFile = diskFileList.get(0);
-        if (parentFile == null) {
-            String msg = "文件被移动/复制到的位置不存在";
-            return Result.fail(msg);
-        }
-
-        if (parentFile.getFileType() != ObjectType.Dir.getCode()) {
-            String msg = "文件被移动/复制到的位置不是目录";
-            return Result.fail(msg);
-        }
-
-        Set<String> parents = new HashSet<>();
-        String pid1 = parentFile.getPid();
-        parents.add(pid1);
-        while (!pid1.equals("0")) {
-            diskQuery = new DiskQuery.Builder()
-                    .fileId(pid1)
-                    .build();
-            page = new Page(1, 10);
-            diskFileList = diskFileMapper.findDiskQueryByPage(page, diskQuery);
-            pid1 = diskFileList.get(0).getPid();
-            parents.add(pid1);
-        }
-
-        for (String fileId : fileIds) {
-            if (parents.contains(fileId)) {
-                String msg = "文件被移动/复制到的位置不能是其自身或子目录";
-                return Result.fail(msg);
-            }
-        }
-
-        List<DiskFile> list = findByFileIdContains(fileIds);
-        if (list.isEmpty()) {
-            String msg = "被移动/复制的文件不存在";
-            return Result.fail(msg);
-        }
-
-        String currentPid = list.get(0).getPid();
-        for (int i = 1; i < list.size(); i++) {
-            if (!list.get(i).getPid().equals(currentPid)) {
-                String msg = "被移动/复制的文件必须来自同一目录";
-                return Result.fail(msg);
-            }
-        }
-
-        List<DiskFile> copiedFiles = list.stream()
-                .filter(diskFile -> diskFile.getFileType() != ObjectType.Dir.getCode())
-                .peek(diskFile -> {
-                    setRootPath(diskFile, parentFile, owner);
-                    if (copy) {
-                        reinitDiskFile(diskFile);
-                    }
-                }).collect(Collectors.toList());
-
-        List<DiskFile> list1 = new ArrayList<>();
-        list.stream()
-                .filter(diskFile -> diskFile.getFileType() == ObjectType.Dir.getCode())
-                .forEach(dirFile -> {
-                    List<DiskFile> results = getChildren(dirFile.getPath());
-                    DiskFile diskFile = list2tree(dirFile.getFileId(), results);
-
-                    moveRoot(diskFile, parentFile, copy, owner);
-                    List<DiskFile> list2 = new ArrayList<>();
-                    tree2List(diskFile, list2);
-                    list1.addAll(list2);
-                });
-
-        copiedFiles.addAll(list1);
-        if (!copiedFiles.isEmpty()) {
-            if (copy) {
-                diskFileMapper.saveAll(copiedFiles);
-            } else {
-                //diskFile1Repository.updateDiskFiles(list1);
-            }
-        }
         return Result.success();
     }
 
@@ -339,7 +254,7 @@ public class DiskFileService {
         String parentPath = parent.getPath();
 
         String filename = current.getFilename();
-        NamePath namePath = getUniqueNamePath(parentPath, filename, owner);
+        NamePath namePath = getUniqueNamePath(parentPath, filename);
         current.setPid(pid);
         current.setPath(namePath.getPath());
         current.setFilename(namePath.getFilename());
@@ -458,15 +373,9 @@ public class DiskFileService {
         }
     }
 
-    public NamePath getUniqueNamePath(String parentPath, String filename, long owner) {
+    public NamePath getUniqueNamePath(String parentPath, String filename) {
         String path = getPath(parentPath, filename);
-        DiskQuery diskQuery = new DiskQuery.Builder()
-                .path(path)
-                .path(path)
-                .build();
-        Page page = new Page(1, 10);
-        List<DiskFile> diskFileList = diskFileMapper.findDiskQueryByPage(page, diskQuery);
-        DiskFile diskFile = diskFileList.get(0);
+        DiskFile diskFile = findByPath(path);
         if (diskFile != null) {
             filename = getNewFilename(filename);
             path = getPath(parentPath, filename);
@@ -522,7 +431,7 @@ public class DiskFileService {
     }
     
     private List<DiskFile> findByFileIdContains(List<String> fileIds) {
-        return Collections.emptyList();
+        return diskFileMapper.findByFileIds(fileIds);
     }
 
     public List<NamePath> getPathList(String path) {

+ 76 - 8
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskFolderService.java

@@ -1,18 +1,19 @@
 package cn.reghao.tnb.content.app.disk.service;
 
 import cn.reghao.jutil.jdk.db.Page;
+import cn.reghao.jutil.jdk.result.Result;
+import cn.reghao.oss.sdk.model.constant.ObjectType;
 import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.content.app.disk.db.mapper.DiskFileMapper;
 import cn.reghao.tnb.content.app.disk.model.dto.CreateFolder;
 import cn.reghao.tnb.content.app.disk.model.po.DiskFile;
 import cn.reghao.tnb.content.app.disk.model.query.DiskQuery;
+import cn.reghao.tnb.content.app.disk.model.vo.FolderTree;
 import org.springframework.stereotype.Service;
 
 import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.UUID;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author reghao
@@ -26,10 +27,45 @@ public class DiskFolderService {
         this.diskFileMapper = diskFileMapper;
     }
 
-    public void createFolder(CreateFolder createFolder) {
+    public synchronized Result createFolder(CreateFolder createFolder) {
+        String parentPath = getCanonicalPath(createFolder.getParentPath());
+        DiskFile parentDiskFile = findByPath(parentPath);
+        if (parentDiskFile == null) {
+            return Result.fail("parent dir not exit");
+        }
+        String pid = parentDiskFile.getFileId();
+
+        String folderName = createFolder.getFolderName();
+        String folderPath = String.format("%s/%s", parentPath, folderName);
+        String folderPath0 = getCanonicalPath(folderPath);
+        DiskFile diskFile = findByPath(folderPath0);
+        if (diskFile != null) {
+            return Result.fail("current dir exit");
+        }
+
+        DiskFile folder = new DiskFile(getFileId(), pid, folderPath0, folderName);
+        diskFileMapper.save(folder);
+        return Result.success();
+    }
+
+    private DiskFile findByPath(String path) {
         long loginUser = UserContext.getUserId();
-        String folderPath = "";
-        String folderId = createFolders(folderPath, loginUser);
+        DiskQuery diskQuery = new DiskQuery.Builder()
+                .path(path)
+                .owner(loginUser)
+                .build();
+        Page page = new Page(1, 1);
+        List<DiskFile> diskFileList = diskFileMapper.findDiskQueryByPage(page, diskQuery);
+        return diskFileList.isEmpty() ? null : diskFileList.get(0);
+    }
+
+    private String getCanonicalPath(String path) {
+        //return new File(path).getCanonicalPath();
+        return new File(path).getAbsolutePath();
+    }
+
+    private String getFileId() {
+        return UUID.randomUUID().toString().replace("-", "");
     }
 
     private String createFolders(String folderPath, long owner) {
@@ -69,7 +105,7 @@ public class DiskFolderService {
             if (!diskFileList.isEmpty()) {
                 pid = diskFileList.get(0).getFileId();
             } else {
-                String fileId = UUID.randomUUID().toString().replace("-", "");
+                String fileId = getFileId();
                 String path = parent;
                 String dirname = parent.substring(parent.lastIndexOf("/")+1);
                 diskFileMapper.save(new DiskFile(fileId, pid, path, dirname));
@@ -81,4 +117,36 @@ public class DiskFolderService {
         diskFileList = diskFileMapper.findDiskQueryByPage(page, diskQuery);
         return diskFileList.get(0).getFileId();
     }
+
+    public List<FolderTree> getFolderTree() {
+        long loginUser = UserContext.getUserId();
+        DiskQuery diskQuery = new DiskQuery.Builder()
+                .fileType(ObjectType.Dir.getCode())
+                .owner(loginUser)
+                .build();
+
+        Page page = new Page(1, 1000);
+        List<DiskFile> netDiskList = diskFileMapper.findDiskQueryByPage(page, diskQuery);
+        Map<String, FolderTree> map = netDiskList.stream()
+                .map(FolderTree::new)
+                .collect(Collectors.toMap(FolderTree::getFileId, diskFile -> diskFile));
+
+        Map<String, FolderTree> tree = new TreeMap<>();
+        netDiskList.forEach(diskFile -> {
+            String pid = diskFile.getPid();
+            String fileId = diskFile.getFileId();
+            FolderTree folderTree = map.get(fileId);
+
+            if (pid.equals("0")) {
+                tree.put(fileId, folderTree);
+            } else {
+                FolderTree parent = map.get(pid);
+                parent.getChildren().add(folderTree);
+            }
+        });
+
+        String key = tree.keySet().iterator().next();
+        FolderTree root = tree.get(key);
+        return List.of(root);
+    }
 }

+ 6 - 0
content/content-service/src/main/resources/mapper/disk/DiskFileMapper.xml

@@ -17,6 +17,12 @@
         </foreach>
     </insert>
 
+    <update id="updateMoveDiskFile">
+        update my_disk_file
+        set update_time=now(),pid=#{pid},`path`=#{path}
+        where file_id=#{fileId}
+    </update>
+
     <delete id="deleteByAlbumIdAndPostId">
         delete from my_disk_file
         where album_id=#{albumId} and post_id=#{postId}