java树形结构后台逻辑
关于树形结构的业务逻辑(用java代码实现)
(1)数据库的表结构如下:
(2)实现的逻辑问题
@Override
public List<Node> getItemList() {
// 原始的数据
List<Node> rootMenu = peopleMapper.selectByExample();
// 查看结果
// for (Node menu : rootMenu) {
// System.out.println(menu);
// }
// 最后的结果
List<Node> menuList = new ArrayList<>();
// 先找到所有的一级菜单
for (int i = 0; i < rootMenu.size(); i++) {
// 一级菜单没有parentId
if (StringUtils.isBlank(rootMenu.get(i).getPid())) {
menuList.add(rootMenu.get(i));
}
}
// 为一级菜单设置子菜单,getChild是递归调用的
for (Node menu : rootMenu) {
//menu.setChildMenus(getChild(menu.getId(), rootMenu));
menu.setChildren(getChild(menu.getId(), rootMenu));
menuList.add(menu);
}
// Map<String,Object> jsonMap = new HashMap<>();
// jsonMap.put("menu", menuList);
// //System.out.println(gson.toJson(jsonMap));
// logger.info("json"+jsonMap);
return menuList;
}
/**
* 递归查找子菜单
*
* @param id
* 当前菜单id
* @param rootMenu
* 要查找的列表
* @return
*/
private List<Node> getChild(String id, List<Node> rootMenu) {
// 子菜单
List<Node> childList = new ArrayList<>();
for (Node menu : rootMenu) {
// 遍历所有节点,将父菜单id与传过来的id比较
if (StringUtils.isNotBlank(menu.getPid())) {
if (menu.getPid().equals(id)) {
childList.add(menu);
}
}
}
// 把子菜单的子菜单再循环一遍
for (Node menu : childList) {// 没有url子菜单还有子菜单
if (StringUtils.isBlank(menu.getId())) {
// 递归
//menu.setChildMenus(getChild(menu.getId(), rootMenu));
menu.setChildren(getChild(menu.getId(), rootMenu));
}
} // 递归退出条件
if (childList.size() == 0) {
return null;
}
return childList;
}
(3)实测代码如下