Browse Source

update content-service/disk

reghao 6 months ago
parent
commit
bfd7d71939
36 changed files with 974 additions and 521 deletions
  1. 5 5
      content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/service/ChatDialogService.java
  2. 2 2
      content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/service/ChatRecordService.java
  3. 3 3
      content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/service/GroupInfoService.java
  4. 6 6
      content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/service/GroupMemberService.java
  5. 1 1
      content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/service/GroupNoticeService.java
  6. 67 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/controller/DiskAlbumController.java
  7. 47 122
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/controller/DiskFileController.java
  8. 39 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/controller/DiskFolderController.java
  9. 43 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/controller/DiskSyncController.java
  10. 23 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/db/mapper/DiskAlbumMapper.java
  11. 1 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/db/mapper/NetDiskMapper.java
  12. 19 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/dto/AlbumAdd.java
  13. 14 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/dto/AlbumCreate.java
  14. 22 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/dto/CreateFile.java
  15. 17 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/dto/CreateFolder.java
  16. 5 1
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/dto/SearchForm.java
  17. 32 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/po/DiskAlbum.java
  18. 21 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/po/DiskAlbumFile.java
  19. 16 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/query/DiskQuery.java
  20. 1 1
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/vo/DiskInfo.java
  21. 33 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/vo/FileTree.java
  22. 0 30
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/vo/FolderTree.java
  23. 4 10
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/vo/NetDiskDetail.java
  24. 123 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskAlbumService.java
  25. 112 132
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskFileService.java
  26. 86 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskFolderService.java
  27. 72 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskSyncService.java
  28. 0 205
      content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/NetDiskQuery.java
  29. 41 0
      content/content-service/src/main/resources/mapper/disk/DiskAlbumMapper.xml
  30. 10 0
      content/content-service/src/main/resources/mapper/disk/NetDiskMapper.xml
  31. 95 0
      content/content-service/src/test/java/cn/reghao/tnb/content/app/disk/service/DiskUnitTest.java
  32. 1 0
      file/file-api/src/main/java/cn/reghao/file/api/iface/OssService.java
  33. 1 1
      file/file-service/src/main/java/cn/reghao/tnb/file/app/config/CacheConfig.java
  34. 1 1
      file/file-service/src/main/java/cn/reghao/tnb/file/app/controller/OssController.java
  35. 10 0
      file/file-service/src/main/java/cn/reghao/tnb/file/app/rpc/StoreServiceWrapperRouter.java
  36. 1 1
      search/search-service/src/main/java/cn/reghao/tnb/search/app/service/WenshuService.java

+ 5 - 5
content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/service/ChatDialogService.java

@@ -92,7 +92,7 @@ public class ChatDialogService {
     }
 
     public List<ChatInitialRet> getChatDialogs() {
-        long loginUser = UserContext.getUserId();;
+        long loginUser = UserContext.getUserId();
         List<ChatDialog> chatDialogs = chatDialogMapper.findChatDialogsByUserId(loginUser);
         return chatDialogs.stream()
                 .map(chatDialog -> {
@@ -109,12 +109,12 @@ public class ChatDialogService {
     }
 
     public void deleteChatDialog(long dialogId) {
-        long loginUser = UserContext.getUserId();;
+        long loginUser = UserContext.getUserId();
         chatDialogMapper.updateSetDisplay(dialogId, loginUser, false);
     }
 
     public void setChatDialogTop(ChatTop chatTop) {
-        long loginUser = UserContext.getUserId();;
+        long loginUser = UserContext.getUserId();
         long dialogId = chatTop.getListId();
         int type = chatTop.getType();
         boolean top = type == 1;
@@ -122,7 +122,7 @@ public class ChatDialogService {
     }
 
     public void setChatDialogDisturb(ChatDisturb chatDisturb) {
-        long loginUser = UserContext.getUserId();;
+        long loginUser = UserContext.getUserId();
         boolean disturb = chatDisturb.getIsDisturb() == 1;
         long receiverId = chatDisturb.getReceiverId();
         ChatDialog chatDialog = chatDialogMapper.findByReceiverAndUserId(receiverId, loginUser);
@@ -132,6 +132,6 @@ public class ChatDialogService {
     }
 
     public void clearUnread(long receiverId) {
-        long loginUser = UserContext.getUserId();;
+        long loginUser = UserContext.getUserId();
     }
 }

+ 2 - 2
content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/service/ChatRecordService.java

@@ -48,7 +48,7 @@ public class ChatRecordService {
 
 
     public ChatRecordGetRetList getChatRecords(long receiverId, long recordId, int limit) {
-        long loginUser = UserContext.getUserId();;
+        long loginUser = UserContext.getUserId();
         List<ChatRecordGetRet> list = chatRecordMapper.findChatRecordGetRet(receiverId, loginUser, recordId, limit);
         list.forEach(chatRecordGetRet -> {
             try {
@@ -113,7 +113,7 @@ public class ChatRecordService {
     }
 
     public ChatRecordGetRetList getChatRecords(int msgType, long receiverId, long recordId, int limit) {
-        long loginUser = UserContext.getUserId();;
+        long loginUser = UserContext.getUserId();
         List<ChatRecordGetRet> list =
                 chatRecordMapper.findChatRecordGetRetByMsgType(msgType, receiverId, loginUser, recordId, limit);
         list.forEach(chatRecordGetRet -> {

+ 3 - 3
content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/service/GroupInfoService.java

@@ -32,7 +32,7 @@ public class GroupInfoService {
     }
 
     public CreateGroupRet createGroup(CreateGroup createGroup) {
-        long loginUser = UserContext.getUserId();;
+        long loginUser = UserContext.getUserId();
         GroupInfo groupInfo = new GroupInfo(createGroup, loginUser);
         groupInfoMapper.save(groupInfo);
 
@@ -46,7 +46,7 @@ public class GroupInfoService {
     }
 
     public GroupDetailRet getGroupDetail(long groupId) {
-        long loginUser = UserContext.getUserId();;
+        long loginUser = UserContext.getUserId();
         GroupMember groupMember = groupMemberMapper.findByGroupAndUserId(groupId, loginUser);
         if (groupMember == null) {
             // TODO 只有群组成员才可获取群信息
@@ -73,7 +73,7 @@ public class GroupInfoService {
     }
 
     public void editGroupDetail(GroupSetting groupSetting) {
-        long loginUser = UserContext.getUserId();;
+        long loginUser = UserContext.getUserId();
         int groupId = groupSetting.getGroupId();
         GroupInfo groupInfo = groupInfoMapper.findByGroupId(groupId);
         long ownerId = groupInfo.getOwnerId();

+ 6 - 6
content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/service/GroupMemberService.java

@@ -37,7 +37,7 @@ public class GroupMemberService {
     }
 
     public GroupInfoRetList getGroups() {
-        long loginUser = UserContext.getUserId();;
+        long loginUser = UserContext.getUserId();
         List<GroupInfoRet> rows = groupInfoMapper.findGroupsByUserId(loginUser);
         rows.forEach(groupInfoRet -> {
             if (groupInfoRet.isOwner()) {
@@ -78,14 +78,14 @@ public class GroupMemberService {
     }
 
     public void setNicknameInGroup(MemberRemark memberRemark) {
-        long loginUser = UserContext.getUserId();;
+        long loginUser = UserContext.getUserId();
         long groupId = memberRemark.getGroupId();
         String remarkName = memberRemark.getVisitCard();
         groupMemberMapper.updateSetMemberRemark(groupId, loginUser, remarkName);
     }
 
     public List<ContactInfo> getInvitedUsers(long groupId) {
-        long loginUser = UserContext.getUserId();;
+        long loginUser = UserContext.getUserId();
         List<UserContact> list = new ArrayList<>();
         /*if (groupId == 0) {
             list = userContactMapper.findByUserId(loginUser);
@@ -103,7 +103,7 @@ public class GroupMemberService {
     }
 
     public void inviteUsers(GroupInvite groupInvite) {
-        long loginUser = UserContext.getUserId();;
+        long loginUser = UserContext.getUserId();
         long groupId = groupInvite.getGroupId();
         GroupMember groupMember = groupMemberMapper.findByGroupAndUserId(groupId, loginUser);
         if (groupMember == null) {
@@ -118,7 +118,7 @@ public class GroupMemberService {
     }
 
     public void leaveGroup(SecedeGroup secedeGroup) {
-        long loginUser = UserContext.getUserId();;
+        long loginUser = UserContext.getUserId();
         long groupId = secedeGroup.getGroupId();
         GroupInfo groupInfo = groupInfoMapper.findByGroupId(groupId);
         long ownerId = groupInfo.getOwnerId();
@@ -132,7 +132,7 @@ public class GroupMemberService {
     }
 
     public void removeMembers(RemoveMember removeMember) {
-        long loginUser = UserContext.getUserId();;
+        long loginUser = UserContext.getUserId();
         long groupId = removeMember.getGroupId();
         GroupInfo groupInfo = groupInfoMapper.findByGroupId(groupId);
         long ownerId = groupInfo.getOwnerId();

+ 1 - 1
content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/service/GroupNoticeService.java

@@ -45,7 +45,7 @@ public class GroupNoticeService {
     }
 
     public NoticeListRet getNoticeList(long groupId) {
-        long loginUser = UserContext.getUserId();;
+        long loginUser = UserContext.getUserId();
         GroupMember groupMember = groupMemberMapper.findByGroupAndUserId(groupId, loginUser);
         if (groupMember == null) {
             // TODO 不是该组成员, 没有权限查看群公告

+ 67 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/controller/DiskAlbumController.java

@@ -0,0 +1,67 @@
+package cn.reghao.tnb.content.app.disk.controller;
+
+import cn.reghao.jutil.jdk.db.PageList;
+import cn.reghao.jutil.web.WebResult;
+import cn.reghao.tnb.common.db.SelectOption;
+import cn.reghao.tnb.content.app.disk.model.dto.AlbumAdd;
+import cn.reghao.tnb.content.app.disk.model.dto.AlbumCreate;
+import cn.reghao.tnb.content.app.disk.model.po.DiskAlbum;
+import cn.reghao.tnb.content.app.disk.model.vo.NetDiskDetail;
+import cn.reghao.tnb.content.app.disk.service.DiskAlbumService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+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 14:23:45
+ */
+@Tag(name = "网盘相册接口")
+@RestController
+@RequestMapping("/api/content/disk/album")
+public class DiskAlbumController {
+    private final DiskAlbumService diskAlbumService;
+
+    public DiskAlbumController(DiskAlbumService diskAlbumService) {
+        this.diskAlbumService = diskAlbumService;
+    }
+
+    @Operation(summary = "创建相册", description = "N")
+    @PostMapping(value = "/create", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String createDiskAlbum(@RequestBody @Validated AlbumCreate albumCreate) {
+        diskAlbumService.createAlbum(albumCreate);
+        return WebResult.success();
+    }
+
+    @Operation(summary = "添加文件到相册", description = "N")
+    @PostMapping(value = "/add", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String addToDiskAlbum(@RequestBody @Validated AlbumAdd albumAdd) {
+        diskAlbumService.addAlbumFile(albumAdd);
+        return WebResult.success();
+    }
+
+    @Operation(summary = "获取相册 KV 列表", description = "N")
+    @GetMapping(value = "/kv", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getAlbumKeyValues() {
+        List<SelectOption> keyValues = diskAlbumService.getAlbumKeyValues();
+        return WebResult.success(keyValues);
+    }
+
+    @Operation(summary = "获取相册列表", description = "N")
+    @GetMapping(value = "/list", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getDiskAlbum() {
+        List<DiskAlbum> diskAlbumList = diskAlbumService.getAlbumList();
+        return WebResult.success(diskAlbumList);
+    }
+
+    @Operation(summary = "获取相册详情", description = "N")
+    @GetMapping(value = "/detail/{albumId}", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getDiskAlbumDetail(@PathVariable("albumId") long albumId) {
+        PageList<NetDiskDetail> pageList = diskAlbumService.getDiskAlbumDetail(albumId);
+        return WebResult.success(pageList);
+    }
+}

+ 47 - 122
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/controller/NetDiskController.java → content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/controller/DiskFileController.java

@@ -1,16 +1,14 @@
 package cn.reghao.tnb.content.app.disk.controller;
 
 import cn.reghao.jutil.jdk.db.PageList;
-import cn.reghao.jutil.jdk.result.WebResult;
-import cn.reghao.oss.sdk.model.constant.ObjectType;
+import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.common.auth.UserContext;
-import cn.reghao.tnb.content.app.disk.model.dto.CreateDir;
 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.NetDisk;
+import cn.reghao.tnb.content.app.disk.model.query.DiskQuery;
 import cn.reghao.tnb.content.app.disk.model.vo.*;
-import cn.reghao.tnb.content.app.disk.service.NetDiskQuery;
-import cn.reghao.tnb.content.app.disk.service.NetDiskService;
+import cn.reghao.tnb.content.app.disk.service.DiskFileService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.http.MediaType;
@@ -24,126 +22,51 @@ import java.util.List;
  * @author reghao
  * @date 2024-08-29 22:17:06
  */
-@Tag(name = "网盘接口")
+@Tag(name = "网盘文件接口")
 @RestController
-@RequestMapping("/api/content/disk")
-public class NetDiskController {
-    private final NetDiskQuery netDiskQuery;
-    private final NetDiskService netDiskService;
+@RequestMapping("/api/content/disk/file")
+public class DiskFileController {
     private int pageSize = 10;
+    private final DiskFileService diskFileService;
 
-    public NetDiskController(NetDiskQuery netDiskQuery, NetDiskService netDiskService) {
-        this.netDiskQuery = netDiskQuery;
-        this.netDiskService = netDiskService;
+    public DiskFileController(DiskFileService diskFileService) {
+        this.diskFileService = diskFileService;
     }
 
-    @Operation(summary = "网盘文件列表页面", description = "N")
-    @GetMapping("/file")
+    @Operation(summary = "网盘文件列表", description = "N")
+    @GetMapping("/list")
     public String diskPage(SearchForm searchForm) {
         Integer pageNumber = searchForm.getPn();
-        String filename = searchForm.getFilename();
         String path = searchForm.getPath();
         Integer fileType = searchForm.getFileType();
-        if (pageNumber == null) {
-            pageNumber = 1;
-        }
-
-        String queryParams = "";
-        if (path == null || path.isBlank()) {
-            path = "/";
-        }
-        queryParams += "?path=" + path;
-
         String pid = "0";
         if (!"/".equals(path)) {
-            NetDisk diskFile = netDiskQuery.findByPath(path);
-            if (diskFile == null) {
+            NetDisk netDisk = diskFileService.findByPath(path);
+            if (netDisk == null) {
                 return WebResult.failWithMsg("not found diskFile");
             }
-            pid = diskFile.getFileId();
-        }
-
-        PageList<FileInfo> pageList = netDiskQuery.findByPid(pageSize, pageNumber, pid);
-        List<NamePath> pathList = netDiskService.getPathList(path);
-        DiskInfo diskInfo = new DiskInfo(pageList, pathList);
-        return WebResult.success(diskInfo);
-    }
-
-    @Operation(summary = "图片文件列表页面", description = "N")
-    @GetMapping("/image")
-    public String getPhotoPage(SearchForm searchForm) {
-        Integer pageNumber = searchForm.getPn();
-        if (pageNumber == null) {
-            pageNumber = 1;
+            pid = netDisk.getFileId();
         }
 
-        PageList<DiskFileInfo> images = netDiskQuery.getImageFiles(ObjectType.Image, pageSize, pageNumber);
-        //model.addAttribute("page", images);
-        return WebResult.success();
-    }
-
-    @Operation(summary = "视频文件列表页面", description = "N")
-    @GetMapping("/video")
-    public String diskVideoPage(SearchForm searchForm) {
-        Integer pageNumber = searchForm.getPn();
-        if (pageNumber == null) {
-            pageNumber = 1;
-        }
-
-        PageList<DiskFileInfo> images = netDiskQuery.getImageFiles(ObjectType.Video, pageSize, pageNumber);
-        //model.addAttribute("page", images);
-        return WebResult.success();
-    }
-
-    @Operation(summary = "音频文件列表页面", description = "N")
-    @GetMapping("/audio")
-    public String diskAudioPage(SearchForm searchForm) {
-        Integer pageNumber = searchForm.getPn();
-        if (pageNumber == null) {
-            pageNumber = 1;
-        }
-
-        PageList<DiskFileInfo> images = netDiskQuery.getImageFiles(ObjectType.Audio, pageSize, pageNumber);
-        //model.addAttribute("page", images);
-        return WebResult.success();
-    }
-
-    @Operation(summary = "文档文件列表页面", description = "N")
-    @GetMapping("/doc")
-    public String diskDocPage(SearchForm searchForm) {
-        Integer pageNumber = searchForm.getPn();
-        if (pageNumber == null) {
-            pageNumber = 1;
-        }
-
-        PageList<DiskFileInfo> images = netDiskQuery.getImageFiles(ObjectType.Text, pageSize, pageNumber);
-        //model.addAttribute("page", images);
-        return WebResult.success();
-    }
-
-    @Operation(summary = "文件分享页面", description = "N")
-    @GetMapping("/share/{shareId}")
-    public String disSharePage(@PathVariable("shareId") String shareId) {
-        /*model.addAttribute("siteName", "disk");
-        model.addAttribute("page", Page.empty());
-        model.addAttribute("query", "fileType=1001");*/
-        return WebResult.success();
-    }
-
-    @Operation(summary = "检查文件是否存在", description = "N")
-    @PostMapping(value = "/file/check", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String createFolder(@Validated CreateDir createDir) {
         long loginUser = UserContext.getUserId();
-        NetDisk netDisk = netDiskQuery.getNetDisk(loginUser, createDir.getPath());
-        Boolean exist = netDisk != null;
-        return WebResult.success(exist);
+        DiskQuery diskQuery = new DiskQuery.Builder()
+                .pageNumber(pageNumber)
+                .pageSize(pageSize)
+                .fileType(fileType)
+                .pid(pid)
+                .owner(loginUser)
+                .build();
+        PageList<FileInfo> pageList = diskFileService.findByDiskQuery(diskQuery);
+        List<NamePath> namePathList = diskFileService.getPathList(path);
+        DiskInfo diskInfo = new DiskInfo(pageList, namePathList);
+        return WebResult.success(diskInfo);
     }
 
-    @Operation(summary = "文件预览", description = "N")
+    @Operation(summary = "预览文件", description = "N")
     @GetMapping(value = "/preview", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getPreviewFile(@RequestParam("fileId") String fileId) {
-        FileUrl fileUrl = netDiskQuery.getFileUrl(fileId);
-        return WebResult.success(fileUrl);
+        NetDiskDetail netDiskDetail = diskFileService.getNetDiskDetail(fileId);
+        return WebResult.success(netDiskDetail);
     }
 
     @Operation(summary = "重命名文件", description = "N")
@@ -180,23 +103,13 @@ public class NetDiskController {
         return WebResult.successWithMsg("尚未实现");
     }
 
-    @Operation(summary = "还原删除的文件", description = "N")
-    @PostMapping(value = "/restore", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String restoreFiles(@RequestParam("fileId") List<String> fileIds) throws IOException {
-        return WebResult.successWithMsg("尚未实现");
-    }
-
-    @Operation(summary = "清空回收站", description = "N")
-    @PostMapping(value = "/erase", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String eraseFiles(@RequestParam("fileId") List<String> fileIds) throws IOException {
-        return WebResult.successWithMsg("尚未实现");
-    }
-
-    @Operation(summary = "获取目录树", description = "N")
-    @GetMapping(value = "/disk/foldertree", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String getFolderTree() {
-        List<FolderTree> list = netDiskQuery.getFolders();
-        return WebResult.success(list);
+    @Operation(summary = "文件分享", description = "N")
+    @GetMapping("/share/{shareId}")
+    public String disSharePage(@PathVariable("shareId") String shareId) {
+        /*model.addAttribute("siteName", "disk");
+        model.addAttribute("page", Page.empty());
+        model.addAttribute("query", "fileType=1001");*/
+        return WebResult.success();
     }
 
     @Operation(summary = "访问分享的文件", description = "N")
@@ -216,4 +129,16 @@ public class NetDiskController {
     public String getTrashList() {
         return WebResult.successWithMsg("尚未实现");
     }
+
+    @Operation(summary = "还原删除的文件", description = "N")
+    @PostMapping(value = "/restore", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String restoreFiles(@RequestParam("fileId") List<String> fileIds) throws IOException {
+        return WebResult.successWithMsg("尚未实现");
+    }
+
+    @Operation(summary = "清空回收站", description = "N")
+    @PostMapping(value = "/erase", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String eraseFiles(@RequestParam("fileId") List<String> fileIds) throws IOException {
+        return WebResult.successWithMsg("尚未实现");
+    }
 }

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

@@ -0,0 +1,39 @@
+package cn.reghao.tnb.content.app.disk.controller;
+
+import cn.reghao.jutil.web.WebResult;
+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.service.DiskFolderService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author reghao
+ * @date 2025-09-01 10:16:46
+ */
+@Tag(name = "网盘目录接口")
+@RestController
+@RequestMapping("/api/content/disk/folder")
+public class DiskFolderController {
+    private final DiskFolderService diskFolderService;
+
+    public DiskFolderController(DiskFolderService diskFolderService) {
+        this.diskFolderService = diskFolderService;
+    }
+
+    @Operation(summary = "新建目录", description = "N")
+    @PostMapping(value = "/rename", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String createFolder(@Validated CreateFolder createFolder) {
+        diskFolderService.createFolder(createFolder);
+        return WebResult.success();
+    }
+
+    @Operation(summary = "重命名目录", description = "N")
+    @PostMapping(value = "/rename", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String renameFolder(@Validated RenameFile renameFile) {
+        return WebResult.successWithMsg("尚未实现");
+    }
+}

+ 43 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/controller/DiskSyncController.java

@@ -0,0 +1,43 @@
+package cn.reghao.tnb.content.app.disk.controller;
+
+import cn.reghao.jutil.web.WebResult;
+import cn.reghao.tnb.content.app.disk.model.dto.CreateFile;
+import cn.reghao.tnb.content.app.disk.service.DiskSyncService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author reghao
+ * @date 2025-09-01 11:42:46
+ */
+@Tag(name = "网盘同步接口")
+@RestController
+@RequestMapping("/api/content/disk/sync")
+public class DiskSyncController {
+    private DiskSyncService diskSyncService;
+
+    public DiskSyncController(DiskSyncService diskSyncService) {
+        this.diskSyncService = diskSyncService;
+    }
+
+    @Operation(summary = "获取文件树", description = "N")
+    @GetMapping(value = "/check", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String checkFile(@RequestParam("path") String path) {
+        return WebResult.success();
+    }
+
+    @Operation(summary = "获取文件树", description = "N")
+    @GetMapping(value = "/get", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getFileTree() {
+        return WebResult.success();
+    }
+
+    @Operation(summary = "添加文件(或目录)", description = "N")
+    @PostMapping(value = "/put", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String putFile(@RequestBody @Validated CreateFile createFile) {
+        return WebResult.success();
+    }
+}

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

@@ -0,0 +1,23 @@
+package cn.reghao.tnb.content.app.disk.db.mapper;
+
+import cn.reghao.jutil.jdk.db.BaseMapper;
+import cn.reghao.tnb.content.app.disk.model.po.DiskAlbum;
+import cn.reghao.tnb.content.app.disk.model.po.DiskAlbumFile;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2025-09-01 14:42:17
+ */
+@Mapper
+public interface DiskAlbumMapper extends BaseMapper<DiskAlbum> {
+    void saveAlbumFiles(List<DiskAlbumFile> list);
+    void updateCoverUrl(@Param("albumId") long albumId, @Param("coverUrl") String coverUrl);
+    void updateNum(@Param("albumId") long albumId, @Param("num") int num);
+
+    List<DiskAlbum> findByCreateBy(long createBy);
+    List<DiskAlbumFile> findByAlbumId(long albumId);
+}

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

@@ -19,4 +19,5 @@ public interface NetDiskMapper extends BaseMapper<NetDisk> {
     List<NetDiskCount> findFileTypeCountByGroup(long owner);
     int countByDiskQuery(DiskQuery diskQuery);
     List<NetDisk> findDiskQueryByPage(@Param("page") Page page, @Param("diskQuery") DiskQuery diskQuery);
+    List<NetDisk> findByFileIds(List<String> list);
 }

+ 19 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/dto/AlbumAdd.java

@@ -0,0 +1,19 @@
+package cn.reghao.tnb.content.app.disk.model.dto;
+
+import lombok.Getter;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2025-09-01 15:40:36
+ */
+@Getter
+public class AlbumAdd {
+    @NotNull
+    private Long albumId;
+    @Size(min = 1, max = 100, message = "每次添加到相册的文件不超过 100 个")
+    private List<String> fileIds;
+}

+ 14 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/dto/AlbumCreate.java

@@ -0,0 +1,14 @@
+package cn.reghao.tnb.content.app.disk.model.dto;
+
+import lombok.Getter;
+import org.hibernate.validator.constraints.Length;
+
+/**
+ * @author reghao
+ * @date 2025-09-01 14:39:27
+ */
+@Getter
+public class AlbumCreate {
+    @Length(min = 4, max = 10, message = "相册名长度为 4 ~ 10 个字符")
+    private String albumName;
+}

+ 22 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/dto/CreateFile.java

@@ -0,0 +1,22 @@
+package cn.reghao.tnb.content.app.disk.model.dto;
+
+import lombok.Getter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author reghao
+ * @date 2025-09-01 10:31:44
+ */
+@Getter
+public class CreateFile {
+    @NotBlank
+    private String parentPath;
+    @NotBlank
+    private String filename;
+    @NotNull
+    private Integer channelCode;
+    @NotBlank
+    private String uploadId;
+}

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

@@ -0,0 +1,17 @@
+package cn.reghao.tnb.content.app.disk.model.dto;
+
+import lombok.Getter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author reghao
+ * @date 2025-09-01 10:19:24
+ */
+@Getter
+public class CreateFolder {
+    @NotBlank
+    private String path;
+    @NotBlank
+    private String folderName;
+}

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

@@ -3,6 +3,9 @@ package cn.reghao.tnb.content.app.disk.model.dto;
 import lombok.Getter;
 import lombok.Setter;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
 /**
  * @author reghao
  * @date 2023-12-22 20:41:02
@@ -10,8 +13,9 @@ import lombok.Setter;
 @Setter
 @Getter
 public class SearchForm {
+    @NotNull
     private Integer pn;
+    @NotBlank
     private String path;
     private Integer fileType;
-    private String filename;
 }

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

@@ -0,0 +1,32 @@
+package cn.reghao.tnb.content.app.disk.model.po;
+
+import cn.reghao.jutil.jdk.db.BaseObject;
+import cn.reghao.tnb.common.auth.UserContext;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2025-09-01 14:40:36
+ */
+@NoArgsConstructor
+@Setter
+@Getter
+public class DiskAlbum extends BaseObject<Integer> {
+    private long albumId;
+    private String albumName;
+    private String coverUrl;
+    private Integer num;
+    private Long createAt;
+    private Long createBy;
+
+    public DiskAlbum(long albumId, String albumName) {
+        this.albumId = albumId;
+        this.albumName = albumName;
+        this.coverUrl = "";
+        this.num = 0;
+        this.createAt = System.currentTimeMillis();
+        this.createBy = UserContext.getUserId();
+    }
+}

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

@@ -0,0 +1,21 @@
+package cn.reghao.tnb.content.app.disk.model.po;
+
+import cn.reghao.jutil.jdk.db.BaseObject;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2025-09-01 14:41:05
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Setter
+@Getter
+public class DiskAlbumFile extends BaseObject<Integer> {
+    private Long albumId;
+    private String fileId;
+    private Integer fileType;
+}

+ 16 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/query/DiskQuery.java

@@ -1,13 +1,17 @@
 package cn.reghao.tnb.content.app.disk.model.query;
 
 import lombok.Getter;
+import lombok.Setter;
 
 /**
  * @author reghao
  * @date 2025-08-29 20:09:08
  */
 @Getter
+@Setter
 public class DiskQuery {
+    private Integer pageNumber;
+    private Integer pageSize;
     private Integer fileType;
     private Long owner;
     private String pid;
@@ -25,6 +29,8 @@ public class DiskQuery {
     }
 
     public static final class Builder {
+        private Integer pageNumber;
+        private Integer pageSize;
         private Integer fileType;
         private Long owner;
         private String pid;
@@ -35,6 +41,16 @@ public class DiskQuery {
         public Builder() {
         }
 
+        public Builder pageNumber(int pageNumber) {
+            this.pageNumber = pageNumber;
+            return this;
+        }
+
+        public Builder pageSize(int pageSize) {
+            this.pageSize = pageSize;
+            return this;
+        }
+
         public Builder fileType(int fileType) {
             this.fileType = fileType;
             return this;

+ 1 - 1
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/vo/DiskInfo.java

@@ -12,5 +12,5 @@ import java.util.List;
 @AllArgsConstructor
 public class DiskInfo {
     private PageList<FileInfo> pageList;
-    private List<NamePath> pathList;
+    private List<NamePath> namePathList;
 }

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

@@ -0,0 +1,33 @@
+package cn.reghao.tnb.content.app.disk.model.vo;
+
+import cn.reghao.tnb.content.app.disk.model.po.NetDisk;
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2023-11-14 10:55:43
+ */
+@Getter
+public class FileTree {
+    private String pid;
+    private String fileId;
+    private int fileType;
+    private List<FileTree> children;
+
+    public FileTree(NetDisk netDisk) {
+        this.pid = netDisk.getPid();
+        this.fileId = netDisk.getFileId();
+        this.fileType = netDisk.getFileType();
+        this.children = new ArrayList<>();
+    }
+
+    public FileTree(String pid, String fileId, int fileType) {
+        this.pid = pid;
+        this.fileId = fileId;
+        this.fileType = fileType;
+        this.children = new ArrayList<>();
+    }
+}

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

@@ -1,30 +0,0 @@
-package cn.reghao.tnb.content.app.disk.model.vo;
-
-import cn.reghao.tnb.content.app.disk.model.po.NetDisk;
-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 String icon;
-    private List<FolderTree> children;
-
-    public FolderTree(NetDisk diskFile) {
-        this.pid = diskFile.getPid();
-        this.fileId = diskFile.getFileId();
-        this.label = diskFile.getPath();
-        this.value = diskFile.getFilename();
-        this.icon = "el-icon-lollipop";
-        this.children = new ArrayList<>();
-    }
-}

+ 4 - 10
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/vo/FileUrl.java → content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/vo/NetDiskDetail.java

@@ -1,7 +1,6 @@
 package cn.reghao.tnb.content.app.disk.model.vo;
 
 import cn.reghao.oss.sdk.model.dto.ObjectInfo;
-import cn.reghao.tnb.content.app.disk.model.po.NetDisk;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
@@ -13,21 +12,16 @@ import lombok.Setter;
 @NoArgsConstructor
 @Setter
 @Getter
-@Deprecated
-public class FileUrl {
+public class NetDiskDetail {
     private String fileId;
     private int fileType;
-    private String originalUrl;
-    private String url;
     private String filename;
-    private String objectName;
+    private String url;
 
-    public FileUrl(ObjectInfo objectInfo, String signedUrl) {
+    public NetDiskDetail(ObjectInfo objectInfo, String signedUrl) {
         this.fileId = objectInfo.getObjectId();
         this.fileType = objectInfo.getFileType();
-        this.originalUrl = objectInfo.getUrl();
-        this.url = signedUrl;
         this.filename = objectInfo.getFilename();
-        this.objectName = objectInfo.getFilename();
+        this.url = signedUrl;
     }
 }

+ 123 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskAlbumService.java

@@ -0,0 +1,123 @@
+package cn.reghao.tnb.content.app.disk.service;
+
+import cn.reghao.file.api.iface.OssService;
+import cn.reghao.jutil.jdk.db.PageList;
+import cn.reghao.jutil.tool.id.SnowFlake;
+import cn.reghao.oss.sdk.model.constant.ObjectType;
+import cn.reghao.oss.sdk.model.dto.ObjectInfo;
+import cn.reghao.tnb.common.auth.UserContext;
+import cn.reghao.tnb.common.db.SelectOption;
+import cn.reghao.tnb.content.app.disk.db.mapper.DiskAlbumMapper;
+import cn.reghao.tnb.content.app.disk.db.mapper.NetDiskMapper;
+import cn.reghao.tnb.content.app.disk.model.dto.AlbumAdd;
+import cn.reghao.tnb.content.app.disk.model.dto.AlbumCreate;
+import cn.reghao.tnb.content.app.disk.model.po.DiskAlbum;
+import cn.reghao.tnb.content.app.disk.model.po.DiskAlbumFile;
+import cn.reghao.tnb.content.app.disk.model.vo.*;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2023-11-10 15:16:35
+ */
+@Service
+public class DiskAlbumService {
+    @DubboReference(check = false, timeout = 60_000)
+    private OssService ossService;
+    private final int channelCode = 111;
+    private final NetDiskMapper netDiskMapper;
+    private final DiskAlbumMapper diskAlbumMapper;
+    private final DiskFileService diskFileService;
+    private final SnowFlake idGenerator;
+
+    public DiskAlbumService(NetDiskMapper netDiskMapper, DiskAlbumMapper diskAlbumMapper,
+                            DiskFileService diskFileService) {
+        this.netDiskMapper = netDiskMapper;
+        this.diskAlbumMapper = diskAlbumMapper;
+        this.diskFileService = diskFileService;
+        this.idGenerator = new SnowFlake(1, 1);
+    }
+
+    public void createAlbum(AlbumCreate albumCreate) {
+        long albumId = idGenerator.nextId();
+        DiskAlbum diskAlbum = new DiskAlbum(albumId, albumCreate.getAlbumName());
+        diskAlbumMapper.save(diskAlbum);
+    }
+
+    public void addAlbumFile(AlbumAdd albumAdd) {
+        long albumId = albumAdd.getAlbumId();
+        List<String> fileIds = albumAdd.getFileIds();
+        long loginUser = UserContext.getUserId();
+        List<DiskAlbumFile> list = netDiskMapper.findByFileIds(fileIds).stream()
+                .filter(netDisk -> netDisk.getFileType() == ObjectType.Image.getCode()
+                        || netDisk.getFileType() == ObjectType.Video.getCode())
+                .filter(netDisk -> netDisk.getOwner() == loginUser)
+                .map(netDisk -> {
+                    String fileId = netDisk.getFileId();
+                    int fileType = netDisk.getFileType();
+                    return new DiskAlbumFile(albumId, fileId, fileType);
+                })
+                .collect(Collectors.toList());
+
+        if (!list.isEmpty()) {
+            DiskAlbumFile diskAlbumFile = list.get(0);
+            String objectId = diskAlbumFile.getFileId();
+            try {
+                ObjectInfo objectInfo = ossService.getObjectInfo(channelCode, objectId);
+                String url = objectInfo.getUrl();
+                diskAlbumMapper.updateCoverUrl(albumId, url);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            diskAlbumMapper.saveAlbumFiles(list);
+        }
+    }
+
+    public List<SelectOption> getAlbumKeyValues() {
+        long loginUser = UserContext.getUserId();
+        return diskAlbumMapper.findByCreateBy(loginUser).stream().map(diskAlbum -> {
+            long albumId = diskAlbum.getAlbumId();
+            String albumName = diskAlbum.getAlbumName();
+            return new SelectOption(albumName, albumId);
+        }).collect(Collectors.toList());
+    }
+
+    public List<DiskAlbum> getAlbumList() {
+        long loginUser = UserContext.getUserId();
+        List<DiskAlbum> diskAlbumList = diskAlbumMapper.findByCreateBy(loginUser);
+        diskAlbumList.forEach(diskAlbum -> {
+            String coverUrl = diskAlbum.getCoverUrl();
+            try {
+                String signedUrl = ossService.getSignedUrlByUrl(channelCode, coverUrl);
+                diskAlbum.setCoverUrl(signedUrl);
+            } catch (Exception e) {
+                // ignore
+            }
+        });
+
+        return diskAlbumList;
+    }
+
+    public PageList<NetDiskDetail> getDiskAlbumDetail(long albumId) {
+        List<DiskAlbumFile> diskAlbumFileList = diskAlbumMapper.findByAlbumId(albumId);
+        List<String> fileIds = diskAlbumFileList.stream().map(DiskAlbumFile::getFileId).collect(Collectors.toList());
+
+        if (!fileIds.isEmpty()) {
+            List<NetDiskDetail> netDiskDetailList = netDiskMapper.findByFileIds(fileIds).stream().map(netDisk -> {
+                String objectId = netDisk.getFileId();
+                return diskFileService.getNetDiskDetail(channelCode, objectId);
+            }).filter(Objects::nonNull).collect(Collectors.toList());
+
+            int total = netDiskDetailList.size();
+            return PageList.pageList(1, 10, total, netDiskDetailList);
+        }
+
+        return PageList.empty();
+    }
+}

+ 112 - 132
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/NetDiskService.java → content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskFileService.java

@@ -1,7 +1,11 @@
 package cn.reghao.tnb.content.app.disk.service;
 
+import cn.reghao.file.api.iface.OssService;
+import cn.reghao.jutil.jdk.converter.ByteConverter;
+import cn.reghao.jutil.jdk.converter.ByteType;
 import cn.reghao.jutil.jdk.converter.DateTimeConverter;
 import cn.reghao.jutil.jdk.db.Page;
+import cn.reghao.jutil.jdk.db.PageList;
 import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.oss.sdk.model.constant.ObjectType;
 import cn.reghao.oss.sdk.model.dto.ObjectInfo;
@@ -9,11 +13,16 @@ import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.common.util.StringUtil;
 import cn.reghao.tnb.content.app.disk.db.mapper.NetDiskMapper;
 import cn.reghao.tnb.content.app.disk.model.dto.CreateDir;
+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.NetDisk;
 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.NetDiskCount;
+import cn.reghao.tnb.content.app.disk.model.vo.NetDiskDetail;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.stereotype.Service;
 
 import java.io.File;
@@ -27,112 +36,43 @@ import java.util.stream.Collectors;
  */
 @Slf4j
 @Service
-public class NetDiskService {
+public class DiskFileService {
+    @DubboReference(check = false, timeout = 60_000)
+    private OssService ossService;
     private final NetDiskMapper netDiskMapper;
+    private final DiskSyncService diskSyncService;
+    private final ByteConverter byteConverter;
 
-    public NetDiskService(NetDiskMapper netDiskMapper) {
+    public DiskFileService(NetDiskMapper netDiskMapper, DiskSyncService diskSyncService) {
         this.netDiskMapper = netDiskMapper;
+        this.diskSyncService = diskSyncService;
+        this.byteConverter = new ByteConverter();
     }
 
-    public String createFolder(String parentPath, String folderName, long owner) {
-        String pid = getFolderId(parentPath, owner, false);
-        if (pid == null) {
-            return null;
-        }
-
-        NamePath namePath = getUniqueNamePath(parentPath, folderName, owner);
-        String fileId = UUID.randomUUID().toString().replace("-", "");
-        NetDisk diskFile = new NetDisk(fileId, pid, namePath.getPath(), namePath.getFilename());
-        netDiskMapper.save(diskFile);
-        return fileId;
-    }
+    public Result addDiskFile(CreateFile createFile) {
+        String parentPath = createFile.getParentPath();
+        File file = new File(parentPath);
+        String filename = createFile.getFilename();
+        String path = String.format("%s/%s", file.getAbsolutePath(), filename);
 
-    public synchronized String createDirs(String dirPath, long owner) {
-        String pid = "0";
-        if (dirPath.equals("/")) {
-            return pid;
+        NetDisk netDisk1 = diskSyncService.checkFile(parentPath);
+        if (netDisk1 == null) {
+            return Result.fail("folder not exist");
         }
+        String pid = netDisk1.getFileId();
 
-        DiskQuery diskQuery = new DiskQuery.Builder()
-                .path(dirPath)
-                .owner(owner)
-                .build();
-        Page page = new Page(1, 10);
-        List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
-        if (!netDiskList.isEmpty()) {
-            return netDiskList.get(0).getFileId();
-        }
-
-        String savedDirPath = dirPath;
-        List<String> list = new ArrayList<>();
-        list.add(dirPath);
-
-        int idx = dirPath.lastIndexOf("/");
-        while (idx != 0) {
-            dirPath = dirPath.substring(0, idx);
-            list.add(dirPath);
-            idx = dirPath.lastIndexOf("/");
+        NetDisk netDisk2 = diskSyncService.checkFile(path);
+        if (netDisk2 != null) {
+            return Result.fail("file exist");
         }
-        Collections.reverse(list);
 
-        for (String parent : list) {
-            diskQuery = new DiskQuery.Builder()
-                    .path(parent)
-                    .owner(owner)
-                    .build();
-            netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
-            if (!netDiskList.isEmpty()) {
-                pid = netDiskList.get(0).getFileId();
-            } else {
-                String fileId = UUID.randomUUID().toString().replace("-", "");
-                String path = parent;
-                String dirname = parent.substring(parent.lastIndexOf("/")+1);
-                netDiskMapper.save(new NetDisk(fileId, pid, path, dirname));
-                pid = fileId;
-            }
-        }
-
-        diskQuery = new DiskQuery.Builder()
-                .path(savedDirPath)
-                .owner(owner)
-                .build();
-        netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
-        return netDiskList.get(0).getFileId();
-    }
-
-    public boolean checkFile(CreateDir createDir) {
-        long owner = UserContext.getUserId();
-        String path = createDir.getPath();
-        String sha256sum = createDir.getSha256sum();
-
-        DiskQuery diskQuery = new DiskQuery.Builder()
-                .path(path)
-                .sha256sum(sha256sum)
-                .owner(owner)
-                .build();
-        Page page = new Page(1, 10);
-        List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
-        return !netDiskList.isEmpty();
-    }
-
-    public Result addNetDisk(ObjectInfo diskFile, String path) {
-        long owner = UserContext.getUserId();
-        String uploadId = diskFile.getObjectId();
+        int channelCode = createFile.getChannelCode();
+        String uploadId = createFile.getUploadId();
         try {
-            String filename = diskFile.getFilename();
-            long size = diskFile.getSize();
-            int fileType = diskFile.getFileType();
-            String sha256sum = diskFile.getSha256sum();
-
-            String parentPath;
-            if (path.equals("/")) {
-                parentPath = "/";
-            } else {
-                File file = new File(path);
-                parentPath = file.getParent();
-            }
-            String pid = createDirs(parentPath, owner);
-            int channelCode = 111;
+            ObjectInfo objectInfo = ossService.getObjectInfo(channelCode, uploadId);
+            long size = objectInfo.getSize();
+            int fileType = objectInfo.getFileType();
+            String sha256sum = objectInfo.getSha256sum();
             NetDisk netDisk = new NetDisk(channelCode, uploadId, pid, path, filename, fileType, sha256sum, size);
             netDiskMapper.save(netDisk);
             return Result.success();
@@ -142,42 +82,6 @@ public class NetDiskService {
         return Result.fail("上传文件失败");
     }
 
-    private String getFolderId(String parent, long owner, boolean isFileId) {
-        if ("/".equals(parent)) {
-            return "0";
-        }
-
-        NetDisk parentFile;
-        if (isFileId) {
-            DiskQuery diskQuery = new DiskQuery.Builder()
-                    .path(parent)
-                    .build();
-            Page page = new Page(1, 10);
-            List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
-            parentFile = netDiskList.get(0);
-        } else {
-            DiskQuery diskQuery = new DiskQuery.Builder()
-                    .path(parent)
-                    .owner(owner)
-                    .build();
-            Page page = new Page(1, 10);
-            List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
-            parentFile = netDiskList.get(0);
-        }
-
-        if (parentFile == null) {
-            String msg = String.format("目录 %s 不存在", parent);
-            return null;
-        }
-
-        if (parentFile.getFileType() != ObjectType.Dir.getCode()) {
-            String msg = String.format("%s 不是目录", parent);
-            return null;
-        }
-
-        return parentFile.getFileId();
-    }
-
     public Result rename(String fileId, String newFilename, long owner) {
         DiskQuery diskQuery = new DiskQuery.Builder()
                 .fileId(fileId)
@@ -573,6 +477,13 @@ public class NetDiskService {
         return new NamePath(filename, path);
     }
 
+    /**
+     * 当前目录中存在同名文件时, 自动修改文件名
+     *
+     * @param
+     * @return
+     * @date 2025-09-01 16:50:36
+     */
     private String getNewFilename(String filename) {
         String suffix = StringUtil.getSuffix(filename);
         String prefix = filename.replace(suffix, "");
@@ -580,7 +491,7 @@ public class NetDiskService {
         String dateTimeStr = DateTimeConverter.format(LocalDateTime.now())
                 .replace(" ", "_")
                 .replace("-", "")
-                .replace(":", "");;
+                .replace(":", "");
         return String.format("%s-%s", prefix, dateTimeStr + suffix);
     }
 
@@ -642,4 +553,73 @@ public class NetDiskService {
         Collections.reverse(pathList);
         return pathList;
     }
+
+    public NetDisk findByPath(String path) {
+        long owner = UserContext.getUserId();
+        DiskQuery diskQuery = new DiskQuery.Builder()
+                .path(path)
+                .owner(owner)
+                .build();
+        Page page = new Page(1, 10);
+        List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
+        return netDiskList.isEmpty() ? null : netDiskList.get(0);
+    }
+
+    public PageList<FileInfo> findByDiskQuery(DiskQuery diskQuery) {
+        int pageNumber = diskQuery.getPageNumber();
+        int pageSize = diskQuery.getPageNumber();
+        Page page = new Page(pageNumber, pageSize);
+        int total = netDiskMapper.countByDiskQuery(diskQuery);
+        List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
+
+        List<FileInfo> list = netDiskList.stream().map(netDisk -> {
+            String sizeStr = byteConverter.convert(ByteType.Bytes, netDisk.getSize());
+            return new FileInfo(netDisk, sizeStr);
+        }).collect(Collectors.toList());
+
+        return PageList.pageList(pageNumber, pageSize, total, list);
+    }
+
+    // @Cacheable(cacheNames = "netdisk", key = "#owner + '-' + #path")
+    public NetDiskDetail getNetDiskDetail(String fileId) {
+        long loginUser = UserContext.getUserId();
+        DiskQuery diskQuery = new DiskQuery.Builder()
+                .fileId(fileId)
+                .owner(loginUser)
+                .build();
+
+        Page page = new Page(1, 10);
+        List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
+        if (!netDiskList.isEmpty()) {
+            NetDisk netDisk = netDiskList.get(0);
+            long owner = netDisk.getOwner();
+            if (owner != loginUser) {
+                return null;
+            }
+
+            int channelCode = 111;
+            String objectId = netDisk.getFileId();
+            return getNetDiskDetail(channelCode, objectId);
+        }
+
+        return null;
+    }
+
+    public NetDiskDetail getNetDiskDetail(int channelCode, String objectId) {
+        try {
+            ObjectInfo objectInfo = ossService.getObjectInfo(channelCode, objectId);
+            String signedUrl = ossService.getSignedUrl(channelCode, objectId);
+            return new NetDiskDetail(objectInfo, signedUrl);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    public Map<Integer, NetDiskCount> getFileTypeCount() {
+        long loginUser = UserContext.getUserId();
+        List<NetDiskCount> list = netDiskMapper.findFileTypeCountByGroup(loginUser);
+        return list.stream().collect(Collectors.toMap(NetDiskCount::getFileType, k -> k));
+    }
 }

+ 86 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskFolderService.java

@@ -0,0 +1,86 @@
+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.tnb.common.auth.UserContext;
+import cn.reghao.tnb.content.app.disk.db.mapper.NetDiskMapper;
+import cn.reghao.tnb.content.app.disk.model.dto.CreateFile;
+import cn.reghao.tnb.content.app.disk.model.dto.CreateFolder;
+import cn.reghao.tnb.content.app.disk.model.po.NetDisk;
+import cn.reghao.tnb.content.app.disk.model.query.DiskQuery;
+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;
+
+/**
+ * @author reghao
+ * @date 2025-09-01 11:28:03
+ */
+@Service
+public class DiskFolderService {
+    private final NetDiskMapper netDiskMapper;
+
+    public DiskFolderService(NetDiskMapper netDiskMapper) {
+        this.netDiskMapper = netDiskMapper;
+    }
+
+    public void createFolder(CreateFolder createFolder) {
+        long loginUser = UserContext.getUserId();
+        String folderPath = "";
+        String folderId = createFolders(folderPath, loginUser);
+    }
+
+    private String createFolders(String folderPath, long owner) {
+        File file = new File(folderPath);
+        String dirPath = file.getAbsolutePath();
+
+        String pid = "0";
+        if (dirPath.equals("/")) {
+            return pid;
+        }
+
+        DiskQuery diskQuery = new DiskQuery.Builder()
+                .path(dirPath)
+                .owner(owner)
+                .build();
+        Page page = new Page(1, 1);
+        List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
+        if (!netDiskList.isEmpty()) {
+            return netDiskList.get(0).getFileId();
+        }
+
+        String savedDirPath = dirPath;
+        List<String> list = new ArrayList<>();
+        list.add(dirPath);
+
+        int idx = dirPath.lastIndexOf("/");
+        while (idx != 0) {
+            dirPath = dirPath.substring(0, idx);
+            list.add(dirPath);
+            idx = dirPath.lastIndexOf("/");
+        }
+        Collections.reverse(list);
+
+        for (String parent : list) {
+            diskQuery.setPath(parent);
+            netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
+            if (!netDiskList.isEmpty()) {
+                pid = netDiskList.get(0).getFileId();
+            } else {
+                String fileId = UUID.randomUUID().toString().replace("-", "");
+                String path = parent;
+                String dirname = parent.substring(parent.lastIndexOf("/")+1);
+                netDiskMapper.save(new NetDisk(fileId, pid, path, dirname));
+                pid = fileId;
+            }
+        }
+
+        diskQuery.setPath(savedDirPath);
+        netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
+        return netDiskList.get(0).getFileId();
+    }
+}

+ 72 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskSyncService.java

@@ -0,0 +1,72 @@
+package cn.reghao.tnb.content.app.disk.service;
+
+import cn.reghao.jutil.jdk.db.Page;
+import cn.reghao.tnb.common.auth.UserContext;
+import cn.reghao.tnb.content.app.disk.db.mapper.NetDiskMapper;
+import cn.reghao.tnb.content.app.disk.model.po.NetDisk;
+import cn.reghao.tnb.content.app.disk.model.query.DiskQuery;
+import cn.reghao.tnb.content.app.disk.model.vo.FileTree;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2025-09-01 11:46:01
+ */
+@Service
+public class DiskSyncService {
+    private final NetDiskMapper netDiskMapper;
+
+    public DiskSyncService(NetDiskMapper netDiskMapper) {
+        this.netDiskMapper = netDiskMapper;
+    }
+
+    public NetDisk checkFile(String path) {
+        long loginUser = UserContext.getUserId();
+        DiskQuery diskQuery = new DiskQuery.Builder()
+                .path(path)
+                .owner(loginUser)
+                .build();
+        Page page = new Page(1, 1);
+        List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
+        return netDiskList.isEmpty() ? null : netDiskList.get(0);
+    }
+
+    public List<FileTree> getFileTree() {
+        String rootId = "0";
+        long loginUser = UserContext.getUserId();
+        DiskQuery diskQuery = new DiskQuery.Builder()
+                .pid(rootId)
+                .owner(loginUser)
+                .build();
+
+        int total = netDiskMapper.countByDiskQuery(diskQuery);
+        Page page = new Page(1, total);
+        List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
+        Map<String, FileTree> map = netDiskList.stream()
+                .map(FileTree::new)
+                .collect(Collectors.toMap(FileTree::getFileId, diskFile -> diskFile));
+
+        Map<String, FileTree> tree = new TreeMap<>();
+        netDiskList.forEach(diskFile -> {
+            String pid = diskFile.getPid();
+            String fileId = diskFile.getFileId();
+            FileTree fileTree = map.get(fileId);
+
+            if (pid.equals(rootId)) {
+                tree.put(fileId, fileTree);
+            } else {
+                FileTree parent = map.get(pid);
+                parent.getChildren().add(fileTree);
+            }
+        });
+
+        String key = tree.keySet().iterator().next();
+        FileTree root = tree.get(key);
+        return List.of(root);
+    }
+}

+ 0 - 205
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/NetDiskQuery.java

@@ -1,205 +0,0 @@
-package cn.reghao.tnb.content.app.disk.service;
-
-import cn.reghao.file.api.iface.OssService;
-import cn.reghao.jutil.jdk.converter.ByteConverter;
-import cn.reghao.jutil.jdk.converter.ByteType;
-import cn.reghao.jutil.jdk.db.Page;
-import cn.reghao.jutil.jdk.db.PageList;
-import cn.reghao.oss.sdk.model.constant.ObjectType;
-import cn.reghao.oss.sdk.model.dto.ObjectInfo;
-import cn.reghao.tnb.common.auth.UserContext;
-import cn.reghao.tnb.content.app.disk.db.mapper.NetDiskMapper;
-import cn.reghao.tnb.content.app.disk.model.po.NetDisk;
-import cn.reghao.tnb.content.app.disk.model.query.DiskQuery;
-import cn.reghao.tnb.content.app.disk.model.vo.*;
-import org.apache.dubbo.config.annotation.DubboReference;
-import org.springframework.cache.annotation.Cacheable;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.TreeMap;
-import java.util.stream.Collectors;
-
-/**
- * @author reghao
- * @date 2023-11-10 15:16:35
- */
-@Service
-public class NetDiskQuery {
-    @DubboReference(check = false, timeout = 60_000)
-    private OssService ossService;
-    private final NetDiskMapper netDiskMapper;
-    private final ByteConverter byteConverter;
-
-    public NetDiskQuery(NetDiskMapper netDiskMapper) {
-        this.netDiskMapper = netDiskMapper;
-        this.byteConverter = new ByteConverter();
-    }
-
-    public List<FolderTree> getFolders() {
-        long loginUser = UserContext.getUserId();
-        DiskQuery diskQuery = new DiskQuery.Builder()
-                .fileType(ObjectType.Dir.getCode())
-                .owner(loginUser)
-                .build();
-
-        Page page = new Page(1, 1000);
-        List<NetDisk> netDiskList = netDiskMapper.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);
-    }
-
-    public NetDisk findByPath(String path) {
-        long owner = UserContext.getUserId();
-        DiskQuery diskQuery = new DiskQuery.Builder()
-                .path(path)
-                .owner(owner)
-                .build();
-        Page page = new Page(1, 10);
-        List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
-        return netDiskList.isEmpty() ? null : netDiskList.get(0);
-    }
-
-    public PageList<FileInfo> findByPid(int pageSize, int pageNumber, String pid) {
-        String[] sortProps = {"fileType", "filename"};
-        long loginUser = UserContext.getUserId();
-        DiskQuery diskQuery = new DiskQuery.Builder()
-                .pid(pid)
-                .owner(loginUser)
-                .build();
-
-        Page page = new Page(pageNumber, pageSize);
-        int total = netDiskMapper.countByDiskQuery(diskQuery);
-        List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
-
-        List<FileInfo> list = netDiskList.stream().map(netDisk -> {
-            String sizeStr = byteConverter.convert(ByteType.Bytes, netDisk.getSize());
-            return new FileInfo(netDisk, sizeStr);
-        }).collect(Collectors.toList());
-
-        return PageList.pageList(pageNumber, pageSize, total, list);
-    }
-
-    public PageList<FileInfo> findByFileType(int pageSize, int pageNumber, int fileType) {
-        String[] sortProps = {"filename"};
-
-        long loginUser = UserContext.getUserId();
-        DiskQuery diskQuery = new DiskQuery.Builder()
-                .fileType(fileType)
-                .owner(loginUser)
-                .build();
-
-        Page page = new Page(pageSize, pageNumber);
-        List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
-        List<FileInfo> list = netDiskList.stream().map(netDisk -> {
-            String sizeStr = byteConverter.convert(ByteType.Bytes, netDisk.getSize());
-            return new FileInfo(netDisk, sizeStr);
-        }).collect(Collectors.toList());
-
-        int total = list.size();
-        return PageList.pageList(pageNumber, pageSize, total, list);
-    }
-
-    public PageList<DiskFileInfo> getImageFiles(ObjectType objectType, int pageSize, int pageNumber) {
-        String[] props = {"filename"};
-        long loginUser = UserContext.getUserId();
-        DiskQuery diskQuery = new DiskQuery.Builder()
-                .fileType(objectType.getCode())
-                .owner(loginUser)
-                .build();
-
-        Page page = new Page(pageSize, pageNumber);
-        List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
-        List<DiskFileInfo> list = netDiskList.stream().map(netDisk -> {
-            String fileId = netDisk.getFileId();
-            String filename = netDisk.getFilename();
-            /*DiskFile diskFile = fileService.getDiskFile(fileId);
-            if (diskFile != null) {
-                long owner = diskFile.getOwner();
-                if (owner == loginUser) {
-                    String url = String.format("/%s", diskFile.getObjectName());
-                    return new DiskFileInfo(fileId, filename, url);
-                }
-            }*/
-            return new DiskFileInfo(null, null, null);
-        }).filter(Objects::nonNull).collect(Collectors.toList());
-
-        int total = list.size();
-        return PageList.pageList(pageNumber, pageSize, total, list);
-    }
-
-    public FileUrl getFileUrl(String fileId) {
-        long loginUser = UserContext.getUserId();
-        DiskQuery diskQuery = new DiskQuery.Builder()
-                .fileId(fileId)
-                .owner(loginUser)
-                .build();
-
-        Page page = new Page(1, 10);
-        List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
-        if (!netDiskList.isEmpty()) {
-            NetDisk netDisk = netDiskList.get(0);
-            long owner = netDisk.getOwner();
-            if (owner != loginUser) {
-                return null;
-            }
-
-            int channelCode = 111;
-            String objectId = netDisk.getFileId();
-            try {
-                ObjectInfo objectInfo = ossService.getObjectInfo(channelCode, objectId);
-                String signedUrl = ossService.getSignedUrl(channelCode, objectId);
-                return new FileUrl(objectInfo, signedUrl);
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-
-            /*DiskFile diskFile = fileService.getDiskFile(objectId);
-            if (diskFile != null) {
-                return new FileUrl(diskFile);
-            }*/
-        }
-
-        return null;
-    }
-
-    @Cacheable(cacheNames = "netdisk", key = "#owner + '-' + #path")
-    public NetDisk getNetDisk(long owner, String path) {
-        DiskQuery diskQuery = new DiskQuery.Builder()
-                .path(path)
-                .owner(owner)
-                .build();
-
-
-        Page page = new Page(1, 10);
-        List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
-        return netDiskList.isEmpty() ? null : netDiskList.get(0);
-    }
-
-    public Map<Integer, NetDiskCount> getFileTypeCount() {
-        long loginUser = UserContext.getUserId();
-        List<NetDiskCount> list = netDiskMapper.findFileTypeCountByGroup(loginUser);
-        return list.stream().collect(Collectors.toMap(NetDiskCount::getFileType, k -> k));
-    }
-}

+ 41 - 0
content/content-service/src/main/resources/mapper/disk/DiskAlbumMapper.xml

@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.reghao.tnb.content.app.disk.db.mapper.DiskAlbumMapper">
+    <insert id="save" useGeneratedKeys="true" keyProperty="id">
+        insert into my_disk_album
+        (`album_id`,`album_name`,`cover_url`,`num`,`create_at`,`create_by`)
+        values
+        (#{albumId},#{albumName},#{coverUrl},#{num},#{createAt},#{createBy})
+    </insert>
+    <insert id="saveAlbumFiles" useGeneratedKeys="true" keyProperty="id">
+        insert into my_disk_album_file
+        (`album_id`,`file_id`,`file_type`)
+        values
+        <foreach collection="list" item="item" index="index" separator=",">
+            (#{item.albumId},#{item.fileId},#{item.fileType})
+        </foreach>
+    </insert>
+
+    <update id="updateCoverUrl">
+        update my_disk_album
+        set update_time=now(),cover_url=#{coverUrl}
+        where album_id=#{albumId}
+    </update>
+    <update id="updateNum">
+        update my_disk_album
+        set update_time=now(),num=#{num}
+        where album_id=#{albumId}
+    </update>
+    
+    <select id="findByCreateBy" resultType="cn.reghao.tnb.content.app.disk.model.po.DiskAlbum">
+        select *
+        from my_disk_album
+        where create_by=#{createBy}
+    </select>
+    <select id="findByAlbumId" resultType="cn.reghao.tnb.content.app.disk.model.po.DiskAlbumFile">
+        select *
+        from my_disk_album_file
+        where album_id=#{albumId}
+    </select>
+</mapper>

+ 10 - 0
content/content-service/src/main/resources/mapper/disk/NetDiskMapper.xml

@@ -71,6 +71,7 @@
                 and sha256sum=#{diskQuery.sha256sum}
             </if>
         </where>
+        order by file_type,filename
     </select>
     <select id="findFileTypeCountByGroup" resultType="cn.reghao.tnb.content.app.disk.model.vo.NetDiskCount">
         select file,count(*) as total
@@ -78,4 +79,13 @@
         group by file_type
         order by total desc
     </select>
+
+    <select id="findByFileIds" resultType="cn.reghao.tnb.content.app.disk.model.po.NetDisk">
+        select *
+        from my_net_disk
+        where file_id in
+        <foreach collection="list" item="id" index="index" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
 </mapper>

+ 95 - 0
content/content-service/src/test/java/cn/reghao/tnb/content/app/disk/service/DiskUnitTest.java

@@ -0,0 +1,95 @@
+package cn.reghao.tnb.content.app.disk.service;
+
+import cn.reghao.oss.sdk.model.constant.ObjectType;
+import cn.reghao.tnb.content.app.disk.model.vo.FileTree;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.*;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
+
+@RunWith(MockitoJUnitRunner.class)
+public class DiskUnitTest {
+    void walkDir(Path path) throws IOException {
+        Files.walkFileTree(path, new FileVisitor<Path>() {
+            @Override
+            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
+                File dir1 = dir.toFile();
+                process(dir1);
+                return FileVisitResult.CONTINUE;
+            }
+
+            @Override
+            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+                File file1 = file.toFile();
+                process(file1);
+                return FileVisitResult.CONTINUE;
+            }
+
+            @Override
+            public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
+                return FileVisitResult.CONTINUE;
+            }
+
+            @Override
+            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+                return FileVisitResult.CONTINUE;
+            }
+        });
+    }
+
+    List<FileTree> fileTreeList = new ArrayList<>();
+    private void process(File file) {
+        String basePath = dir.getAbsolutePath();
+        String absolutePath = file.getAbsolutePath();
+        String path = absolutePath.replace(basePath, "");
+        String pid = file.getParent().replace(basePath, "");
+        if (path.equals("")) {
+            pid = "0";
+        } else if (pid.equals("")) {
+            pid = "/";
+        }
+
+        int fileType = ObjectType.Image.getCode();
+        if (file.isDirectory()) {
+            fileType = ObjectType.Dir.getCode();
+        }
+
+        String fileId = absolutePath.replace(basePath, "");
+        FileTree fileTree = new FileTree(pid, fileId, fileType);
+        fileTreeList.add(fileTree);
+    }
+
+    String baseDir = "/home/reghao/Downloads/";
+    File dir = new File(baseDir);
+
+    Map<String, List<FileTree>> getTreeMap() throws IOException {
+        Path path = Paths.get(dir.getAbsolutePath());
+        walkDir(path);
+
+        Map<String, List<FileTree>> pidGroup = fileTreeList.stream()
+                .collect(Collectors.groupingBy(FileTree::getPid));
+        return new TreeMap<>(pidGroup);
+
+    }
+
+    @Test
+    public void treeTest() throws Exception {
+        /*Map<String, List<FileTree>> pidTreeMap = getTreeMap();
+        pidTreeMap.forEach((key, list) -> {
+            String pid = key;
+            for (FileTree fileTree : list) {
+                String fileId = fileTree.getFileId();
+            }
+        });
+        System.out.println("main-thread goto sleep...");*/
+    }
+}

+ 1 - 0
file/file-api/src/main/java/cn/reghao/file/api/iface/OssService.java

@@ -19,6 +19,7 @@ public interface OssService {
     void deleteByObjectUrl(String objectUrl) throws Exception;
     ObjectInfo getObjectInfo(int channelId, String objectId) throws Exception;
     String getSignedUrl(int channelId, String objectId) throws Exception;
+    String getSignedUrlByUrl(int channelId, String objectUrl) throws Exception;
     VideoInfo getVideoInfo(int channelId, String videoFileId) throws Exception;
     ImageInfo getImageInfo(int channelId, String imageFileId) throws Exception;
     ConvertedImageInfo getWebpInfo(int channelId, String imageFileId) throws Exception;

+ 1 - 1
file/file-service/src/main/java/cn/reghao/tnb/file/app/config/CacheConfig.java

@@ -68,7 +68,7 @@ public class CacheConfig {
         Caffeine<Object, Object> caffeineCache = Caffeine.newBuilder()
                 .initialCapacity(1000)
                 .maximumSize(10_000)
-                .expireAfterAccess(365, TimeUnit.DAYS);;
+                .expireAfterAccess(365, TimeUnit.DAYS);
         cacheManager.setCaffeine(caffeineCache);
         return cacheManager;
     }

+ 1 - 1
file/file-service/src/main/java/cn/reghao/tnb/file/app/controller/OssController.java

@@ -53,7 +53,7 @@ public class OssController {
     @Operation(summary = "获取文件上传 token", description = "N")
     @PostMapping(value = "/serverinfo/file", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getFileChannelInfo() throws Exception {
-        ServerInfo serverInfo = storeServiceWrapperRouter.getUploadStore(114);
+        ServerInfo serverInfo = storeServiceWrapperRouter.getUploadStore(111);
         return WebResult.success(serverInfo);
     }
 }

+ 10 - 0
file/file-service/src/main/java/cn/reghao/tnb/file/app/rpc/StoreServiceWrapperRouter.java

@@ -93,6 +93,16 @@ public class StoreServiceWrapperRouter implements OssService {
         throw new Exception("OSSType not found");
     }
 
+    public String getSignedUrlByUrl(int channelCode, String objectUrl) throws Exception {
+        if (ossType == OssType.localOss.getCode()) {
+            OssConsoleClient ossConsoleClient = ossConsoleClientFactory.getOssConsoleClient();
+            return ossConsoleClient.getSignedUrlByUrl(channelCode, objectUrl);
+        } else if (ossType == OssType.aliyunOss.getCode()) {
+        }
+
+        throw new Exception("OSSType not found");
+    }
+
     public VideoInfo getVideoInfo(int channelId, String videoFileId) throws Exception {
         OssConsoleClient ossConsoleClient = ossConsoleClientFactory.getOssConsoleClient();
         return ossConsoleClient.getVideoInfo(channelId, videoFileId);

+ 1 - 1
search/search-service/src/main/java/cn/reghao/tnb/search/app/service/WenshuService.java

@@ -27,7 +27,7 @@ import java.util.stream.Collectors;
 @Service
 public class WenshuService {
     private String indexName = "wenshu_lucene";
-    private SnowFlake idGenerator = new SnowFlake(1, 1);;
+    private SnowFlake idGenerator = new SnowFlake(1, 1);
     private WenshuDocRepository wenshuDocRepository;
     private LuceneIndex luceneIndex;
     private LuceneDocument luceneDocument;