最近挺忙,一直在做項目,然后有個樹形目錄結構需要返回給前端,這里給大家說一下實現的思路。
具體達到的效果類似:
一級目錄A:
二級目錄A:
三級目錄:
四級目錄:
文件.txt
二級目錄B:
文件1.txt
一級目錄B:
文件2.txt
表結構(沒有把我代碼的所有表結構都貼上,根據自身業務,參考實現邏輯):
a、目錄表
ID NAME PID
1 一級目錄
2 二級目錄 1
3 三級目錄 2
4 三級目錄 2
5 一級目錄
b、文件目錄表
ID FileName PID
1 a.txt 1
2 a.txt 3
3 a.txt 2
4 a.txt 5
下面看代碼實現:
Controller方法 把兩個表的數據查出來
public ApiResult getDirectoryStructure(HttpServletRequest request){ List<DocumentListVo> docListVo = new ArrayList<>(); List<document> doclist = documentServiceImpl.selectDocumentList(); List<DirectoryStructure> dirlist = directoryStructureServiceImpl.selectDirStrList(); if(doclist.size() > 0){ docListVo = TreeStructureUtil.getVolists(dirlist,doclist); } return new ApiResult(ApiResult.STATE_SUCCESS,"success",docListVo); }
TreeStructureUtil文檔樹形目錄結構工具類
public class TreeStructureUtil { public static List<DocumentListVo> getVolists(List<DirectoryStructure> dirlist, List<document> doclist){ List<DocumentListVo> listvo = new ArrayList<>(); List<DirectoryStructure> dirlistPen = new ArrayList<>();//一級目錄 //獲取沒有目錄的文件,跟一級目錄同級 for(int i=0;i<doclist.size();i++) { document d = doclist.get(i); if (d.getdSId() == null) { DocumentListVo docvo = new DocumentListVo(); docvo.setName(d.getName()); docvo.setHashCode(d.getHashCode()); docvo.setUpdateTime(d.getUpdateTime()); listvo.add(docvo); } } if(dirlist.size() > 0){ //獲取一級目錄 for(int j=0;j<dirlist.size();j++){ DirectoryStructure dir = dirlist.get(j); if(dir.getPid() == null){ dirlistPen.add(dir); } } //根據一級目錄獲取子目錄和文件 if(dirlistPen.size() > 0){ for(int k = 0;k<dirlistPen.size();k++){ DirectoryStructure dir = dirlist.get(k); DocumentListVo docvo = new DocumentListVo(); docvo.setName(dir.getName()); List<DocumentListVo> d = getVoDrenlist(dir.getId(),dirlist,doclist);//子目錄 if(d.size() < 1){ for(int i = 0;i<doclist.size();i++){ document doc = doclist.get(i); if(doc.getdSId() == dir.getId()){ DocumentListVo docvo1 = new DocumentListVo(); docvo1.setName(doc.getName()); docvo1.setHashCode(doc.getHashCode()); docvo1.setUpdateTime(doc.getUpdateTime()); d.add(docvo1); } } } docvo.setList(d); listvo.add(docvo); } } } return listvo; } /** * 遞歸算法獲取子目錄和文件 * @param id * @param dirlist * @param doclist * @return */ public static List<DocumentListVo> getVoDrenlist(Long id ,List<DirectoryStructure> dirlist,List<document> doclist){ List<DocumentListVo> listvo = new ArrayList<>(); for(int j=0;j<dirlist.size();j++){ DirectoryStructure dir = dirlist.get(j); if(dir.getPid() == id){ DocumentListVo docvo = new DocumentListVo(); docvo.setName(dir.getName()); docvo.setList(getVoDrenlist(dir.getId(),dirlist,doclist)); listvo.add(docvo); } //循環完當前目錄級,去看當前級下面有沒有文件 if(j == (dirlist.size()-1)){ for(int i = 0;i<doclist.size();i++){ document doc = doclist.get(i); if(doc.getdSId() == id){ DocumentListVo docvo1 = new DocumentListVo(); docvo1.setName(doc.getName()); docvo1.setHashCode(doc.getHashCode()); docvo1.setUpdateTime(doc.getUpdateTime()); listvo.add(docvo1); } } } } return listvo; } }
最終前端拿到的結構這樣的 有點多字體縮小了:
這樣無論多少級 Java代碼也可以變量出來,只要理順邏輯使用遞歸是比較簡單的。
技術QQ群:216868740