定义结构
我们假设要构建一个菜单,可以实现系统管理和店铺管理,菜单的样子如下:
系统管理
- 用户管理
- 添加用户
店铺管理
商品管理
添加商品
那这种结构如何保存在数据库中呢?一般是这样的:
我们看到,每条数据根据parentId相互关联并表示层级关系,parentId在这里也叫外键,weight是排序。
导包
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.8.15</version>
</dependency>
查询出的menuList
对menuList进行处理
menuList = menuMapper.selectMenuListByUserId(menu1);
log.info("menulist:{}"+menuList.toString());
//组装NodeList
List<TreeNode<String>> nodeList = menuList.stream().map(menu->{
// 需要的其他信息
Map<String,Object> extraMap = new HashMap<>();
// 组件路径
extraMap.put("component",menu.getComponent());
TreeNode<String> treeNode = new TreeNode<String>()
//主键
.setId(menu.getMenuId().toString())
.setName(menu.getMenuName())
//设置父亲ID
.setParentId(menu.getParentId().toString())
.setWeight(menu.getOrderNum())
//放入其他需要的参数
.setExtra(extraMap);
return treeNode;
}).collect(Collectors.toList());
//自定义字段名,使得到结果的属性为自定义
TreeNodeConfig config = new TreeNodeConfig();
//设置输出主键名为 menuId
config.setIdKey("menuId");
config.setChildrenKey("childrenMenuId");
config.setWeightKey("orderNum");
//构建树结构目录 0是设置的最上层id,根节点
List<Tree<String>> treeNodes = TreeUtil.build(nodeList,"0",config,((treeNode, tree) -> {
tree.setId(treeNode.getId());
tree.setParentId(treeNode.getParentId());
tree.setWeight(treeNode.getWeight());
tree.setName(treeNode.getName());
//放入额外属性
tree.putExtra("component",treeNode.getExtra().getOrDefault("component","#"));
}));
log.info("转化后"+ JSON.toJSON(treeNodes));
log.info("转化后"+ treeNodes.toString());
处理后
完成!