easyui 生成 多级 菜单树 01

这篇博客,算是 爬坑总结,如果想直接看成功 的方案,请看 下一篇博客。

本来打算复制数据的,但是看了一下,数据没啥用,还特别多,如果你真的需要看这些数据,可以单独找我,QQ:1286238812 ,备注 **** easyui tree . 放心,这些数据 不涉及公司机密。

数据结构如图下:

easyui 生成 多级 菜单树 01


然后,先说,最开始 想通过 js 生成 菜单树的思路。

在 打算 在 页面 的js 中,通过 ajax 请求,获取 所有 菜单结构数据的集合,通过 js 来 循环遍历,生成带有多级菜单结构的树。 因为这个算是错误案例,所以不贴代码,只粘图

js 代码如图下:

easyui 生成 多级 菜单树 01


basejs.jsp ,即为项目 的引入 文件,文件内容全部是引入的js ,以及 css 样式。

get MenuList 方法,为 访问后台数据,拼接html 代码的方法。

具体方法如下:

function createMenuListParent(resourceData,html,ticket){
	for(var [key,value] of resourceData){
		if(value.children.length > 0){
			html.push("");
			html.push("<li>");
			html.push("<span>" + value.name + "</span>");
			html.push("<ul>");
			var childrenList = value.children;
			for(var child of childrenList){
				createMenuListChild(child,html,ticket);
			}
			html.push("");
			html.push("</ul>");
			html.push("</li>");
		}else{
			html.push("<li>");
			var url = assemblyUrl(value, ticket);
			html.push("");
			html.push("<a href='###' onclick='addFrameTab(\""+ value.name +"\", \""+ url +"\")'>");
			html.push("<span style='cursor:pointer;'>" + value.name + "</span>");
			html.push("</a>");
			html.push("");
			html.push("");
			html.push("</li>");
		}
	}
}

function createMenuListChild(resourceData,html,ticket){
	if(resourceData.children !=null && resourceData.children.length > 0){
		html.push("");
		html.push("<li>");
		html.push("<span>" + resourceData.name + "</span>");
		html.push("<ul>");
		for(var child of resourceData.children){
			createMenuListChild(child,html,ticket);
		}
		html.push("");
		html.push("</ul>");
		html.push("</li>");
	}else{
		html.push("");
		html.push("<li>");
		var url = assemblyUrl(resourceData, ticket);
		html.push("");
		html.push("<a href='###' onclick='addFrameTab(\""+ resourceData.name +"\", \""+ url +"\")'>");
		html.push("<span style='cursor:pointer;'>" + resourceData.name + "</span>");
		html.push("</a>");
		html.push("");
		html.push("");
		html.push("</li>");
	}
}


function getMenuList(roleId, sysId, ticket) {
	$.ajax({
		"dataType" : 'json',
		"type" : 'POST',
		"url" : basePath + '/pages/frame/getResourceZTreeByRoleId',
		"data" : {
			'sysId' : sysId,
			'roleId' : roleId
		},
		"async" :true,
		"success" : function(response) {
			if (response.isSuccess == "true") {
				var html = [];
				var resourceData = new Map();
				var resourceListData = new Map();
				var resourceList = response.aaData;
				if (resourceList != null) {
					for (var i = 0; i < resourceList.length; i++) {
						var resource = resourceList[i];
						resourceListData.set(resource.id, resource);
					}
				}
				if (resourceList != null) {
					for (var i = 0; i < resourceList.length; i++) {
						var resource = resourceList[i];
						
						if (resource.parentResourceId == null || resource.parentResourceId == "") {
							if(resource.children === undefined || resource.children == 0){
								resource.children = [];
							}
							resourceData.set(resource.id, resource);
						}else{
							var parentResource = resourceData.get(resource.parentResourceId);
							if (parentResource != null) {
								parentResource.children.push(resource);
							}else{
								var parentResource2 = resourceListData.get(resource.parentResourceId);
								if(parentResource2.children === undefined || parentResource2.children.length == 0){
									parentResource2.children = [];
								}
								 
								parentResource2.children.push(resource);
							}
						}
					}
				}
				if(resourceData.size > 0){
					createMenuListParent(resourceData,html,ticket);
				}else{
					html.push("<li iconCls=\"\">");
					html.push("<span>无权限</span> ");
					html.push("<ul>");
					html.push("");
					html.push("</ul>");
					html.push("</li>");   
				}
				
				var defaultResourceName = null;
				var defaultResourceUrl = null;
				//var resources = resourceData.values();
				
				$("#dtree").html(html.join(""));
				console.log(html.join(""));
				//addFrameTab(defaultResourceName, defaultResourceUrl);
			} else {
				alertMsg('alertModal', 'alertMsg', response.msg);
				window.location.href = basePath + response.url;
			}
		},
		"error" : function(response) {
			window.location.href = basePath ;
		}
	});
}

assemblyUrl 方法是,拼接 url + ticket (ticket 为 登录验证生成的随机数) ,生成访问路径 的方法。

$("#dtree") ,是 上一篇博客介绍的 tree

当前ajax 请求,对应的后台方法是:

public ResourceForm getResourceZTreeByRoleId(HttpServletRequest request,HttpServletResponse response, ResourceForm form) throws Exception{
		try {
			String ticket = (String) request.getSession().getAttribute("ticket");
			Map<String,Object> resourceCondition = new HashMap<String,Object>();
			resourceCondition.put("sysId", form.getSysId());
			resourceCondition.put("roleId", form.getRoleId());
			List<SysResource> resourceList = sysResourceService.getResourceListByRoleId(resourceCondition);
			for(SysResource list : resourceList){
				list.setComponent(this.sysComponentService.getComponentById(list.getComponentId()));
				list.setSystem(this.sysSystemService.getSystemById(list.getSystemId()));
			}
			MenuResourceList.put(ticket, resourceList);
			form.setAaData(resourceList);
			form.setIsSuccess(SUCCESS);
		} catch (Exception e) {
			form.setIsSuccess(FAILURE);
			form.setMsg((e instanceof WebgateException) ? "" : e.getMessage());
		}
		return form;
	}

其中,sysId , 为,系统ID。 菜单树结构,必须属于某个系统。

roleId ,为,角色ID。根据角色,显示 菜单链接。


这个js 方法,生成的 html 如下:

<li><span>系统管理</span><ul><li><span>系统信息</span><ul><li><span>三级菜单</span><ul><li><a href='###' onclick='addFrameTab("四级菜单", "http://127.0.0.1:8080/webgate/pages/system/form/index?ticket=1489622475604_0.5272848774602615&pt_rtype=m")'><span style='cursor:pointer;'>四级菜单</span></a></li></ul></li></ul></li><li><a href='###' onclick='addFrameTab("资源信息", "http://127.0.0.1:8080/webgate/pages/resource/form/index?ticket=1489622475604_0.5272848774602615&pt_rtype=m")'><span style='cursor:pointer;'>资源信息</span></a></li><li><span>账户信息</span><ul><li><a href='###' onclick='addFrameTab("三级菜单2", "http://127.0.0.1:8080/webgate/pages/system/form/index?ticket=1489622475604_0.5272848774602615&pt_rtype=m")'><span style='cursor:pointer;'>三级菜单2</span></a></li></ul></li><li><a href='###' onclick='addFrameTab("角色信息", "http://127.0.0.1:8080/webgate/pages/role/form/index?ticket=1489622475604_0.5272848774602615&pt_rtype=m")'><span style='cursor:pointer;'>角色信息</span></a></li><li><a href='###' onclick='addFrameTab("组件信息", "http://127.0.0.1:8080/webgate/pages/component/form/index?ticket=1489622475604_0.5272848774602615&pt_rtype=m")'><span style='cursor:pointer;'>组件信息</span></a></li><li><a href='###' onclick='addFrameTab("模块信息", "http://127.0.0.1:8080/webgate/pages/module/form/index?ticket=1489622475604_0.5272848774602615&pt_rtype=m")'><span style='cursor:pointer;'>模块信息</span></a></li><li><a href='###' onclick='addFrameTab("功能信息", "http://127.0.0.1:8080/webgate/pages/function/form/index?ticket=1489622475604_0.5272848774602615&pt_rtype=m")'><span style='cursor:pointer;'>功能信息</span></a></li></ul></li><li><a href='###' onclick='addFrameTab("一级菜单", "http://127.0.0.1:8080/webgate/pages/system/form/index?ticket=1489622475604_0.5272848774602615&pt_rtype=m")'><span style='cursor:pointer;'>一级菜单</span></a></li>

此html 拼接到页面上,显示的是错误的。错误原因,上一篇博客已经说过:http://blog.****.net/u012246342/article/details/62443719

但是,如果把这段html,直接复制到 页面上,并不通过js 加载,样式就是正确的。详情请看上一篇博客。


下一篇博客来写,正确的 生成 easyui 树菜单 的方法。