实现三级目录tree

公司开新项目 要求写个三级动态的目录tree 想了个比较简便的写法 在此给大家分享一下
数据库:mysql
框架:springboot+mybatis
数据传输格式:json

传输给前端的数据格式示例:

[
   {
       "name":"一级目录示例",
       "二级目录":[
           {
               "name":"二级目录示例",
               "三级目录":[
                   {
                       "name":"三级目录示例"
                   }
               ]
           }
       ]
   }
]

表:

CREATE TABLE portal_repo_catalog (
  guid varchar(32) NOT NULL COMMENT '主键',
  name varchar(64) DEFAULT NULL COMMENT '名称',
  arent_id varchar(32) DEFAULT NULL COMMENT '父目录编号',
  root_id varchar(32) DEFAULT NULL COMMENT '根目录编号',
  full_name_pat` varchar(255) DEFAULT NULL COMMENT '名称全路径',
  full_id_path varchar(255) DEFAULT NULL COMMENT '编号全路径',
  level int(11) DEFAULT NULL COMMENT '层级',
) 

entity实体类

/**
 * 目录
 * @author shenzy0036@163.com
 *  */
 @Data
public class CatalogDO{
	
	private String id;
	private String name;
	private String parentId;
	private String rootId;
	private String fullNamePath;
	private String fullIdPath;
	private String comments;
	private int level;
}

vo类

import java.util.List;

/**
 * 目录
 * 
 * @author shenzy0036@163.com
 */
 @Data
public class Catalog {
	private String id;
	private String name;
	private String parentId;
	private String rootId;
	private String fullNamePath;
	private String comments;
	private int level;
}

entity转vo

/**
 * 目录
 * @author WeChat:15565550036 Email:shenzy0036@163.com 
 */

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * @author shenzy0036@163.com
 *
 */
public class ModelConvertor {
	public static Optional<CatalogStruct> toCatalogStructVoModel(CatalogDO catalogDO) {
		Optional<CatalogStruct> ret;
		if (catalogDO == null) {
			ret = Optional.empty();
		}else {
			CatalogStruct cata = new CatalogStruct();
			cata.setId(catalogDO.getId());
			cata.setName(catalogDO.getName());
			cata.setComments(catalogDO.getComments());
			cata.setFullNamePath(catalogDO.getFullNamePath());
			cata.setLevel(catalogDO.getLevel());
			cata.setParentId(catalogDO.getParentId());
			cata.setRootId(catalogDO.getRootId());
			cata.setSortNum(catalogDO.getSortNum());
			cata.setChildren(null);
			ret = Optional.of(cata);
		}
		return ret;
	}
}

数据组装所需要的类

/**
 * 目录类
 * @author WeChat:15565550036 Email:shenzy0036@163.com
 */
import java.util.List;
import java.util.ArrayList;

@Data
public class CatalogStruct extends Catalog{
    private List<CatalogStruct> children;

    public void addSubCatalog (CatalogStruct subCatalog) {
        if (null == children) {
            children = new ArrayList<CatalogStruct>();
        }
        children.add(subCatalog);
    }
}

dao

import java.util.List;
import org.apache.ibatis.annotations.Mapper;

/**
 * 目录持久化接口
 * 
 * @author WeChat:15565550036 Email:shenzy0036@163.com
 */

@Mapper
public interface CatalogMapper {
    List<CatalogDO> queryCatalogByAll();
}

mapper文件 根据编号全路径进行排序 查出的数据更容易进行数据组装

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.longfor.bpm.portal.repo.dao.mapper.CatalogMapper">
	<resultMap id="result" type="com.longfor.bpm.portal.repo.dao.entity.CatalogDO">
		<id column="guid" property="id" />
		<result column="name" property="name" />
		<result column="parent_id" property="parentId" />
		<result column="root_id" property="rootId" />
		<result column="level" property="level" />
		<result column="sort_num" property="sortNum" />
		<result column="full_id_path" property="fullIdPath" />
		<result column="full_name_path" property="fullNamePath" />
		<result column="comments" property="comments" />
	</resultMap>
	
	<select id="queryCatalogByAll" resultMap="result">
		    select * from portal_repo_catalog order by full_id_path ASC
	</select>
</mapper>

service

import java.util.List;

/**
 * 目录服务
 * @author WeChat:15565550036 Email:shenzy0036@163.com
 */
public interface CatalogService {
	List<CatalogStruct> queryCatalogByAll();
}

serviceImpl


import java.util.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

/**
 * 目录服务
 * @author WeChat:15565550036 Email:shenzy0036@163.com
 */
@Service
public class CatalogServiceImpl implements CatalogService {
	@Autowired
	private CatalogMapper catalogMapper;
	@Override
	public List<CatalogStruct> queryCatalogByAll() {
		List<CatalogStruct> ret = new ArrayList<CatalogStruct>();
		List<CatalogDO> cataDoList = catalogMapper.queryCatalogByAll();
		CatalogStruct topStruct = new CatalogStruct();
		CatalogStruct secStruct = new CatalogStruct();
		for (CatalogDO catalogDO: cataDoList){
			CatalogStruct cataStruct = ModelConvertor.toCatalogStructVoModel(catalogDO).get();
			int level = cataStruct.getLevel();
			//根据层级取出目录
			switch (level) {
				case 1:
					ret.add(cataStruct);
					topStruct = cataStruct;
					break;
				case 2:
					if (null == topStruct) {
						throw RepoErrorCode.CATALOG_NO_PARENT_DIR.exception(cataStruct.getId());//自定义异常
					}
					topStruct.addSubCatalog(cataStruct);
					secStruct = cataStruct;
					break;
				case 3:
					if (null == secStruct) {
						throw RepoErrorCode.CATALOG_NO_PARENT_DIR.exception(cataStruct.getId());//自定义异常
					}
					secStruct.addSubCatalog(cataStruct);
					break;
			}
		}
		return ret;
	}
}

controller Restful风格接口


import java.util.List;
import java.util.Optional;
import com.longfor.bpm.portal.repo.service.model.CatalogStruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 目录视图
 * @author WeChat:15565550036 Email:shenzy0036@163.com
 */
@RestController
@RequestMapping("/catalogs")
public class CatalogController {
	@Autowired
	CatalogService catalogService ;
	@PostMapping
	public List<CatalogStruct> queryCatalogAll(){
        List<CatalogStruct> list = catalogService.queryCatalogByAll();
        return list;
	}
}

以上就是一个简单的三级目录的实现 只需要查询一次数据库 在service进行数据组装 返回给前端所需要的数据格式


版权声明:本文为weixin_43672887原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。