先上效果图
首先说说jquery-treeview 这个插件,这里有官方的demo http://jquery.bassistance.de/treeview/demo/ 用法很简单
我们只需要组织好相应的html标签就好了,例如:
<div id="treeContainer">
<ul>
<li>父节点
<ul>
<li>子节点1</li>
<li>子节点2</li>
</ul>
</li>
</ul>
</div>
然后简单的调用 $("#treeContainer ul").Treeview(); 就能生成一颗js树
那么接下来,我们就要想办法来组织这些标签,我自己是在后台使用freemarker来动态生成的。
至于系统栏目表的结构,就是一个引用自身的表,
例如 t_menu表有字段 id name parent 这三个字段
那么相应的数据有可能是这样的
id name parentId
1 系统管理 0(或者NULL)
2 系统日志 1
3 用户管理 1
4 文章管理 0(或者NULL)
5 文章分类 4
这个大家应该一看就知道是一个无限级树形结构.
那么使用hibernate后,我们首选需要查询出所有的顶级菜单和相应的子菜单列表
hql = "from t_menu where parentId = 0"
由于hibernate可以级联查询出所有子菜单的数据,所以,我们可以很方便的拿到一个list,它的数量为2(2个顶级菜单)
然后把这个list对象传给freemarker的上下文,就可以用freemarker的宏来递归产生html标签(我上面的例子和对象只是简单举例,下面的模板内容是我实际项目的编码,所以看起来会和上面举的例子的不一致,不过过程都一样的,理解了都一样的,就是迭代菜单名,然后判断是否还有子菜单,有就递归调用宏.)
<#-- 定义宏buildCheckbox -->
<#macro buildCheckbox purviewItem>
<#if purviewItem= 1>
<input type="checkbox" name="purview" value ="1" >查看
<#elseif purviewItem = 2>
<input type="checkbox" name="purview" value ="2" >添加
<#elseif purviewItem = 3>
<input type="checkbox" name="purview" value ="3" >修改
<#elseif purviewItem = 4>
<input type="checkbox" name="purview" value ="4" >删除
</#if>
</#macro>
<#-- 定义宏buildNode -->
<#macro buildNode child parent>
<li id="${parent.MPkid}" parentId="${parent.MParentId}">${parent.MItem}
<#if child?? && child?size gt 0>
<ul>
<#list child as t>
<#-- 递归调用宏buildNode -->
<@buildNode child=t.children parent=t/>
</#list>
</ul>
<#else>
<#-- 如果是叶子节点 -->
<#list parent.options as purviewItem>
<#-- 循环调用宏buildCheckbox -->
<@buildCheckbox purviewItem=purviewItem/>
</#list>
<#-- <input type="checkbox" name="purview" value ="1" >查看 <input type="checkbox" name="purview" value ="2" >添加 <input type="checkbox" name="purview" value ="3" >修改 <input type="checkbox" name="purview" value ="4" >删除-->
</#if>
</li>
</#macro>
<ul>
<#list rootMenus as root>
<#-- 循环调用宏buildNode -->
<@buildNode child=root.children parent=root/>
</#list>
</ul>
就这样,就能够产生一个无限级树的js菜单所需要的html标签了,接着只需要在页面简单的调用 $("#treeContainer ul").Treeview(); 就好了.
另一方面,至于如何授权(遍历js树),就有很多方法了,我是这么实现的
工具:用到json2.js和google gson这个库来将json对象转换成java对象
页面代码,遍历树,组织json对象,用于提交到服务器
//定义rolePurview对象
var rolePurview = function(jewelryRole, jewelryMenu, opQuery){
this.jewelryRole = jewelryRole;
this.jewelryMenu = jewelryMenu;
this.opQuery = opQuery;
}
//定义集合对象,用于递归时地址传递
var rolePurviews = {str: '{ "rolePurviews":['};
//授权
function save(){
//迭代所有根节点
$("li[parentId='0']").each(function(){
var $this = $(this);
var menu = $this.attr('id');
var options = [];
//判断根目录下的所有叶子节点是否有进行选择的,有就进行递归遍历
if($this.find("input:checked").length > 0){
recursiveTree($this,rolePurviews);
}
});
//如果所有checkbox都没有选择
if(rolePurviews.str.length == 18){
rolePurviews.str += ',';
}
rolePurviews.str = rolePurviews.str.substring(0,rolePurviews.str.length-1)+"]}";
//alert(rolePurviews.str);
roleServiceDWR.roleAuthorizationDwr(purview,operations[1],role,rolePurviews.str,{
callback:function(data){
if(data == 0){
sucInfoHandler("角色授权成功!",back);
}else{
sucInfoHandler("角色授权失败!",emptyPurviews);
}
}
});
}
//递归遍历js树
function recursiveTree(node,rolePurviews){
var options = [];
var sdataObj;
var jsonText;
var nodeId = node.attr('id');
//如果不是叶子节点,且其下的叶子节点有被选择的.
if(node.find("ul").length > 0 && node.find("input:checked").length > 0){
sdataObj = new rolePurview(role,nodeId,options);
jsonText = JSON.stringify(sdataObj);
rolePurviews.str+=jsonText+",";
node.find("li[parentId="+nodeId+"]").each(function(){
//递归
return recursiveTree($(this),rolePurviews);
})
}else if(node.find("ul").length == 0 && node.find("input:checked").length > 0){
//如果是叶子节点,且有被选择的
node.find("input:checked").each(function(){
options.push($(this).val());
})
sdataObj = new rolePurview(role,nodeId,options);
jsonText = JSON.stringify(sdataObj);
rolePurviews.str+=jsonText+",";
}
}
然后 服务器里,只需要简单的调用google gson的反射方法,就能够拿到一个list对象,里面装好了每个栏目的相应权限.
Gson gson = new Gson();
ListRolePurview r = gson.fromJson(jsonStr, ListRolePurview.class);
分享到:
相关推荐
本项目“s2sh+freemarker+jquery+jquery-treeview 无限级树形菜单”就是这样一个解决方案,它整合了多种技术来实现这一功能。 首先,我们来看“s2sh”。这是Struts2、Spring和Hibernate三者的简称,它们分别是MVC...
JEECMS使用目前java主流技术架构:hibernate3+struts2+spring2+freemarker。AJAX使用jquery和json实现。视图层并没有使用传统的JSP技术,而是使用更为专业、灵活、高效freemarker。 数据库使用MYSQL,并可支持orcale...
JAVAPMS是JAVA门户管理系统(JAVA Portal Management System)的简称,以Sping+Hibernate+Freemarker+Html5+jQuery为技术核心架构,面向广大站长、软件开发者、程序爱好者、网页设计师,适用于个人站长、商业企业、...
struts2+spring2.5+hibernate3.2 + freemarker 全新功能实现的增删改查+freemarker 摸版 struts2 的方式自己去看简单。 spring2.5 是用注释来注入 hibernate3.2 是用ejb3注解映射关系 hibernate3 +个属性可以自动...
基于SpringBoot+freemarker实现的人事管理系统分为七大模块:绩效考核,招聘管理,档案管理,工资管理,考勤管理,培训管理,系统管理。本系统最大特色是有强大和灵活的权限控制功能,所有菜单,按钮功能均可由管理...
本示例中,"spring+hibernate+freemarker+jQuery"的组合提供了一个高效且功能丰富的解决方案。让我们详细了解一下这些技术以及它们如何协同工作来实现这个系统。 首先,Spring是一个开源的Java框架,主要用于简化...
spring4.0+hibernate4.3+freemarker+jquery+extjs4.2 在实现了漂亮的首页,图表拖拉都实现了,这里重点是spring4.0和freemarker的搭建,注意其中的包的变化以及配置的不同 main.view为spring的入口,ext的节目为main...
Struts2、Hibernate和FreeMarker是Java开发领域中常见的三个开源框架,它们分别在MVC(Model-View-Controller)架构的不同层面发挥着关键作用。这个"struts2+hibernate+freemarker"项目实例是将这三个框架集成到一起...
整合S2SH+Freemarker,后台用Spring管理各个bean,Hibernate做数据库持久化,viewer用Freemarker。整合中对Struts2,Hibernate,Spring都采用Annotation进行注解类。
基于SpringBoot+LayUI+Freemarker+Mybatis的通用后台管理系统源码.zip 完整代码,可运行 。 项目描述 本系统是基于SpringBoot + 通用Mapper + LayUI + freemarker 而开发的,大体功能模块如下: 网站管理 角色管理 ...
1、基于springboot+mvc+freemarker+aop实现校友信息管理系统源码.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考...
一、项目运行 环境配置: Jdk1.8 + Tomcat8.0 + mysql + Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持) ...Springboot + SpringMVC + MyBatis + FreeMarker + JavaScript + JQuery + Ajax + maven等等。
+----doc +-----jeecms基础概念.txt +-----图文安装JDK+TOMCAT+MYSQL配置指南.doc +----jeecms +-----源码 +----JEECMS v2.3.2 Final版发布公告.txt +----readme.txt +----框架简介.txt JEECMS是JavaEE版网站...
基于springboot+mvc+freemarker+aop实现校友信息管理系统.zip基于springboot+mvc+freemarker+aop实现校友信息管理系统.zip基于springboot+mvc+freemarker+aop实现校友信息管理系统.zip基于springboot+mvc+freemarker...
其中可能涉及一些链家网、H-ui等相关的信息,在这里说明,本项目仅供交流学习,不得用于商业传播)基于springboot+MyBatis+FreeMarker+redis+nginx等技术的JavaWeb项目------恋家房产平台先简单放几张项目的图吧,...
在本项目中,我们主要探讨如何手动构建一个基于SpringMVC、Spring Data JPA、Hibernate以及FreeMarker模板引擎的Maven工程,同时实现环境切换功能。这个基础框架为日常开发工作提供了必要的支持。 首先,SpringMVC...
整合S2SH+Freemarker+oscache,后台用Spring管理各个bean,Hibernate做数据库持久化,viewer用Freemarker。整合中对Struts2,Hibernate,Spring都采用Annotation进行注解类。
maven管理项目+springmvc+spring+hibernate+freemarker 集成框架。其中注解格式清晰,hibernate进行了代码封装,对开发效率有了提高,对异常进行了封装。freemarker也有优化,参考common包下。对日期工具类有各种...
**Maven+SpringMVC+Freemarker Demo详解** 在Web开发中,Maven、SpringMVC和Freemarker是三个关键的组件,它们分别负责构建管理、业务逻辑处理和视图展示。这个"Maven+SpringMVC+Freemarker Demo"是一个基础的Web...