本示例只做到指定id用户的拥有的权限回显,并能动态获得ztree中重新选择的权限id。(至于权限的更新,就是后台人员对象和权限对象建立关系的过程,不做展示)

第一步:拼写jsp页面(下载ztree包,把css,js库导入webroot下。并在jsp页面上引用,将demo中ztree的显示代码贴上)如下

 <html>
<head> <link rel="stylesheet" href="<%=request.getContextPath() %>/css/zTreeStyle/zTreeStyle.css" type="text/css">
<script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-1.4.4.min.js"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery.ztree.core-3.5.js"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery.ztree.excheck-3.5.js"></script>
<script type="text/javascript">
//ztree的Demo代码
var setting = {
check: {
enable: true
},
data: {
simpleData: {
enable: true
}
}
};
//ztree的Demo代码
var zNodes; //当页面加载完毕,向后台发送ajax请求,获取用户id为1的用户所拥有的权限(这里要显示所有权限,该id用户的权限回显时,被自动选中)
function loadPower(){
$.ajax({
type:"post",
url:"<%=request.getContextPath() %>/PowerAction!query",
data:{"uid":1},
async:false,
dataType:"json",
success:function(msg){
zNodes=msg["tree"];
} }) } //用户重新选择权限时,获取选择权限的id,此处可以拼接权限id的字符串,到后台切割成数组。String.split(",")
function test(){
//获取被选中的节点集合
var treeObj = $.fn.zTree.getZTreeObj("treeDemo");
var nodes = treeObj.getCheckedNodes(true);
//如果nodes的长度大于0说明ztree中有被选中的节点
if(nodes.length>0){
for(var i=0;i<nodes.length;i++){
var id=nodes[i]["id"];//获取选中节点的id
var name=nodes[i]["name"];//获取选中节点的名字
alert(id);
alert(name);
}
}else{
alert("没有选中节点");
} } //页面加载完毕时加载此方法
$(document).ready(function(){
loadPower();
$.fn.zTree.init($("#treeDemo"), setting, zNodes);
});
</script>
</head> <body>
<div class="zTreeDemoBackground left">
<ul id="treeDemo" class="ztree"></ul>
</div>
<input type="hidden" name="uid" value="${uid }">
<input type="button" value="测试被选中的节点的id" onclick="test();" />
</body>
</html>

第二步:后台接受前台请求。action的方法和service加工数据的方法和dao层查询数据的方法

     /**
* action层
* 接受前台的ajax请求,获取所有权限(指定id用户拥有的权限,在回显成ztree节点时被选中)
* @Title: query
* @Description: TODO(这里用一句话描述这个方法的作用)
* @return
* @return String 返回类型
* @author 尚晓飞
* @date 2014-9-29 下午3:45:42
*/
public String query(){
//响应对象
PrintWriter out=null;
try {
//获取加工好的权限集合(指定id用户的权限在回显时被选中)
List<Map<String,Object>> list=powerService.queryByStuId(uid);
//获取响应对象
HttpServletResponse resp=ServletActionContext.getResponse();
//防止响应回去的数据乱码
resp.setCharacterEncoding("utf-8");
resp.setHeader("content-type", "text/html;charset=utf-8");
resp.setContentType("text/html;charset=utf-8");
//包装成json数据格式
JSONObject jsonObject=new JSONObject();
jsonObject.put("tree",list);
//响应ajax请求
out=resp.getWriter();
out.print(jsonObject);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
out.close();
} return null;
} /**
* service业务层
* 用于加工前台需要的数据格式
* (1)查询出所有的权限集合
* (2)查询出指定id用户拥有的权限集合
* (3)加工前台需要的数据集合
* 注意点:hibernate从数据库中获取的对象都是单例模式,也就是说listOne.contains(power)是可以用于判断的
* 因为list集合是有序可重复的容器。
* @Title: queryByStuId
* @Description: TODO(这里用一句话描述这个方法的作用)
* @author 尚晓飞
* @date 2014-9-29 下午3:48:42
* @param id
* @return
* @see com.bjsxt.sxf.service.PowerService#queryByStuId(java.lang.Integer)
*/
@Override
public List<Map<String, Object>> queryByStuId(Integer id) {
// TODO Auto-generated method stub
//查询所有权限
List<Power> listAll=powerDao.queryAll();
//查询出指定id用户的权限
List<Power> listOne=powerDao.queryByUid(id);
//包装ztree
List<Map<String, Object>> list=new ArrayList<Map<String,Object>>();
Map<String, Object> map=null;
//{ id:2, pId:0, name:"随意勾选 2", checked:true, open:true},
//需要加工成的模式。
for(int i=0;i<listAll.size();i++){
map=new HashMap<String, Object>();
Power power=listAll.get(i);
map.put("id",power.getId());
map.put("pId",power.getParentId());
map.put("name", power.getName());
if(listOne!=null&&listOne.size()>0&&listOne.contains(power)){
map.put("checked",true);
map.put("open", true);
map.put("url",power.getUrl());
}else{
map.put("checked",false);
map.put("open", false);
}
list.add(map);
}
return list;
} /**
* dao层
* 查询出所有权限集合(hql语句)
* @Title: queryAll
* @Description: TODO(这里用一句话描述这个方法的作用)
* @return
* @return List<Power> 返回类型
* @author 尚晓飞
* @date 2014-9-29 下午3:52:44
*/
public List<Power> queryAll(){
return hibernateTemplate.find("from Power");
} /**
* dao层
* 查询出指定用户id拥有的权限集合
* @Title: queryByUid
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param id
* @return
* @return List<Power> 返回类型
* @author 尚晓飞
* @date 2014-9-29 下午3:53:08
*/
public List<Power> queryByUid(final Integer id){
return hibernateTemplate.execute(new HibernateCallback<List<Power>>() { @Override
public List<Power> doInHibernate(Session session)
throws HibernateException, SQLException {
// TODO Auto-generated method stub
String sql="SELECT * from shang_power p where p.id IN (SELECT sp.power_id from stu_power sp where sp.stu_id=?)";
SQLQuery query=session.createSQLQuery(sql).addEntity(Power.class);
query.setParameter(0, id); List<Power> list=query.list();
return list;
} });
}

Ztree小demo用于系统授权的更多相关文章

  1. Android -BLE蓝牙小DEMO

    代码地址如下:http://www.demodashi.com/demo/13890.html 原文地址: https://blog.csdn.net/vnanyesheshou/article/de ...

  2. Nancy之基于Self Hosting的补充小Demo

    前面把Hosting Nancy with ASP.NET.Self Hosting Nancy和Hosting Nancy with OWIN 以demo的形式简单描述了一下. 这篇是为Self H ...

  3. 一周一个小demo — 前端后台的交互实例

    这一周呢,本K在大神的指导下,完成了一个利用ajax与php文件上传处理相结合的一个留言板功能的小实例,下面就让本K来带大家瞅瞅如何实现这一种功能. 一.界面概览 首先我们来看一下这个小demo的具体 ...

  4. 【微信小程序】再次授权地理位置getLocation+openSetting使用

    写在前面:在tarbar主页面,再次授权JS代码请放在onshow里面:在详情页(非一级主页面),再次授权JS代码请放在onReady里面,具体原因我前面博客讲了的. 我们知道: 1.微信的getLo ...

  5. 移动端页面弹幕小Demo实例说明

    代码地址如下:http://www.demodashi.com/demo/11595.html 弹幕小Demo实例地址,点击看效果 写在前面:尝试做了一下弹幕的实例,欢迎提出并指正问题 问题说明: D ...

  6. Nancy之基于Nancy.Hosting.Self的小Demo

    继昨天的Nancy之基于Nancy.Hosting.Aspnet的小Demo后, 今天来做个基于Nancy.Hosting.Self的小Demo. 关于Self Hosting Nancy,官方文档的 ...

  7. Nancy之基于Nancy.Owin的小Demo

    前面做了基于Nancy.Hosting.Aspnet和Nancy.Hosting.Self的小Demo 今天我们来做个基于Nancy.Owin的小Demo 开始之前我们来说说什么是Owin和Katan ...

  8. Android -- 自定义View小Demo,动态画圆(一)

    1,转载:(http://blog.csdn.NET/lmj623565791/article/details/24500107),现在如下图的效果: 由上面的效果图可以看到其实是一个在一个圆上换不同 ...

  9. 一个基于ES5的vue小demo

    由于现在很多vue项目都是基于ES6开发的,而我学vue的时候大多是看vue官网的API,是基于ES5的,所以对于刚接触项目的我来说要转变为项目的模块化写法确实有些挑战.因此,我打算先做一个基于ES5 ...

随机推荐

  1. [LeetCode]206. Reverse Linked List(链表反转)

    Reverse a singly linked list. click to show more hints. Subscribe to see which companies asked this ...

  2. 2017 Benelux Algorithm Programming Contest (BAPC 17) Solution

    A - Amsterdam Distance 题意:极坐标系,给出两个点,求最短距离 思路:只有两种方式,取min  第一种,先走到0点,再走到终点 第二种,走到同一半径,再走过去 #include ...

  3. hdu5009

    这题说的是给了一个  长度为n(n<=50000)的数列,数列表示的是给每个珍珠涂的颜色,任务是将一窜长度为n的珍珠涂成他所要的颜色.然后你可以操至多n次, 每次画只能画连续的区间,每次操作是的 ...

  4. 使用老毛桃安装Windows操作系统

    首先必须知道什么是PE系统? 当电脑出现问题而不能正常进入系统时候的一种“紧急备用”系统,通常放在U盘中,设置启动项优先级,使得电脑启动的时候加载PE系统. 如何在U盘中安装老毛桃(PE工具箱)? h ...

  5. 【转载】IEEE754 学习总结

    以下是参考<IEEE754 学习总结>并结合自己学习总结 一:前言二:预备知识 三:浮点数的表示范围四:将浮点格式转换成十进制数 一:前言 前不久在分析一个程序的过程中遇到了浮点运算,也就 ...

  6. RESTful源码笔记之RESTful Framework的APIview, Viewset总结分析

    0x00  引言 官方文档:http://www.django-rest-framework.org/drf为我们提供强大的通用view的功能,本博客对这些view进行简要的总结分析.首先,我们看一下 ...

  7. Python3.x:函数定义

    Python3.x:函数定义 1,函数定义: def 函数名称([参数1,参数2,参数3......]): 执行语句 2,实例一(不带参数和没返回值): def helloWorld(): print ...

  8. 云主机搭建Kubernetes 1.10集群

    一.基础环境 云主机 下载软件包 将所有软件下载至/data目录 # 链接:https://pan.baidu.com/s/13DlR1akNBCjib5VFaIjGTQ 密码:1l69 # 链接:h ...

  9. 计算机基础教程11 - 互联网&内联网

    在本章中,我们将看到什么是Internet和Intranet,以及讨论两者之间的异同. 互联网 它是互联计算机网络的全球/全球系统.它使用标准的Internet协议(TCP / IP).Interne ...

  10. UVa 1635 无关的元素(唯一分解定理+二项式定理)

    https://vjudge.net/problem/UVA-1635 题意: 给定n个数a1,a2,...an,依次求出相邻两数之和,将得到一个新数列.重复上述操作,最后结果将变成一个数.问这个数除 ...