Files
intc-vue-h5/src/utils/request.ts
2026-07-12 12:49:10 +08:00

178 lines
5.6 KiB
TypeScript

import config from '@/config'
import { getToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import { toast, showConfirm, tansParams } from '@/utils/common'
import { RequestConfig, ResponseData } from '@/types/request'
import useUserStore from '@/store/modules/user'
let timeout = 10000
const baseUrl = config.baseUrl
const request = <T>(config: RequestConfig): Promise<ResponseData<T>> => {
const metaHeaders = config.headers || {}
// 是否需要设置 token
const isToken = metaHeaders.isToken === false
const silentAuth = metaHeaders.silentAuth === true
config.header = config.header || {}
if (getToken() && !isToken) {
config.header['Authorization'] = 'Bearer ' + getToken()
}
// get请求映射params参数
if (config.params) {
let url = config.url + '?' + tansParams(config.params)
url = url.slice(0, -1)
config.url = url
}
return new Promise((resolve, reject) => {
uni.request({
method: config.method || 'GET',
timeout: config.timeout || timeout,
url: (config.baseUrl || baseUrl) + config.url,
data: config.data,
header: config.header,
dataType: 'json'
}).then(response => {
/* let [error, res] = response
if (error) {
toast('后端接口连接异常')
reject('后端接口连接异常')
return
} */
const res = response
const data: ResponseData<T> = res.data as ResponseData<T>
const code = data.code || 200
// @ts-ignore
const msg: string = errorCode[code] || data.msg || errorCode['default']
if (code === 401) {
const authError = { code: 401, msg: '无效的会话,或者会话已过期,请重新登录。' }
if (!silentAuth) {
showConfirm('登录状态已过期,您可以继续留在该页面,或者重新登录?').then(res => {
if (res.confirm) {
useUserStore().logOut().then(res => {
uni.reLaunch({ url: '/pages/login' })
})
}
})
}
return reject(silentAuth ? authError : authError.msg)
} else if (code === 500) {
toast(msg)
return reject('500')
} else if (code !== 200) {
toast(msg)
return reject(code)
}
resolve(data)
})
.catch(error => {
let { message } = error
if (message === 'Network Error') {
message = '后端接口连接异常'
} else if (message.includes('timeout')) {
message = '系统接口请求超时'
} else if (message.includes('Request failed with status code')) {
message = '系统接口' + message.substr(message.length - 3) + '异常'
}
if (!silentAuth) {
toast(message)
}
reject(error)
})
})
}
export function postAction(url: string, data?: any, isToken: boolean = true) {
return request({ data, url, method: 'POST', headers: { isToken }, })
}
export function getAction(url: string, params?: any, isToken: boolean = true) {
return request({ params, url, method: 'GET', headers: { isToken }, })
}
export function putAction(url: string, data?: any, isToken: boolean = true) {
return request({ data, url, method: 'PUT', headers: { isToken }, })
}
export function deleteAction(url: string, data?: any, isToken: boolean = true) {
return request({ data, url, method: 'DELETE', headers: { isToken }, })
}
export function downloadAction(url: string, data: any = {}, filename: string = 'download.xlsx') {
const token = getToken()
const fullUrl = baseUrl + url
// #ifdef H5
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest()
xhr.open('POST', fullUrl, true)
xhr.responseType = 'blob'
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
if (token) {
xhr.setRequestHeader('Authorization', 'Bearer ' + token)
}
xhr.onload = () => {
if (xhr.status >= 200 && xhr.status < 300) {
const blob = xhr.response
const link = document.createElement('a')
link.href = window.URL.createObjectURL(blob)
link.download = filename
link.click()
window.URL.revokeObjectURL(link.href)
resolve(blob)
} else {
toast('下载文件出现错误')
reject(xhr.status)
}
}
xhr.onerror = () => {
toast('下载文件出现错误')
reject(new Error('download error'))
}
xhr.send(tansParams(data))
})
// #endif
// #ifndef H5
return new Promise((resolve, reject) => {
uni.request({
method: 'POST',
url: fullUrl,
data: tansParams(data),
responseType: 'arraybuffer',
header: {
'Content-Type': 'application/x-www-form-urlencoded',
...(token ? { Authorization: 'Bearer ' + token } : {})
},
success: (res: any) => {
if (res.statusCode !== 200) {
toast('下载文件出现错误')
reject(res.statusCode)
return
}
// #ifdef MP-WEIXIN
const filePath = `${wx.env.USER_DATA_PATH}/${filename}`
uni.getFileSystemManager().writeFile({
filePath,
data: res.data,
success: () => {
uni.openDocument({
filePath,
fileType: 'xlsx',
showMenu: true,
success: resolve,
fail: reject
})
},
fail: reject
})
// #endif
// #ifndef MP-WEIXIN
resolve(res.data)
// #endif
},
fail: (err) => {
toast('下载文件出现错误')
reject(err)
}
})
})
// #endif
}
export default request