1.app>model>access.js写入定义权限表的schemajavascript
/* 一、模块名称: 模块名称就是左侧的主菜单名称,若是增长数据的时候是模块,那么须要指定节点类型是模块,而且选择所属模块为顶级模块 二、节点类型: 一、表示模块 二、表示菜单 三、操做 三、操做名称:若是节点类型是菜单,那么操做名称就是左侧菜单的名称。若是节点类型是操做,那么操做名称就是具体的操做名称 四、操做地址:用户实际访问的地址 五、所属模块:模块(顶级模块) 菜单和操做(父亲模块) */ 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 }, //节点类型 : 一、表示模块 二、表示菜单 三、操做 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"); };
2.增长菜单侧边栏权限连接:html
<li> <h4>权限管理</h4> <ul> <li class="list-group-item"> <a href="/admin/access"> 权限列表</a></li> <li class="list-group-item"> <a href="/admin/access/add" >增长权限</a></li> </ul> </li>
3.定义路由:java
router.get('/admin/access', controller.admin.access.index); router.get('/admin/access/add', controller.admin.access.add);
4.先实现权限add的方法:改造权限add页:app
<%- include ../public/page_header.html %> <div class="container-fluid"> <div class="row"> <div class="col-sm-2"> <%- include ../public/page_aside.html %> </div> <div class="col-sm-10"> <div class="panel panel-default"> <div class="panel-heading"> 增长权限 </div> <div class="panel-body"> <div class="table-responsive input-form"> <form action="/admin/access/doAdd" method="post"> <ul> <input type="hidden" name="_csrf" value="<%=csrf%>"> <li> 模块名称: <input type="text" name="module_name"/></li> <li> 节点类型: <!-- 一、表示模块 二、表示菜单 三、操做 --> <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> </div> </div> </div> </div> </div> </div> </body> </html>
5.定义增长权限的方法。async
async doAdd() { // console.log(this.ctx.request.body); var addResult = this.ctx.request.body; var module_id = addResult.module_id; //菜单 或者操做 if (module_id) { addResult.module_id = this.app.mongoose.Types.ObjectId(module_id); //调用mongoose里面的方法把字符串转换成ObjectId } var access = new this.ctx.model.Access(addResult); access.save(); await this.success("/admin/access", "增长权限成功"); }
6.添加模块,模块就是一级菜单。 依次添加下列三种模块。mongoose
可得access表中有三条数据:ide
7.添加二级菜单,须要循环所属模块列表,访问add页面,查询模块列表数据在select循环。 module_id = 0就是顶级模块post
async add() { //获取模块列表 var result = await this.ctx.model.Access.find({ module_id: "0" }); await this.ctx.render("admin/access/add", { moduleList: result }); }
<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>
8.二级菜单照此步骤添加完成。ui
得表中多6个菜单数据。this
9.添加操做级权限,也能够说是按钮级权限。
10.access表的自关联
async index() { // var result=await this.ctx.model.Access.find({}); // console.log(result); // 一、在access表中找出 module_id=0的数据 管理员管理 _id 权限管理 _id 角色管理 (模块) //二、让access表和access表关联 条件:找出access表中 module_id等于_id的数据 var result = await this.ctx.model.Access.aggregate([ { $lookup: { from: "access", localField: "_id", foreignField: "module_id", as: "items" } }, { $match: { module_id: "0" } } ]); console.log(result); await this.ctx.render("admin/access/index", { list: result }); }
11.渲染出权限展现页面:
<%- include ../public/page_header.html %> <div class="container-fluid"> <div class="row"> <div class="col-sm-2"> <%- include ../public/page_aside.html %> </div> <div class="col-sm-10"> <div class="panel panel-default"> <div class="panel-heading"> 搜索角色 </div> <div class="panel-body"> <form role="form" class="form-inline"> <div class="form-group"> <label for="name">名称</label> <input type="text" class="form-control" id="name" placeholder="请输入名称"> </div> <div class="form-group"> <button type="submit" class="btn btn-default">开始搜索</button> </div> </form> </div> </div> <!-- 列表展现 --> <div class="table-responsive"> <table class="table table-bordered"> <thead> <tr> <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> <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> </div> </div> </div> </div> </body> </html>
碎觉