import store from '../../store' // 状态管理 import { encodeRedirectUrl } from '../../common/util.js' import Request from './request.js' import Config from '../config.js' import { wechatAutoLogin } from '../api/user.js'; export const http = new Request(); // 设置全局配置 http.setConfig((config) => { config.baseUrl = Config.baseUrl; config.header = { 'Content-Type': 'application/json;charset=UTF-8' }; return config }) // 请求之前拦截器 http.interceptor.beforeRequest((config, cancel) => { // console.log('请求前拦截', config.url, config) // 登录校验 let accessToken = store.getters.accessToken; let activityId = store.getters.activityId; // console.log('get.accessToken', accessToken, activityId); if (!config.muteLogin) { if (!accessToken) { console.error('needLogin request'); cancel('登录过期,尝试重试'); // 取消请求 console.info('needLogin request', 'silentReload'); silentReload(config.curd === 'save'); return; } config.header['token'] = accessToken; // config.url += '?token=' + accessToken; // config.header['Cookie'] = 'token=' + accessToken; // uploadFile时,不能传header,慎用这种方式 } config.url += (config.url.indexOf('?') === -1 ? '?' : '&') + 'activity_id=' + activityId; return config; }) // 请求之后拦截器 http.interceptor.afterRequest((response) => { // console.log('请求后拦截', response); // 系统错误 if (response.statusCode === 500) { console.error('系统错误'); setTimeout(() => { uni.showToast({ title: '系统错误', icon: 'none', mask: true, duration: 2000 }) }, 50); return [response]; } let data = response.data; // 网络错误 if (!data) { console.error('网络错误'); setTimeout(() => { uni.showToast({ title: '网络错误', icon: 'none', mask: true, duration: 2000 }) }, 50) return [response]; } if (typeof data === 'string') { data = JSON.parse(data) } // 正常请求 if (data.code === 1) { return [0, data.data || data.msg]; } // 系统错误 console.warn('invalid request', data.msg); switch (data.code) { case 401: // 认证失败 console.error('needLogin 401'); store.commit('delAccessToken'); // 删除token console.info('needLogin 401', 'silentReload'); silentReload(response.config.curd === 'save'); break; case 402: // 小程序自动登录失败 break; default: // 错误提示 setTimeout(() => { uni.showToast({ title: data.msg || '网络错误', icon: 'none', mask: true, duration: 2000 }) }, 50) if (data.code === 403) { // 活动无效 store.commit('delAccessToken'); // 删除token store.commit('delActivityId'); // 删除活动ID smartLogin(''); } break; } return [response]; }) /** * 获取 login code */ export function silentReload(warning = false, redirectUrl = null) { if (warning) { setTimeout(() => { uni.showToast({ title: '鉴权失败,请重新操作', icon: 'none', mask: true, duration: 2000 }) }, 50) return false } if (store.getters.isLock('silentReload')) { return false } console.info('needLogin silentReload') store.commit('lock', 'silentReload') if (redirectUrl === null) { const pages = getCurrentPages() const currentPage = pages[pages.length - 1] redirectUrl = encodeRedirectUrl(currentPage.route, currentPage.options) } // #ifdef MP-WEIXIN // 微信小程序自动登录 uni.reLaunch({ url: '/pages/user/login?redirect=' + redirectUrl }) /* #endif */ // #ifdef H5 // 跳到登录页面或活动列表页 smartLogin(redirectUrl) /* #endif */ return true } /** * 获取 login code */ export function smartLogin(redirectUrl, loginCheck) { if (store.getters.activityId) { // 有缓存的活动ID if (!loginCheck) { // 直接到登录页面 uni.reLaunch({ url: '/pages/user/login?redirect=' + redirectUrl }) } return true; } const globalConfig = store.getters.globalConfig // 配置未正确加载 if (!globalConfig) { setTimeout(() => { uni.showToast({ title: '数据加载失败,请点击右上角“重新进入小程序“', icon: 'none', mask: true, duration: 2000 }) }, 50) return true; } // 存在默认活动 if (globalConfig.default_activity) { if (!loginCheck) { // 直接到登录页面 uni.reLaunch({ url: '/answer_pages/user/login?redirect=' + redirectUrl }) } return true; } // 可以选择活动 if (globalConfig.select_activity) { // 直接到活动列表 uni.reLaunch({ url: '/answer_pages/home/dashboard' }) return true; } // 需要扫码进入 setTimeout(() => { uni.reLaunch({ url: '/answer_pages/user/tips' }) }, 50) return true } export function getRedirectUrl() { let redirectUrl = '/pages/home/index' const pages = getCurrentPages() const currentPage = pages[pages.length - 1] if (currentPage) { if (currentPage.$page) { redirectUrl = currentPage.$page.fullPath } } return redirectUrl }