import axios from 'axios' // import type { AxiosRequestConfig } from 'axios'; import { token } from "@/stores/modules/user"; import { message } from "./message"; import router from '@/router'; const TOKEN_KEY = "token"; declare module 'axios' { export interface AxiosRequestConfig { showLoading?: boolean // [自定义属性声明] } } // const { createMessage, createWarningModal } = useMessage() // 创建axios实例 const service = axios.create({ // 服务接口请求 baseURL: "/test-api", // 超时设置 timeout: 15000, headers: { 'Content-Type': 'application/json;charset=utf-8;' }, showLoading: false }) // let loading: any; // const [openFullLoading, closeFullLoading] = useLoading({ // tip: '拼命加载中,请稍后...' // }) //正在请求的数量 let requestCount: number = 0 //显示loading const showLoading = () => { if (requestCount === 0) { //加载中显示样式可以自行修改 // loading = ElLoading.service({ // text: "拼命加载中,请稍后...", // background: 'rgba(0, 0, 0, 0.7)', // spinner: 'el-icon-loading', // }) message.loading('请求中...') } requestCount++ } //隐藏loading const hideLoading = () => { requestCount-- if (requestCount == 0) { // loading.close() message.destroyAll() } } // 请求拦截 service.interceptors.request.use( (config) => { // config.showLoading if (config.showLoading) { showLoading() } if (token) config.headers[TOKEN_KEY] = unref(token); // if (getToken()) { // // 是否需要设置 token放在请求头 // config.headers['token'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 // } // get请求映射params参数 if (config.method === 'get' && config.params) { let url = config.url + '?' for (const propName of Object.keys(config.params)) { const value = config.params[propName] const part = encodeURIComponent(propName) + '=' if (value !== null && typeof value !== 'undefined') { // 对象处理 if (typeof value === 'object') { for (const key of Object.keys(value)) { const params = propName + '[' + key + ']' const subPart = encodeURIComponent(params) + '=' url += subPart + encodeURIComponent(value[key]) + '&' } } else { url += part + encodeURIComponent(value) + '&' } } } url = url.slice(0, -1) config.params = {} config.url = url } return config }, (error) => { // console.log(error) Promise.reject(error) } ) // 响应拦截器 service.interceptors.response.use( async (response: any) => { // console.log('响应拦截器res', response) // if (res.config.showLoading) { // showLoading() // } hideLoading() // 未设置状态码则默认成功状态 const { data, status } = response; if (data instanceof Blob || data instanceof ArrayBuffer) { if (response.headers["content-disposition"]) { const fileName = response.headers["content-disposition"] ?.split(";")[1] ?.split("=")[1]; return { data, fileName, }; } else { return Promise.reject("没有访问权限"); } } const { errCode, code, msg } = data || {}; const errMsg = data?.errMsg || data?.message || msg; // console.log(11, code, errMsg) if(code === 2000){ await router.push('/'); } if (![0, 200].includes(code)) { // if(errMsg==='用户未登录') // { message.error(errMsg);} // else if(errMsg==='密码不正确'){ // message.error(errMsg); // } // else if(errMsg==="账户信息查找为空"){ // message.error(errMsg); // } // else{ message.error("服务器升级维护中,请稍后重试!")}\ message.error(errMsg); return Promise.reject(errMsg); } if (/^[4|5].*/.test(code || errCode || status)) { // console.error('> axios(interceptors.response): ', errMsg); message.error(errMsg); // message.error("服务器访问过多,请稍后重试!"); // 处理未登录,token过期等 情况 // if (code !== 404 && /^[4].*/.test(code || errCode || status)) { // await app.fedLogout(); // } return Promise.reject(data); } return data; }, (error) => { // console.log('err' + error) hideLoading() 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) + '异常' } message.err("服务器升级维护中,请稍后重试!") return Promise.reject(error) } ) export default service