第4.1.2章 WEB系统最佳实践页面实例 角色管理
2016-12-16 20:54
471 查看
大多数管理系统的权限设计都是基于基于角色的访问控制(RBAC),下方的效果图中功能涉及创建、编辑、删除角色,为角色授予权限以及为角色添加对应的用户。这里将这些功能放在一个页面,主要目的是为了增加用户体验。
这个页面看似并不复杂,但是内涵的操作逻辑还是挺费脑子。
表格我采用的是bootstrap-table,
树控件我采用的是ztree
1 角色列表初始化时,默认选中第一条记录的权限和用户。
初始化角色表,加载完后触发事件,代码如下。
2 选中角色时,显示当前选中角色对应的权限和用户清单
这里用到了bootstrap table的行点击事件
3 初始化用户清单做了什么
下面的代码比较常规,没什么可讲的。
4 刷新用户清单是如何做到的
5 初始化权限清单做了哪些
从下面可以看出,我这里先加载了所有的权限清单,加载完毕后,在向后台请求哪些是角色所有的。
下面代码加载已授权的权限,主要是ztree中相关api的使用。
6 那么树又是如何刷新的
7 权限是如何保存的
下面的大概的逻辑是,从权限树中获取打上勾的节点,从节点中获取id,然后将id清单提交到后台. js中用到了Ladda,以及layer
下面的代码是controller的逻辑,从@RequestBody中获取权限清单
下方是保存权限的核心业务逻辑,思想是先删后加,简单粗暴。
这个页面看似并不复杂,但是内涵的操作逻辑还是挺费脑子。
表格我采用的是bootstrap-table,
树控件我采用的是ztree
1 角色列表初始化时,默认选中第一条记录的权限和用户。
初始化角色表,加载完后触发事件,代码如下。
onLoadSuccess:function(data){ console.log(data); if ($.isArray(data.rows) && data.total>0){ // 默认选中第一条角色记录 var firstRow = data.rows[0]; curRole = firstRow.id; // 设置当前选择的角色标识 $('#txtRole').text(firstRow.name); // 表格选中 mainGrid.bootstrapTable('check', 0); } else{ // 默认角色为超级管理员 curRole = constant.admin; } if (userGrid == undefined){ // 当角色对应权限清单没有渲染时,初始化用户grid console.log('开始执行 initUserGrid'); initUserGrid(); // 初始化权限树 initPermissionTree(); } else{ // 当角色表刷新时,触发用户清单和权限树的刷新。 refreshUser(); refreshPermission(); } }
2 选中角色时,显示当前选中角色对应的权限和用户清单
这里用到了bootstrap table的行点击事件
onClickRow:function(item){ curRole = item.id;// 当前选中的角色 // 设置当前角色标识 $('#txtRole').text(item.name); // 刷新用户清单 refreshUser(); // 刷新角色清单 refreshPermission(); }
3 初始化用户清单做了什么
下面的代码比较常规,没什么可讲的。
/** * 初始化用户清单 */ function initUserGrid(){ userGrid = $('#user-grid').bootstrapTable({ sidePagination:'server',cache:false,method:'post',url:ctx+'/ucsUser/selectByRole',queryParams:queryUserParams,contentType: 'application/x-www-form-urlencoded', uniqueId:'id',sortName:'username',height:375, pagination:true,pageNumber:1,pageSize:20,pageList:[20,30,50],search:false, singleSelect:false,striped:true,clickToSelect:true, columns:[ {checkbox:true}, {field:'username',title:'用户帐号',sortable:true,width:100,align: 'center',valign: 'middle'}, {field:'name',title:'用户实名',sortable:true,width:100,align: 'center',valign: 'middle',hide:true}, {field:'email',title:'email',sortable:true,width:100,align: 'center',valign: 'middle'}, {field:'phone',title:'联系电话',sortable:true,width:100,align: 'center',valign: 'middle'} ] }); } /** * 查询条件 */ function queryUserParams(params){ var solidParams = { page:params.pageNumber, rows:params.limit, sort:params.sort, order:params.order }; console.log('curRole is: ' + curRole); // 增加当前角色的查询条件 solidParams = $.extend(solidParams,{roleId:curRole}); return solidParams; }
4 刷新用户清单是如何做到的
/** * 刷新用户 */ function refreshUser(){ userGrid.bootstrapTable('refresh',{url:ctx+'/ucsUser/selectByRole'}); }
5 初始化权限清单做了哪些
从下面可以看出,我这里先加载了所有的权限清单,加载完毕后,在向后台请求哪些是角色所有的。
function initPermissionTree(){ $.fn.zTree.init($('#permissionTree'),{ view:{selectedMulti:false},check:{enable:true,chkStyle: 'checkbox',radioType:'level'}, data:{simpleData:{enable:true,pIdKey:'pid'}},edit:{enable:false}, async:{enable:true,dataType:'json',url:ctx+'/ucsPermission/findList'}, callback:{ onAsyncSuccess:function(){ // 异步加载权限 loadPermissions(); } } }) }
下面代码加载已授权的权限,主要是ztree中相关api的使用。
function loadPermissions(){ var permissionTree = $.fn.zTree.getZTreeObj('permissionTree'); $.ajax({ async:false, type:'get', url:ctx+'/ucsPermission/selectByRole', data:{roleId:curRole}, success: function(data){ if(typeof data=='object'){ // 加载权限并选中 $.each(data,function(index,value){ var node = permissionTree.getNodeByParam('id',value.id); node.checked = true; permissionTree.updateNode(node); }) }else{ layer.msg(data); } } }); }
6 那么树又是如何刷新的
function refreshPermission(){ // 获取权限树对象 var permissionTree = $.fn.zTree.getZTreeObj('permissionTree'); // 调用异步加载树节点方法 permissionTree.reAsyncChildNodes(null, "refresh"); }
7 权限是如何保存的
下面的大概的逻辑是,从权限树中获取打上勾的节点,从节点中获取id,然后将id清单提交到后台. js中用到了Ladda,以及layer
function savePermission(){ var permissionTree = $.fn.zTree.getZTreeObj('permissionTree'); var nodes = permissionTree.getCheckedNodes(true); if ($.isArray(nodes) && nodes.length>0){ var layero = layer.confirm('您确定要保存修改的权限吗?',{title:'系统提示',btn:['确定','取消'],anim:1,icon:3},function(){ layer.close(layero); var process= Ladda.create($('#btnSetPermission')[0]); process.start(); var newPermissionList=[]; $.each(nodes,function(index,node){ newPermissionList.push(node.id); }) $.ajax({ url:ctx+'/ucsRolePermission/savePermissions/'+curRole, type:'post', data:JSON.stringify(newPermissionList), contentType:'application/json;charset=utf-8', success:function(resp){ if (resp.success){ layer.msg(resp.msg); } else{ layer.msg(resp.msg); } } }).always(function(){process.stop();}); }) } else{ layer.msg('请选择需要修改的权限',{title:'系统提示',icon:0 ,time:1000}); return false; } }
下面的代码是controller的逻辑,从@RequestBody中获取权限清单
@RequestMapping(value="savePermissions/{roleId}", method = RequestMethod.POST) @ResponseBody public BaseResponse savePermissions(@PathVariable("roleId") String roleId, @RequestBody List<String> newPermissions){ boolean flag = ucsRolePermissionService.updatePermissions(roleId, newPermissions); BaseResponse baseResponse = flag ? new BaseResponse(true, "设置成功") : new BaseResponse(false, "设置失败"); return baseResponse; }
下方是保存权限的核心业务逻辑,思想是先删后加,简单粗暴。
@Transactional(readOnly = false) @Override public boolean updatePermissions(String roleId, List<String> newPermissions) { // 旧权限 List<UcsPermission> ucsPermissions = ucsPermissionService.selectByRole(roleId); List<String> oldPermissions = null; if (!CheckEmptyUtil.isEmpty(ucsPermissions)){ oldPermissions = new ArrayList<String>(); for (UcsPermission uPermission:ucsPermissions){ oldPermissions.add(uPermission.getId()); } // 删除旧权限 deleteOldPermissions(newPermissions, oldPermissions); // 插入新权限 return insertNewPermissions(newPermissions, oldPermissions, roleId); } else{ return insertNewPermissions(newPermissions, oldPermissions, roleId); } } // 删除旧权限 @Transactional(readOnly = false) private void deleteOldPermissions(List<String> newPermissions,List<String> oldPermissions ){ for (String oldPermission:oldPermissions){ if (!newPermissions.contains(oldPermission)){ removeByPermission(oldPermission); } } } // 插入新权限 @Transactional(readOnly = false) private boolean insertNewPermissions(List<String> newPermissions,List<String> oldPermissions, String roleId){ UcsRolePermission ucsRolePermission = null; boolean flag = false; if (!CheckEmptyUtil.isEmpty(oldPermissions)){ for (String newPermission:newPermissions){ if (!oldPermissions.contains(newPermission)){ ucsRolePermission = new UcsRolePermission(); ucsRolePermission.setRoleId(roleId); ucsRolePermission.setPermissionId(newPermission); flag = insertSelective(ucsRolePermission); } } } else{ for (String newPermission:newPermissions){ ucsRolePermission = new UcsRolePermission(); ucsRolePermission.setRoleId(roleId); ucsRolePermission.setPermissionId(newPermission); flag = insertSelective(ucsRolePermission); } } return flag; }
相关文章推荐
- 第4.1.1章 WEB系统最佳实践页面实例-bootstrap登录页面
- 安全管理最佳实践系列:给ECS实例配置RAM角色
- 轻量级单点登录系统最佳实践(九)——5.4. 人力资源管理系统演示SSOLab. APP1. WebApp
- [Web] 被遗忘的知识点 - JavaScript加载管理最佳实践
- 第2.3章 WEB系统最佳实践属性配置
- 第2.1.2章 WEB系统最佳实践Spring文件配置之spring-common.xml
- 第2.3.3章 WEB系统最佳实践属性配置之shiro.properties
- 轻量级单点登录系统最佳实践(十)——5.5. 财务管理系统演示SSOLab. APP2. WebApp
- JSP 最佳实践: 使用JSTL来更新JSP页面 ------标准化JSTL标记为您的Web页面带来更多的功能
- 第2.3.1章 WEB系统最佳实践属性配置之ehcache.xml
- 第2.1.4章 WEB系统最佳实践Spring文件配置之spring-hessian-server.xml
- 第3.1.2章 WEB系统最佳实践 js控件之requirejs的使用
- calamari:基于web页面的ceph系统监控管理工具安装
- 第2.1.7章 WEB系统最佳实践Spring文件配置之spring-shiro.xml
- 轻量级单点登录系统最佳实践(四)——第3章 Web-SSO通常实现方式
- jsp生成web静态页面的最佳实践
- Web前端开发最佳实践(13):前端页面卡顿?可能是DOM操作惹的祸,你需要优化代码
- 用户角色权限管理系统-----java web 脚手架搭建(一)
- 第2.1.8章 WEB系统最佳实践Spring文件配置之spring-email.xml
- 第2.3.2章 WEB系统最佳实践属性配置之jdbc.properties