const install = (Vue, vm) => {
|
// 是否正在刷新的标记
|
let isRefreshing = false
|
// 重试队列,每一项将是一个待执行的函数形式
|
let requests = []
|
|
// 请求拦截器
|
uni.$u.http.interceptors.request.use((config) => {
|
uni.showLoading({
|
title: '加载中',
|
mask: true
|
});
|
const cookies = vm.$store.state.cookies || ''
|
if (cookies) {
|
config.header['doumee-auth-token'] = cookies;
|
}
|
return config
|
}, config => {
|
return Promise.reject(config)
|
})
|
|
// 响应拦截器
|
uni.$u.http.interceptors.response.use((response) => {
|
uni.hideLoading();
|
// 登录过期
|
if (response.data.code === 401 && vm.$store.state.cookies) {
|
if (!isRefreshing) { // 是否已经执行刷新
|
isRefreshing = true
|
uni.login({
|
provider: 'weixin',
|
success: async function (loginRes) {
|
let { code } = loginRes;
|
uni.request({
|
url: vm.$baseUrl + 'system/loginByWxMini',
|
method: "POST",
|
data: { code },
|
success: (res) => {
|
isRefreshing = false
|
if (res.data.data) {
|
vm.$store.commit('setCookies', res.data.data)
|
vm.$u.api.getUserInfo()
|
.then(user => {
|
vm.$store.commit('setUserInfo', user.data)
|
})
|
// 已经刷新了token,将所有队列中的请求进行重试
|
requests.forEach(item => item(res.data.data))
|
requests = []
|
} else {
|
uni.navigateTo({
|
url: '/pages/login/login'
|
})
|
}
|
}
|
});
|
}
|
});
|
}
|
return new Promise((resolve) => {
|
// 将resolve放进队列,用一个函数形式来保存,等token刷新后直接执行
|
requests.push(token => {
|
response.config.header['doumee-auth-token'] = token
|
resolve(uni.$u.http.request(response.config));
|
})
|
})
|
} else if (response.data.code === 401 && !vm.$store.state.cookies) {
|
uni.navigateTo({
|
url: '/pages/login/login'
|
})
|
}
|
if (response.data.code !== 200) {
|
uni.showToast({
|
title: response.data.message,
|
icon: "none",
|
duration: 2000
|
});
|
}
|
return response.data;
|
}, (response) => {
|
uni.hideLoading();
|
return Promise.reject(response)
|
})
|
}
|
|
export default { install }
|