最近挺忙,一直在做项目,然后有个树形目录结构需要返回给前端,这里给大家说一下实现的思路。
具体达到的效果类似:
一级目录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方法 把两个表的数据查出来
publicApiResult getDirectoryStructure(HttpServletRequest request){
List docListVo = new ArrayList<>();
List doclist =documentServiceImpl.selectDocumentList();
List dirlist =directoryStructureServiceImpl.selectDirStrList();if(doclist.size() > 0){
docListVo=TreeStructureUtil.getVolists(dirlist,doclist);
}return new ApiResult(ApiResult.STATE_SUCCESS,"success",docListVo);
}
TreeStructureUtil文档树形目录结构工具类
public classTreeStructureUtil {public static List getVolists(List dirlist, Listdoclist){
List listvo = new ArrayList<>();
List dirlistPen = new ArrayList<>();//一级目录//获取没有目录的文件,跟一级目录同级
for(int i=0;i
document d=doclist.get(i);if (d.getdSId() == null) {
DocumentListVo docvo= newDocumentListVo();
docvo.setName(d.getName());
docvo.setHashCode(d.getHashCode());
docvo.setUpdateTime(d.getUpdateTime());
listvo.add(docvo);
}
}if(dirlist.size() > 0){//获取一级目录
for(int j=0;j
DirectoryStructure dir=dirlist.get(j);if(dir.getPid() == null){
dirlistPen.add(dir);
}
}//根据一级目录获取子目录和文件
if(dirlistPen.size() > 0){for(int k = 0;k
DirectoryStructure dir=dirlist.get(k);
DocumentListVo docvo= newDocumentListVo();
docvo.setName(dir.getName());
List d = getVoDrenlist(dir.getId(),dirlist,doclist);//子目录
if(d.size() < 1){for(int i = 0;i
document doc=doclist.get(i);if(doc.getdSId() ==dir.getId()){
DocumentListVo docvo1= newDocumentListVo();
docvo1.setName(doc.getName());
docvo1.setHashCode(doc.getHashCode());
docvo1.setUpdateTime(doc.getUpdateTime());
d.add(docvo1);
}
}
}
docvo.setList(d);
listvo.add(docvo);
}
}
}returnlistvo;
}/*** 递归算法获取子目录和文件
*@paramid
*@paramdirlist
*@paramdoclist
*@return
*/
public static List getVoDrenlist(Long id ,List dirlist,Listdoclist){
List listvo = new ArrayList<>();for(int j=0;j
DirectoryStructure dir=dirlist.get(j);if(dir.getPid() ==id){
DocumentListVo docvo= newDocumentListVo();
docvo.setName(dir.getName());
docvo.setList(getVoDrenlist(dir.getId(),dirlist,doclist));
listvo.add(docvo);
}//循环完当前目录级,去看当前级下面有没有文件
if(j == (dirlist.size()-1)){for(int i = 0;i
document doc=doclist.get(i);if(doc.getdSId() ==id){
DocumentListVo docvo1= newDocumentListVo();
docvo1.setName(doc.getName());
docvo1.setHashCode(doc.getHashCode());
docvo1.setUpdateTime(doc.getUpdateTime());
listvo.add(docvo1);
}
}
}
}returnlistvo;
}
}
最终前端拿到的结构这样的 有点多字体缩小了:
这样无论多少级 Java代码也可以变量出来,只要理顺逻辑使用递归是比较简单的。
技术QQ群:216868740