前言:自动化构建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