来自一枚rookie的项目开发——vue3.0+typescript+element-plus+vue-router4+Pinia之动态路由(下)

路由守卫结合JWT token鉴权控制路由跳转

Pinia使用

import { defineStore } from 'pinia'
import { Entity } from '../global'
import { getMenuUrlSet } from '../utils/index'


export const useStore = defineStore('store', {
    state: () => {
        return {
            accountId: Number,
            token: JSON.parse(JSON.stringify(window.sessionStorage.getItem('token'))),
            menus: [] as Entity.RouterEntity[],
            apis: [],
            menuSet: [] as string[]
        }


    },

    getters: {
        getAccountId: (state) => state.accountId,
        getToken: (state) => state.token,
        getMenus: (state) => state.menus,
        getMenuSet: (state) => state.menuSet
    },

    actions: {
        setAccountId(key: number) {
           
        },
        setToken(key: string) {
            this.token = key
            window.sessionStorage.setItem('token', this.token);
        },
        setMeus(key: Entity.RouterEntity[]) {
            this.menus = JSON.parse(JSON.stringify(key))
            this.setMenuSet(getMenuUrlSet(this.menus,[] as string[]))
        },
        setMenuSet(key: string[]) {
            this.menuSet = key
        }

    },
    // state 数据持久化
    /* persist: {
        enabled: true
    } */
})

Typescript下路由守卫结合token实现前端权限管理

router.beforeEach((to: RouteLocationNormalized, from: RouteLocationNormalized, next: any) => {
    const UserState = useStore();
    if (UserState.getToken) {
        if (JSON.parse(JSON.stringify(UserState.getMenus)).length) {
            if (new Set(UserState.menuSet).has(to.path)) {
                next()
            } else {
                next({ path: "/nav" })
            }
        } else {
            api.login().then(data => {
                UserState.setMeus(data?.data.menuData);
                UserState.setMenuSet(getMenuUrlSet(data?.data.menuData, [] as string[]))
                setTimeout(() => {
                    next({ ...to, replace: true });
                }, 100);
            }).catch(e => {
                window.sessionStorage.removeItem('token')
                next({ path: "/login" })
            });
        }
    } else {
        if (to.path == "/login") {
            next();
        }
        else {
            next({ path: "/login", replace: true })
        }
    }
})
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值