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方法
目录
相关文章
|
5月前
|
前端开发 数据安全/隐私保护
若依框架---权限控制角色设计
若依框架---权限控制角色设计
1011 0
|
5月前
|
SQL XML Java
若依框架 --- 使用数据权限功能
若依框架 --- 使用数据权限功能
805 0
|
4天前
|
存储 JavaScript 前端开发
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
18 2
|
14天前
|
SQL 前端开发 测试技术
进行Web应用的设计需要遵循一定的步骤和原则
【10月更文挑战第3天】进行Web应用的设计需要遵循一定的步骤和原则
13 3
|
3月前
|
安全 Java 数据安全/隐私保护
SpringSecurity2 --- 通用权限管理模型
本文介绍了两种常见的权限管理模型:ACL和RBAC。ACL(访问控制列表)是一种传统的模型,允许将权限直接赋予用户或角色,形成多对多的关系。开发者可以独立实现ACL,Spring Security也提供了支持。相比之下,RBAC(基于角色的访问控制)更现代,不直接给用户分配权限,而是通过角色来间接控制。RBAC强调最小权限、职责分离和数据抽象,分为RBAC0、RBAC1、RBAC2和RBAC3四个级别,其中RBAC1引入角色继承,RBAC2和RBAC3则涉及职责分离的概念,包括静态和动态的角色互斥。
|
3月前
|
安全 Java 数据库
|
4月前
|
缓存 安全 Java
【权限管理系统】Spring security(三)---认证过程(原理解析,demo)
【权限管理系统】Spring security(三)---认证过程(原理解析,demo)
|
缓存 前端开发 NoSQL
vue-element-admin实战 | 第二篇: 最小改动接入后台实现根据权限动态加载菜单
vue-element-admin实战 | 第二篇: 最小改动接入后台实现根据权限动态加载菜单
|
5月前
|
SQL 前端开发 数据安全/隐私保护
若依框架---权限管理设计
若依框架---权限管理设计
478 0
|
存储 NoSQL 安全
权限管理-整合 SpringSecurity 代码过程 | 学习笔记
快速学习 权限管理-整合 SpringSecurity 代码过程
174 0
权限管理-整合 SpringSecurity 代码过程 | 学习笔记