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])
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |