service
service/admin.js
- 获取全部的权限
- 查询当前角色拥有的权限(查询当前角色的权限id) 把查找到的数据放在数组中
- 循环遍历所有的权限数据 判断当前权限是否在角色权限的数组中, 如果在角色权限的数组中:选中 如果不在角色权限的数组中不选中
async getAuthList(role_id){
//1、获取全部的权限
var result = await this.ctx.model.Access.aggregate([
{
$lookup: {
from: 'access',
localField: '_id',
foreignField: 'module_id',
as: 'items'
}
},
{
$match: {
"module_id": '0'
}
}
]);
// console.log(JSON.stringify(result))
//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);
return result;
}
middleware
middleware/adminauth.js
增加ctx.state.asideList = await ctx.service.admin.getAuthList(ctx.session.userinfo.role_id);
全部代码
const url = require('url')
module.exports = options => {
return async function adminauth(ctx, next) {
// 1.用户没有登录跳转到登录页面
// 2.只有登录以后才可以访问后台管理系统
var pathname = url.parse(ctx.request.url).pathname;
console.log(pathname)
//csrf
ctx.state.csrf = ctx.csrf;
ctx.state.prevPage = ctx.request.headers['referer']; //获取上一页的url
if(ctx.session.userinfo){
ctx.state.userinfo = ctx.session.userinfo;
// await next();
//登录权限判断
var hasAuth = await ctx.service.admin.checkAuth();
if(hasAuth){
ctx.state.asideList = await ctx.service.admin.getAuthList(ctx.session.userinfo.role_id);
await next();
}else{
ctx.body = '你没有权限访问当前地址'
}
}else{
// 排除不需要做杼判断的页面 admin/verify?mt=0.7755167188853835
if(pathname == '/admin/login' || pathname == '/admin/doLogin' || pathname == '/admin/verify'){
await next()
}else{
ctx.redirect('/admin/login')
}
}
};
};
view
admin/public/page_aside.html
- is_super=1超级管理员 default:0
-
type节点类型
- 表示模块(红色)
- 表示菜单(黄色)
- 操作
<ul class="aside">
<%for(var i=0;i<asideList.length;i++){%>
<li>
<%if((asideList[i].checked && asideList[i].type==1) || (userinfo.is_super==1&& asideList[i].type==1)){%>
<h4>
<%=asideList[i].module_name %>
</h4>
<ul>
<%for(var j=0;j<asideList[i].items.length;j++){%>
<%if((asideList[i].items[j].checked && asideList[i].items[j].type!=3) || (userinfo.is_super==1 && asideList[i].items[j].type!=3)){%>
<li class="list-group-item"> <a href="<%=asideList[i].items[j].url%>">
<%=asideList[i].items[j].action_name %></a></li>
<%}%>
<%}%>
</ul>
<%}%>
</li>
<%}%>
</ul>
实例 市场部门lisi
查看管理员所属角色
查看角色拥有的权限
管理员登录,所能看到和操作的url