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>
碎覺