自动化构建API模块

前言:自动化构建api大大缩短了在api分类管理上浪费的时间

1:引入所需的模块

const fs = require('fs')
const axios = require('axios')
复制代码

2:建立接口配置对象

const configArray = [
  {
    type: 'biz', // 接口类型
    apiUrl: ***, // 接口请求api
    apiPath: './src/api/', // 接口生成文件夹路径
    headObj: [
      {name: 'request', path: '@/utils/request'}
    ], // 每个js文件头部写入内容import
    flag: 'w', // a表示续写 w表示覆盖 //默认覆盖
    tags: [],
    nowDate: getNowFormatDate()//获取时间
  }
]
复制代码

3:请求接口获取api路径并进行处理

//约束好后端接口的格式,这里通过api/隔开,以下是处理方法,最终生成config对象
function GenerateApi(config) {
  axios.get(config.apiUrl).then(res => {
    let data = res.data.paths
    config.tags = res.data.tags.map(v => {
      return {name: v.name, fileData: '',fileName: v.description.replace(/\s*/g,'').replace(/Controller$/g,''), oldContent: '', isExistence: false} // 每个生成文件头引入
    })
    let arr = Object.entries(data)
    arr.forEach(v => {
      let msg = v[1].post|| v[1].get || v[1].delete
      let tag = msg.tags[0]
      config.tags.forEach(k => {
        if (tag === k.name) {
          if (!/api/g.test(v[0])) return
          const tmpUrl = v[0].split('/api/')[1]
          k.desc = msg.description
          k.url = tmpUrl
          k.apiName = filterApiName(tmpUrl.split('/'))
          k.isExistence = readFileInfo(k.fileName, k.apiName, config)
          k.oldContent = k.isExistence.data
          k.fileData += getTemplate(k, config)
        }
      })
    })
    createApiFileJs(config)
  }).catch(e => {
    console.error(e, '接口访问失败')
  })
}

//api格式化
function filterApiName(arr) {
  let name = ''
  arr.forEach((k, i) => {
    name += i > 0 ? k.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase()) : k
  })
  return name
}
//判断api文件是否存在
function readFileInfo(path, params, config) {
  let result = {
    status: false,
    data: ''
  }
  try {
    let data = fs.readFileSync(`${config.apiPath}${path}.js`).toString()
    result.status = data.indexOf(params) > 0
    result.data = data
  } catch (e) {
    result.status = false
  }
  return result
}
//生成接口模板
function getTemplate(data, config) {
  let template = ''
  if (!readFileInfo(data.fileName, data.apiName).status) {
    template = `
                /**
                 * ${data.desc}
                 * @author: zhangkang
                 * @createDate: ${config.nowDate}
                 * @param data {Object} 参数
                 */
                export function ${data.apiName}(data) {
                  return request({
                    type: '${config.type}',
                    url: '${data.url}',
                    method: 'post',
                    data
                  })
                }`
  }
  return template
}
复制代码

4:node生成并写入文件

//生成并写入文件
function createApiFileJs(config) {
  config.tags.forEach(v => {
    let path = `${config.apiPath}${v.fileName}.js`
    let heade = createHeadTemplate(v.fileName, config)
    // v.fileData = v.oldContent + v.fileData
    v.fileData = heade + v.fileData
    v.fileData = createfileNotes(v, config) + v.fileData
    fs.writeFile(path, v.fileData, {flag: config.flag, encoding: 'utf-8'}, function (err) {
      if (err) {
        console.error(err, '失败')
      } else {
        console.log(`${v.fileName}文件生成成功`)
      }
    })
  })
}

//生成头部import模板
function createHeadTemplate(p, config) {
  let template = ''
  config.headObj.forEach(v => {
    if (!readFileInfo(p, v.path).status) {
      template += `import ${v.name} from '${v.path}'
`
    }
  })
  return template
}

//生成相应api的文件注释
function createfileNotes(data, config) {
  let template = ''
  if (!readFileInfo(data.fileName, '@file', config).status) {
    template = `/**
                 * @file: ${data.fileName}.
                 * @authors: yangj.
                 * @createDate: ${config.nowDate}.
                 * @Description: ${data.name}
               */
               `
  }
  return template
}
复制代码

每次接口更新通过node run一次就完成构建

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享