根据用户对应的角色所拥有的菜单在后台动态拼成Json,传递给js,生成Ztree。
公司之前的ztree实现都是在jsp里获取用户权限之后拼json。但添加父子级菜单,更改权限内容,维护起来都比较麻烦,所以花了两三个小时重构了一下,轻拍···
SpringMVC+Hibernate+Spring
Ztree+EasyUI
用户User 和 角色Role 多对一
角色Role 和 菜单Function 多对多
po里使用关联对象注解方式配置的关联关系。
具体代码:
1.Control层,easyui-layout的west访问下面的方法
@RequestMapping(value = "/showTreeMenu.do", method = RequestMethod.GET)
public String zTreeShow(Model model, HttpServletRequest request)
throws Exception {
String userId = ((UserVo) request.getSession()
.getAttribute("loginUser")).getUSERID();
List<FunctionVo> parentList = userService.selectParentZtree(userId); // 根据用户Id,查询该用户拥有的一级菜单
List<String> childList = userService.selectChildZtree(parentList,
request, userId); // 根据用户ID,一级菜单获取该用户拥有的子菜单
model.addAttribute("pList", parentList);
model.addAttribute("cList", childList);
return "/jsp/main/west"; //返回生成ztree的jsp页面
}
2.Service层
// 查询用户拥有的一级菜单
@Override
public List<FunctionVo> selectParentZtree(String userId) throws Exception {
List<Function> functionlist = this.userDao.selectParentZtree(userId);
List<FunctionVo> retFunctionVoList = new ArrayList<FunctionVo>();
for (Function function : functionlist) {
FunctionVo vo = new FunctionVo();
PropertyUtils.copyProperties(vo, function);
retFunctionVoList.add(vo);
}
return retFunctionVoList;
}
// 根据父类菜单的ID,查询出对应的子类菜单
@Override
public List<String> selectChildZtree(List<FunctionVo> parentList,
HttpServletRequest request, String userId) throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("userId", userId);
List<String> childList = new ArrayList<String>();
for (FunctionVo vo : parentList) {
map.put("functionVo", vo);
String temp = recursionChildZtree(map, request, 0);//递归查询子菜单,拼json
if (temp.length() != 0) {
childList.add("[" + temp.substring(0, temp.length() - 1) + "]");//父菜单List和子菜单List一一对应,保证父子菜单的List下标相同
} else {
childList.add(null);
}
}
return childList;
}
// 根据参数递归查询子菜单
public String recursionChildZtree(Map<String, Object> map,
HttpServletRequest request, int status) throws Exception {
Map<String, Object> m;
FunctionVo vo;
List<Function> listResult = userDao.selectChildZtree(map); // 根据父类菜单和用户ID获取该菜单旗下用户拥有的所有子级菜单
String temp = "";
for (Function function : listResult) {
if (function != null) {
if (((FunctionVo) map.get("functionVo")).getFUNCTIONID()
.equals(function.getPARENTFUNCTION()))
{//如果当前菜单有父类菜单,则继续查询该菜单的子菜单
m = new HashMap<String, Object>();
vo = new FunctionVo();
PropertyUtils.copyProperties(vo, function);
m.put("functionVo", vo);
m.put("userId", map.get("userId"));
temp += recursionChildZtree(m, request, 1);
}
String icon = "";
String url = "";
icon = (status == 0) ? "1_open.png" : "1_close.png";
url = (status == 0) ? "" : ",attributes:{\"url\" :\""
+ request.getContextPath() + function.getFUNCTIONURL()
+ "\"}";
temp += "{id : \"" + function.getFUNCTIONID() + "\",pId:\""
+ function.getPARENTFUNCTION() + "\",icon:\""
+ request.getContextPath() + "/css/zTreeStyle/img/diy/"
+ icon + "\",name: \"" + function.getFUNCTIONNAME()
+ "\",open:true " + url + "},";
}
}
return temp;
}
3.Dao层
@Override
public List<Function> selectChildZtree(Map map) {
StringBuffer sql = new StringBuffer();
List<Function> list = null;
sql
.append("from Function a inner join fetch a.role b inner join fetch b.user c where c.USERID='"
+ map.get("userId")
+ "' and a.PARENTFUNCTION='"
+ ((FunctionVo) map.get("functionVo")).getFUNCTIONID()
+ "'order by a.FUNCTIONORDER, a.FUNCTIONID");
list = (List<Function>) this.findByHQL(sql.toString());
return list;
}
@Override
public List<Function> selectParentZtree(String userId) {
StringBuffer sql = new StringBuffer();
List<Function> list = null;
sql.append("from Function a inner join fetch a.role b inner join fetch b.user c where a.PARENTFUNCTION='0' and c.USERID='"
+ userId + "' order by a.FUNCTIONORDER, a.FUNCTIONID");
list = (List<Function>) this.findByHQL(sql.toString());
return list;
}
4.west.jsp
<script type="text/javascript" charset="utf-8">
var json=${cList }; //接收子菜单
$(function() {
$('#menuAccordion').accordion({ //定义手风琴
animate:false,
fit : true,
border : false
});
});
var setting = {
data: {
simpleData: {
enable: true
}
},
callback: {
onClick:zTreeOnClick
}
};
$(document).ready(function(){
for(var i=0;i<json.length;i++) {
$.fn.zTree.init($("#"+i+""), setting, json[i]); //遍历Json,生成zTree
}
});
function zTreeOnClick(event, treeId, treeNode) {
addTab(treeNode);
};
</script>
<div id="menuAccordion">
<c:set var="index" value="0" />
<c:forEach items="${pList}" var="li" >
<div title=" ${li.FUNCTIONNAME }" style="overflow:auto;" id="${li.FUNCTIONID }" >
<ul id="${index }" class="ztree"></ul> <!-- 根据查出的父类菜单的数量生成对等的手风琴 -->
</div>
<c:set var="index" value="${index+1}" />
</c:forEach>
</div>
- 大小: 3.9 KB
分享到:
相关推荐
zTree是一款广泛应用于Web开发中的JavaScript树形菜单插件,其最新版本为zTree_v3.5.17。这个插件以其强大的功能、灵活的配置选项和良好的用户体验深受开发者喜爱。在本压缩包中,你将获得zTree的核心源码,以便于你...
《jQuery zTree_v3——构建动态交互式树形菜单的利器》 在Web开发中,交互性和用户体验成为了衡量一个网站质量的重要标准。zTree,作为一个基于jQuery的开源插件,以其出色的性能、丰富的配置选项以及多样的功能...
综上所述,这个项目展示了如何整合前端的ZTree、Struts2框架,以及Ajax和JSON技术,实现一个动态的、基于checkbox的权限树,优化了权限管理的用户体验,同时通过存储过程减少了对数据库的频繁访问,提升了系统性能。
在这个“asp.net mvc4 ztree 连接数据库 动态生成菜单简单demo”中,我们将探讨如何利用ASP.NET MVC4的技术特性结合ZTree,一个流行的JavaScript树状视图插件,来动态生成菜单,同时连接到数据库获取数据。...
ZTree,一个基于JavaScript的树形控件,提供了丰富的功能,包括动态生成JSON,这对于构建交互式的、数据驱动的用户界面尤其有用。在这里,我们将深入探讨如何使用ZTree实现动态生成JSON以及相关的技术细节。 首先,...
在 zTree 中,你可以轻松地生成动态的树结构,支持异步加载数据,这在处理大量数据时尤其有用,因为它可以只加载用户需要看到的部分,提高了页面的响应速度。zTree 的核心特性包括: 1. **数据操作**:zTree 支持 ...
在网页开发中,zTree可以帮助开发者快速构建出美观、可操作的树状菜单,广泛应用于网站导航、组织架构展示、文件管理等领域。这个版本是v2.6,可能包含了一些改进和修复,以提升性能和用户体验。 zTree的核心特性...
在Java项目中,我们通常会结合后台服务(如Spring MVC或Servlet)来动态生成Ztree的数据源,然后通过Ajax请求传递到前端进行渲染。 1. **Ztree的配置与使用**: Ztree的配置主要涉及JSON数据格式和HTML结构。你...
这样,当用户登录时,系统可以根据该用户的所属角色查询角色-菜单关联表,获取其有权访问的菜单,进而动态生成zTree展示的菜单结构。 在实际操作中,"rightDispatch"可能是一个实现此功能的代码文件或者是一个处理...
【标题】"ztree左侧菜单jspDemo"是一个关于在Java Web开发中使用ZTree实现动态左侧菜单栏的实例。ZTree是一款基于JavaScript的树形插件,广泛应用于网站的导航菜单、组织结构展示等场景。它支持JSON数据格式,可以...
- zTree通过解析JSON数据,动态渲染出树形结构。 以上就是关于"zTree后台组装树结构java代码"的主题知识,包括了zTree的使用、Java与MySQL的交互、递归算法构建树、Spring JDBC等内容。理解并掌握这些知识点,能够...
**ZTree 异步加载 SSH JSON** ZTree是一款基于jQuery的树形插件,它具有丰富的功能和良好的可扩展性,常用于构建网站的导航菜单、文件目录展示等场景。在"ZTree 异步加载 SSH JSON"这个主题中,我们将深入探讨如何...
动态生成树技术在现代Web应用中广泛用于展示层次结构数据,如组织结构、文件系统或导航菜单等。这里我们关注的是使用jQuery-zTree插件在前端实现动态树,结合Struts2和Spring后端框架来从数据库获取并处理数据,以及...
Struts2.0、ZTree 和 jQuery 是在Web开发中常用的三大技术,它们结合使用可以实现动态生成树状结构的功能,这种结构常用于展现层级关系的数据,如组织架构、文件目录等。本篇将深入探讨如何利用这三种技术实现这一...
【标题】"ztree二级树菜单(SSI框架下)--hulian平台二版代码"涉及的知识点主要集中在zTree这个JavaScript库的使用上,以及它在服务器端包含(SSI,Server-Side Include)框架下的应用。zTree是一个功能强大的jQuery...
zTree_v3通过解析Json数据,能够动态地创建和更新树节点,支持多种节点操作,如展开、折叠、添加、删除、编辑等。 zTree_v3-maste的特性包括: 1. **灵活配置**:zTree提供了丰富的配置选项,允许开发者根据实际...
通过`$.fn.zTree.init()`方法将数据和配置项传入,ZTree会自动解析并生成树形菜单。 总的来说,使用ZTree构建树形菜单需要理解其核心JS库、扩展功能库和样式文件的作用,并结合ZTree的API和数据格式来实现具体的...
在“ztree.rar 树生成案例”中,我们可以深入学习如何利用 `zTree` 实现动态、交互式的树形界面。 `zTree` 具有以下主要特性: 1. **轻量级**:`zTree` 的源码体积小巧,易于引入项目,减少加载时间。 2. **高度可...