最近挺忙,一直在做项目,然后有个树形目录结构需要返回给前端,这里给大家说一下实现的思路。
具体达到的效果类似:
一级目录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