// http.ts import axios, { AxiosRequestConfig } from 'axios' import NProgress from 'nprogress' import { Action, ElMessageBox, ElMessage } from 'element-plus' import { __getItem } from './storage' import { i18n } from '../i18n' let isOpenMessage = false // 设置请求头和请求路径 axios.defaults.baseURL = '/api' axios.defaults.timeout = 1000000 axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8' axios.interceptors.request.use( (config): AxiosRequestConfig => { const serveConfig: string = window.sessionStorage.getItem('serveConfig') || '' const tokenName = JSON.parse(serveConfig)?.token const tokenValue = __getItem('x-auth-token') if (tokenValue) { // @ts-ignore config.headers[tokenName] = tokenValue } // @ts-ignore config.headers['AUTH-ROUTE'] = window?.location?.pathname || '/resourceDirectory/index' Http.request(config) const language = __getItem('language', 'localStorage') // @ts-ignore config.headers['accept-language'] = language === 'en' ? 'en-US' : 'zh-CN' return config }, (error) => { return error } ) // 响应拦截 axios.interceptors.response.use((res) => { if (res.data.code === 111) { sessionStorage.setItem('token', '') // token过期操作 } Http.response(res) return res }, (err) => { if (err.name === 'CanceledError') return null if (err.response?.status === 401) { if (isOpenMessage) return isOpenMessage = true const serveConfig: string = window.sessionStorage.getItem('serveConfig') || '' const serveConfigObj = JSON.parse(serveConfig) const errMsg = err.response?.data?.message // || err.message ElMessageBox.alert( errMsg || serveConfigObj?.logoutPrompt || i18n.global.t('userLoginInvalid'), i18n.global.t('confirmTips'), { confirmButtonText: i18n.global.t('confirm'), callback: (action: Action) => { // 跳转到登陆 isOpenMessage = false window.location.href = serveConfigObj?.defaultLoginHref || serveConfigObj?.defaultHref }, beforeClose: (action, instance, done) => { done() } } ) return } if (!navigator.onLine) { ElMessage.error({ message: i18n.global.t('networkRequestError') }) return } return Promise.resolve(err) }) interface ResType { data?: object err?: string config: object headers: object } interface HttpInterface { get: (url: string, params?: unknown, noBase?: boolean, config?: Object) => Promise put: (url: string, params?: unknown, noBase?: boolean, config?: Object) => Promise delete: (url: string, params?: unknown, noBase?: boolean, config?: Object) => Promise post: (url: string, params?: unknown, noBase?: boolean, config?: Object) => Promise upload: (url: string, params: unknown, config?: Object) => Promise download: (url: string) => void, request: (config: Object) => void, response: (config: Object) => void, } const Http: HttpInterface = { request (config) {}, response (config) {}, get (url, params, noBase = false, config) { // @ts-ignore let baseUrl = JSON.parse(window?.sessionStorage?.getItem('serveConfig'))?.baseURL || '/api' axios.defaults.baseURL = noBase ? '' : baseUrl return new Promise((resolve, reject) => { NProgress.start() axios .get(url, { params, ...config }) .then((res) => { NProgress.done() resolve(res) }) .catch((err) => { NProgress.done() reject(err) }) }) }, put (url, params, noBase = false, config) { // @ts-ignore let baseUrl = JSON.parse(window?.sessionStorage?.getItem('serveConfig'))?.baseURL || '/api' axios.defaults.baseURL = noBase ? '' : baseUrl return new Promise((resolve, reject) => { NProgress.start() axios .put(url, params, config) .then((res) => { NProgress.done() resolve(res) }) .catch((err) => { NProgress.done() reject(err) }) }) }, post (url, params, noBase = false, config) { // @ts-ignore let baseUrl = JSON.parse(window?.sessionStorage?.getItem('serveConfig'))?.baseURL || '/api' axios.defaults.baseURL = noBase ? '' : baseUrl return new Promise((resolve, reject) => { NProgress.start() axios .post(url, typeof (params) === 'string' ? params : JSON.stringify(params), config) .then((res) => { NProgress.done() resolve(res) }) .catch((err) => { NProgress.done() reject(err) }) }) }, delete (url, params, noBase = false, config) { // @ts-ignore let baseUrl = JSON.parse(window?.sessionStorage?.getItem('serveConfig'))?.baseURL || '/api' axios.defaults.baseURL = noBase ? '' : baseUrl return new Promise((resolve, reject) => { NProgress.start() axios({ method: 'delete', url: url, data: params, ...config }) .then((res) => { NProgress.done() resolve(res) }) .catch((err) => { NProgress.done() reject(err) }) }) }, upload (url, file, config) { return new Promise((resolve, reject) => { NProgress.start() axios .post(url, file, { headers: { 'Content-Type': 'multipart/form-data' }, ...config }) .then((res) => { NProgress.done() resolve(res) }) .catch((err) => { NProgress.done() reject(err) }) }) }, download (url) { const iframe = document.createElement('iframe') iframe.style.display = 'none' document.body.appendChild(iframe) iframe.src = url iframe.onload = function () { // @ts-ignore const iframeDoc = iframe.contentWindow.document // @ts-ignore const resp = JSON.parse(iframeDoc.querySelector('pre').innerHTML) if (!resp.ok) { ElMessage.error(resp.message) document.body.removeChild(iframe) } } } } export { Http }