当前位置 博文首页 > 文章内容

    vue自动提取后端swagger api中的api数据生成请求接口文件

    作者: 栏目:未分类 时间:2020-09-01 11:01:08

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    前言

    每次使用前端请求api地址都都要自己手写api地址过于繁琐

    创建genSwagger/index.js 文件

    当前genSwagger文件夹在根目录

    const fs = require('fs')
    const path = require('path')
    const http = require('http')
    
    function mkdirsSync(dirname) {
      if (fs.existsSync(dirname)) {
        return true
      } else {
        if (mkdirsSync(path.dirname(dirname))) {
          fs.mkdirSync(dirname)
          return true
        }
      }
    }
    function getPath(pathUrl) {
      return path.resolve(__dirname, pathUrl)
    }
    function generateTemplate(arr) {
      return `import { ${arr.join(', ')} } from '@/utils/request'\n`
    }
    function generateFunc(name, summary, type = 'post') {
      const arr = name.slice(1).split('/')
      const fun = arr[arr.length - 1]
      return `
    // ${summary || ''}
    export function ${fun}(data, cb, errHandle) {
      return ${type}('${name}', data, cb, errHandle)
    }\n`
    }
    function httpgetJson(url) {
      return new Promise((resolve, reject) => {
        http.get(url, (res) => {
          const { statusCode } = res
          const contentType = res.headers['content-type']
    
          let error
          if (statusCode !== 200) {
            error = new Error('请求失败。\n' +
                          `状态码: ${statusCode}`)
          } else if (!/^application\/json/.test(contentType)) {
            error = new Error('无效的 content-type.\n' +
                          `期望 application/json 但获取的是 ${contentType}`)
          }
          if (error) {
            console.error(error.message)
            // 消耗响应数据以释放内存
            res.resume()
            return
          }
    
          res.setEncoding('utf8')
          let rawData = ''
          res.on('data', (chunk) => {
            rawData += chunk
          })
          res.on('end', () => {
            try {
              const parsedData = JSON.parse(rawData)
              resolve(parsedData)
            } catch (e) {
              reject(`错误: ${e.message}`)
            }
          })
        }).on('error', (e) => {
          reject(`错误: ${e.message}`)
        })
      })
    }
    
    const srcFolder = '/src'
    const url = 'http://localhost:61793/swagger/v1/swagger.json'
    // const argv = process.argv
    // console.log(argv)
    
    async function main() {
      console.log('获取远程json文件中...')
      const { paths } = await httpgetJson(url)
      console.log('获取成功正在生成api文件')
      const obj = {}
      for (const name in paths) {
        const path = paths[name]
    
        let folder = ''
        if (path.post) {
          const tag = path.post.tags[0]
          if (!tag) continue
          const urlArray = name.slice(1).split('/')
          if (name.slice(1).split('/').length === 4) {
            folder = urlArray[1]
          } else {
            if (name.slice(1).split('/')[0] !== tag) continue
          }
          if (obj[path.post.tags[0]]) {
            obj[path.post.tags[0]].push({ summary: path.post.summary, tag, name, type: 'post', folder })
          } else {
            obj[path.post.tags[0]] = [{ summary: path.post.summary, tag, name, type: 'post', folder }]
          }
        } else if (path.get) {
          const tag = path.get.tags[0]
          console.log(tag)
          if (!tag) continue
          const urlArray = name.slice(1).split('/')
          if (name.slice(1).split('/').length === 4) {
            folder = urlArray[1]
          } else {
            if (name.slice(1).split('/')[0] !== tag) continue
          }
          if (obj[path.get.tags[0]]) {
            obj[path.get.tags[0]].push({ summary: path.get.summary, tag, name, type: 'get', folder })
          } else {
            obj[path.get.tags[0]] = [{ summary: path.get.summary, tag, name, type: 'get', folder }]
          }
        }
      }
      for (const tagName in obj) {
        let jsString = ''
        const requestTypes = []
        let folder = ''
        for (const item of obj[tagName]) {
          const requestType = requestTypes.filter(o => o === item.type)
          if (requestType.length === 0) requestTypes.push(item.type)
          jsString += generateFunc(item.name, item.summary, item.type)
          folder = item.folder
        }
        jsString = generateTemplate(requestTypes) + jsString
        mkdirsSync(getPath(`..${srcFolder}/api/${folder}`))
        // console.log(jsString)
        fs.writeFileSync(getPath(`..${srcFolder}/api/${folder}/${tagName}.js`), jsString)
      }
      console.log('生成完毕')
    }
    
    main()
    

    我目前url格式是 /Api/Admin/Home/Index 和格式 /Test/Index

    生成后的文件夹格式是/api/Admin/Home.js 或/api/Test.js 文件如下

    import { get, post } from '@/utils/request'
    
    // 获取
    export function Index(data, cb, errHandle) {
      return get('/Api/Admin/Home/Index', data, cb, errHandle)
    }
    
    // 添加
    export function Add(data, cb, errHandle) {
      return post('/Api/Admin/Home/Add', data, cb, errHandle)
    }
    
    // 删除
    export function Delete(data, cb, errHandle) {
      return post('/Api/Admin/Home/Delete', data, cb, errHandle)
    }
    

    使用时需要将const url = 'http://localhost:61793/swagger/v1/swagger.json'改成你自己的地址
    当前项目目录结构基于element-admin-template

    修改package.json文件

    scripts索引中加入"swagger":"node genSwagger/index.js"

    "scripts": {
        "dev": "vue-cli-service serve",
        "build:prod": "vue-cli-service build",
        "build:stage": "vue-cli-service build --mode staging",
        "preview": "node build/index.js --preview",
        "lint": "eslint --ext .js,.vue src",
        "test:unit": "jest --clearCache && vue-cli-service test:unit",
        "test:ci": "npm run lint && npm run test:unit",
        "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml",
        "swagger": "node genSwagger/index.js"
      }
    

    使用npm run swagger 命令生成swagger接口请求文件