aqsc-mobile-com
Version:
基于uni-ui实现的二次封装
109 lines (104 loc) • 3.57 kB
JavaScript
import qs from 'qs'
import { useUserStore } from '@/store/modules/user'
const whiteList = [
'/pages/main/login/autoLogin',
'/pages/main/login/index',
'/pages/main/login/404',
'/pages/main/a',
'/pages/main/b',
'/pages/main/c',
]
const list = ['navigateTo', 'redirectTo', 'reLaunch', 'switchTab']
list.forEach((item) => {
// 用遍历的方式分别为,uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab这4个路由方法添加拦截器
uni.addInterceptor(item, {
invoke(e) {
// 调用前拦截 获取用户的token
const userStore = useUserStore()
const token = userStore.token
// 获取当前页面路径(即url去掉"?"和"?"后的参数)
const url = e.url.split('?')[0]
// 判断要打开的页面是否需要验证登录
if (!whiteList.includes(url) && !token) {
uni.showToast({
title: '该页面需要登录才能访问,请先登录',
icon: 'none',
})
uni.reLaunch({ url: '/pages/main/login/index' })
return false
}
// 有token,跳转登录页,定向到首页
if (token && url === '/pages/main/login/index') {
uni.switchTab({ url: '/pages/main/index/index' })
return false
}
},
fail(err) {
// 失败回调拦截
console.log(err)
},
complete() {
// fix: 跳转页面后滚动条位置不在顶部
uni.pageScrollTo({
scrollTop: 0,
duration: 0,
})
},
})
})
// 拦截器配置
const httpInterceptor = {
// 拦截前触发
invoke(options) {
// 非 http 开头需拼接地址
if (!options.url.startsWith('http') && !options.url.includes('/fileservice')) {
options.url = import.meta.env.VITE_APP_API_BASEURL + options.url
}
if (
!options.url.includes('/weworkCompany') &&
!options.url.includes('/jtgs') &&
import.meta.env.MODE !== 'development' &&
uni.getStorageSync('werks')
) {
options.url = '/' + uni.getStorageSync('werks') + options.url
}
// 请求超时 有大文件上传,此处改为10分钟超时
options.timeout = 10 * 60000
// 跨域请求时是否携带凭证(cookies)
options.withCredentials = true
// method 全端适配只支持GET和POST,此处转为大写
options.method = !options.method ? 'GET' : options.method.toLocaleUpperCase()
// 移动端端请求头标识
options.header = {
'source-client': 'app',
...options.header,
}
// 添加 token 请求头标识
const userStore = useUserStore()
const token = userStore.token
if (token) {
options.header.Authorization = 'Bearer ' + token
}
// GET请求序列化处理,解决传数组问题
if (options.method === 'GET' && options.data) {
const newData = qs.stringify(options.data, { indices: false })
delete options.data
if (options.url.includes('?')) {
options.url = `${options.url}&${newData}`
} else {
options.url = `${options.url}?${newData}`
}
}
// POST请求传数组处理
if (
options.method === 'POST' &&
options.header['Content-Type'] === 'application/x-www-form-urlencoded'
) {
options.data = qs.stringify(options.data, { indices: false })
}
},
}
// 拦截 request 请求
uni.addInterceptor('request', httpInterceptor)
// 拦截 uploadFile 文件上传
uni.addInterceptor('uploadFile', httpInterceptor)