import axios from 'axios' import store from '../store' import router from '../router' import { getToken, removeToken } from '@/utils/auth' import { anonUrls } from '../config' import {getRefreshToken, setRefreshToken, setToken} from "./auth"; import {getAuthToken} from "../api/login"; import Vue from 'vue' const Base64 = require('js-base64').Base64 // 创建axios实例 const service = axios.create({ baseURL: '/api/', // api的base_url timeout: 15000, // 请求超时时间 headers: { "Pragma": "no-cache", "Cache-Control": "must-revalidate", "Cache-Control": "no-cache" , "Cache-Control": "no-store", } }) const notSetAuthHeaderUrls = anonUrls; const base64Urls= [ "./uc", "./op", "/umsUsers", "./personnel", "./meeting", "./cms", "./project" ] const needDownloadUrl=[ // "/uum/sysAllAuditLogs/backups" ] // request拦截器 let getTokenByRefreshToken = false; let retryRequests = []; service.interceptors.request.use(config => { let token = Vue.prototype.$Cookies.get('token'); if (!config.headers.ANON && needSetAuthHead(config.url)) { // config.headers['Auth'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 // config.headers['Authorization'] = 'Bearer ' + getToken() config.headers['Authorization'] = 'Bearer ' + getToken() }else if(token !=undefined ){ config.headers['Authorization'] = 'Bearer ' + getToken() } /* if(needBase64(config.url)){ if(config.method=="post"||config.method=="put"){ config.headers.post["Content-Type"] = "application/json;charset=UTF-8"; config.headers.put["Content-Type"]="application/json;charset=UTF-8"; config.data=Base64.encode(JSON.stringify(config.data)); } }*/ return config }, error => { // Do something with request error console.log(error) // for debug Promise.reject(error) }) // respone拦截器 service.interceptors.response.use( response => { //解密 /* if(needBase64(response.config.url)){ if(!needDownload(response.config.url)){ response.data=JSON.parse(Base64.decode(response.data)); } }else if(response.config.url.indexOf("/login") !=-1){ response.data=JSON.parse(Base64.decode(response.data)); }else{ // }*/ /** * code为非20000是抛错 可结合自己业务进行修改 */ // if (response['headers']['content-disposition']) { // const data = response.data; // var fileName = response['headers']['content-disposition'].split(";")[1].split("filename=")[1]; // var index = fileName.lastIndexOf("\""); // if (index == fileName.length - 1) { // var start = 0; // if (fileName.indexOf("\"") == 0) { // start = 1; // } // fileName = fileName.substring(start, index); // } // return { // data, // fileName // } // } if (response['headers']['captcha-uid']) { return response; } const res = response.data; if (res['access_token'] || !res.status) { return response.data; } if (res.status != 200) { if (res.status == 401) { removeToken(); // router.push({ // path: '/login', // }) } else { msg(res.msg); } return Promise.reject(res) } else { return response.data } }, error => { const config = error.config; if (config.url == '/api/./uua/oauth/token') { removeToken(); closeLoading(); router.push({ path: '/login', }) return ;baseProjectEntityList } if (error && error.response) { if (error.response.status == 401) { Vue.prototype.$Cookies.remove('token'); Vue.prototype.$Cookies.remove('userInfo'); if (!getTokenByRefreshToken) { let p = new Promise((resolve) => { retryRequests.push((token) => { config.baseURL = ''; config.headers['Authorization'] = 'Bearer ' + token; resolve(service(config)); }) }); getTokenByRefreshToken = true; getAuthToken(getRefreshToken()).then(res => { if (res.hasOwnProperty('access_token') && res.access_token) { setToken(res['access_token']); setRefreshToken(res['refresh_token']); retryRequests.forEach(cb => cb(getToken())); retryRequests = []; } }).catch(error => { removeToken(); closeLoading(); router.push({ path: '/login', }) }).finally(() => { getTokenByRefreshToken = false; }); return p; } else { return new Promise((resolve) => { retryRequests.push((token) => { config.baseURL = ''; config.headers['Authorization'] = 'Bearer ' + token; resolve(service(config)); }) }); } } else if (error.response.status == 403) { msg("无权访问"); } else if (error.response.status == 500) { msg("系统繁忙,请稍后再试"); } } console.log('err' + error) // for debug // store.dispatch('user/LOGOUT').then(() => { // //location.reload()// 为了重新实例化vue-router对象 避免bug // }) // Message({ // message: error.message, // type: 'error', // duration: 5 * 1000 // }) return Promise.reject(error) } ) const needSetAuthHead = (url) => { return notSetAuthHeaderUrls.indexOf(url) == -1; } const msg = (msg) => { } const needBase64 = (reqUrl) => { var needBaseFlag=false; base64Urls.forEach(url =>{ if(reqUrl.indexOf(url)!=-1){ needBaseFlag=true; } }) return needBaseFlag; } const needDownload = (repUrl) =>{ var needUploadFlag=false; needDownloadUrl.forEach(url =>{ if(repUrl.indexOf(url)!=-1){ needUploadFlag=true; } }) return needUploadFlag; } /* eslint-disable no-proto */ service.__proto__ = axios /* eslint-enable */ export default service