权限分配-角色分配功能
①概要设计-建表
②角色列表页增加分配功能的按钮
a)点击分配按钮,传递rid和rname
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" onclick="toSetFun('{{d.rid}}','{{d.rname}}')"><i class="layui-icon"></i>分配功能</button>
b)jQuery-AJAX请求模板页
//给角色分配功能 语雀5.1function toSetFun(rid,rname) {//弹出一个窗口(弹出层)layui.use(['layer'],function() {var layer = layui.layer;var $=layui.$;$.ajax({type:'get',url:'setFuns.jsp',data:{rid:rid,rname:rname},//自动拼装synch:true,//设置异步的ajax请求还是同步的success:function (responseText) {layer.open({type:1,area:[600,500],title:'分配功能',content:responseText, //需要弹出层展示的网页模板内容,请求btn:['保存','取消'],yes:function () {//点击保存触发函数}});}});});}
c)将模板页展示layer弹出层
d)上部展示rid和rname
e)下部treetable展示功能列表信息
<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%--设计分配功能的页面 语雀5.1--%><html><head><link rel="stylesheet" type="text/css" href="layui/css/layui.css"/><script src="./layui/layui.all.js"></script></head><body><div class="layui-card"><div class="layui-card-header" style="padding: 10px;text-align: center">角色编号:<input class="layui-input layui-input-inline" value="${param.rid}" id="rid2" name="rid2" style="width:150px;" />角色名称:<input class="layui-input layui-input-inline" value="${param.rname}" id="rname2" name="rname2" style="width:150px;" /></div><div class="layui-card-body"><%--数据展示的位置--%><div id="funGrid"></div></div></div><!-- layui-js代码实现 --><script>var insTb ;layui.config({base: './treetable-lay/' //指定treetable组件所在的文件夹目录}).use(['treeTable'], function () { //use() 使用指定的layui组件var treeTable = layui.treeTable;insTb = treeTable.render({elem: '#funGrid',//指定渲染的位置url: 'funAll',//使用ajax技术展示请求表格中要展示的数据cols: [[//告诉组件按照什么样的表格形式去展示数据{type:'numbers',width:70}, // <td>{type:'checkbox',width:70}, // <td>{title: '功能名称', field: 'fname'}//<td>]],tree:{//设置查询数据之间的子父关系iconIndex: 2,//指定展开合并图标出现在哪一列idName:'fid',//按照id和pid的关系实现子父级别pidName:'pid',isPidData:true,//表示按照id和pid的关系实现子父级别},done:function () {}});});</script></body></html>
③分配功能,打开弹出层时除了要展示功能列表,还要默认选中上一次分配的功能
方式一: 可以使用2个查询语句,分别查出所有的功能(以供选择),查出上一次已分配的功能
方式二: 使用1个联合查询语句,查询出所有的功能额外还配有选中和未选中的状态
treetable组件复选框默认选中有2种方式
方式一: 正常加载所有的功能信息,加载完毕,利用treetable的一个函数,选中指定的复选框
insTb.setChecked([‘1’,’2’]);
* 扩展: jquery.ajax 增加dataType:’json’ 将响应的json格式字符串自动json反序列化
* 注意: 关于模板网页引用问题,编码是在2个文件中编写,但执行的时候2个文件内容会合并在一起
done:function () {//当treetable表格数据加载完毕时调用的函数//数据库查询当前角色上一次分配的功能编号//需要js代码发请求 location.href , window.open() , ajax$.ajax({type:'get',url:'findFidsByRole',data:{rid:$("#rid2").val()},synch:true,success:function (responseText){insTb.setChecked(responseText);//JSON.parse(responseText);},dataType:'json'//告诉jQuery,将响应回来的字符串json反序列化});}
RoleController
@RequestMapping("/findFidsByRole")@ResponseBodypublic List<Integer> findFidsByRole(@RequestParam("rid") int rid){//语雀5.1return roleService.findFidsByRole(rid);}
RoleService
//语雀5.1public List<Integer> findFidsByRole(int rid){return roleDao.findFidsByRole(rid);}
RoleDao
@Select("select fid from t_role_fun where rid = #{rid}")public List<Integer> findFidsByRole(int rid);//语雀5.1
方式二: 加载功能信息时就自动勾选了,要求查询结果中,每条记录都增加一个新的字段 LAY_CHECKED:true/false
* 建议使用Map装载查询结果
④保存,将角色id和选中的一堆fid存入关系表中
扩展:treetable提供了一个方法 insTb.checkStatus(); 获取选中数据
role.jsp
yes:function () {//点击保存触发函数//发送请求,传递rid,fidsvar checkboxs=insTb.checkStatus();//获取所有被选中的复选框var fids='';for(var i=0;i<checkboxs.length;i++){fids+=checkboxs[i].fid+',';}fids=fids.substring(0,fids.length-1);$.ajax({type:'post',url:'setF',data:{rid:rid,fids:fids},synch:true,success:function(respText){layer.alert('分配成功',function(){layer.closeAll();});}});}
RoleController
@RequestMapping("/setF")public void setFuns(@RequestParam("rid") int rid,@RequestParam("fids") String fids){//语雀5.1System.out.println("setFuns123");roleService.setFuns(rid, fids);}
RoleService
//语雀5.1public void setFuns(int rid, String fids) {funDao.removeRelationship(rid);if (fids != null && !"".equals(fids)) {Map<String, Integer> param = new HashMap<>();param.put("rid", rid);String[] fid = fids.split(",");for (String f : fid) {param.put("fid", Integer.parseInt(f));funDao.addRelationship(param);}}}
FunDao
@Delete("delete from t_role_fun where rid=#{rid}")
public void removeRelationship(int rid);//语雀5.1
@Insert("insert into t_role_fun values(#{rid},#{fid})")
public void addRelationship(Map<String,Integer> param);//语雀5.1
