Prechádzať zdrojové kódy

DiskFolderService#getFolderTree 方法实现 el-tree 需要的数据格式, 即一棵目录树

reghao 6 mesiacov pred
rodič
commit
3ac9032707

+ 42 - 9
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskFolderService.java

@@ -101,12 +101,18 @@ public class DiskFolderService {
         return diskFileList.get(0).getFileId();
     }
 
+    /**
+     * elementui 的 el-tree
+     *
+     * @param
+     * @return
+     * @date 2025-09-05 16:29:33
+     */
     public List<FolderTree> getFolderTree() {
         DiskFile root = diskFileMapper.findRoot();
         if (root == null) {
             return Collections.emptyList();
         }
-        FolderTree treeRoot = new FolderTree(root);
 
         long loginUser = UserContext.getUserId();
         DiskQuery diskQuery = new DiskQuery.Builder()
@@ -116,16 +122,43 @@ public class DiskFolderService {
 
         Page page = new Page(1, 1000);
         List<DiskFile> diskFileList = diskFileMapper.findDiskQueryByPage(page, diskQuery);
-        Map<String, List<FolderTree>> map = diskFileList.stream()
+        List<FolderTree> topChildren = getCollapsedTree(diskFileList);
+
+        FolderTree treeRoot = new FolderTree(root);
+        treeRoot.setChildren(topChildren);
+        return List.of(treeRoot);
+    }
+
+    /**
+     * 获取一棵收拢的树
+     *
+     * @param
+     * @return
+     * @date 2025-09-05 16:27:03
+     */
+    private List<FolderTree> getCollapsedTree(List<DiskFile> folderList) {
+        Map<String, FolderTree> map = folderList.stream()
                 .map(FolderTree::new)
-                .collect(Collectors.groupingBy(FolderTree::getPid));
+                .collect(Collectors.groupingBy(FolderTree::getLabel,
+                        Collectors.collectingAndThen(Collectors.toList(), value -> value.get(0))));
+
+        // 按 path 长度降序
+        List<String> list = map.keySet().stream()
+                .sorted((o1, o2) -> o2.length()-o1.length())
+                .collect(Collectors.toList());
+
+        // 对于一棵树, 从最下面的节点往上收拢
+        for (String path : list) {
+            int idx = path.lastIndexOf("/");
+            String parentPath = path.substring(0, idx);
+            if (parentPath.isBlank()) {
+                continue;
+            }
 
-        String rootId = treeRoot.getFileId();
-        List<FolderTree> list = map.get(rootId);
-        if (list != null) {
-            treeRoot.setChildren(list);
+            FolderTree folderTree = map.get(path);
+            map.get(parentPath).getChildren().add(folderTree);
+            map.remove(path);
         }
-
-        return List.of(treeRoot);
+        return new ArrayList<>(map.values());
     }
 }

+ 13 - 0
content/content-service/src/test/java/cn/reghao/tnb/content/app/disk/service/DiskTest.java

@@ -1,14 +1,20 @@
 package cn.reghao.tnb.content.app.disk.service;
 
+import cn.reghao.tnb.common.auth.LoginUser;
+import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.content.app.ContentApplication;
 import cn.reghao.tnb.content.app.disk.db.mapper.DiskAlbumMapper;
 import cn.reghao.tnb.content.app.disk.db.mapper.DiskFileMapper;
+import cn.reghao.tnb.content.app.disk.model.vo.FolderTree;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.ActiveProfiles;
 
+import java.util.Collections;
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2025-09-03 19:12:34
@@ -22,7 +28,14 @@ public class DiskTest {
     @Autowired
     DiskFileMapper diskFileMapper;
 
+    @Autowired
+    DiskFolderService diskFolderService;
     @Test
     public void diskTest() {
+        LoginUser loginUser = new LoginUser(10001L, "loginId", Collections.emptySet());
+        UserContext context = new UserContext(loginUser);
+
+        List<FolderTree> list = diskFolderService.getFolderTree();
+        System.out.println();
     }
 }