仅支持回显以及选择,不支持在树中的编辑

搭建后台回显以及修改的模块

JSON数据封装

public class Msg {
private int code;
private String msg;
private Map<String,Object> extend=new HashMap<String,Object>();
//还有一些getset方法没显示出来
public static Msg success(){
Msg result = new Msg();
result.setCode(100);
result.setMsg("处理成功");
return result;
} public static Msg fail(){
Msg result = new Msg();
result.setCode(200);
result.setMsg("处理失败");
return result;
} public static Msg noPermission(){
Msg result = new Msg();
result.setCode(250);
result.setMsg("没有权限");
return result;
} public static Msg reject(){
Msg result = new Msg();
result.setCode(300);
result.setMsg("拒绝请求");
return result;
} }

Controller中的代码,RequiredPermission为自定义注解

   @ResponseBody
@RequiredPermission("树形分配:获得回显信息")
@RequestMapping("role/treePermission_echo")
public Msg treePermission_echo(@RequestParam("ID")Long ID) throws Exception{
//这里判断有无权限,具体原因请看其他文章
Throwable t = new Throwable();
boolean isHasPermission=PermissionUtil.hasPermission(this.getClass(),t.getStackTrace()[0].getMethodName());
if(!isHasPermission)
return Msg.noPermission().add("returnMsg","您没有权限【树形分配:获得回显信息】");
//从下一层获取ztree权限树数据
List<ZtreePermission> allZtreeMsg =
permissionService.getAllZtreeMsg(ID);
System.out.println();
return Msg.success().add("allZtreeMsg",allZtreeMsg);
} @ResponseBody
@RequiredPermission("树形分配:修改")
@RequestMapping("role/treePermission_alter")
public Msg treePermission_alter(@RequestParam("permissionListTree")List<String> permissionListTree
) throws Exception {
Throwable t = new Throwable();
boolean isHasPermission=PermissionUtil.hasPermission(this.getClass(),t.getStackTrace()[0].getMethodName());
if(!isHasPermission)
return Msg.noPermission().add("returnMsg","您没有权限【树形分配:修改】");
ArrayList<Long> permissionListID = new ArrayList<>();
Long ID=Long.valueOf(permissionListTree.get(0));
//判断是权限组还是权限,是权限则加入
for(String permissionID:permissionListTree){
if(permissionID.charAt(0)=='p'){
permissionListID.add(Long.valueOf(permissionID.substring(2,permissionID.length())));
}
}
//这里其实可以优化,我暂时采用了删除所有再更新的方法
roleToPermissionService.deleteById(ID);
for(Long id:permissionListID){
RoleToPermission roleToPermission=new RoleToPermission();
Role role = new Role();
role.setId(ID);
Permission permission=new Permission();
permission.setId(id);
roleToPermission.setRole(role);
roleToPermission.setPermission(permission);
roleToPermissionService.addItem(roleToPermission);
}
return Msg.success();
}

ztree树的构建

因为我需要的功能复杂度不高,所以ztree设定很简单

   var setting = {
check: {
enable: true
},
data: {
simpleData: {
enable: true
}
}
};
var zNodes ;
function setCheck() {
var zTree = $.fn.zTree.getZTreeObj("treeDemo"),
type = { "Y" : "ps", "N" : "ps" };
zTree.setting.check.chkboxType = type;
}
$(".treeBtn").each(function () {
$(this).click(function () {
ID = $(this).attr("name");
$.ajax({
url: "role/treePermission_echo",
//ID为你本次选择需要为哪个角色分配权限的角色ID
data: "ID=" + ID,
type: "POST",
success: function (result) {
if (result.code == 100) {
zNodes=result.extend.allZtreeMsg;
$.fn.zTree.init($("#treeDemo"), setting, zNodes);
setCheck();
} else if(result.code==250){
//弹出权限不足的窗口
$("#btn_closeTree").click();
show_errorWindows(result.extend.returnMsg);
}
}
});
});
});

看看最简单的checkbox权限树结构 
 
ztree非常方便,甚至不用我们自己写算法递归出树,因此只要将结构封装成一样的json丢给zNodes就可以了!

ztree对应的实体类

public class ZtreePermission {
String id;
String pId;
String name;
Boolean checked;
Boolean open; public ZtreePermission(){ } public ZtreePermission(Permission permission){
this.id="p."+permission.getId();
this.pId="g."+permission.getParentID();
this.name=permission.getName();
this.open=false;
this.checked=false;
} public ZtreePermission(Permission_Groud permission_groud){
this.id="g."+permission_groud.getId();
this.pId="g."+permission_groud.getParentID();
this.name=permission_groud.getName();
this.checked=null;
this.open=true;
}
}

值得注意的是如果你有两张表而且id重复的话,可以这样 id=”student.1” pid=”teacher.2”

回显部分代码

这里只获取了ID,如果需要其他数据可以查看API文档

 $("#btn_inputTree").click(function () {
var zTree = $.fn.zTree.getZTreeObj("treeDemo");
var nodes=zTree.getCheckedNodes(true);
permissionListTree = new Array();
//这里我把ID丟进了ID第一位,后台要注意!!
permissionListTree.push(ID);
for ( var j = 0; j < nodes.length; j++) {
permissionListTree.push(nodes[j].id);
}
$.ajax({
url: "role/treePermission_alter",
data: "permissionListTree="+permissionListTree,
type: "POST",
success: function (result) {
if(result.code ==100){
$("#btn_closeTree").click();
}else if(result.code==250){
$("#btn_closeTree").click();
//权限不足,显示窗口 show_errorWindows(result.extend.returnMsg);
} }
}); });

最后来看看最简单窗口代码

    <div class="modal fade" id="dtreeModal" tabindex="-1" role="dialog" aria-labelledby="preModalLabel">
<div class="modal-dialog">
<div class="modal-content">
<form role="form" action="" method="post">
<div class="modal-header">
<button data-dismiss="modal" class="close" type="button"><span
aria-hidden="true">×</span><span
class="sr-only">Close</span></button>
<h4 class="modal-title">树形分配</h4>
</div>
<div class="modal-body" >
<div>
<ul id="treeDemo" class="ztree"></ul>
</div>
</div>
<div class="modal-footer">
<button id="btn_closeTree" data-dismiss="modal" class="btn btn-default" type="button">
关闭
</button>
<button id="btn_inputTree" class="btn btn-primary" type="button">提交</button>
</div>
</form>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div>

完整项目地址
这是我第一个写的web项目,代码烂得飞起,仅供纪念,不做参考
带Shiro版:https://github.com/EnTaroAdunZ/ssm_rbac_shiro.git
不带Shiro版:https://github.com/EnTaroAdunZ/ssm_rbac.git
---------------------
版权声明:本文为CSDN博主「EnTaroAdunZ」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/EnTaroAdunZ/article/details/76112781

基于SSM的RBAC权限系统(1)-利用ajax,bootstrap,ztree完成权限树功能的更多相关文章

  1. 简洁经常使用权限系统的设计与实现(一):构造权限菜单树的N(N&gt;=4)种方法

    权限系统.Web开发常见标准子系统之中的一个.结合自己的一些思考和实践,从本篇開始权限系统的设计与实现之路. 近期,重构了项目的权限菜单构造过程,向前端返回json格式的权限树. 这一篇.仅仅是大致介 ...

  2. 简洁常用权限系统的设计与实现(一):构造权限菜单树的N(N>=4)种方法

    权限系统,Web开发常见标准子系统之一.结合自己的一些思考和实践,从本篇开始权限系统的设计与实现之路. 最近,重构了项目的权限菜单构造过程,向前端返回json格式的权限树. 这一篇,只是大致介绍下这个 ...

  3. 基于SSM的在线考试系统

    本系统功能非常完善,页面美观大方,技术新颖,选用主流数据库Mysql,表数量及结构适当,如果你需要做在线考试或者其它考试类系统,这个系统将非常有用. 其实,任何考试系统,无非试题不一样,所以如果你是做 ...

  4. 基于SSM开发在线考试系统 Java源码

    实现的关于在线考试的功能有:用户前台:用户注册登录.查看考试信息.进行考试.查看考试成绩.查看历史考试记录.回顾已考试卷.修改密码.修改个人信息等,后台管理功能(脚手架功能不在这里列出),科目专业管理 ...

  5. SSM框架,在Html界面利用ajax,json,jQuery实现省市区下拉框联动

    1.先生成省市区表格 2.建立实体类 3.在html画出下拉框 <select id="province"> <option value="" ...

  6. 利用Ajax和Servlet实现输入框提示功能

    目的和效果:     输入框输入字符串x,匹配后台传入的数据str,如果str中的元素包含字符串x,则提示. 后台代码:                   String x = request.ge ...

  7. 十二、基于Django实现RBAC权限管理

    一.RBAC概述 RBAC(Role-Based Access Control,基于角色的访问控制),通过角色绑定权限,然后给用户划分角色. 从企业的角度来说,基本上是按照角色来划分职能.比如,CEO ...

  8. 权限系统(RBAC)的数据模型设计

    前言: RBAC是Role-Based Access Control的缩写, 它几乎成为权限系统的数据模型的选择标配. 之前写个两篇关于权限系统的文章, 主要涉及如何在应用中实现权限控制, 对权限系统 ...

  9. 基于SSM的租赁管理系统0.1_20161225_项目需求

    基于SSM的汽车租赁系统项目计划书 1.产品定位 本系统供提供租赁服务的企业内部使用,供企业员工进行线下操作. 2.需求分析 2.1 能为工作人员提供员工信息的管理功能,具有RBAC基于角色的权限管理 ...

随机推荐

  1. applicationContext.xml无错有红叉,Error occured processing XML 'Provider org.apache.xerces.parsers.解决方案

    applicationContext.xml无错有红叉,网上讲的取消xml验证的方法没用... 甚至我的myeclipse10连windows-->perferences-->myecli ...

  2. 在Python中操作文件之truncate()方法的使用教程

    在Python中操作文件之truncate()方法的使用教程 这篇文章主要介绍了在Python中操作文件之truncate()方法的使用教程,是Python入门学习中的基础知识,需要的朋友可以参考下 ...

  3. Flannel - 配置

    原文地址 flannel 从 ETCD 中读取配置. 默认情况下,flannel 从 /coreos.com/network/config 中读取配置,可以使用 --etcd-prefix 覆盖. 通 ...

  4. 腾讯开源微服务架构 Tars,高性能 RPC 开发框架

    腾讯微服务架构 Tars 于今日正式开源. Tars 取名于电影“星际穿越”中的机器人,是支持多语言的高性能 RPC 开发框架和配套一体化的服务治理平台,可以帮助企业或者用户以微服务的方式快速构建稳定 ...

  5. Recurrent Neural Network(3):LSTM Basics and 《Inside Out》

    下图是Naive RNN的Recurrent Unit示意图,可以看到,在每个时间点t,Recurrent Unit会输出一个隐藏状态ht,对ht加工提取后将产生t时刻的输出yt.而在下一个时间节点t ...

  6. Convolutional Neural Networks(1): Architecture

    Concolutional Neural Networks(CNN)同样使用三层结构,但结构上同Feedforward Neural Network有很大不同,其结构如下图: Input layer: ...

  7. 简单谈谈Netty的高性能之道

    传统RPC 调用性能差的三宗罪 网络传输方式问题:传统的RPC 框架或者基于RMI 等方式的远程服务(过程)调用采用了同步阻塞IO,当客户端的并发压力或者网络时延增大之后,同步阻塞IO 会由于频繁的w ...

  8. aspnet core in docker

    1 创建一个文件夹(app), 将项目发布后的文件放入该文件夹中 并且创建Dockerfile文件 2 打开Dockerfile文件,编辑一下内容 #基于 `microsoft/dotnet:-cor ...

  9. 移动端Web页面适配方案

    概念理解 viewport视口 visual viewport 可见视口,设备屏幕的宽度  windw.innerWidth/Height layout viewport 布局视口,DOM宽度 doc ...

  10. python学习三十八天常用内置函数分类汇总

    python给我们提供丰富的内置函数,不用去写函数体,直接调用就可以运行,很方便快速给我提供开发所需要的函数. 1,查内存地址 id() 变量的内存地址 id() 2,输入输出 input()  pr ...