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方法
目录
相关文章
|
数据采集 运维 Java
有了 Dataphin v4.0,跨系统调度依赖再也不是难题
Dataphin v4.0引入了新的触发式节点,用于解决多数据平台间的调度问题。当上游系统(如Unix的crontab)完成数据采集后,可通过触发式节点通知Dataphin开始拉取数据,避免传统轮询方式的效率低和资源占用。触发式节点需满足Dataphin OpenAPI开通和网络连通条件,并通过SDK进行外部触发。示例展示了如何创建和使用触发式节点,以及使用Java SDK模拟触发请求。
672 0
|
文字识别
入职必会-开发环境搭建09-屏幕截图软件-PixPin下载和安装
PixPin是一款功能强大使用简单的截图/贴图工具,帮助你提高效率,包含截图、贴图、长截图、文字识别、标注、GIF动图等功能。
445 1
|
Java Linux iOS开发
Dragonwell JDK系统要求
Dragonwell JDK系统要求
|
关系型数据库 MySQL Java
MySQL中wait_timeout与interactive_timeout详解
MySQL中wait_timeout与interactive_timeout详解
2692 0
|
8天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
7天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
344 130
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
19天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1331 8
|
7天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
333 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)