eggjs学习笔记第四十一天:eggjs后管类系统权限管理RBAC之权限列表的添加与展现

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>

 

 

碎觉

相关文章
相关标签/搜索