权限分配-角色分配功能
    ①概要设计-建表
    image.png
    ②角色列表页增加分配功能的按钮
    a)点击分配按钮,传递rid和rname

    1. <button type="button" class="layui-btn layui-btn-normal layui-btn-sm" onclick="toSetFun('{{d.rid}}','{{d.rname}}')">
    2. <i class="layui-icon">&#xe716;</i>分配功能</button>

    b)jQuery-AJAX请求模板页

    1. //给角色分配功能 语雀5.1
    2. function toSetFun(rid,rname) {
    3. //弹出一个窗口(弹出层)
    4. layui.use(['layer'],function() {
    5. var layer = layui.layer;
    6. var $=layui.$;
    7. $.ajax({
    8. type:'get',
    9. url:'setFuns.jsp',
    10. data:{rid:rid,rname:rname},//自动拼装
    11. synch:true,//设置异步的ajax请求还是同步的
    12. success:function (responseText) {
    13. layer.open({
    14. type:1,
    15. area:[600,500],
    16. title:'分配功能',
    17. content:responseText, //需要弹出层展示的网页模板内容,请求
    18. btn:['保存','取消'],
    19. yes:function () {
    20. //点击保存触发函数
    21. }
    22. });
    23. }
    24. });
    25. });
    26. }

    c)将模板页展示layer弹出层
    d)上部展示rid和rname
    e)下部treetable展示功能列表信息

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    3. <%--设计分配功能的页面 语雀5.1--%>
    4. <html>
    5. <head>
    6. <link rel="stylesheet" type="text/css" href="layui/css/layui.css"/>
    7. <script src="./layui/layui.all.js"></script>
    8. </head>
    9. <body>
    10. <div class="layui-card">
    11. <div class="layui-card-header" style="padding: 10px;text-align: center">
    12. 角色编号:<input class="layui-input layui-input-inline" value="${param.rid}" id="rid2" name="rid2" style="width:150px;" />
    13. 角色名称:<input class="layui-input layui-input-inline" value="${param.rname}" id="rname2" name="rname2" style="width:150px;" />
    14. </div>
    15. <div class="layui-card-body">
    16. <%--数据展示的位置--%>
    17. <div id="funGrid"></div>
    18. </div>
    19. </div>
    20. <!-- layui-js代码实现 -->
    21. <script>
    22. var insTb ;
    23. layui.config({
    24. base: './treetable-lay/' //指定treetable组件所在的文件夹目录
    25. }).use(['treeTable'], function () { //use() 使用指定的layui组件
    26. var treeTable = layui.treeTable;
    27. insTb = treeTable.render({
    28. elem: '#funGrid',//指定渲染的位置
    29. url: 'funAll',//使用ajax技术展示请求表格中要展示的数据
    30. cols: [[//告诉组件按照什么样的表格形式去展示数据
    31. {type:'numbers',width:70}, // <td>
    32. {type:'checkbox',width:70}, // <td>
    33. {title: '功能名称', field: 'fname'}//<td>
    34. ]],
    35. tree:{//设置查询数据之间的子父关系
    36. iconIndex: 2,//指定展开合并图标出现在哪一列
    37. idName:'fid',//按照id和pid的关系实现子父级别
    38. pidName:'pid',
    39. isPidData:true,//表示按照id和pid的关系实现子父级别
    40. },
    41. done:function () {
    42. }
    43. });
    44. });
    45. </script>
    46. </body>
    47. </html>

    ③分配功能,打开弹出层时除了要展示功能列表,还要默认选中上一次分配的功能

    方式一: 可以使用2个查询语句,分别查出所有的功能(以供选择),查出上一次已分配的功能
    方式二: 使用1个联合查询语句,查询出所有的功能额外还配有选中和未选中的状态

    treetable组件复选框默认选中有2种方式
    方式一: 正常加载所有的功能信息,加载完毕,利用treetable的一个函数,选中指定的复选框
    insTb.setChecked([‘1’,’2’]);
    * 扩展: jquery.ajax 增加dataType:’json’ 将响应的json格式字符串自动json反序列化
    * 注意: 关于模板网页引用问题,编码是在2个文件中编写,但执行的时候2个文件内容会合并在一起

    1. done:function () {
    2. //当treetable表格数据加载完毕时调用的函数
    3. //数据库查询当前角色上一次分配的功能编号
    4. //需要js代码发请求 location.href , window.open() , ajax
    5. $.ajax({
    6. type:'get',
    7. url:'findFidsByRole',
    8. data:{rid:$("#rid2").val()},
    9. synch:true,
    10. success:function (responseText){
    11. insTb.setChecked(responseText);
    12. //JSON.parse(responseText);
    13. },
    14. dataType:'json'//告诉jQuery,将响应回来的字符串json反序列化
    15. });
    16. }

    RoleController

    1. @RequestMapping("/findFidsByRole")
    2. @ResponseBody
    3. public List<Integer> findFidsByRole(@RequestParam("rid") int rid){//语雀5.1
    4. return roleService.findFidsByRole(rid);
    5. }

    RoleService

    1. //语雀5.1
    2. public List<Integer> findFidsByRole(int rid){
    3. return roleDao.findFidsByRole(rid);
    4. }

    RoleDao

    1. @Select("select fid from t_role_fun where rid = #{rid}")
    2. public List<Integer> findFidsByRole(int rid);//语雀5.1

    方式二: 加载功能信息时就自动勾选了,要求查询结果中,每条记录都增加一个新的字段 LAY_CHECKED:true/false
    * 建议使用Map装载查询结果

    ④保存,将角色id和选中的一堆fid存入关系表中
    扩展:treetable提供了一个方法 insTb.checkStatus(); 获取选中数据
    role.jsp

    1. yes:function () {
    2. //点击保存触发函数
    3. //发送请求,传递rid,fids
    4. var checkboxs=insTb.checkStatus();//获取所有被选中的复选框
    5. var fids='';
    6. for(var i=0;i<checkboxs.length;i++){
    7. fids+=checkboxs[i].fid+',';
    8. }
    9. fids=fids.substring(0,fids.length-1);
    10. $.ajax({
    11. type:'post',
    12. url:'setF',
    13. data:{rid:rid,fids:fids},
    14. synch:true,
    15. success:function(respText){
    16. layer.alert('分配成功',function(){
    17. layer.closeAll();
    18. });
    19. }
    20. });
    21. }

    RoleController

    1. @RequestMapping("/setF")
    2. public void setFuns(@RequestParam("rid") int rid,@RequestParam("fids") String fids){//语雀5.1
    3. System.out.println("setFuns123");
    4. roleService.setFuns(rid, fids);
    5. }

    RoleService

    1. //语雀5.1
    2. public void setFuns(int rid, String fids) {
    3. funDao.removeRelationship(rid);
    4. if (fids != null && !"".equals(fids)) {
    5. Map<String, Integer> param = new HashMap<>();
    6. param.put("rid", rid);
    7. String[] fid = fids.split(",");
    8. for (String f : fid) {
    9. param.put("fid", Integer.parseInt(f));
    10. funDao.addRelationship(param);
    11. }
    12. }
    13. }

    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