176 lines
4.6 KiB
JavaScript
176 lines
4.6 KiB
JavaScript
|
|
|
||
|
|
import checkTypes from "@/utils/checkTypes";
|
||
|
|
import {urlJoin} from "@/utils/url";
|
||
|
|
import {isEmpty} from "@/utils/tools";
|
||
|
|
import http from './axios'
|
||
|
|
const isDev = process.env.NODE_ENV === 'development'
|
||
|
|
|
||
|
|
const getUrlByCode = function (url, obj = {}) {
|
||
|
|
const reg = /\{([a-zA-Z0-9]+)\}/g
|
||
|
|
const match = url.match(reg) || []
|
||
|
|
let str = url
|
||
|
|
match.forEach(field => {
|
||
|
|
const _field = field.substr(1, field.length - 2)
|
||
|
|
str = str.replace(field, obj[_field] || field)
|
||
|
|
})
|
||
|
|
return str
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取请求地址
|
||
|
|
* @param prefix
|
||
|
|
* @param url
|
||
|
|
*/
|
||
|
|
const getUrl = (prefix, url) => {
|
||
|
|
if (url.startsWith('http') || !prefix) return url
|
||
|
|
if (prefix.startsWith('http')) {
|
||
|
|
return urlJoin(`${prefix}/${url}`)
|
||
|
|
}
|
||
|
|
return urlJoin(`/${prefix}/${url}`)
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 请求处理
|
||
|
|
* @param httpMethod { String } 请求类型
|
||
|
|
* @param fetchUrl { String } 请求地址
|
||
|
|
* @returns {function(...[*]=)}
|
||
|
|
*/
|
||
|
|
const decoratorHandler = function (httpMethod, fetchUrl) {
|
||
|
|
return function (target, propertyKey, descriptor) {
|
||
|
|
const method = descriptor.value
|
||
|
|
descriptor.value = async function (params = {}, options = {}, $logName) {
|
||
|
|
const res = await method.apply(this, [params, options])
|
||
|
|
let _params = params
|
||
|
|
let _options = options
|
||
|
|
if (!isEmpty(res) && checkTypes.isObject(res) && res.params) {
|
||
|
|
_params = res.params
|
||
|
|
_options = res.options
|
||
|
|
}
|
||
|
|
if (this._commonAxiosOptions) {
|
||
|
|
_options = {
|
||
|
|
...this._commonAxiosOptions,
|
||
|
|
..._options
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// 生成请求参数
|
||
|
|
const httpOptions = {
|
||
|
|
method: httpMethod,
|
||
|
|
url: getUrl(this.prefix, getUrlByCode(fetchUrl || propertyKey, _params)),
|
||
|
|
baseURL: '',
|
||
|
|
..._options
|
||
|
|
}
|
||
|
|
if (httpMethod === 'get') {
|
||
|
|
httpOptions.params = _params
|
||
|
|
} else {
|
||
|
|
httpOptions.data = _params
|
||
|
|
}
|
||
|
|
try {
|
||
|
|
const response = await http(httpOptions)
|
||
|
|
if (this.log) return this.log($logName, httpOptions, response)
|
||
|
|
return response
|
||
|
|
} catch (error) {
|
||
|
|
if (this.log) throw this.log($logName, httpOptions, null, error)
|
||
|
|
throw error
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 根据环境过滤地址
|
||
|
|
* @param devUrl { String }
|
||
|
|
* @param prodUrl { String }
|
||
|
|
* @returns {String}
|
||
|
|
*/
|
||
|
|
const filterUrl = function (devUrl, prodUrl) {
|
||
|
|
return (isDev ? devUrl : prodUrl || devUrl) || undefined
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 初始化请求接口前缀
|
||
|
|
* @param devPrefix { String } 开发环境请求地址前缀
|
||
|
|
* @param prodPrefix { String } 生产环境请求地址前缀
|
||
|
|
* @returns {function(*): {new(): {prefix: *}, prototype: {prefix: *}}}
|
||
|
|
* @constructor
|
||
|
|
*/
|
||
|
|
export const Request = (devPrefix, prodPrefix) => {
|
||
|
|
return function (constructor) {
|
||
|
|
return class extends constructor {
|
||
|
|
prefix = isDev ? devPrefix : prodPrefix || devPrefix
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Post请求
|
||
|
|
* @param devUrl { String }
|
||
|
|
* @param prodUrl { String }
|
||
|
|
* @returns {function(...[*]=)}
|
||
|
|
* @constructor
|
||
|
|
*/
|
||
|
|
export const Post = (devUrl, prodUrl) => {
|
||
|
|
let _devUrl = typeof devUrl === 'string' ? devUrl : prodUrl
|
||
|
|
return decoratorHandler.call(this, 'post', filterUrl(_devUrl, prodUrl))
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get请求
|
||
|
|
* @param devUrl { String }
|
||
|
|
* @param prodUrl { String }
|
||
|
|
* @returns {function(...[*]=)}
|
||
|
|
* @constructor
|
||
|
|
*/
|
||
|
|
export const Get = (devUrl, prodUrl) => {
|
||
|
|
let _devUrl = typeof devUrl === 'string' ? devUrl : prodUrl
|
||
|
|
return decoratorHandler.call(this, 'get', filterUrl(_devUrl, prodUrl))
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Put请求注解
|
||
|
|
* @param devUrl { String }
|
||
|
|
* @param prodUrl { String }
|
||
|
|
* @returns {function(...[*]=)}
|
||
|
|
* @constructor
|
||
|
|
*/
|
||
|
|
export const Put = (devUrl, prodUrl) => {
|
||
|
|
let _devUrl = typeof devUrl === 'string' ? devUrl : prodUrl
|
||
|
|
return decoratorHandler.call(this, 'put', filterUrl(_devUrl, prodUrl))
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Delete请求注解
|
||
|
|
* @param devUrl { String }
|
||
|
|
* @param prodUrl { String }
|
||
|
|
* @returns {function(...[*]=)}
|
||
|
|
* @constructor
|
||
|
|
*/
|
||
|
|
export const Delete = (devUrl, prodUrl) => {
|
||
|
|
let _devUrl = typeof devUrl === 'string' ? devUrl : prodUrl
|
||
|
|
return decoratorHandler.call(this, 'delete', filterUrl(_devUrl, prodUrl))
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 为当前方法添加其他内容
|
||
|
|
* @param _options
|
||
|
|
* @return {function(...[*]=)}
|
||
|
|
* @constructor
|
||
|
|
*/
|
||
|
|
export const AxiosOptions = function (_options = {}) {
|
||
|
|
return function (target, propertyKey, descriptor) {
|
||
|
|
// 类
|
||
|
|
if (target.prototype) {
|
||
|
|
return class extends target {
|
||
|
|
_commonAxiosOptions = _options || {}
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
const method = descriptor.value
|
||
|
|
descriptor.value = function (params = {}, options = {}, $logName) {
|
||
|
|
return method.apply(this, [params, {
|
||
|
|
...options,
|
||
|
|
..._options
|
||
|
|
}, $logName])
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|