项目实践——Easyui中tree的使用

 树状结构在项目中必不可少,这篇博客来学习一下Easyui的tree。

前台JSP

<span style="font-size:14px;"><body>
	<div id="leftDiv" class="easyui-layout" fit="true">
	<div region="center" border="false" border="false">
		<div id="grid"></div>
	</div>
	<div id="rightDiv" region="east" split="true" style="width:330px;">
	<div style="padding-top: 5px;padding-bottom: 5px;position: relative;background-color: #F4F4F4;">
	<a href="#" class="easyui-linkbutton" data-options="iconCls:'icon-add',plain:true" onclick="saveRoleNodes()">确定</a>
	<a href="#" class="easyui-linkbutton" data-options="iconCls:'icon-ok',plain:true" onclick="selectAll()">全选</a>
	<a href="#" class="easyui-linkbutton" data-options="iconCls:'icon-no',plain:true" onclick="unSelectAll()">全不选</a>
	</div>
	<span style="white-space:pre">	</span><div id="tree"></div>
		</div>
	</div>
</body>
<script type="text/javascript">

onload = function(){
	$('#grid').datagrid({
		url:getRootPath()+"/sysrole/roleList.do;"+$.now(),
		columns:[[
		   {field:'id',title:'角色编号',width:100,align:'center',hidden:true},
	           {field:'crolename',title:'角色名称',width:300,align:'center'},
	           {field:'biskeep',title:'是否禁用',width:200,align:'center',
	        	   formatter: function(value,row,index){
	   				if (value=="N"){
	   					return "否";
	   				} else {
	   					return "是";
	   				}
	   			}

	           },
	           {field:'cdiscription',title:'备注',width:300,align:'center'}

	    ]],
	    singleSelect:true

	});

}

$('#tree').tree({
	url : getRootPath()+'/sysnode/nodeList.do',
	lines:true,
	checkbox:"true",
	loadFilter : function(rows) {
		return convert(rows);
	}

});

function convert(rows){
	function exists(rows, parentId){
		for(var i=0; i<rows.length; i++){
			if (rows[i].id == parentId) return true;
		}
		return false;
	}

	var nodes = [];
	for(var i=0; i<rows.length; i++){
		var row = rows[i];
		if (!exists(rows, row.parentId)){
			nodes.push({
				id:row.id,
				text:row.name
			});
		}
	}

	var toDo = [];
	for(var i=0; i<nodes.length; i++){
		toDo.push(nodes[i]);
	}
	while(toDo.length){
		var node = toDo.shift();
		for(var i=0; i<rows.length; i++){
			var row = rows[i];
			if (row.parentId == node.id){
				var child = {id:row.id,text:row.name};
				if (node.children){
					node.children.push(child);
				} else {
					node.children = [child];
				}
				toDo.push(child);
			}
		}
	}
	return nodes;
}

$('#grid').datagrid({
	onClickRow: function(index,field,value){
		$.ajax({
			type: "POST",
			async: false,
			url: getRootPath()+"/sysrole2node/getNodeByRoleId.do",
			data:{
				sysRoleId: field.id
			} ,
			dataType: "json",
			success: function(data){
				 var arrs=data;
				 uncheckALL();
				 nodeids=[];
				 if(arrs.length>0){
					 for(var i=0;i<arrs.length;i++){
						//根据节点Id获取节点
						var node = $('#tree').tree('find', arrs[i].nodeid);
						var childrens= $('#tree').tree('getChildren', node.target);
					    if(childrens.length==0){
					    	 $('#tree').tree('check', node.target);
					    }
					    nodeids.push(arrs[i].id);
					 }
				 }

			}
		});

	}
});

//全选/反选
function checkALL(){

	 var roots = $('#tree').tree('getRoots');
	  for(var i=0;i<roots.length;i++){
		  var node=$('#tree').tree('find',roots[i].id);
		  $('#tree').tree('check', node.target);
	  }
}
function uncheckALL(){

	 var roots = $('#tree').tree('getRoots');
	  for(var i=0;i<roots.length;i++){
		  var node=$('#tree').tree('find',roots[i].id);
		  $('#tree').tree('uncheck', node.target);
	  }
}

//保存角色对应的节点信息
function saveRoleNodes(){
	if($("#grid").datagrid("getSelected")==null||$("#grid").datagrid("getSelected")==""){
		alert("请先选中一条角色记录!");
		return;
	}

	var sysRoleNodeList=[];

	var selectedSysRole = $("#grid").datagrid("getSelected");
	var selectedSysNode = $('#tree').tree("getChecked");	

	var sysRoleId=selectedSysRole.id;
	for(var i=0;i<selectedSysNode.length;i++)
	{

		SysRole2node=new Object();
		SysRole2node.nodeid=selectedSysNode[i].id;
		SysRole2node.roleid=sysRoleId;
		sysRoleNodeList.push(SysRole2node);
	}
	var sysRoleNodeString=JSON.stringify(sysRoleNodeList);
	$.ajax({
		type: "POST",
		url: "http://localhost:8080/buildPrice/sysrole2node/saveRoleNode.do",
		data: {
			sysRoleNodeString: sysRoleNodeString,
			sysRoleId:sysRoleId
		},
		dataType: "json",
		success: function(data){
			alert(data.message);

		}
	});

}
</script></span><span style="font-size:18px;">
</span>

后台Controller

<span style="font-size:18px;">	</span><span style="font-size:14px;">@Autowired
	private SysRole2NodeService service;

	// 张磊磊---------保存角色菜单对应信息---------begin

	@RequestMapping("/saveRoleNode.do")
	@ResponseBody
	@Override
	@SuppressWarnings("all")
	public Object saveRoleNode(HttpServletRequest request) {
		String sysRoleNodeString = CommonUtil.toNull(request.getParameter("sysRoleNodeString"));
		String sysRoleId = CommonUtil.toNull(request.getParameter("sysRoleId"));

		try {
			JSONArray jsonArray = JSONArray.fromObject(sysRoleNodeString);
			List<SysRole2node> role2nodelist = (List<SysRole2node>) JSONArray.toCollection(jsonArray, SysRole2node.class);
			// 1、在SysRole2Node表中清空该RoleId为sysRoleId的所有记录
			service.deleteR2NByRoleid(sysRoleId);
			// 2、将实体集合添加到SysRole2Node表中
			service.saveEntities(role2nodelist);
			return createSuccessMessage("操作成功").toString();
		} catch (Exception e) {
			e.printStackTrace();
			return createErrorMessage(e.getMessage()).toString();
		}
	}

	// 张磊磊---------保存角色菜单对应信息---------end

	// 张磊磊---------根据角色Id查询对应的node集合---------start
	@Override
	@RequestMapping("getNodeByRoleId.do")
	@ResponseBody
	public String getNodeByRoleId(HttpServletRequest httpServletRequest) {
		String result = "";
		try {
			String sysRoleId = CommonUtil.toNull(httpServletRequest.getParameter("sysRoleId"));
			List<SysRole2node> sysRole2nodes = service.getNodeByRoleId(sysRoleId);
			result = JSONArray.fromObject(sysRole2nodes).toString();
		} catch (Exception e) {
			e.printStackTrace();
			result=createErrorMessage(e.getMessage()).toString();
		}
		return result;
	}
	// 张磊磊---------根据角色Id查询对应的node集合---------end</span><span style="font-size:18px;">
</span>

HQL查询结构

<span style="font-size:14px;">public List<Object> nodeLists(){
<span style="white-space:pre">	</span>String hql="select new map(sysnode.id as id, sysnode.parentid as parentId,sysnode.cnodetext as name,sysnode.cnodecode)from SysNode sysnode";
<span style="white-space:pre">	</span>List<Object> nodeList=basedao.queryByHQL(hql, null, null);
<span style="white-space:pre">	</span>return nodeList;
}</span>

  备注:因为这里采用简答格式的Json数据(Easyui的树需要个一种格式),所以这里用HQL进行查询!

  查出来的格式,如下:

[
{"id":1,"parendId":0,"name":"系统管理"},
{"id":2,"parentId":1,"name":"用户管理"},
{"id":3,"parentId":1,"name":"菜单管理"}
]

  这种格式,和ztree的那种简单Json的树没什么区别,都是子节点Id+父节点Id+子节点名称

时间: 2024-12-24 22:40:26

项目实践——Easyui中tree的使用的相关文章

做权限树时 使用EasyUI中Tree

符合EasyUI中Tree的Json格式,我们先看一下,格式是如何的 <span style="font-size:18px;">[{ "id":1, "text":"My Documents", "children":[{ "id":22, "text":"Photos", "state":"closed

递归实现EasyUI中Tree的Json格式

最近在做学校的基础系统的时候前台需要树形的组织结构,由于前台的整体框架都用的是EasyUI,所以只能采用EasyUi中Tree的格式,可是麻烦的是,需要符合EasyUI中Tree的Json格式,我们先看一下,格式是如何的呢? <span style="font-size:18px;">[{ "id":1, "text":"My Documents", "children":[{ "id

easyui中tree型控件不正常显示的处理方法

我在使用easyui中的tree控件时,出现不正常显示的现象,比如li中不能使用自定义的图标.父级展开或关闭时,其子级仍然显现并出现重叠等.找了很多资料,都没解决这个问题,后来逐个对照官方的源码,才发现是easyui.css和icon.css的引用顺序引起的. 正确的引用顺序是先引用easyui.css,然后引用icon.css. 不知这是否是easyui的Bug?

Easyui中tree组件实现搜索定位功能及展开节点定位

这几天遇到个input + tree  实现搜索功能的需求,在这里贴出来供大家参考下,如果你有更好的实现效果希望不腻赐教! 首先给大家看看效果     小二 上图  : 需要的部件知识: easyui API 方法: select       target        选择一个节点,'target'参数表示节点的DOM对象. expand    target         展开一个节点,'target'参数表示节点的DOM对象.在节点关闭或没有子节点的时候,节点ID的值(名为'id'的参数)

市委组织部考核项目——利用EasyUi中可编辑的DataGrid控件对多行数据进行编辑并提交

http://blog.csdn.net/cjr15233661143/article/details/19041165 市委组织部考核项目中需要录入原始数据,拿开发区的数据录入举例说明,见下图,需要给 查询出的单位录入定量成绩和定性成绩,开始使用弹出框的形式逐条进行编辑,后来考虑如果每一条都需要弹出一次弹出框,每一条都需要一次保存的话,用户可能 会不方便,后来发现了easyui中有这么一个好东西,用在这里非常合适——Cell Editing in DataGrid 查询出的结果图 为了控制提交

项目实践——Easyui解析器

介绍: 解析器可是easyui一个重要基础插件,你之所以可以通过简单class定义,在浏览器里面就能展现出一个布局或是面板.全是通过这个插件作为入口,他会获取所有在指定范围内所有定义为easyui组件的class定义,然后在根据后缀定义辨别需要把当前节点解析成为何种组件. 解析器有两种用法: $.parser.parse();不带任何参数.这种情况下默认是解析页面中所有定义为easyui组件的节点. $.parser.parse('#cc');  带一个jquery选择器.通过这种方式我们可以只

项目实践中Linux集群的总结和思考

前言:作为一名Linux/unix系统工程师.项目实施工程师,这几年一直在涉及到对外项目,经手过许多小中型网站的架构,F5.LVS及Nginx接触的都比较多,我想一种比较通俗易懂的语气跟大家说明下何谓负载均衡,何谓Linux集群,帮助大家走出这个误区,真正意义上来理解它们,具体项目施工案例请参考我在network.51cto.com上的同类文章.一.目前网站架构一般分成负载均衡层.web层和数据库层,我其实一般还会多加一层,即文件服务器层,因为现在随着网站的PV越来越多,文件服务器的压力也越来越

[PHP] 项目实践中使用的IOC容器思想

1.容器的意思就是一个全局变量,里面存了很多对象,如果要用到某个对象就从里面取,前提就是要先把对象放进去2.控制反转就是把自己的控制权交给别人3.这两个结合就是,把自己的控制权交给别人并且创建的对象放进一个全局变量里4.好处就是可以灵活的修改一个对象的属性,而不需要去修改类本身的代码 项目实践:1.Application对象的resources属性数组就是那个容器2.getResource方法就是控制生成对象的方法,生成一个对象的控制权交给了Application3.这里先简化的规定下,自定义的

Hangfire项目实践

Hangfire项目实践分享 Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(Delayed jobs) 定时任务执行(Recurring jobs) 延续性任务执行(Continuations) 与quartz.net对比 Hangfire扩展 Hangfire Dashborad日志查看 Hangfire Dashborad授权 IOC容器之Au