123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- 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
- }
|