shiro安全框架扩展教程--角色树控制展示(ztree框架)

简介:         对于系统来说,一个好的角色架构是灰常重要的,但是页面该怎么展示,以及修改配置权限更方便呢?我个人觉得应该是使用树形结构来展示我们的角色层叠更贴切,所以我花了一天的时候研究了...

        对于系统来说,一个好的角色架构是灰常重要的,但是页面该怎么展示,以及修改配置权限更方便呢?我个人觉得应该是使用树形结构来展示我们的角色层叠更贴切,

所以我花了一天的时候研究了下jquery的ztree是怎么样玩的(哈哈,因为个人比较愚钝,所以花的时间有点多)


下面先上点效果图



这样的做法基本可以管理简单的树形模式,下面我来帖些代码


<!DOCTYPE html>
<HTML>
<HEAD>
	<TITLE>角色控制面板</TITLE>
	<meta http-equiv="content-type" content="text/html; charset=UTF-8">
	<style type="text/css">
		.ztree li span.button.add {margin-left:2px; margin-right: -1px; background-position:-144px 0; vertical-align:top; *vertical-align:middle}
	</style>
	<link rel="stylesheet" href="/static/plugin/zTree_v3/css/zTreeStyle/zTreeStyle.css" type="text/css">
	<script type="text/javascript" src="/static/plugin/zTree_v3/js/jquery-1.4.4.min.js"></script>
	<script type="text/javascript" src="/static/plugin/zTree_v3/js/jquery.ztree.core-3.5.js"></script>
	<script type="text/javascript" src="/static/plugin/zTree_v3/js/jquery.ztree.excheck-3.5.js"></script>
	<script type="text/javascript" src="/static/plugin/zTree_v3/js/jquery.ztree.exedit-3.5.js"></script>
	<SCRIPT type="text/javascript">
		var setting = {
			view: {
				addHoverDom: addHoverDom,
				removeHoverDom: removeHoverDom,
				selectedMulti: false,
				showIcon: true
			},
			edit: {
				enable: true,
				editNameSelectAll: true,
				showRemoveBtn: showRemoveBtn,
				showRenameBtn: true
			},
			data: {
				simpleData: {
					enable: true
				}
			},
			callback: {
				beforeDrag: beforeDrag,
				beforeEditName: beforeEditName,
				beforeRemove: beforeRemove,
				beforeRename: beforeRename,
				onRemove: onRemove
			}
		};

		function beforeDrag(treeId, treeNodes) {
			return false;
		}
		
		function beforeEditName(treeId, treeNode) {
			var zTree = $.fn.zTree.getZTreeObj("treeDemo");
			zTree.selectNode(treeNode);
			if(confirm("是否进入简单编辑状态?")){
				return true;
			}else{
				$("#formRoleId").val(treeNode.id);
				$("#formRoleRsv").val(treeNode.rsv_);
				$("#formRoleName").val(treeNode.name);
				$("#formRoleContent").val(treeNode.content);
			}
			return false;
		}
		
		function beforeRemove(treeId, treeNode) {
			var zTree = $.fn.zTree.getZTreeObj("treeDemo");
			zTree.selectNode(treeNode);
			return confirm("确认删除 [" + treeNode.name + "]?");
		}
		
		function onRemove(e, treeId, treeNode) {
			$.post('/cms/authority/removeById.do', 'id='+treeNode.id+'&rsv_='+treeNode.rsv_, function(result){
				var json = toJson(result);
				if(!json.success){
					alert(json.message);
				}
			});
		}
		
		function beforeRename(treeId, treeNode, newName, isCancel) {
			if (newName.length == 0) {
				alert("内容不能为空.");
				var zTree = $.fn.zTree.getZTreeObj("treeDemo");
				setTimeout(function(){zTree.editName(treeNode)}, 10);
				return false;
			}
			if(treeNode.name == newName){
				return true;
			}
			$.post('/cms/authority/modify.do', 'id='+treeNode.id+'&rsv_='+treeNode.rsv_+'&name='+newName, function(result){
				var json = toJson(result);
				if(!json.success){
					alert(json.message);
					return false;
				}
			});
			return true;
		}
		
		function showRemoveBtn(treeId, treeNode) {
			return !treeNode.isParent;
		}
		
		function addHoverDom(treeId, treeNode) {
			var sObj = $("#" + treeNode.tId + "_span");
			if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return;
			var addStr = "<span class='button add' id='addBtn_" + treeNode.tId
				+ "' title='add' onfocus='this.blur();'></span>";
			sObj.after(addStr);
			var btn = $("#addBtn_"+treeNode.tId);
			if (btn) btn.bind("click", function(){
				var zTree = $.fn.zTree.getZTreeObj("treeDemo");
				var f = confirm("确定要添加新角色?");
				if(!f){
					return false;
				}
				$.post('/cms/authority/save.do', 'parent.id='+treeNode.id+'&name=新角色', function(result){
					var json = toJson(result);
					if(json.success){
						zTree.addNodes(treeNode, toJson(json.value));
					}else{
						alert(json.message);
					}
				});
				return false;
			});
		};
		
		function removeHoverDom(treeId, treeNode) {
			$("#addBtn_"+treeNode.tId).unbind().remove();
		};

		function toJson(obj){
			try{
				return eval('('+obj+')');
			}catch(e){
				return [{success:false,message:'请求返回数据异常!'}];
			}
		}
		
		$(document).ready(function(){
			$.post('/cms/authority/find4tree.do', '', function(result){
				$.fn.zTree.init($("#treeDemo"), setting, toJson(result));
			});
		});

		function submitForm(){
			$.post('/cms/authority/modify.do', $('#submitForm').serialize(), function(result){
				var json = toJson(result);
				if(json.success){
					var zTree = $.fn.zTree.getZTreeObj('treeDemo');
					var newNode = zTree.getNodeByParam("id", $('#formRoleId').val());
					newNode.name = $('#formRoleName').val();
					newNode.content = $('#formRoleContent').val();
					zTree.updateNode(newNode);
					resetForm();
				}
				alert(json.message);
			});
		}

		function resetForm(){
			$("#formRoleId").val('');
			$("#formRoleRsv").val('');
			$("#formRoleName").val('');
			$("#formRoleContent").val('');
		}
		
	</SCRIPT>
</HEAD>

<BODY>
<h2>角色控制面板</h2>
<div>
	<ul id="treeDemo" class="ztree"></ul>
</div>
<hr />
<div>
	<h3>修改明细</h3>
	<form action="#" id="submitForm" method="post">
	<input type="hidden" name="id" id="formRoleId" />
	<input type="hidden" id="formRolePId" />
	<input type="hidden" name="rsv_" id="formRoleRsv" />
	角色名称: <input type="text" name="name" id="formRoleName" /><br />
	角色内容: <input type="text" name="content" id="formRoleContent" /><br />
	<input type="button" value="submit" onclick="submitForm();" /> <input type="button" value="reset" onclick="resetForm();" />
	</form>
</div>
</BODY>
</HTML>

幸好ztree的api还是比较不错的,用起来挺顺手,除了add节点那个事件比较别扭,其他的还算可以,基本看了我上面代码应用的事件,基本的功能点都覆盖到了,一般的项目也就是用到哪几个功能而已,其他订制的需要自己研究,基本的新增修改流程就是addNodes,updateNode方法
目录
相关文章
|
8月前
|
前端开发 数据安全/隐私保护
若依框架---权限控制角色设计
若依框架---权限控制角色设计
1304 0
|
3月前
ext portal+dwr+spring实现个性主页面拖拉效果的核心代码
ext portal+dwr+spring实现个性主页面拖拉效果的核心代码
54 6
|
3月前
|
存储 JavaScript 前端开发
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
336 2
|
3月前
|
SQL 前端开发 测试技术
进行Web应用的设计需要遵循一定的步骤和原则
【10月更文挑战第3天】进行Web应用的设计需要遵循一定的步骤和原则
45 3
|
5月前
|
存储 关系型数据库 MySQL
PHP编程基础:构建你的第一个Web应用
【8月更文挑战第31天】 在数字时代的海洋里,每个人都可以成为自己命运的船长。本文将引领初学者启航,用PHP语言搭建起第一个属于自己的网站。我们将从浅入深,逐步探索PHP的世界,最终实现一个简单的个人博客系统。这不仅是一段代码的旅程,更是一次思维和技术的飞跃。
|
5月前
|
Apache 开发者 Java
Apache Wicket揭秘:如何巧妙利用模型与表单机制,实现Web应用高效开发?
【8月更文挑战第31天】本文深入探讨了Apache Wicket的模型与表单处理机制。Wicket作为一个组件化的Java Web框架,提供了多种模型实现,如CompoundPropertyModel等,充当组件与数据间的桥梁。文章通过示例介绍了模型创建及使用方法,并详细讲解了表单组件、提交处理及验证机制,帮助开发者更好地理解如何利用Wicket构建高效、易维护的Web应用程序。
69 0
|
8月前
|
SQL 前端开发 数据安全/隐私保护
若依框架---权限管理设计
若依框架---权限管理设计
592 0
|
设计模式 前端开发 JavaScript
采用「复合模式」构建可复用的 Web 前端组件
在现代 Web 前端开发中,构建可复用、可维护的组件是提高开发效率和代码质量的关键。为了实现这一目标,开发者们一直在寻找合适的设计模式和架构原则。其中,Compound Pattern(复合模式)被广泛应用于构建具有高度复用性和可扩展性的 Web 前端组件。本文将深入探讨 Compound Pattern 的概念、优点和缺点,适用场景,开源实现方案,以及其在知名项目中的应用
4887 1
采用「复合模式」构建可复用的 Web 前端组件

热门文章

最新文章

下一篇
开通oss服务