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