import { useUserStore } from "@/store" import storage from "@/utils/storage" import { showMessage } from "./status" import website from '@/config/website' import { Base64 } from 'js-base64' // 防止重复提交 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) } } } // 请求拦截器 function requestInterceptors(http) { http.interceptors.request.use((config) => { const {detail} = useUserStore().$state?.userInfo || {} // 假设有token值需要在头部需要携带 let accessToken = useUserStore()?.$state?.userInfo?.access_token; if (accessToken) { config.header['Blade-Auth'] = 'bearer ' + accessToken; } if (detail?.areaCode) { config.header['areaCode'] = detail.areaCode } // 安全请求header config.header['Blade-Requested-With'] = 'BladeHttpRequest'; // 客户端认证参数 config.header['Authorization'] = 'Basic ' + Base64.encode(website.clientId + ':' + website.clientSecret); return config }, config => { // 可使用async await 做异步操作 return Promise.reject(config) }) } // 响应拦截器 function responseInterceptors(http) { http.interceptors.response.use((response) => { let res = response const status = res.data.error_code || res.data.code || res.statusCode const message = res?.data?.msg || res?.data?.error_description || res?.data?.message || '系统错误' if (status !== 200) { uni.showToast({title: message, icon: 'none'}); return Promise.reject(response); } return response; }, (response) => { let res = response const message = res?.data?.msg || res?.data?.error_description || res?.data?.message || '系统错误' /* 对响应错误做点什么 (statusCode !== 200)*/ uni.showToast({title: message, icon: 'none'}); if (response.statusCode === 401) { const pages = getCurrentPages() const currentPage = pages[pages.length - 1] uni.reLaunch({ url: `/pages/login/index?redirect=/${currentPage.route}` }) } return Promise.reject(response) }) } export { requestInterceptors, responseInterceptors }