公司开新项目 要求写个三级动态的目录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版权协议,转载请附上原文出处链接和本声明。