import axios from 'axios';
import router from '@/router'
import urls from './urls'const base = urls.base;
const base = urls.base;
var instance = axios.create({
timeout: 1000 * 12
});
instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
const toLogin = () => {
window.localStorage.clear();
router.replace({
path: '/login'
});
}
const checkToken = () => {
let expired_time = localStorage.getItem('expired_time') || '';
let key = false;
if (expired_time) {
let nowTime = new Date();
let eprTime = new Date(expired_time);
key = nowTime.getTime() > eprTime.getTime();
}
return key;
}
let isRefreshToken = false;
let refreshSubscribers = []
function subscribeTokenRefresh(cb) {
refreshSubscribers.push(cb);
}
function onRrefreshed(token) {
refreshSubscribers.map(cb => cb(token));
}
function refreshToken() {
return new Promise((resolve, reject) => {
axios.get(base.refresh, {
params: {
token: localStorage.getItem('token')
},
headers: {
'authorization': localStorage.getItem('token')
}
})
.then(res => {
if (res.data.code == 3000) {
localStorage.setItem('token', res.data.data.authorization);
localStorage.setItem("expired_time", res.data.data.expired_time);
resolve();
} else {
if (res.data.code == 2001) {
toLogin();
}
reject()
}
})
.
catch(error => {
reject()
})
})
}
instance.interceptors.request.use((req) => {
let isLogin = localStorage.getItem('isLogin');
let token = localStorage.getItem('token') || '';
req.headers.common['authorization'] = toke let isExpired = checkToken();
if (isLogin && isExpired) {
if (!isRefreshToken) {
isRefreshToken = true;
refreshToken().then(res => {
let token = localStorage.getItem('token') || '';
onRrefreshed(token) refreshSubscribers = []
}).
catch(error => {
refreshSubscribers = [] toLogin();
}).
finally(() => {
isRefreshToken = false;
});
}
let retry = new Promise((resolve, reject) => {
subscribeTokenRefresh((token) => {
req.headers.common['authorization'] = token;
resolve(req)
})
});
return retry;
} else {
return Promise.resolve(req);
}
}
const errorHandle = (status, other) => {
switch (status) {
case 401:
toLogin();
break;
case 403:
setTimeout(() => {
toLogin();
},
1000);
break;
ase 404 : break;
default:
console.log(other);
}
}
instance.interceptors.response.use(res => {
if (res.status === 200) {
if (res.data.code == 3000 || res.data.code == 2000) {
return Promise.resolve(res)
} else {
if (res.data.code == 2006 || res.data.code == 2001) {
toLogin();
} else {
return Promise.reject(res)
}
}
} else {
return Promise.reject(res)
}
},
error => {
const {
response
} = error;
if (response) {
errorHandle(response.status, response.data.message);
return Promise.reject(response);
} else {
return Promise.reject(` {
status: -1,
message: '断网了',
data: null
}`);
}
});
export dfault instance;
console