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
- 一级模块是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>
查找
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>
编辑
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>
删除
view
<a href="/admin/delete?model=Access&id=<%=list[i].items[j]._id%>">删除</a>