最近在做一个权限管理系统,需要有一个菜单的管理,菜单的数据结构是自关联无限极的一对多关系。在列表管理页面决定选择用easyui的treegrid插件。考虑到其无限层级关系,若要一次性拿出所有数据那需要在mysql中写函数跟存储过程,需要有临时表的存在,这样会相对降低效率,所以选择用动态异步加载的方式请求数据
首先来看一下效果图(第一次加载的结果页面):
对于treegrid的使用我们可以参考官方的api : http://www.zi-han.net/case/easyui/datagrid&tree.html#treegrid
其中动态加载的关键方法为:onBeforeExpand , 次方法为节点打开前触发的事件,我们可以在其中进行子节点的加载。
具体代码为:
$(function() {
$("#menuTree")
.treegrid(
{
url : "${ctx}/menu/getFirstData",//首次查询路径
idField : 'id',
treeField : 'name',
parentField : 'menuid',
rownumbers : true,
queryParams : {
"id" : "-1"
},//首次查询参数
columns : [ [ {
field : "name",
title : "名称",
width : 200
}, {
field : "description",
title : "描述",
width : 300
}, {
field : "createtime",
title : "创建时间",
width : 200
}, {
field : "icon",
title : "图标地址",
width : 300
}, {
field : "linkurl",
title : "链接",
width : 300
} ] ],
onBeforeExpand : function(row) {
// 此处就是异步加载地所在
if (row) {
$(this).treegrid('options').url = '${ctx}/menu/getSecondData?id='
+ row.id;
}
return true;
},
toolbar : [ {
id : 'addLeafBtn',
text : '添加菜单',
iconCls : 'icon-add',
handler : function() {
addMenu();
}
},'-', {
id : 'editBtn',
text : '修改',
iconCls : 'icon-edit',
handler : function() {
$('#btnsave').linkbutton('enable');
alert('cut')
}
}, '-', {
id : 'deleteBtn',
text : '删除',
disabled : true,
iconCls : 'icon-save',
handler : function() {
$('#btnsave').linkbutton('disable');
alert('save');
}
} ]
});
});
这是我的model对象(省略get set方法):
public class SsmMenu { private Integer id;
private String name;
private String icon;
private String createtime;
private Integer creator;
private String linkurl;
private Integer status;
private Integer menulevel;
private Integer menuid;
private Integer sort;
private String description;
private String state ; //closed:表示有子节点 open:表示没有子节点
private List<SsmMenu> children ;}
{
"rows": [
{
"children": [
{
"createtime": "2012-12-12 08:22:29",
"description": "系统",
"icon": "www.baidu.com",
"id": 1,
"linkurl": "www.baidu.com",
"menuid": -1,
"menulevel": 1,
"name": "系统管理",
"sort": 1,
"state": "closed",
"status": 1
},
{
"createtime": "2012-12-12 03:22:22",
"description": "用户",
"icon": "www.baidu.com",
"id": 2,
"linkurl": "www.baidu.com",
"menuid": -1,
"menulevel": 1,
"name": "用户管理",
"sort": 2,
"state": "open",
"status": 1
}
],
"createtime": "2012-12-12 08:22:29",
"description": "菜单",
"icon": "www.baidu.com",
"id": -1,
"linkurl": "www.baidu.com",
"name": "菜单分类",
"state": "open"
}
],
"total": 10
}
其中state是最重要的参数,若该对象中有children集合,则state表示是否展开节点,“closed”表示不展开,“open”表示展开;若该对象中无children集合则表示是否为子节点,“open”表示是子节点,“closed”表示为父节点;
接下来我们看点击展开节点时请求getSecondData返回的json数据格式
[
{
"createtime": "2012-12-12",
"description": "菜单",
"icon": "www.baidu.com",
"id": 3,
"linkurl": "www.baidu.com",
"menuid": 1,
"menulevel": 1,
"name": "菜单管理",
"sort": 1,
"state": "closed",
"status": 1
}
]
注意它返回的是一个json数组