UNPKG

aqsc-mobile-com

Version:

基于uni-ui实现的二次封装

109 lines (104 loc) 3.57 kB
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)