Java后台实现多层级目录树的构建

首先,想清楚目的,需要的是只是单纯的实现菜单功能,还是菜单下可以有文件的那种实战开发中需要用到的菜单(即菜单下可以有菜单还可以有文件)

如果只是想要单纯的实现菜单,不需要有文件那么这种方式相对较为简单

1、建目录表,表中应有以下关键字段

  • 目录id(dir_id)
  • 目录名(dir_name)
  • 父目录id(parent_id)

2、创建目录(这个功能就是向数据库表中插入数据,没什么好说的,注意需要同名判断)

3、获取目录树结构

思路:从数据库中获取所有的目录节点对象,设置根目录,判断此字段的父id是否为根目录,然后递归

     /**
     * 获取目录树结构
     * @return
     */
    public DataSetDirectory getDir() {
        //获取所有的目录节点对象,从数据库里面查就好了
        List dataSetDirectorys = this.getAllDataSetDirectory();
        DataSetDirectory rootDir = new DataSetDirectory();
        rootDir.setDirId("0");
        rootDir.setDirName("根目录");
        if (null != dataSetDirectorys) {
            rootDir.setChildren(getChildrenDir(dataSetDirectorys, "0"));
        }
        return rootDir;
    }

    /**
     * 获取目录子节点
     *
     * @param dataSetDirectories
     * @param parentId
     * @return
     */
    public List getChildrenDir(List dataSetDirectories, String parentId) {
        List result = new ArrayList<>();
        for (DataSetDirectory dataSetDirectory : dataSetDirectories) {
            if (null == dataSetDirectory || null == parentId) {
                continue;
            }
            if (Objects.equals(dataSetDirectory.getSupId(), parentId)) {
                //此目录的父id和parentId相等说明是一级目录,则设置其子目录
                dataSetDirectory.setChildren(getChildrenDir(dataSetDirectories, dataSetDirectory.getDirId()));
                result.add(dataSetDirectory);
            }
        }
        return result;
    }

这样就简单的实现了获取多层级目录的功能

如果想要实现可以正常使用的多层级菜单,菜单下有菜单还可以有文件的那种,就要稍微复杂点,具体实现如下:

1、想要实现这种方式,就肯定要有一个目录文件类,既包含了目录又包含了文件,代码如下:

public class DataTree {
    //目录节点id
    private String treeId;

    //目录名
    private String treename;

    //目录父节点id
    private String parentId;

    //目录类型,是文件还是目录
    private DataTreeType dataTreeType;

    //子节点对象
    private List children;

    //此处省略getset方法·····
}

枚举类如下:

public enum DataTreeType {
    /**
     * 目录
     */
    DIR,

    /**
     * 文件
     */
    FILE;

}

目录类如下:

public class DataSetDirectory {
    //目录id
    private String dirId;

    //目录名称
    private String dirName;

    //上级目录id
    private String supId;

    //描述
    private String description;

    //文件夹包含的数据集
    private List dataSetList;

    //子目录
    private List children;

    //此处省略getset方法
}

文件类就不列举出来了,记得有个关键性字段为所在目录id(dirId),其他的无关紧要。

思路:想查询出目录又想查询出文件,而且我有了一个目录文件类,那么我就需要把目录和菜单都装进这个类里面去,目录和文件都装进去之后返回这个对象也就可以得到目录树和数据集结构

正式逻辑:

1、首先需要获取指定目录下的数据集吧(数据集即文件),方法如下:

    /**
     * 获取目录树下的数据集
     *
     * @param dataTree
     * @return
     */
    public List getChildrenDataSet(DataTree dataTree) {
        //获取指定目录节点下所有文件
        List dataSetList = this.getDataSetBydirId(dataTree.getTreeId());

        List dataTreeLit = new ArrayList<>();

        for (DataSet dataSet : dataSetList) {
            if (null != dataSet) {
                continue;
            }
            DataTree child = new DataTree();
            child.setParentId(dataTree.getTreeId());
            child.setTreeId(dataSet.getDirId());
            child.setTreename(dataSet.getDatasetName());
            child.setDataTreeType(DataTreeType.FILE);
            dataTreeLit.add(child);
        }
        return dataTreeLit;
    }

2、有了目录下的数据集,还需要获取目录和目录下的数据集(数据集即文件)

    /**
     * 获取数据集和目录子节点
     *
     * @param dataSetDirectories 所有的目录节点对象
     * @param parentId 父目录id
     * @return
     */
    public List getchildrenDataTree(List dataSetDirectories, String parentId) {
        List result = new ArrayList<>();
        for (DataSetDirectory dataSetDirectory : dataSetDirectories) {
            if (Objects.equals(dataSetDirectory.getSupId(), parentId)) {
                DataTree dataTree = new DataTree();
                dataTree.setTreeId(dataSetDirectory.getDirId());
                dataTree.setParentId(dataSetDirectory.getSupId());
                dataTree.setTreename(dataSetDirectory.getDirName());
                dataTree.setDataTreeType(DataTreeType.DIR);
                //先加载所有子目录
                List childrenDir = getchildrenDataTree(dataSetDirectories, dataSetDirectory.getDirId());
                //加载所有目录下的文件
                List childrenDataSet = getChildrenDataSet(dataTree);

                List children = new ArrayList<>();
                if (null != childrenDir && childrenDir.size() > 0) {
                    children.addAll(childrenDir);
                }
                if (null != childrenDataSet && childrenDataSet.size() > 0) {
                    children.addAll(childrenDataSet);
                }
                dataTree.setChildren(children);
                result.add(dataTree);
            }
        }
        return result;
    }

3、啥都有了,直接获取目录树和数据集结构

    /**
     * 获取目录树及其数据集
     * @return
     */
    public List getDataTree() {
        //获取所有的目录
        List dataSetDirectories = this.getAllDataSetDirectory();
        List DataTreeList = new ArrayList<>();
        //加载目录树结构
        if(null!=dataSetDirectories&&dataSetDirectories.size()>0){
            DataTreeList.addAll(getchildrenDataTree(dataSetDirectories,"0"));
        }
        //有些人不喜欢建目录直接建文件,这时候就可能会有这种情况,根目录为0
        List rootDataSet = dataSetMapper.getByDirId("0");
        if (null != rootDataSet && rootDataSet.size() > 0) {
            for (DataSet dataSet : rootDataSet) {
                DataTree dataTree = new DataTree();
                dataTree.setParentId("0");
                dataTree.setTreeId(dataSet.getDirId());
                dataTree.setTreename(dataSet.getDatasetName());
                dataTree.setDataTreeType(DataTreeType.FILE);
                DataTreeList.add(dataTree);
            }
        }
        return DataTreeList;

    }

以上。

你可能感兴趣的:(java基础,多层级目录树,Java)