eggjs学习笔记第三十九天:eggjs后管类系统权限管理RBAC之用户的增删改以及用户与角色的关联关系

…衆ロ難τιáo~ 提交于 2020-08-11 04:54:14

一、用户和角色的关系

一般系统当中,一个用户可能有多种角色,一个角色可能对应着多个用户,在本实例中,我们先考虑吧比较简单的情况,即一个角色对应多个用户,一个用户只有一个角色的情况。

二、创建管理员model,用来操作数据库

model>admin.js下新建管理员的schema,用来操作admin表

module.exports = app => {
  const mongoose = app.mongoose;
  const Schema = mongoose.Schema;

  var d = new Date();

  const AdminSchema = new Schema({
    username: { type: String },
    password: { type: String },
    mobile: { type: String },
    email: { type: String },
    status: { type: Number, default: 1 },
    role_id: { type: Schema.Types.ObjectId },
    add_time: {
      type: Number,
      default: d.getTime()
    },
    is_super: { type: Number }
  });

  return mongoose.model("Admin", AdminSchema, "admin");
};

三、修改管理员添加页面

view>manage>add.html 其中管理员角色有一个select标签循环角色列表

<%- 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/manager/doAdd" method="post">
                                    <ul>
                                        <input type='hidden' name="_csrf" value="<%=csrf%>"></input>
                                        <li>  管理员名称: <input type="text" name="username"/></li>

                                        <li>  管理员密码:  <input type="text" name="password"/></li>
                                        <li>  管理员电话: <input type="text" name="mobile"/></li>
                                        <li>  管理员邮箱: <input type="text" name="email"/></li>

                                        <li>
                                    管理员角色:
                                    <select name="role_id" id="role_id">
                                                <%for(let i=0;i<rolesList.length;i++){%>
                                                    <option value="<%=rolesList[i].id%>"><%=rolesList[i].title%></option>
                                                <%}%>
                                            </select>
                                        </li>

                                        <li>
                                            <br/>
                                            <button type="submit" class="btn btn-default">提交</button>
                                        </li>

                                    </ul>

                                </form>
                            </div>
                        </div>

                    </div>

                </div>
            </div>
        </div>

    </body>
</html>

四、当调用/admin/manager/add这个路径的时候,去角色表中查询角色数据,传入新增页循环角色列表。

async add() {
    let rolesList = await this.ctx.model.Role.find({});
    console.log(rolesList);

    await this.ctx.render("admin/manager/add", { rolesList });
  }

渲染效果如图所示:

五、加入csrf隐藏域,提交调用doAdd方法增加管理员。

六、配置新增编辑的路由。

router.post("/admin/manager/doAdd", controller.admin.manager.doAdd);
router.post("/admin/manager/doEdit", controller.admin.manager.doEdit);

七、注意md5密码加密。新增用户到admin表

async doAdd() {
    let userItem = this.ctx.request.body;
    userItem.password = await this.service.tools.md5(userItem.password);
    // 判断当前用户是否存在
    let userResult = await this.ctx.model.Admin.find({
      username: userItem.username
    });
    console.log(userResult);
    if (userResult.length > 0) {
      await this.error("admin/add", "此管理员已存在");
    } else {
      let admin = new this.ctx.model.Admin(this.ctx.request.body);
      let result = await admin.save();
      await this.success("/admin/manager", "增加用户成功");
    }
  }

八、渲染用户列表:

<%- 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 class="th">
                                    <th>管理员名称</th>
                                    <th>管理员手机</th>
                                    <th>管理员邮箱</th>
                                    <th>管理员角色</th>
                                </tr>
                            </thead>
                            <tbody>
                                <%for(let i=0;i<adminList.length;i++){%>
                                    <tr class="th">
                                        <td><%=adminList[i].username%></td>
                                        <td><%=adminList[i].mobile%></td>
                                        <td><%=adminList[i].email%></td>
                                        <td><%=adminList[i].role[0].title%></td>
                                    </tr>
                                <%}%>
                            </tbody>
                        </table>
                    </div>

                </div>
            </div>
        </div>

    </body>
</html>

九,访问管理员列表查询数据,用户表关联角色表可以得到对应角色中文信息。

async index() {
    // 查询管理员表并关联角色表
    let adminList = await this.ctx.model.Admin.aggregate([
      {
        $lookup: {
          from: "role",
          localField: "role_id",
          foreignField: "_id",
          as: "role"
        }
      }
    ]);
    console.log(adminList);
    await this.ctx.render("admin/manager/index", { adminList });
  }

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!