| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- let base64 = require('../utils/base64.js').Base64;
- import {
- http,
- toast
- } from '@/uni_modules/uview-plus'
- import {
- DEVE_URL,
- PRODUCT_URL
- } from '@/common/config.js'
- import store from '@/store/index.js'
- const CODE_MESSAGE = {
- 0: '未可知错误,可能是因为后端不支持跨域CORS、接口地址不存在等问题引起',
- 200: '服务器成功返回请求数据',
- 201: '新建或修改数据成功',
- 202: '一个请求已经进入后台排队(异步任务)',
- 204: '删除数据成功',
- 400: '发出信息有误',
- 401: '用户没有权限(令牌失效、用户名、密码错误、登录过期)',
- 402: '令牌过期',
- 403: '用户得到授权,但是访问是被禁止的',
- 404: '访问资源不存在',
- 406: '请求格式不可得',
- 410: '请求资源被永久删除,且不会被看到',
- 500: '服务器发生错误',
- 502: '网关错误',
- 503: '服务不可用,服务器暂时过载或维护',
- 504: '网关超时',
- }
- let refreshToking = false
- let requests = []
- let baseURL = ''
- if (process.env.NODE_ENV === 'development') {
- baseURL = DEVE_URL
- } else {
- baseURL = PRODUCT_URL
- }
- // #ifdef H5
- baseURL = ''
- // #endif
- import {
- login
- } from '../config/api.js';
- import Vue from 'vue'
- // 此vm参数为页面的实例,可以通过它引用vuex中的变量
- const requestInterceptors = (vm) => {
- /**
- * axios请求拦截器配置
- * @param config
- * @returns {any}
- */
- const requestConf = (config) => {
- // 初始化请求拦截器时,会执行此方法,此时data为undefined,赋予默认{}
- config.data = config.data || {}
- let token = uni.getStorageSync('access_token');
- if (token) config.header['Blade-Auth'] = `Bearer ${token}`
- // if (token) config.headers['Blade-Auth'] = `Bearer ${token}`
- // 根据custom参数中配置的是否需要token,添加对应的请求头
- config.header['Authorization'] = `Basic ${base64.encode('saber:saber_secret')}`
- // uni.showLoading({
- // title: '加载中...',
- // mask: true
- // })
- return config
- }
- /**
- * 刷新刷新令牌
- * @param config 过期请求配置
- * @returns {any} 返回结果
- */
- const tryRefreshToken = async (config) => {
- if (!refreshToking) {
- refreshToking = true
- try {
- const params = {}
- params.grantType = 'refresh_token'
- params.refreshToken = uni.getStorageSync('refresh_token')
- const data = await store.dispatch('refreshToken', params);
- console.log('刷新成功,返回:')
- console.log(data)
- if (data.access_token) {
- requests.forEach((cb) => cb(data.access_token))
- requests = []
- return uni.$u.http.middleware(requestConf(config))
- }
- } catch (error) {
- console.error('refreshToken error =>', error)
- // 使用 store 的 action 处理未登录状态
- const pages = getCurrentPages();
- const currentPage = pages[pages.length - 1];
- const redirectPath = currentPage ? currentPage.route : '';
- store.dispatch('handleUnauthorized', redirectPath);
- return Promise.reject(error)
- } finally {
- refreshToking = false
- }
- } else {
- return new Promise((resolve) => {
- requests.push(() => {
- resolve(uni.$u.http.middleware(requestConf(config)))
- })
- })
- }
- }
- // 初始化请求配置
- uni.$u.http.setConfig((config) => {
- /* config 为默认全局配置*/
- config.baseURL = baseURL; /* 根域名 */
- return config
- })
- // 请求拦截
- uni.$u.http.interceptors.request.use(requestConf, config => { // 可使用async await 做异步操作
- return Promise.reject(config)
- })
- // 响应拦截
- uni.$u.http.interceptors.response.use(async (response) => {
- uni.hideLoading()
- /* 对响应成功做点什么 可使用async await 做异步操作*/
- const data = response.data
- if (data.success && data.success == 'true' || data.Code == 0) {
- return data
- }
-
- // 处理未登录和token过期情况
- if (data.code === 401 || data.code === 402) {
- store.commit('userInfo', {});
- store.commit('isLogin', false);
- store.commit('access_token', '');
- store.commit('refresh_token', '');
-
- // 显示提示
- uni.$u.toast(data.code === 401 ? '请先登录' : 'token已过期,请重新登录');
-
- // 获取当前页面路径
- const pages = getCurrentPages();
- const currentPage = pages[pages.length - 1];
- const redirectUrl = currentPage ? encodeURIComponent(currentPage.route) : '';
-
- // 延迟跳转,让用户看到提示
- setTimeout(() => {
- uni.navigateTo({
- url: `/pages/user/login?redirect=/${redirectUrl}`
- });
- }, 1500);
-
- return Promise.reject(data);
- }
-
- // 处理其他状态码
- switch (data.code) {
- case 200:
- case 201:
- return data;
- case 403:
- return vm.$route('/pages/403');
- case 500:
- uni.$u.toast('服务器响应失败');
- return Promise.reject(data);
- }
- // 其他错误统一提示
- const errMsg = data.msg || data.error_description || CODE_MESSAGE[data.code] || '未知错误';
- uni.$u.toast(errMsg);
- return Promise.reject(data);
- }, (error) => {
- uni.hideLoading();
- // 处理网络错误等
- uni.$u.toast('网络请求失败,请检查网络连接');
- return Promise.reject(error);
- })
- }
|