第三节 创建第一组接口

在mrcs(model/router/controller/service)服务端框架模型中,我们创建一个接口走完每个环路

1. 创建router

  • router 协议定义
    get - 查询
    post - 增加
    update - 更新
    delete -删除

在router文件夹下创建role.js文件

'use strict';
module.exports = app => {
  app.router.get('/role/list',app.controller.role.list); // 获取角色列表
  app.router.post('/role/add',app.controller.role.add); // 新增角色
  app.router.update('/role/update',app.controller.role.update); // 新增角色
  app.router.delete('/role/delete',app.controller.role.delete); // 新增角色
}

在 /app/router.js 中引用role.js路由文件

'use strict';

module.exports = app => {
  require('./router/role')(app);
};

2. 创建controller

在/app/controller文件夹下创建role.js

'use strict';

const { Controller } = require('egg'); // es6解构

class RoleController extends Controller {
  async add () {
    // 多用try捕获想不到的问题
    try {
      const { ctx } = this;
      const cbody = ctx.request.body // 通过ctx.request.body 获取通过body数据包发过来的数据
      const params = {}
      if (cbody.name && typeof cbody.name === 'string') {
        if (cbody.name.length > 10) throw new Error('角色名称不能超过10个字符') // 防止数据库长度溢出
        if (cbody.name.replace(/\s+/g, '') === '') throw new Error('角色名称不能为空') // 替换掉名称里面的空格,不能为空
        params.name = cbody.name
      } else {
        throw new Error('请输入角色名称')
      }
      if (cbody.auths && typeof cbody.auths === 'string') { // 用户权限如果存在则设置,如果为传入则置空
        params.auths = cbody.auths
      } else {
        params.auths = ''
      }
      this.ctx.body = await this.ctx.service.role.add(params) // 把业务参数处理好传给service服务处理
    } catch (err) {
      // 返回错误信息
      this.ctx.body = {
        code: 0,
        msg: err.message
      }
    }
  }
  async list () {
    const { ctx } = this;
    try {
      // 对于角色而言往往数量很少,不至于使用分页和关键词搜索,这里是为了演示数据操作
      const cbody = ctx.query // 通过query路由参数传过来的参数在ctx.query中
      const params = {
        searchMsg: cbody.search || '', // 关键词搜索
        page: cbody.page || 1, // 页码
        pageSize: cbody.pageSize || 20 // 单页数量
      }
      this.ctx.body = await this.ctx.service.role.list(params)
    } catch (err) {
      // 返回错误信息
      this.ctx.body = {
        code: 0,
        msg: err.message
      }
    }
  }
  async update () {
    // 多用try捕获想不到的问题
    try {
      const { ctx } = this;
      const cbody = ctx.request.body // 通过ctx.request.body 获取通过body数据包发过来的数据
      const params = {}
      if (cbody.id && !isNaN(Number(cbody.id))) {
        params.id = cbody.id
      } else {
        throw new Error('缺少参数id')
      }
      if (cbody.name && typeof cbody.name === 'string') { // 如果角色名称存在,传入
        if (cbody.name.length > 10) throw new Error('角色名称不能超过10个字符') // 防止数据库长度溢出
        if (cbody.name.replace(/\s+/g, '') === '') throw new Error('角色名称不能为空') // 替换掉名称里面的空格,不能为空
        params.name = cbody.name
      }
      if (cbody.auths && typeof cbody.auths === 'string') { // 如果用户权限存在,传入
        params.auths = cbody.auths
      }
      this.ctx.body = await this.ctx.service.role.update(params) // 把业务参数处理好传给service服务处理
    } catch (err) {
      // 返回错误信息
      this.ctx.body = {
        code: 0,
        msg: err.message
      }
    }
  }

  async delete () {
    const { ctx } = this;
    try {
      const cbody = ctx.request.body // 这里delete参数使用body体传入
      if (cbody.id && isNaN(Number(cbody.id))) {
        this.ctx.body = await this.ctx.service.role.delete({ id: cbody.id })
        return
      }
      throw new Error('缺少参数id')
    } catch (err) {
      // 返回错误信息
      this.ctx.body = {
        code: 0,
        msg: err.message
      }
    }
  }
}

module.exports = RoleController;

3. 创建Service

在/app/service 下创建role.js

'use strict';

const { Service } = require('egg');
const SuccessMsg = '操作成功'
class RoleService extends Service {
  /**
   * 新增角色
   */
  async add (params) {
    const { ctx } = this;
    try {
      const hasOne = await ctx.model.Role.findOne({
        where: {
          name: params.name
        }
      })
      if (hasOne) throw new Error('已有同名角色') // 判断是否有同名角色
      const data = await ctx.model.Role.create({
        name: params.name,
        auths: params.auths
      })
      if (data) {
        return {
          code: 1,
          msg: SuccessMsg
        }
      }
      throw new Error('创建角色失败')
    } catch (err) {
      return {
        code: 0,
        msg: err.message
      }
    }
  }
  /**
   * 获取角色列表
   */
  async list () {
    const { ctx, app } = this;
    try {
      const Op = app.Sequlize.Op; // op查询方法
      const query = {};
      if (params.searchMsg !== '') {
        query.name = {
          [Op.like]: '%' + params.searchMsg + '%',
        };
      }
      const data = await ctx.model.Role.findAndCountAll({
        attributes: ['id', 'name', 'auths'], // 所需要的字段,不设置该字段默认全部拿出,对于字段比较多的表建议设置
        where: query, // 查询参数
        limit: parseInt(params.pageSize), // 分页
        offset: (parseInt(params.page) - 1) * parseInt(params.pageSize), // 分页偏移
        order: [['created_at', 'DESC']], // 排序
      });
      return {
        code: 1,
        msg: SuccessMsg,
        data: data.rows.map((items) => {
          items.dataValues.auths = items.dataValues.auths.split(',') // 返回auths数组,方便前端使用
          return items
        }),
        count: data.count
      }
    } catch (err) {
      return {
        code: 0,
        msg: err.message
      }
    }
  }
  /**
   * 更新角色
   */
  async update (params) {
    const { ctx } = this;
    try {
      const hasOne = await ctx.model.Role.findOne({
        where: {
          name: params.name
        }
      })
      if (hasOne && hasOne.id !== params.id) throw new Error('已有同名角色') // 判断是否有同名角色
      const query = {}
      if (params.name) query.name = params.name
      if (params.auths) query.auths = params.auths
      const data = await ctx.model.Role.update({
        name: params.name,
        auths: params.auths
      }, {
        where: {
          id: params.id
        }
      })
      if (data) {
        return {
          code: 1,
          msg: SuccessMsg
        }
      }
      throw new Error('更新角色失败')
    } catch (err) {
      return {
        code: 0,
        msg: err.message
      }
    }
  }

  /**
   * 删除角色
   */
  async delete (params) {
    const { ctx } = this;
    try {
      const data = await ctx.model.Role.destroy({
        where: {
          id: params.id,
        },
      });
      if (!data) throw new Error('删除角色失败');
      return {
        code: 1,
        msg: SuccessMsg
      }
    } catch (err) {
      return {
        code: 0,
        msg: err.message
      }
    }
  }

}

module.exports = RoleService;

4.通过 postman / apipost等工具进行访问调试,这里不附图~

你可能感兴趣的:(第三节 创建第一组接口)