目前有一张目录表:CATALOGS,存放目录,目录有多个级别,如根目录,一级目录,二级目录等。二级目录的父级id等于一级目录的id,以此关联。
另外一张表是业务数据表:SHARES,有一个字段catalogId来存放目录id
需要展示所有的数据,并且返回相应的目录层级
如下图:
实现思路:
首先第一步:查询出所有的SHARES,然后再获取到SHARES所在的目录,拿到这些目录id后,再遍历查询数据库,获取到所有涉及的目录信息。
然后再组装树结构。
上代码:
//目录类
public class CatalogVo {
//父级id
private String tmpParentCatalogId;
//id
private String editContentId;
//目录名
private String tmpCatalogName;
//排序
private String sortNumber;
}
//业务数据类
public class DghyYjhcHcxShare implements Serializable {
@TableId(value = "ID")
@ApiModelProperty("主键")
private Long id;
@ApiModelProperty("图层id")
private String tcId;
@ApiModelProperty("目录主键")
@TableField(exist = false)
private String catalogId;
private static final long serialVersionUID = 1L;
}
关键代码:递归查询所有父级目录,直到查询到根目录
/**
* 查找所有的父级目录
*
* @param catalogAll
* @param plist
*/
private void getParentCatalog(List<CatalogVo> catalogAll, List<CatalogVo> plist) {
for (CatalogVo catalogVo : plist) {
//一级菜单父id为0
if (!"0".equals(catalogVo.getTmpParentCatalogId())) {
List<CatalogVo> list = dghyYjhcHcxShareMapper.getCatalogs(null, catalogVo.getTmpParentCatalogId());
catalogAll.addAll(list);
getParentCatalog(catalogAll, list);
}
}
}
组装树结构:
先找根节点,然后往下一次组装字节点:
private List getTree(List<CatalogVo> catalogAll, List<DghyYjhcHcxShare> sharesAll) {
//先拿出根节点:即父级id为0的数据
Optional<CatalogVo> root = catalogAll.stream().filter(i -> "0".equals(i.getTmpParentCatalogId())).findFirst();
if (root.isPresent()) {
CatalogVo rootVo = root.get();
String id = rootVo.getEditContentId();
List list = getchild(id, catalogAll, sharesAll, new ArrayList<>());
return list;
}
return null;
}
/**
* 获取当前父id的所有子节点
*
* @param id 父id
* @param catalogAll 所有目录
* @param sharesAll 所有图层
* @return {@link List}
*/
private List getchild(String id, List<CatalogVo> catalogAll, List<DghyYjhcHcxShare> sharesAll, List<DghyYjhcHcxShare> isAddShare) {
List ret = new ArrayList();
//看有哪些子目录
List<CatalogVo> childCatalog = catalogAll.stream().filter(i -> id.equals(i.getTmpParentCatalogId())).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(childCatalog)) {
for (CatalogVo catalogVo : childCatalog) {
Map<String, Object> map = new HashMap<>();
//目录
map.put("types", 0);
map.put("shares", "1");
map.put("id", catalogVo.getEditContentId());
map.put("treeid", "0_" + catalogVo.getEditContentId());
map.put("pid", catalogVo.getTmpParentCatalogId());
map.put("name", catalogVo.getTmpCatalogName());
map.put("label", catalogVo.getTmpCatalogName());
map.put("text", catalogVo.getTmpCatalogName());
map.put("sort", catalogVo.getSortNumber());
map.put("children", getchild(catalogVo.getEditContentId(), catalogAll, sharesAll, isAddShare));
ret.add(map);
}
}
List<DghyYjhcHcxShare> childTxs = sharesAll.stream().filter(i -> id.equals(i.getCatalogId())).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(childTxs)) {
for (int i = 0; i < childTxs.size(); i++) {
DghyYjhcHcxShare tx = childTxs.get(i);
JSONObject item = JSONObject.parseObject(JSONObject.toJSONString(tx));
item.put("types", 1);
item.put("shares", "1");
item.put("id", tx.getId());
item.put("treeid", "0_" + tx.getId());
item.put("pid", tx.getCatalogId());
item.put("name", tx.getGraphName());
item.put("label", tx.getGraphName());
item.put("text", tx.getGraphName());
item.put("sort", i);
item.put("tcid", tx.getTcId());
ret.add(item);
isAddShare.add(tx);
}
}
return ret;
}