新增
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
import { FetchOptions } from 'ofetch'
|
||||
import { RequestCodeEnum, RequestMethodsEnum } from '@/enums/requestEnums'
|
||||
import feedback from '@/utils/feedback'
|
||||
import { merge } from 'lodash-es'
|
||||
import { Request } from './request'
|
||||
import { getApiPrefix, getApiUrl, getVersion } from '../env'
|
||||
import { useUserStore } from '@/stores/user'
|
||||
|
||||
export function createRequest(opt?: Partial<FetchOptions>) {
|
||||
const userStore = useUserStore()
|
||||
// const { setPopupType, toggleShowPopup } = useAccount()
|
||||
const defaultOptions: FetchOptions = {
|
||||
// 基础接口地址
|
||||
baseURL: getApiUrl(),
|
||||
//请求头
|
||||
headers: {
|
||||
version: getVersion()
|
||||
},
|
||||
retry: 2,
|
||||
requestOptions: {
|
||||
apiPrefix: getApiPrefix(),
|
||||
isTransformResponse: true,
|
||||
isReturnDefaultResponse: false,
|
||||
withToken: true,
|
||||
isParamsToData: true,
|
||||
requestInterceptorsHook(options) {
|
||||
const { apiPrefix, isParamsToData, withToken } =
|
||||
options.requestOptions
|
||||
// 拼接请求前缀
|
||||
if (apiPrefix) {
|
||||
options.url = `${apiPrefix}${options.url}`
|
||||
}
|
||||
const params = options.params || {}
|
||||
// POST请求下如果无data,则将params视为data
|
||||
if (
|
||||
isParamsToData &&
|
||||
!Reflect.has(options, 'body') &&
|
||||
options.method?.toUpperCase() === RequestMethodsEnum.POST
|
||||
) {
|
||||
options.body = params
|
||||
options.params = {}
|
||||
}
|
||||
const headers = options.headers || {}
|
||||
if (withToken) {
|
||||
const token = userStore.token
|
||||
headers['token'] = token
|
||||
}
|
||||
options.headers = headers
|
||||
return options
|
||||
},
|
||||
async responseInterceptorsHook(response, options) {
|
||||
const { isTransformResponse, isReturnDefaultResponse } =
|
||||
options.requestOptions
|
||||
//返回默认响应,当需要获取响应头及其他数据时可使用
|
||||
if (isReturnDefaultResponse) {
|
||||
return response
|
||||
}
|
||||
// 是否需要对数据进行处理
|
||||
if (!isTransformResponse) {
|
||||
return response._data
|
||||
}
|
||||
const { code, data, show, msg } = response._data
|
||||
switch (code) {
|
||||
case RequestCodeEnum.SUCCESS:
|
||||
if (show) {
|
||||
msg && feedback.msgSuccess(msg)
|
||||
}
|
||||
return data
|
||||
case RequestCodeEnum.FAIL:
|
||||
if (show) {
|
||||
msg && feedback.msgError(msg)
|
||||
}
|
||||
return Promise.reject(msg)
|
||||
case RequestCodeEnum.LOGIN_FAILURE:
|
||||
userStore.logout()
|
||||
return Promise.reject(data)
|
||||
case RequestCodeEnum.NOT_INSTALL:
|
||||
window.location.replace('/install/install.php')
|
||||
break
|
||||
default:
|
||||
return data
|
||||
}
|
||||
},
|
||||
responseInterceptorsCatchHook(err) {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return new Request(
|
||||
// 深度合并
|
||||
merge(defaultOptions, opt || {})
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
import {
|
||||
FetchOptions,
|
||||
$fetch,
|
||||
$Fetch,
|
||||
FetchResponse,
|
||||
RequestOptions,
|
||||
FileParams,
|
||||
RequestEventStreamOptions
|
||||
} from 'ofetch'
|
||||
import { merge } from 'lodash-es'
|
||||
import { isFunction } from '../validate'
|
||||
import { RequestMethodsEnum } from '@/enums/requestEnums'
|
||||
import { objectToQuery } from '../util'
|
||||
|
||||
export class Request {
|
||||
private requestOptions: RequestOptions
|
||||
private fetchInstance: $Fetch
|
||||
constructor(private fetchOptions: FetchOptions) {
|
||||
this.fetchInstance = $fetch.create(fetchOptions)
|
||||
this.requestOptions = fetchOptions.requestOptions
|
||||
}
|
||||
|
||||
getInstance() {
|
||||
return this.fetchInstance
|
||||
}
|
||||
/**
|
||||
* @description get请求
|
||||
*/
|
||||
get(fetchOptions: FetchOptions, requestOptions?: Partial<RequestOptions>) {
|
||||
return this.request(
|
||||
{ ...fetchOptions, method: RequestMethodsEnum.GET },
|
||||
requestOptions
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* @description post请求
|
||||
*/
|
||||
post(fetchOptions: FetchOptions, requestOptions?: Partial<RequestOptions>) {
|
||||
return this.request(
|
||||
{ ...fetchOptions, method: RequestMethodsEnum.POST },
|
||||
requestOptions
|
||||
)
|
||||
}
|
||||
/**
|
||||
* @description: 文件上传
|
||||
*/
|
||||
uploadFile(options: FetchOptions, params: FileParams) {
|
||||
const formData = new FormData()
|
||||
const customFilename = params.name || 'file'
|
||||
formData.append(customFilename, params.file)
|
||||
if (params.data) {
|
||||
Object.keys(params.data).forEach((key) => {
|
||||
const value = params.data![key]
|
||||
if (Array.isArray(value)) {
|
||||
value.forEach((item) => {
|
||||
formData.append(`${key}[]`, item)
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
formData.append(key, params.data![key])
|
||||
})
|
||||
}
|
||||
return this.request({
|
||||
...options,
|
||||
method: RequestMethodsEnum.POST,
|
||||
body: formData
|
||||
})
|
||||
}
|
||||
/**
|
||||
* @description 请求函数
|
||||
*/
|
||||
request(
|
||||
fetchOptions: FetchOptions,
|
||||
requestOptions?: Partial<RequestOptions>
|
||||
): Promise<any> {
|
||||
let mergeOptions = merge({}, this.fetchOptions, fetchOptions)
|
||||
mergeOptions.requestOptions = merge(
|
||||
{},
|
||||
this.requestOptions,
|
||||
requestOptions
|
||||
)
|
||||
const {
|
||||
requestInterceptorsHook,
|
||||
responseInterceptorsHook,
|
||||
responseInterceptorsCatchHook
|
||||
} = this.requestOptions
|
||||
if (requestInterceptorsHook && isFunction(requestInterceptorsHook)) {
|
||||
mergeOptions = requestInterceptorsHook(mergeOptions)
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
return this.fetchInstance
|
||||
.raw(mergeOptions.url, mergeOptions)
|
||||
.then(async (response: FetchResponse<any>) => {
|
||||
if (
|
||||
responseInterceptorsHook &&
|
||||
isFunction(responseInterceptorsHook)
|
||||
) {
|
||||
try {
|
||||
response = await responseInterceptorsHook(
|
||||
response,
|
||||
mergeOptions
|
||||
)
|
||||
|
||||
resolve(response)
|
||||
} catch (error) {
|
||||
reject(error)
|
||||
}
|
||||
return
|
||||
}
|
||||
resolve(response)
|
||||
})
|
||||
.catch((err) => {
|
||||
if (
|
||||
responseInterceptorsCatchHook &&
|
||||
isFunction(responseInterceptorsCatchHook)
|
||||
) {
|
||||
reject(responseInterceptorsCatchHook(err))
|
||||
return
|
||||
}
|
||||
reject(err)
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user