1.需求场景
数据库后台返回树形结构菜单,实现菜单排序。
2.项目环境
spring spring mvc mybatis mysql
3.实现方法
对应的实体类
private int id;// '主键ID',
private String cname;// '菜单名称',
private int pid;// '父级ID',默认0
private String redirect;// '菜单地址',
private String creator;// '创建者',
private String updatedate;// '修改日期',
private String updator;// '修改者',
private String createdate;// '创建日期',
private double sortid;//菜单排序字段 默认0
private List<AuthUser> children;//父菜单下的子菜单
封装树形数据
public class TreeUtil {
private int count = 0;
private List<AuthUser> nodes;
public TreeUtil(List<AuthUser> nodes){
this.nodes = nodes;
}
public List<AuthUser> buildTree(){
List<AuthUser> list = new ArrayList<AuthUser>();
for (AuthUser node : nodes) {
if (node.getPid() == 0) {
list.add(node);
}
}
list = getSortChildren(list);
for (AuthUser node : list) {
build(node);
}
return list;
}
/***
* 构建权限树
* @Title: build
* @Description: TODO
* @param node
*/
private void build(AuthUser node){
List<AuthUser> children = getChildren(node);
if (!children.isEmpty()) {
node.setChildren(children);
if(count <3){
//children.get(0).setChecked("true");//设置默认选中
count ++;
}
for (AuthUser child : children) {
build(child);
}
}
}
/**
*
* @Title: getChildren
* @Description: TODO 获取子节点
* @param node
* @return
*/
private List<AuthUser> getChildren(AuthUser node){
List<AuthUser> children = new ArrayList<AuthUser>();
Integer id = node.getId();
for (AuthUser child : nodes) {
if (id==child.getPid()) {
children.add(child);
}
}
return getSortChildren(children);
// return children;
}
/**
*
* @Title: getChildren
* @Description: TODO 获取排序子节点
* @param node
* @return
*/
private List<AuthUser> getSortChildren(List<AuthUser> children){
MyCompare my = new MyCompare();
Collections.sort(children,my) ;
return children;
}
}
自定义比较器
public class MyCompare implements Comparator<AuthUser>{
@Override
public int compare(AuthUser o1, AuthUser o2) {
if(o1.getSortid()<o2.getSortid()){
return -1;
}else{
return 1;
}
}
}
数据库返回
public void getauthinfo(Map<String,object> param){
List<AuthUser> authList =userRoleService.getUserAuthTree(param); //执行查询
TreeUtil tree = new TreeUtil(authList);
//返回按照sortid排好序的树形结构的菜单
List<AuthUser> datalist = tree.buildTree();
}
} catch (Exception e) {
e.printStackTrace();
}
}