/** * @description 自定义路由拦截 */ // 白名单 const whiteList = [ '/', // 注意入口页必须直接写 '/' // { pattern: /^\/pages\/list.*/ }, // 支持正则表达式 '/pages/component/home', '/pages/component/recycle', '/pages/component/my', '/pages/component/home', '/pages/wxUserInfo', '/pages/subcomponent/inspection-report.vue', '/pages/subcomponent/inspection-detail.vue', { pattern: /^\/pages\/index\/*/ } ] export default async function() { const list = ['navigateTo', 'redirectTo', 'reLaunch', 'switchTab'] // 用遍历的方式分别为,uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab这4个路由方法添加拦截器 list.forEach(item => { uni.addInterceptor(item, { invoke(e) { const url = e.url.split('?')[0]// 获取要跳转的页面路径(url去掉"?"和"?"后的参数) // console.log('url路由拦截-地址', url) if(url!=='/pages/index/index'){ //并缓存要去的页面路由以便用户登录成功后直接跳转 uni.setStorageSync('toRouter', url) // console.log('不是login') } let pass if (whiteList) {// 判断当前窗口是白名单,如果是则不重定向路由 pass = whiteList.some((item) => { if (typeof(item) === 'object' && item.pattern) { return item.pattern.test(url) } return url === item }) } let userInfo = uni.getStorageSync('token') console.log(userInfo,'是否路由导航') // console.log('url路由拦截-用户缓存', pass, userInfo, !userInfo) // 不是白名单并且没有token if (!pass && !userInfo) { uni.showToast({ title: '请先登录', icon: 'none' }) uni.navigateTo({ url: "/pages/index/index" }) return false } return e }, fail(err) { // 失败回调拦截 console.log(err) } }) }) }