import {
|
useUserStore
|
} from "@/store"
|
import {
|
getToken
|
} from "@/utils/auth"
|
import storage from "@/utils/storage"
|
import {
|
showMessage
|
} from "./status"
|
import website from '@/config/website'
|
import {
|
Base64
|
} from 'js-base64'
|
// 重试队列,每一项将是一个待执行的函数形式
|
let requestQueue = []
|
|
// 防止重复提交
|
const repeatSubmit = config => {
|
const requestObj = {
|
url: config.url,
|
data: typeof config.data === "object" ?
|
JSON.stringify(config.data) : config.data,
|
time: new Date().getTime()
|
}
|
const sessionObj = storage.getJSON("sessionObj")
|
if (!sessionObj) {
|
storage.setJSON("sessionObj", requestObj)
|
} else {
|
const s_url = sessionObj.url // 请求地址
|
const s_data = sessionObj.data // 请求数据
|
const s_time = sessionObj.time // 请求时间
|
const interval = 1000 // 间隔时间(ms),小于此时间视为重复提交
|
if (
|
s_data === requestObj.data &&
|
requestObj.time - s_time < interval &&
|
s_url === requestObj.url
|
) {
|
const message = "数据正在处理,请勿重复提交"
|
console.warn(`[${s_url}]: ${message}`)
|
return Promise.reject(new Error(message))
|
} else {
|
storage.setJSON("sessionObj", requestObj)
|
}
|
}
|
}
|
|
// 是否正在刷新token的标记
|
let isRefreshing = false
|
|
// 刷新token
|
const refreshToken = async (http, config) => {
|
// 是否在获取token中,防止重复获取
|
if (!isRefreshing) {
|
// 修改登录状态为true
|
isRefreshing = true
|
// 等待登录完成
|
await useUserStore().authLogin()
|
// 登录完成之后,开始执行队列请求
|
requestQueue.forEach(cb => cb())
|
// 重试完了清空这个队列
|
requestQueue = []
|
isRefreshing = false
|
// 重新执行本次请求
|
return http.request(config)
|
}
|
|
return new Promise(resolve => {
|
// 将resolve放进队列,用一个函数形式来保存,等登录后直接执行
|
requestQueue.push(() => {
|
resolve(http.request(config))
|
})
|
})
|
}
|
|
function requestInterceptors(http) {
|
http.interceptors.request.use((config) => { // 可使用async await 做异步操作
|
// 假设有token值需要在头部需要携带
|
let accessToken = uni.getStorageSync('accessToken');
|
if (accessToken) {
|
config.header['Blade-Auth'] = 'bearer ' + accessToken;
|
}
|
|
// 安全请求header
|
config.header['Blade-Requested-With'] = 'BladeHttpRequest';
|
// 客户端认证参数
|
config.header['Authorization'] = 'Basic ' + Base64.encode(website.clientId + ':' + website.clientSecret);
|
|
// #ifndef H5
|
let url = config.url
|
if (process.env.NODE_ENV == 'development' && !url.startsWith("http")) {
|
url = url.substring(url.indexOf('/api') + 4)
|
config.url = url
|
}
|
// #endif
|
|
// 额外参数
|
// config.data = config.data || {};
|
// config.data.pf = uni.getSystemInfoSync().platform;
|
// config.data.sys = uni.getSystemInfoSync().system;
|
|
// 演示custom 用处
|
// if (config.custom.auth) {
|
// config.header.token = 'token'
|
// }
|
// if (config.custom.loading) {
|
// uni.showLoading()
|
// }
|
/**
|
/* 演示
|
if (!token) { // 如果token不存在,return Promise.reject(config) 会取消本次请求
|
return Promise.reject(config)
|
}
|
**/
|
return config
|
}, config => { // 可使用async await 做异步操作
|
return Promise.reject(config)
|
})
|
}
|
|
function responseInterceptors(http) {
|
http.interceptors.response.use((response) => {
|
console.log(response, 2222)
|
// 若有数据返回则通过
|
if (response.data.access_token || response.data.key) {
|
return response.data
|
}
|
// 服务端返回的状态码不等于200,则reject()
|
if (response.data.code !== 200) {
|
uni.showToast({
|
title: response.data.msg,
|
icon: 'none'
|
});
|
return Promise.reject(response);
|
}
|
return response.data;
|
}, (response) => {
|
console.log(response, 111)
|
/* 对响应错误做点什么 (statusCode !== 200)*/
|
uni.showToast({
|
title: response.data.msg,
|
icon: 'none'
|
});
|
if (response.statusCode == 401) {
|
const pages = getCurrentPages()
|
const currentPage = pages[pages.length - 1]
|
uni.redirectTo({
|
url: `/pages/login/login-account?redirect=/${currentPage.route}`
|
})
|
}
|
return Promise.reject(response)
|
})
|
}
|
|
export {
|
requestInterceptors,
|
responseInterceptors
|
}
|