egg(45,46)--rbac之权限curd

router.js

  router.get('/admin/access', controller.admin.access.index);
  router.get('/admin/access/add', controller.admin.access.add);
  router.post('/admin/access/doAdd', controller.admin.access.doAdd);
  router.get('/admin/access/edit', controller.admin.access.edit);
  router.post('/admin/access/doEdit', controller.admin.access.doEdit);

model

model/access.js

/*
1、模块名称: 模块名称就是左侧的主菜单名称,如果增加数据的时候是模块,那么需要指定节点类型是模块,并且选择所属模块为顶级模块


2、节点类型: 1、表示模块   2、表示菜单     3、操作


3、操作名称:如果节点类型是菜单,那么操作名称就是左侧菜单的名称。如果节点类型是操作,那么操作名称就是具体的操作名称


4、操作地址:用户实际访问的地址


5、所属模块:模块(顶级模块)  菜单和操作(父亲模块)


*/

module.exports = app => {
    const mongoose = app.mongoose;   /*引入建立连接的mongoose */
    const Schema = mongoose.Schema;   
    var d=new Date();
    const AccessSchema = new Schema({
      module_name: { type: String  },      //模块名称
      action_name: { type: String  },      //操作名称
      type: { type: Number  },   //节点类型 :  1、表示模块   2、表示菜单     3、操作
      url:{type:String},
      module_id:{                //此module_id和当前模型的_id关联     module_id= 0 表示模块
        type:Schema.Types.Mixed  //混合类型
      },
      sort:{
        type:Number,
        default:100
      },
      description:{type: String},
      status:{
        type:Number,
        default:1
      },
      add_time:{
        type:Number,
        default:d.getTime()
      }
    });
    return mongoose.model('Access', AccessSchema,'access');    
}

增加

controller

  1. 一级模块是0 管理员管理 角色管理 权限管理
admin/access.js
  async add() {
    //获取模块列表
    //一级模块是0  管理员管理 角色管理 权限管理
    var result = await this.ctx.model.Access.find({
      "module_id": "0"
    })
    console.log(result)
    await this.ctx.render('admin/access/add', {
      moduleList: result
    });
  }
  async doAdd() {
    var addResult=this.ctx.request.body;
    var module_id=addResult.module_id;
    // //菜单  或者操作
    if(module_id != "0"){  //如果不是一级模块 (管理员管理 角色管理 权限管理)
      addResult.module_id=this.app.mongoose.Types.ObjectId(module_id);    //调用mongoose里面的方法把字符串转换成ObjectId
    }
    var access=new this.ctx.model.Access(addResult);
    await access.save();
    await this.success('/admin/access','增加权限成功');
  }

view

admin/accsss/add.html
                        <form action="/admin/access/doAdd" method="post">
                            <ul>
                                <input type="hidden" name="_csrf" value="<%=csrf%>">
                                <li> 模块名称: <input type="text" name="module_name" /></li>
                                <li>
                                    节点类型:
                                    <!-- 1、表示模块   2、表示菜单     3、操作 -->
                                    <select name="type" id="type">
                                        <option value="1">模块</option>
                                        <option value="2">菜单</option>
                                        <option value="3">操作</option>
                                    </select>
                                </li>
                                <li> 操作名称: <input type="text" name="action_name" /></li>
                                <li> 操作地址: <input type="text" name="url" /></li>
                                <li> 所属模块:
                                    <select name="module_id" id="module_id">
                                        <option value="0">---顶级模块--</option>
                                        <%for(var i=0;i<moduleList.length;i++){%>
                                        <option value="<%=moduleList[i]._id%>">
                                            <%=moduleList[i].module_name%>
                                        </option>
                                        <%}%>
                                    </select>
                                </li>
                                <li> 排  序: <input type="text" name="sort" value="100" /></li>
                                <li> 描  述 :
                                    <textarea name="description" id="description" cols="60" rows="5"></textarea>
                                </li>
                                <li>
                                    <br />
                                    <button type="submit" class="btn btn-default">提交</button>
                                </li>
                            </ul>
                        </form>

clipboard.png

查找

controller

自己联表自己

  async index() {
    var result = await this.ctx.model.Access.aggregate([{
      $lookup: {
        from: 'access',
        localField: '_id',
        foreignField: 'module_id',
        as: 'items'
      }
    }, {
      $match: {
        "module_id": "0"
      }
    }])
    await this.ctx.render('admin/access/index', {
      list: result
    });
  }

view

                <table class="table table-bordered">
                    <thead>
                        <tr class="th">
                            <th>模块名称</th>
                            <th>节点类型</th>
                            <th>操作名称</th>
                            <th>操作地址</th>
                            <th>排序</th>
                            <th>描述</th>

                            <th class="text-center">操作</th>
                        </tr>
                    </thead>
                    <tbody>
                        <%for(var i=0;i<list.length;i++){%>
                        <tr style="background-color: #428bca;color:#fff;">
                            <td>
                                <%=list[i].module_name%>
                            </td>
                            <td>
                                <%if(list[i].type==1){%>
                                模块
                                <%}else if(list[i].type==2){%>
                                菜单
                                <%}else{%>
                                操作
                                <%}%>
                            </td>
                            <td>
                                <%=list[i].action_name%>
                            </td>
                            <td>
                                <%=list[i].url%>
                            </td>
                            <td>
                                <%=list[i].sort%>
                            </td>

                            <td>
                                <%=list[i].description%>
                            </td>
                            <td class="text-center">修改 删除</td>
                        </tr>
                        <%for(var j=0;j<list[i].items.length;j++){%>
                        <tr>
                            <td>----
                                <%=list[i].items[j].module_name%>
                            </td>
                            <td>
                                <%if(list[i].items[j].type==1){%>
                                模块
                                <%}else if(list[i].items[j].type==2){%>
                                菜单
                                <%}else{%>
                                操作
                                <%}%>
                            </td>
                            <td>
                                <%=list[i].items[j].action_name%>
                            </td>

                            <td>
                                <%=list[i].items[j].url%>
                            </td>
                            <td>
                                <%=list[i].items[j].sort%>
                            </td>

                            <td>
                                <%=list[i].items[j].description%>
                            </td>

                            <td class="text-center">修改 删除</td>
                        </tr>

                        <%}%>
                        <%}%>
                    </tbody>
                </table>

clipboard.png

clipboard.png

编辑

controller

var result = await this.ctx.model.Access.find({"module_id":"0"});默认选中要用

  async edit() {
    var id = this.ctx.request.query.id;
    var accessResult = await this.ctx.model.Access.find({"_id":id});
    var result = await this.ctx.model.Access.find({"module_id":"0"});
     
    await this.ctx.render('admin/access/edit',{
      list:accessResult[0],
      moduleList:result
    });
  }
  async doEdit() {
    var updateResult = this.ctx.request.body;
    var id = updateResult.id;
    var module_id = updateResult.module_id;

    if(updateResult !=0){
      updateResult.module_id = this.app.mongoose.Types.ObjectId(module_id);
    }
    var result = await this.ctx.model.Access.updateOne({"_id":id},updateResult);

    await this.success('/admin/access','编辑权限成功')
  }

view

list.module_id.toString()==moduleList[i]._id.toString()默认选中所属模块

                        <form action="/admin/access/doEdit" method="post">
                            <ul>
                                <input type="hidden" name="id" value="<%= list._id %>">
                                <input type="hidden" name="_csrf" value="<%=csrf%>">
                                <li> 模块名称: <input type="text" name="module_name" value="<%= list.module_name %>" /></li>
                                <li>
                                    节点类型:
                                    <!-- 1、表示模块   2、表示菜单     3、操作 -->
                                    <select name="type" id="type">
                                        <option value="1" <%if(list.type==1){%>selected
                                            <%}%>>模块</option>
                                        <option value="2" <%if(list.type==2){%>selected
                                            <%}%>>菜单</option>
                                        <option value="3" <%if(list.type==3){%>selected
                                            <%}%>>操作</option>
                                    </select>
                                </li>
                                <li>  操作名称: <input type="text" name="action_name" value="<%=list.action_name%>"/></li>
        
                                    <li>  操作地址: <input type="text" name="url" value="<%=list.url%>"/></li>
                                <li> 所属模块:
                                    <select name="module_id" id="module_id">
                                        <option value="0" <%if(list.module_id==0){%>selected
                                            <%}%>>---顶级模块--</option>
                                        <%for(var i=0;i<moduleList.length;i++){%>
                                        <option value="<%=moduleList[i]._id%>" <%if(list.module_id.toString()==moduleList[i]._id.toString()){%>selected
                                            <%}%> >
                                            <%=moduleList[i].module_name%>
                                        </option>
                                        <%}%>
                                    </select>
                                </li>
                                <li> 排  序: <input type="text" name="sort" value="<%= list.sort %>" /></li>
                                <li> 描  述 :
                                    <textarea name="description" id="description" cols="60" rows="5">
                                            <%= list.description %>
                                    </textarea>
                                </li>
                                <li>
                                    <br />
                                    <button type="submit" class="btn btn-default">提交</button>
                                </li>
                            </ul>
                        </form>

clipboard.png

删除

view

<a href="/admin/delete?model=Access&id=<%=list[i].items[j]._id%>">删除</a>

clipboard.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值