`
我是温浩然
  • 浏览: 104172 次
文章分类
社区版块
存档分类
最新评论

easyui 生成 菜单结构树 02

 
阅读更多

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

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

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

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

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




上图中,被注释掉的代码 ,是 通过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 信息的类。

分别如图下:


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




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

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

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

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


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



OK。


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

分享到:
评论

相关推荐

    easyUI递归生成菜单树

    2. 使用EasyUI生成菜单树: 在HTML中,我们需要一个`div`元素作为菜单树的容器,然后通过JavaScript调用`$.fn.menu`方法初始化菜单。在创建菜单时,我们可以传递一个JSON数据数组,EasyUI会根据数据自动生成菜单树...

    使用easyUI实现树菜单

    在本文中,我们将深入探讨如何使用EasyUI框架来实现一个动态的树形菜单。EasyUI是一个基于jQuery的轻量级前端开发框架,它提供了一系列组件,包括表格、对话框、菜单等,使得开发者能够快速构建用户界面。在这个场景...

    easyui树形菜单操作

    在本案例中,我们将聚焦于 "easyui 树形菜单操作",特别是在 ASP.NET 中的动态绑定。树形菜单是一种常见的用户界面元素,用于展示具有层级关系的数据,如目录结构、组织架构等。 1. **EasyUI Tree 控件** EasyUI ...

    科发EasyUi代码生成器v3.5

    EasyUI的核心组件包括表格、表单、按钮、对话框、菜单、树形视图、面板、布局等,而科发EasyUi代码生成器能帮助开发者快速生成与这些组件交互的代码。例如,它可以自动生成用于数据展示的表格,用户操作的按钮,以及...

    Jquery-easyUI动态菜单

    在这个"Jquery-easyUI动态菜单"项目中,我们将会探讨如何在标准的 Maven 项目中实现动态生成的菜单,以及其在分页和界面交互中的应用。 **1. Maven项目结构与配置** Maven是Java项目管理工具,用于构建、依赖管理和...

    Easyui异步生成树节点,动态获取树节点

    EasyUI 中的 Tree 组件可以展示层级结构的数据,常用于菜单、目录等场景。它支持通过 JSON 数据源或者 AJAX 异步加载数据。在“异步生成树节点”中,这意味着树节点不是一次性加载所有数据,而是根据需要在用户交互...

    使用easyui表格数据动态生成饼图

    首先,EasyUI是一个基于jQuery的UI库,它提供了一系列预定义的组件,如表格、对话框、下拉菜单等,使得开发者可以快速构建用户界面。在描述中提到的“根据json格式获取到数据,easyui样式列表显示”,意味着我们需要...

    easyUi 菜单数据库获取动态菜单 和cxf整合 传值

    标题中提到的“easyUI 菜单数据库获取动态菜单”是指利用easyUI来动态展示从数据库中获取的菜单结构。在实际应用中,菜单通常存储在数据库中,这样可以根据用户的权限动态生成个性化菜单,避免硬编码,提高系统的...

    利用jQuery-Easyui 1.2实现多级折叠菜单代码.rar

    这个组件允许开发者创建可展开和折叠的菜单结构,非常适合用于网站的导航栏或侧边栏菜单。下面将详细介绍如何利用jQuery EasyUI 1.2创建多级折叠菜单: 1. **基本结构**: 菜单的基本HTML结构通常包括 `div` 元素...

    easyui-tree多级菜单并动态与数据库交互

    在本项目中,我们主要探讨的是如何利用EasyUI框架创建一个具有多级菜单功能的树形结构,并且能够与后台数据库进行动态交互。EasyUI是一个基于jQuery的UI库,提供了丰富的组件,包括我们这里用到的树形控件(tree)。...

    利用servlet和json生成easyUI图表

    EasyUI是一个基于jQuery的UI库,提供了丰富的组件,包括表格、表单、树形菜单、对话框等,以及各种图表。在本案例中,我们将使用EasyUI的图表组件来显示从Servlet通过JSON获取的数据。 步骤如下: 1. **数据准备**...

    jsMind思维导图整合Easyui的鼠标右键菜单

    在整合过程中,可能需要处理的问题包括菜单的定位(确保它始终显示在鼠标点击的位置),菜单项的动态生成(根据当前选中的节点或状态来决定哪些操作可用),以及事件的正确触发和处理。此外,还要注意保持整体界面的...

    Easyui+ashx权限菜单权限管理框架

    例如,当用户登录时,后端ashx处理程序会查询用户的角色和关联的权限,然后返回一个只包含用户有权访问的菜单的JSON对象,前端Easyui根据这个对象生成菜单栏。 6. 安全性考虑:在设计权限系统时,不仅要考虑正常...

    EasyUI 多层导航框架

    在描述中提到,这个框架实现了多导航功能,这意味着用户可以通过多级菜单结构来访问不同的功能模块,使得复杂的应用程序界面变得有序且易于理解。EasyUI的`easyui-accordion`和`easyui-tree`组件在其中起到了关键...

    js菜单可以动态生成

    本文将深入探讨如何使用JavaScript来动态生成菜单,并结合jQuery EasyUI库进行实践。 首先,了解JavaScript动态生成菜单的基本原理。通过JavaScript,我们可以操控HTML DOM(文档对象模型)来添加、删除或修改元素...

    jQuery动态菜单列表(树)

    本文将详细讲解如何使用jQuery实现动态菜单列表(树)以及与layui、easyui等前端框架的整合。 jQuery是一款轻量级、高性能的JavaScript库,它简化了DOM操作、事件处理和动画效果,使得开发者可以更加便捷地实现复杂...

    easyui基本权限管理系统

    根据用户的角色,动态生成菜单是权限管理的关键。EasyUI的菜单组件支持JSON数据源,开发者可以根据用户的角色权限动态生成JSON数据,从而控制菜单的显示。这样,用户只能看到他们有权访问的功能模块。 4. 权限校验 ...

    easyui java系统

    - EasyUI 提供了诸如对话框(dialog)、表格(datagrid)、下拉菜单(combobox)、树形控件(tree)等众多组件,这些组件大大简化了前端开发工作。 2. **Java 后端与 EasyUI 前端的交互**: - JSON 数据格式:...

    springmvc+hibernate+easyui

    在SpringMVC中,可以通过Controller从Service获取当前用户的角色和对应的菜单权限,然后将数据传递给EasyUI的菜单组件来生成菜单。 【数据列表动态显示】 数据列表动态显示是指根据用户查询条件,从数据库中获取...

    jquery-easyui-1.3.2

    而EasyUI则是对jQuery的进一步扩展,提供了一系列预定义的UI组件,如数据网格、对话框、菜单、表单、树形结构等,使得开发者无需从零开始编写复杂的HTML、CSS和JavaScript代码,就能快速构建出符合现代标准的Web界面...

Global site tag (gtag.js) - Google Analytics