美文网首页
第三节 创建第一组接口

第三节 创建第一组接口

作者: 张Boy | 来源:发表于2020-12-13 10:38 被阅读0次

    在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等工具进行访问调试,这里不附图~

    相关文章

      网友评论

          本文标题:第三节 创建第一组接口

          本文链接:https://www.haomeiwen.com/subject/kcddgktx.html