创建 permission.js 文件:

//@unilts/permission.js

// 白名单
const whiteList = [
    '/', // 注意入口页必须直接写 '/'
    '/pages/tabbar/classify/classify', //分类
    '/pages/tabbar/cart/cart', //购物车
    {
        pattern: /^\/pages\/common\/*/
    } //支持正则表达式
];

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) {
                // 获取要跳转的页面路径(url去掉"?"和"?"后的参数)
                const url = e.url.split('?')[0]
                // 判断当前窗口是白名单,如果是则不重定向路由
                let pass
                if (whiteList) {
                    pass = whiteList.some((item) => {
                        if (typeof(item) === 'object' && item.pattern) {
                            return item.pattern.test(url)
                        }
                        return url === item
                    })
                }

                // 不是白名单并且没有token
                let token = uni.getStorageSync('Authorization');
                if (!pass && !token) {
                    // uni.showToast({
                    //     title: '请先登录',
                    //     icon: 'error'
                    // })
                    uni.redirectTo({
                        url: "/pages/common/login/login"
                    })
                    return false
                }
                return e
            },
            fail(err) { // 失败回调拦截
                console.log(err)
            }
        })
    })
}

1、在App.vue下使用:

import routingIntercept from '@/util/permission.js'
export default {
    onLaunch: function() {
        console.warn('当前组件仅支持 uni_modules 目录结构 ,请升级 HBuilderX 到 3.1.0 版本以上!');
        console.log('App Launch');
        // 对路由进行统一拦截,实现路由导航守卫 router.beforeEach 功能
        routingIntercept()
    },

2、在main.js下使用:

import routingIntercept from './utils/permission.js'


//对路由进行统一拦截,实现路由导航守卫router.beforeEach功能
routingIntercept()

注意:以上2种使用方式,任选其一即可。

标签: none

添加新评论