在package.json中增加依赖
yarn add swagger-axios-codegen
"swagger-axios-codegen": "^0.12.5",
增加运行指令
"genApi": "node src/generatorApi/index.js"
增加如下目录(用来配置后生成api文件)
config.js
const host = 'http://10.14.2.27' const host169 = 'http://10.14.2.169' const modular = [ // { name: 'op', url: '', label: '审批服务', port: 19200 }, // { name: 'doc', url: '', label: '公文服务', port: 19210 }, // { name: 'office', url: '', label: '行政模块', port: 19220 }, // { name: 'meeting', url: '', label: '会议模块', port: 19230 }, // { name: 'process', url: '', label: '事务模块', port: 19240 }, // { name: 'supervise', url: '', label: '督办模块', port: 19260 }, // { name: 'tz', url: '', label: '台账模块', port: 19261 }, // { name: 'home', url: '', label: 'home模块', port: 19290 }, // { name: 'user', url: '', label: '用户模块', port: 19110 }, // { name: 'todo', url: '', label: 'todo模块', port: 19150 }, // { name: 'file', url: '', label: '文件模块', port: 19140,serve:169 }, { name: 'search', url: '', label: '检索模块', port: 19180, serve: 169 } // { name: 'user1', url: '', label: '用户模块', port: 19110 }, // { name: 'file', url: '', label: '文件模块', port: 19140 }, // { name: 'sso', url: '', label: '登录模块', port: 19100 }, ] modular.forEach(item => { item.url = `${host}:${item.port}/v2/api-docs` if (item.serve === 169) { item.url = `${host169}:${item.port}/v2/api-docs` } // item.url = `${host}:${item.port}/v3/api-docs` }) module.exports = { modular }
index.js
/* eslint-disable */ // const fs = require('fs') const path = require('path') const { modular } = require('./config.js') const { codegen } = require('swagger-axios-codegen') modular.forEach((item) => { codegen({ remoteUrl: item.url, outputDir: path.resolve(__dirname, `autoApi`), fileName: item.name + '.ts', }).catch((err) => { console.log(err) }) })
依赖装好、配置改好就可以运行生成api文件了
yarn genApi
最终就会生成
如search.js
/** Generate by swagger-axios-codegen */ // @ts-nocheck /* eslint-disable */ /** Generate by swagger-axios-codegen */ /* eslint-disable */ // @ts-nocheck import axiosStatic, { AxiosInstance, AxiosRequestConfig } from 'axios';
import { request } from '@/utils/request'
export interface IRequestOptions extends AxiosRequestConfig {} export interface IRequestConfig { method?: any; headers?: any; url?: any; data?: any; params?: any; } // Add options interface export interface ServiceOptions { axios?: AxiosInstance; } // Add default options export const serviceOptions: ServiceOptions = {
axios: request
}; // Instance selector export function axios(configs: IRequestConfig, resolve: (p: any) => void, reject: (p: any) => void): Promise<any> { if (serviceOptions.axios) { return serviceOptions.axios .request(configs) .then(res => { resolve(res.data); }) .catch(err => { reject(err); }); } else { throw new Error('please inject yourself instance like axios '); } } export function getConfigs(method: string, contentType: string, url: string, options: any): IRequestConfig { const configs: IRequestConfig = { ...options, method, url }; configs.headers = { ...options.headers, 'Content-Type': contentType }; return configs; } export const basePath = ''; export interface IList<T> extends Array<T> {} export interface List<T> extends Array<T> {} export interface IDictionary<TValue> { [key: string]: TValue; } export interface Dictionary<TValue> extends IDictionary<TValue> {} export interface IListResult<T> { items?: T[]; } export class ListResultDto<T> implements IListResult<T> { items?: T[]; } export interface IPagedResult<T> extends IListResult<T> { totalCount?: number; items?: T[]; } export class PagedResultDto<T = any> implements IPagedResult<T> { totalCount?: number; items?: T[]; } // customer definition // empty export class FullTextSearchControllerService { /** * 按业务模块全文检索 */ static searchUsingPost1( params: { /** param */ param: SearchParamDto; } = {} as any, options: IRequestOptions = {} ): Promise<SearchResultDTO> { return new Promise((resolve, reject) => { let url = basePath + '/search'; const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); let data = params['param']; configs.data = data; axios(configs, resolve, reject); }); } /** * 按业务模块全文检索,按模块名统计命中文档数 */ static searchWithSummaryUsingPost( params: { /** param */ param: SearchParamDto; } = {} as any, options: IRequestOptions = {} ): Promise<SearchResultDTO> { return new Promise((resolve, reject) => { let url = basePath + '/search/aggregations'; const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); let data = params['param']; configs.data = data; axios(configs, resolve, reject); }); } } export class IndexManagerControllerService { /** * 获取所有索引信息 */ static getIndexListUsingGet( params: { /** index */ index?: string; } = {} as any, options: IRequestOptions = {} ): Promise<索引总览信息> { return new Promise((resolve, reject) => { let url = basePath + '/search/admin/index'; const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); configs.params = { index: params['index'] }; let data = null; configs.data = data; axios(configs, resolve, reject); }); } /** * 增加索引 */ static addIndexUsingPost( params: { /** index */ index?: string; } = {} as any, options: IRequestOptions = {} ): Promise<any> { return new Promise((resolve, reject) => { let url = basePath + '/search/admin/index'; const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); configs.params = { index: params['index'] }; let data = null; configs.data = data; axios(configs, resolve, reject); }); } /** * 清空索引 */ static clearIndexUsingPut( params: { /** index */ index?: string; } = {} as any, options: IRequestOptions = {} ): Promise<any> { return new Promise((resolve, reject) => { let url = basePath + '/search/admin/index'; const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); configs.params = { index: params['index'] }; let data = null; configs.data = data; axios(configs, resolve, reject); }); } /** * 删除索引 */ static deleteIndexUsingDelete( params: { /** index */ index?: string; } = {} as any, options: IRequestOptions = {} ): Promise<any> { return new Promise((resolve, reject) => { let url = basePath + '/search/admin/index'; const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); configs.params = { index: params['index'] }; let data = null; configs.data = data; axios(configs, resolve, reject); }); } /** * 获取数据日志 */ static getDataLogUsingPost( params: { /** searchParamDto */ searchParamDto: SearchParamDto; } = {} as any, options: IRequestOptions = {} ): Promise<SearchResultDTO_SearchLogResultDTO> { return new Promise((resolve, reject) => { let url = basePath + '/search/admin/index/log'; const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); let data = params['searchParamDto']; configs.data = data; axios(configs, resolve, reject); }); } /** * 获取服务器信息 */ static getServerInfoUsingGet(options: IRequestOptions = {}): Promise<TransportAddress[]> { return new Promise((resolve, reject) => { let url = basePath + '/search/admin/index/server'; const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); let data = null; configs.data = data; axios(configs, resolve, reject); }); } } export class CustomizeSearchControllerService { /** * 自动完成 */ static completionUsingGet( params: { /** autoCompleteDto */ autoCompleteDto: AutoCompleteDto; } = {} as any, options: IRequestOptions = {} ): Promise<string[]> { return new Promise((resolve, reject) => { let url = basePath + '/search/customize/completion'; const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); let data = params['autoCompleteDto']; configs.data = data; axios(configs, resolve, reject); }); } /** * 自动完成 */ static completionUsingPost( params: { /** autoCompleteDto */ autoCompleteDto: AutoCompleteDto; } = {} as any, options: IRequestOptions = {} ): Promise<string[]> { return new Promise((resolve, reject) => { let url = basePath + '/search/customize/completion'; const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); let data = params['autoCompleteDto']; configs.data = data; axios(configs, resolve, reject); }); } /** * 自定义数据索引 */ static definedIndexUsingGet( params: { /** param */ param: JsonDataSourceDto; } = {} as any, options: IRequestOptions = {} ): Promise<any> { return new Promise((resolve, reject) => { let url = basePath + '/search/customize/definedIndex'; const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); let data = params['param']; configs.data = data; axios(configs, resolve, reject); }); } /** * 自定义数据索引 */ static definedIndexUsingPost( params: { /** param */ param: JsonDataSourceDto; } = {} as any, options: IRequestOptions = {} ): Promise<any> { return new Promise((resolve, reject) => { let url = basePath + '/search/customize/definedIndex'; const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); let data = params['param']; configs.data = data; axios(configs, resolve, reject); }); } /** * 检索 */ static searchUsingPost( params: { /** param */ param: SearchParamDto; } = {} as any, options: IRequestOptions = {} ): Promise<SearchResultDTO> { return new Promise((resolve, reject) => { let url = basePath + '/search/customize/search'; const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); let data = params['param']; configs.data = data; axios(configs, resolve, reject); }); } } export class IkDictionaryControllerService { /** * IK远程热更新字典接口 */ static getDicUsingGet(options: IRequestOptions = {}): Promise<string> { return new Promise((resolve, reject) => { let url = basePath + '/search/hot-words'; const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); let data = null; configs.data = data; axios(configs, resolve, reject); }); } /** * 索引历史数据更新 */ static updateByQueryUsingPost( params: { /** indexNames */ indexNames?: string; } = {} as any, options: IRequestOptions = {} ): Promise<any> { return new Promise((resolve, reject) => { let url = basePath + '/search/hot-words'; const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); configs.params = { indexNames: params['indexNames'] }; let data = null; configs.data = data; axios(configs, resolve, reject); }); } } export class IndexControllerService { /** * 创建初始化索引 */ static createIndexAndInitUsingPost( params: { /** ip */ ip: string; /** moduleName */ moduleName?: string; /** port */ port: number; } = {} as any, options: IRequestOptions = {} ): Promise<any> { return new Promise((resolve, reject) => { let url = basePath + '/search/index'; const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); configs.params = { ip: params['ip'], moduleName: params['moduleName'], port: params['port'] }; let data = null; configs.data = data; axios(configs, resolve, reject); }); } /** * 删除索引 */ static deleteIndexUsingDelete( params: { /** moduleName */ moduleName: string; } = {} as any, options: IRequestOptions = {} ): Promise<any> { return new Promise((resolve, reject) => { let url = basePath + '/search/index'; const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); configs.params = { moduleName: params['moduleName'] }; let data = null; configs.data = data; axios(configs, resolve, reject); }); } /** * 删除索引数据 */ static deleteIndexContentByQueryUsingDelete( params: { /** moduleName */ moduleName: string; } = {} as any, options: IRequestOptions = {} ): Promise<any> { return new Promise((resolve, reject) => { let url = basePath + '/search/index/content'; const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); configs.params = { moduleName: params['moduleName'] }; let data = null; configs.data = data; axios(configs, resolve, reject); }); } } export interface AutoCompleteDto { /** */ indexNames?: string[]; /** */ keyWord?: string; /** */ searchField?: string; /** */ size?: number; /** */ sortField?: string; } export interface JsonDataSourceDto { /** */ dataJson?: string; /** */ indexName?: string; /** */ mappings?: string; /** */ primaryKey?: string; } export interface SearchLogResultDTO { /** */ content?: string; /** */ docBoostScore?: number; /** */ extraPrimaryContent?: string; /** */ extraSecondaryContent?: string; /** */ lastUpdateTime?: Date; /** */ lastUpdateTimeIntValue?: string; /** */ moduleKey?: string; /** */ moduleName?: string; /** */ moduleShowName?: string; /** */ operationTime?: Date; /** */ operationType?: string; /** 二级模块显示名称 */ secondaryModuleShowName?: string; /** */ title?: string; } export interface SearchParamDto { /** */ indexNames?: string; /** */ keyWord?: string; /** */ pageIndex?: number; /** */ pageSize?: number; } export interface SearchResultDTO { /** */ keyWords?: string; /** */ pageIndex?: number; /** */ pageSize?: number; /** */ resultCollection?: object[]; /** */ searchTime?: number; /** */ summary?: object; /** */ totalCount?: string; /** */ totalPage?: number; } export interface SearchResultDTO_SearchLogResultDTO { /** */ keyWords?: string; /** */ pageIndex?: number; /** */ pageSize?: number; /** */ resultCollection?: SearchLogResultDTO[]; /** */ searchTime?: number; /** */ summary?: object; /** */ totalCount?: string; /** */ totalPage?: number; } export interface TransportAddress { /** */ address?: string; /** */ port?: number; } export interface 索引总览信息 { /** 文件总数 */ docsCount?: string; /** 索引详情 */ indexDetailList?: 索引详情[]; /** 索引存储总大小 */ storageSizeTotal?: number; } export interface 索引详情 { /** 是否支持删除 */ canDelete?: boolean; /** 文件数量 */ docsCount?: string; /** 索引名 */ indexName?: string; /** 索引存储大小(kb) */ storageSize?: number; }
如上红色部分是生成后的文件上手动新加的,可用来将axios替换成自己配置好的(带有拦截器等)
比如我的request
import axios from 'axios' import { UserModule } from '@/store/modules/user' import { tokenStorage } from '@/utils/storage' import { openLoading, closeLoading } from '@/utils/util' import QS from 'qs' import Vue from 'vue' // import { MainModule as AppModule } from '@main/store/app' // import { loginExpired } from './webViewApi' const type = (obj: any) => Object.prototype.toString .call(obj) .slice(8, -1) .toLowerCase() interface IStatusStrategy { [prop: number]: () => void } interface ITypeStrategy { [prop: string]: (error: any) => void } const request = axios.create({ timeout: 150000000 }) let messageError: any const requestConfig = async (config: any) => { if (!config.headers.Authorization && tokenStorage.get() && !config.url.includes('oauth/captcha')) { // 表示非登录请求 config.headers['Authorization'] = 'Bearer ' + tokenStorage.get() // 让每个请求携带自定义token 请根据实际情况自行修改 } if (config.method === 'get') { config.paramsSerializer = function(params: any) { return QS.stringify(params, { arrayFormat: 'repeat' }) } } return config } const responseRes = (res: any) => { const code = res.status if (code !== 200) { Vue.prototype.$message.success(res.statusText) return res } else { return res } } const statusStrategy: IStatusStrategy = { 500() { messageError('服务器请求失败') }, 502() { messageError('网关不可用') }, 503() { messageError('服务不可用') }, 504() { messageError('网关超时') }, 401() { messageError('登录超时,请重新登录!', 3000) UserModule.setLoginExpired(true) }, 404() { messageError('地址无效') } } const typeStrategy: ITypeStrategy = { arraybuffer(error) { const enc = new TextDecoder('utf-8') const err = JSON.parse(enc.decode(new Uint16Array(error.response.data))).error messageError(err, 5000) }, blob(error) { const reader = new FileReader() reader.onload = (e: any) => { try { const data = JSON.parse(e.target.result) messageError(data.error || '系统错误,请联系管理员', 5000) } catch (error) { messageError(e.target.result || '系统错误,请联系管理员', 5000) } } reader.readAsText(error.response.data) } } const statusHandler = (error: any) => { const status = error?.response.status if (!statusStrategy[status]) return statusStrategy[status]() return true } const typeHandler = (error: any) => { const errType = type(error?.response.data) if (typeStrategy[errType]) { typeStrategy[errType](error) } else { const errMsg = error?.response.data.error_description || error?.response.data.error messageError(errMsg || '系统错误,请联系管理员', 5000) } } const responseError = (error: any) => { messageError = Vue.prototype.$message.error if (!error.message.includes('timeout')) statusHandler(error) || typeHandler(error) return Promise.reject(error) } request.interceptors.request.use( (config: any) => { openLoading() return requestConfig(config) }, (error: any) => { closeLoading() Promise.reject(error) } ) request.interceptors.response.use( (res: any) => { closeLoading() return responseRes(res) }, (error: any) => { closeLoading() return responseError(error) } ) export { request }
以上就生成了,直接调用即可,如有不懂可加vx:844271163 备注博客园