egg(47,48)--rbac之角色和权限关联,角色授权

新增角色

clipboard.png

角色授权

clipboard.png

查找出所有的权限

clipboard.png

勾选上想要增加的权限(角色新增权限)

view

表单包括

  1. role_id(黄色框): 当前角色的id
  2. access_node(红色框): 把勾选上的权限id,都放到一个数组里
view/admin/role/auth.html

一级access_node

                                    <label>
                                        <input type="checkbox" class="module_cbo" <%if(list[i].checked){%> checked
                                        <%}%> value="<%=list[i]._id %>" name="access_node[]">&nbsp;&nbsp;
                                        <%=list[i].module_name %> <%=list[i]._id %>
                                    </label>

二级access_node

                                <td>
                                    <%for(var j=0;j<list[i].items.length;j++){%>
                                    &nbsp;&nbsp;
                                    <label>
                                        <input type="checkbox" class="action_cbo" <%if(list[i].items[j].checked){%>
                                        checked
                                        <%}%> value="<%=list[i].items[j]._id%>" name="access_node[]">
                                        &nbsp;&nbsp;
                                        <%=list[i].items[j].action_name%> <%=list[i].items[j]._id%></label>&nbsp;&nbsp;
                                    <%}%>
                                </td>

全部view

                    <form action="/admin/role/doAuth" method="POST">
                        <input type="hidden" name="_csrf" value="<%=csrf%>" />
                        <input type="hidden" name="role_id" value="<%=role_id%>" />
                        <table class="table table-bordered">
                            <%for(var i=0;i<list.length;i++){%>
                            <tr>
                                <td align="right" style="background: #D8E2FA; padding-right: 10px; width: 150px;">
                                    <label>
                                        <input type="checkbox" class="module_cbo" <%if(list[i].checked){%> checked
                                        <%}%> value="<%=list[i]._id %>" name="access_node[]">&nbsp;&nbsp;
                                        <%=list[i].module_name %> <%=list[i]._id %>
                                    </label>
                                </td>
                                <td>
                                    <%for(var j=0;j<list[i].items.length;j++){%>
                                    &nbsp;&nbsp;
                                    <label>
                                        <input type="checkbox" class="action_cbo" <%if(list[i].items[j].checked){%>
                                        checked
                                        <%}%> value="<%=list[i].items[j]._id%>" name="access_node[]">
                                        &nbsp;&nbsp;
                                        <%=list[i].items[j].action_name%> <%=list[i].items[j]._id%></label>&nbsp;&nbsp;
                                    <%}%>
                                </td>
                            </tr>
                            <%}%>
                        </table>
                        <button type="submit" class="btn btn-primary">提交</button>
                    </form>

clipboard.png

controller

controller/admin/role.js
  1. 删除当前角色下面的所有权限
  2. 把获取的权限和角色增加到数据库
  async doAuth() {
    /*
    1、删除当前角色下面的所有权限
    2、把获取的权限和角色增加到数据库
    */
    // console.log(this.ctx.request.body);
    var role_id = this.ctx.request.body.role_id;
    var access_node = this.ctx.request.body.access_node;
    // console.log(access_node)
    //1、删除当前角色下面的所有权限
    await this.ctx.model.RoleAccess.deleteMany({
      "role_id": role_id
    });

    //2、给role_access增加数据 把获取的权限和角色增加到数据库
    if (access_node) {
      for (var i = 0; i < access_node.length; i++) {
        var roleAccessData = new this.ctx.model.RoleAccess({
          role_id: role_id,
          access_id: access_node[i]
        })
        roleAccessData.save();
      }
    }
    await this.success('/admin/role/auth?id=' + role_id, "授权成功");
  }
  1. role_id(黄色框): 角色id
  2. access_id(右边红色框): 表单勾选上的权限id,要给角色增加的权限
  3. access_id(左边多个红色框): 查找role_access表,得到的role_access关联的数据

clipboard.png

查看授权的时候,把角色拥有的权限默认勾选上(角色查看权限)

view

view/admin/role/auth.html

左边是第一级<%if(list[i].checked){%>

                                    <label>
                                        <input type="checkbox" class="module_cbo" <%if(list[i].checked){%> checked
                                        <%}%> value="<%=list[i]._id %>" name="access_node[]">&nbsp;&nbsp;
                                        <%=list[i].module_name %> <%=list[i]._id %>
                                    </label>

右边是第二级<%if(list[i].items[j].checked){%>

                                <td>
                                    <%for(var j=0;j<list[i].items.length;j++){%>
                                    &nbsp;&nbsp;
                                    <label>
                                        <input type="checkbox" class="action_cbo" <%if(list[i].items[j].checked){%>
                                        checked
                                        <%}%> value="<%=list[i].items[j]._id%>" name="access_node[]">
                                        &nbsp;&nbsp;
                                        <%=list[i].items[j].action_name%> <%=list[i].items[j]._id%></label>&nbsp;&nbsp;
                                    <%}%>
                                </td>

clipboard.png

controller

  1. 获取全部的权限
  2. 查询当前角色拥有的权限(查询当前角色的权限id) 把查找到的数据放在数组中
  3. 循环遍历所有的权限数据 判断当前权限是否在角色权限的数组中, 如果在角色权限的数组中:选中 如果不在角色权限的数组中不选中
controller/admin/role.js
  async auth() {
    /*
     1、获取全部的权限  
     2、查询当前角色拥有的权限(查询当前角色的权限id) 把查找到的数据放在数组中
     3、循环遍历所有的权限数据     判断当前权限是否在角色权限的数组中,   如果在角色权限的数组中:选中    如果不在角色权限的数组中不选中
    */
    var role_id = this.ctx.request.query.id;
    //1、获取全部的权限
    var result = await this.ctx.model.Access.aggregate([
      {
        $lookup: {
          from: 'access',
          localField: '_id',
          foreignField: 'module_id',
          as: 'items'
        }
      },
      {
        $match: {
          "module_id": '0'
        }
      }
    ]);

    //2、查询当前角色拥有的权限(查询当前角色的权限id) 把查找到的数据放在数组中
    var accessReulst = await this.ctx.model.RoleAccess.find({
      "role_id": role_id
    });
    console.log(accessReulst)
    var roleAccessArray = [];
    accessReulst.forEach(function (value) {
      roleAccessArray.push(value.access_id.toString());
    })
    console.log(roleAccessArray)
    // console.log(roleAccessArray);

    // 3、循环遍历所有的权限数据     判断当前权限是否在角色权限的数组中
    for (var i = 0; i < result.length; i++) {
      if (roleAccessArray.indexOf(result[i]._id.toString()) != -1) {
        result[i].checked = true;
      }
      for (var j = 0; j < result[i].items.length; j++) {
        if (roleAccessArray.indexOf(result[i].items[j]._id.toString()) != -1) {
          result[i].items[j].checked = true;
        }
      }
    }
    // console.log(result);
    await this.ctx.render('admin/role/auth', {
      list: result,
      role_id: role_id
    });
  }
  1. 右边红色框为,当前角色(技术部门),所拥有的权限
  2. 左边红色框为,所有的权限列表

clipboard.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值