|
|
import {
|
|
|
ROOTPATH as baseUrl
|
|
|
} from "@/common/config.js"
|
|
|
|
|
|
// 这里的Vue为Vue对象(非创建出来的实例),vm为main.js中“Vue.use(httpInterceptor, app)”这一句的第二个参数,
|
|
|
// 为一个Vue的实例,也即每个页面的"this"
|
|
|
// 如果需要了解这个install方法是什么,请移步:https://uviewui.com/components/vueUse.html
|
|
|
const install = (Vue, vm) => {
|
|
|
// 此为自定义配置参数,具体参数见上方说明
|
|
|
Vue.prototype.$u.http.setConfig({
|
|
|
baseUrl,
|
|
|
showLoading: false, // 是否显示请求中的loading
|
|
|
loadingMask: false, // 展示loading的时候,是否给一个透明的蒙层,防止触摸穿透
|
|
|
loadingText: '', // 请求loading中的文字提示
|
|
|
loadingTime: 800,
|
|
|
originalData: true, // 是否在拦截器中返回服务端的原始数据
|
|
|
// 设置自定义头部content-type
|
|
|
header: {
|
|
|
'content-type': 'application/json;charset=UTF-8'
|
|
|
}
|
|
|
});
|
|
|
|
|
|
// 请求拦截部分,如配置,每次请求前都会执行
|
|
|
Vue.prototype.$u.http.interceptor.request = (config) => {
|
|
|
console.log('config-http', config)
|
|
|
let mkwcancel_lifeData = uni.getStorageSync('mkwcancel_lifeData')
|
|
|
let vuex_token = mkwcancel_lifeData.vuex_token;
|
|
|
if (vuex_token || vm.vuex_token) {
|
|
|
config.header['Authorization'] = `Bearer ${vuex_token || vm.vuex_token}`;
|
|
|
}
|
|
|
|
|
|
return config;
|
|
|
}
|
|
|
|
|
|
// 响应拦截,如配置,每次请求结束都会执行本方法
|
|
|
Vue.prototype.$u.http.interceptor.response = (res) => {
|
|
|
console.log('res-http', res)
|
|
|
|
|
|
// 处理网络错误
|
|
|
if (res.statusCode !== 200) {
|
|
|
let errorMsg = '网络错误'
|
|
|
switch(res.statusCode) {
|
|
|
case 401:
|
|
|
errorMsg = '未授权,请重新登录'
|
|
|
handleAuthError()
|
|
|
break
|
|
|
case 403:
|
|
|
errorMsg = '禁止访问'
|
|
|
break
|
|
|
case 404:
|
|
|
errorMsg = '请求地址不存在'
|
|
|
break
|
|
|
case 500:
|
|
|
errorMsg = '服务器内部错误'
|
|
|
break
|
|
|
default:
|
|
|
errorMsg = `网络错误 ${res.statusCode}`
|
|
|
}
|
|
|
|
|
|
uni.showToast({
|
|
|
icon: "none",
|
|
|
title: errorMsg
|
|
|
})
|
|
|
return Promise.reject(res)
|
|
|
}
|
|
|
|
|
|
// 处理业务逻辑
|
|
|
if (res.data && res.data.hasOwnProperty("errcode")) {
|
|
|
if (res.data.errcode === 1000) {
|
|
|
// 成功
|
|
|
return res.data
|
|
|
} else if (res.data.errcode === 40001) {
|
|
|
// token失效或未认证
|
|
|
handleAuthError()
|
|
|
return Promise.reject(res.data)
|
|
|
} else {
|
|
|
// 其他业务错误
|
|
|
const errorMsg = res.data.msg || '请求失败'
|
|
|
uni.showToast({
|
|
|
icon: "none",
|
|
|
title: errorMsg
|
|
|
})
|
|
|
return Promise.reject(res.data)
|
|
|
}
|
|
|
} else if (res.data && res.data.access_token) {
|
|
|
// 特殊处理登录接口返回的access_token格式
|
|
|
return res.data
|
|
|
} else if (res.data) {
|
|
|
// 其他有数据的响应,直接返回
|
|
|
return res.data
|
|
|
} else {
|
|
|
// 响应格式错误
|
|
|
uni.showToast({
|
|
|
icon: "none",
|
|
|
title: '响应格式错误'
|
|
|
})
|
|
|
return Promise.reject(res)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 处理认证错误的函数
|
|
|
function handleAuthError() {
|
|
|
// 清除本地存储的认证信息
|
|
|
uni.removeStorageSync('mkwcancel_lifeData')
|
|
|
|
|
|
// 清除vuex中的认证信息
|
|
|
if (vm && vm.$u && vm.$u.vuex) {
|
|
|
vm.$u.vuex('vuex_token', '')
|
|
|
vm.$u.vuex('vuex_user', {})
|
|
|
}
|
|
|
|
|
|
// 显示提示
|
|
|
uni.showModal({
|
|
|
title: '认证失效',
|
|
|
content: '登录状态已失效,请重新登录',
|
|
|
showCancel: false,
|
|
|
confirmText: '去登录',
|
|
|
success: function() {
|
|
|
// 跳转到登录页面
|
|
|
uni.reLaunch({
|
|
|
url: '/pages/login/index'
|
|
|
})
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
export default {
|
|
|
install
|
|
|
}
|