代码地址 :https://github.com/Wenhaoran/webgate

上两篇博客,介绍了,为啥js 拼接html ,为啥不能生成正确的菜单树。 也写了 通过js 来 拼接的方法。

下面说一下,正确的生成 菜单树 的方法。

先说页面,页面配置很简单。

就是在 jsp 中,嵌套一点 java 代码 + 引入一个java 文件 + <%= %> 的用法,如图下:

easyui 生成 菜单结构树 02

easyui 生成 菜单结构树 02


上图中,被注释掉的代码 ,是 通过js 生成的html,完全复制过来后,页面是正确的。

完整的 WebMenuList 文件代码:

WebMenuList 的代码有点多,慢慢的看,主要是,循环判断的逻辑有点绕。

大概意思是这样的:

1、生成html 的准备工作。

先循环全部 资源,判断当前资源,是否有 父ID。

否: 如果没有,保存 当前资源 到 list 中。 这个 list 中的资源,就是 根节点。

是: 如果 有,就把当前节点,保存到,父ID 的 资源 的 child 集合中。

说白了就这么简单。

2、准备生成 html

循环 根节点 集合,判断 当前节点 是否有 子节点

是: 循环当前节点的子节点集合 ,拼接html ,再 判断 子节点 是否还存在子节点,如果存在就不断的重复 循环, 再拼接html

否: 拼接html 。



package cn.service.menu;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import cn.authcation.bean.MenuHtmlList;
import cn.authcation.bean.MenuResourceList;
import cn.po.system.SysResource;

public class WebMenuList {

	public String getMenuList(HttpServletRequest request) {
		String ticket = (String) request.getSession().getAttribute("ticket");
		if(!"".equals(ticket)&&ticket!=null){
			List<SysResource> resourceList = MenuResourceList.get(ticket);
			if("".equals(MenuHtmlList.get(ticket))||MenuHtmlList.get(ticket) == null){
				String html = createMenuHtml(resourceList,ticket);
				MenuHtmlList.put(ticket, html);
				return html;
			}else{
				return MenuHtmlList.get(ticket);
			}
		}
		return "";
		
	}
	
	public String createMenuHtml(List<SysResource> resourceList,String ticket){
		StringBuffer sb = new StringBuffer();
		
		Map<String, SysResource> menuList = new HashMap<String, SysResource>();
		Map<String, SysResource> resourceData = new HashMap<String, SysResource>();
		
		if (resourceList != null) {
			for (int i = 0; i < resourceList.size(); i++) {
				SysResource resource = resourceList.get(i);
				menuList.put(resource.getId(), resource);
			}
		}
		
		if (resourceList != null) {
			for (int i = 0; i < resourceList.size(); i++) {
				SysResource resource = resourceList.get(i);
				//判断,是否属于根节点
				if (resource.getParentResourceId() == null || resource.getParentResourceId() == "") {
					//属于根节点
					//根节点集合,存值
					resourceData.put(resource.getId(), resource);
					
				}else{
					//不是根节点
					
//					SysResource parentResource = resourceData.get(resource.getParentResourceId());

					//判断当前 路径 的 父节点,是不是根节点。 
//					if (parentResource != null) {
//						if(parentResource.getChild() == null){
//							 List<SysResource> list = new ArrayList<SysResource>();
//							 parentResource.setChild(list);
//						 }
//						parentResource.getChild().add(resource);
//						
//					}else{
						SysResource parentResource2 = menuList.get(resource.getParentResourceId());
						 if(parentResource2.getChild() == null){
							 List<SysResource> list = new ArrayList<SysResource>();
							 parentResource2.setChild(list);
						 }
						parentResource2.getChild().add(resource);
//					}
				}
			}
		}
		resourceData.get("");
		
		if(resourceData.size() > 0){
			sb = createMenuListParent(resourceData,sb,ticket);
		}else{
			sb.append("<li iconCls=\"\">");
			sb.append("<span>无权限</span> ");
			sb.append("<ul>");
			sb.append("");
			sb.append("</ul>");
			sb.append("</li>");   
		}
		
		
		return sb.toString();
	}
	
	public StringBuffer createMenuListParent(Map<String, SysResource> resourceData,StringBuffer sb,String ticket){
		
		
		for (Map.Entry<String, SysResource> entry : resourceData.entrySet()) {  
			List<SysResource> list = entry.getValue().getChild();
			if(list!=null && entry.getValue().getChild().size()>0){
				sb.append("");
				sb.append("<li>");
				sb.append("<span>" + entry.getValue().getName() + "</span>");
				sb.append("<ul>");
				List<SysResource> childrenList = entry.getValue().getChild();
				for(SysResource  rs: childrenList){
					createMenuListChild(rs,sb,ticket);
				}
				sb.append("");
				sb.append("</ul>");
				sb.append("</li>");
			}else{
				sb.append("<li>");
				String url = assemblyUrl(entry.getValue().getLink(), ticket);
				sb.append("");
				sb.append("<a href='###' onclick='openContent(\""+ entry.getValue().getName() +"\", \""+ url +"\")'>");
				sb.append("<span style='cursor:pointer;'>" + entry.getValue().getName() + "</span>");
				sb.append("</a>");
				sb.append("");
				sb.append("");
				sb.append("</li>");
			}
			
			
		    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());  
		  
		}
		return sb;
	}
	
	
	public StringBuffer createMenuListChild(SysResource resourceData,StringBuffer sb,String ticket){
		if(resourceData.getChild() !=null && resourceData.getChild().size() > 0){
			sb.append("");
			sb.append("<li>");
			sb.append("<span>" + resourceData.getName() + "</span>");
			sb.append("<ul>");
			for(SysResource child: resourceData.getChild()){
				createMenuListChild(child,sb,ticket);
			}
			sb.append("");
			sb.append("</ul>");
			sb.append("</li>");
		}else{
			sb.append("");
			sb.append("<li>");
			String url = assemblyUrl(resourceData.getLink(), ticket);
			sb.append("");
			sb.append("<a href='###' onclick='openContent(\""+ resourceData.getName() +"\", \""+ url +"\")'>");
			sb.append("<span style='cursor:pointer;'>" + resourceData.getName() + "</span>");
			sb.append("</a>");
			sb.append("");
			sb.append("");
			sb.append("</li>");
		}
		return sb;
	}


	public String assemblyUrl(String url,String ticket){
		
//		if (resource.link == null || resource.link == "") {
//			return null;
//		}
//		var url = [];
//		if (resource.full == 1) { // 是否全路径 1-否 2-是
//			url.push("http://");
//			url.push(resource.component.address);
//			url.push(":");
//			url.push(resource.component.port);
//			url.push("/");
//			url.push(resource.component.code);
//		}
//		url.push(resource.link);
//		url.push("?ticket=" + ticket);
//		url.push("&pt_rtype=m");
//		
//		return url.join("");
		return url;
	}
}

 

代码中,通过session 获取的ticket ,是用来获取 用户信息。 在用户登录系统之后,会生成 随机数(ticket), 放到 session 和 用户信息存储文件中 ,来保存用户信息。

MenuResourceList 和MenuHtmlList ,是用来 存储 menu 信息的类。

分别如图下:

easyui 生成 菜单结构树 02

MenuHtmlList 的 key 是 ticket ,value ,是 拼接生成的html 。


easyui 生成 菜单结构树 02

MenuResourceList 的key ,是 当前用户 随机生成 的ticket 。

而 value ,就是 菜单树 数据的集合。

数据的来源,是在 登录系统时,查询并保存的。

保存数据的过程,如图下:

easyui 生成 菜单结构树 02

通过这样,就可以成功的,先 拼接 当前 角色对应的html 到页面上,然后让他正常的显示了。



OK。


如果有啥疑问,欢迎随时找我问。联系方式 QQ:1286238812 备注,csdn easyui tree

相关文章:

  • 2021-10-30
  • 2021-09-25
  • 2022-02-06
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-25
  • 2022-02-01
猜你喜欢
  • 2021-04-23
  • 2021-08-18
  • 2022-12-23
  • 2021-11-30
  • 2022-01-02
  • 2021-06-02
  • 2021-07-04
相关资源
相似解决方案