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

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

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

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

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

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

3、获取目录树结构

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

     /**
     * 获取目录树结构
     * @return
     */
    public DataSetDirectory getDir() {
        //获取所有的目录节点对象,从数据库里面查就好了
        List<DataSetDirectory> 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<DataSetDirectory> getChildrenDir(List<DataSetDirectory> dataSetDirectories, String parentId) {
        List<DataSetDirectory> 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<DataTree> 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<DataSet> dataSetList;

    //子目录
    private List<DataSetDirectory> children;

    //此处省略getset方法
}

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

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

正式逻辑:

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

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

        List<DataTree> 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<DataTree> getchildrenDataTree(List<DataSetDirectory> dataSetDirectories, String parentId) {
        List<DataTree> 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<DataTree> childrenDir = getchildrenDataTree(dataSetDirectories, dataSetDirectory.getDirId());
                //加载所有目录下的文件
                List<DataTree> childrenDataSet = getChildrenDataSet(dataTree);

                List<DataTree> 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<DataTree> getDataTree() {
        //获取所有的目录
        List<DataSetDirectory> dataSetDirectories = this.getAllDataSetDirectory();
        List<DataTree> DataTreeList = new ArrayList<>();
        //加载目录树结构
        if(null!=dataSetDirectories&&dataSetDirectories.size()>0){
            DataTreeList.addAll(getchildrenDataTree(dataSetDirectories,"0"));
        }
        //有些人不喜欢建目录直接建文件,这时候就可能会有这种情况,根目录为0
        List<DataSet> 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;

    }

以上。

  • 15
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值