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 = (config: RequestConfig): Promise> => { 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 = res.data as ResponseData 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