如何做一个菜单树?
1.前端处理
这样对后端开发人员来说是非常简单的,select * from xxx ,一句sql 解决问题,而且减少了后端程序处理的时间。
2.后端处理
1)方式一:树节点是有限的,不需要做增加或者删除,或者说就是一个死的树型菜单,而且呢菜单节点不超过3级,后端处理方式可以查出来一级一级封装,这样需要查询数据库最多三次,对于后端人员来说也是比较简单的。
2)方式二:通过递归方式来查询树型菜单,可以动态修改树,这也是比较常用的方式,但是呢,比较复杂,对后端开发人员要求较高。那今天就来用最简单的递归方式来查询一个树型菜单。
//部门类
public class Department{
private String id; //节点id 必需
private String parentId; //父节点id 必需
private String name; //节点名称 必需
private List<Department> children = new ArrayList<>(); //子节点集合 必需
//当然根据实际业务,这里还可以添加许多属性,例如 节点是否打开,节点对应图标地址,排序等等,今天只做最简单的。
//... 省略get 和 set 方法
}
//业务处理类
public class DepartmentService{
public List<Department> treeMenu(){
//1.先查询出所有的菜单集合 这里使用mybatis-plus
//当然你也可以使用其它方式,总之是这块是要查询出所有的菜单集合
//sql就是 select * from xxx 了
List<Department> lists = baseMapper.selectList(null);
//2.将查询出的菜单集合出入我们要处理的方法,进行第一次处理
return this.buildTreeMenu(lists);
}
private List<Department> buildTreeMenu(List<Department> lists ){
//菜单树都有一个根节点,就像树肯定有根一样。
List<Department> tree = new ArrayList<>();
//3.找到根节点
for(Department d : lists){
//判断根节点,这里假设根节点具有的特点就是parentId的值为root,当然实际情况要根据需求来设定根节点的特点
if("root".equals(d.getParentId())){
//4.将根节点和菜单集合传入要递归封装的方法
tree.add(this.buildChildren(d,lists));
break;
}
}
return tree;
}
private Department buildChildren(Department d,List<Department> lists){
//5.从根节点一层一层进行封装
for(Department node : lists){
if(node.getParentId().equals(d.getId()){
d.getChildren().add(this.buildChildren(node, lists));
}
}
return d;//返回根节点对象
}
}
ps: 边写边看效果会更好