import { createRouter, createWebHistory } from 'vue-router'
import axios from 'axios'
import store from './store'
const routerHistory = createWebHistory()
const router = createRouter({
history: routerHistory,
routes: [
{
path: '/',
name: 'home',
component: () => import('@/views/Home.vue')
},
{
path: '/login',
name: 'login',
component: () => import('@/views/Login.vue'),
meta: { redirectAlreadyLogin: true }
},
{
path: '/signup',
name: 'signup',
component: () => import('@/views/Signup.vue'),
meta: { redirectAlreadyLogin: true }
},
{
path: '/create',
name: 'create',
component: () => import('@/views/CreatePost.vue'),
meta: { requiredLogin: true }
},
{
path: '/column/:id',
name: 'column',
component: () => import('@/views/ColumnDetail.vue')
},
{
path: '/posts/:id',
name: 'post',
component: () => import('@/views/PostDetail.vue')
}
]
})
router.beforeEach((to, from, next) => {
// 从 vuex store 中获取用户是否登录(user.isLogin)、是否有登录过(token)
const { user, token } = store.state
// 通过 vue-router 的设定,获取各个路由 route 是否是需要登录后
// 才能访问(route.meta.requiredLogin)、登录后就不用访问
// 而是直接跳转(route.meta.redirectAlreadyLogin
const { requiredLogin, redirectAlreadyLogin } = to.meta
if (!user.isLogin) { // 用户没有登录
if (token) { // 用户没有登录,但之前有登陆过,客户端存在有 token
axios.defaults.headers.common.Authorization = `Bearer ${token}`
store.dispatch('fetchCurrentUser').then(() => { // 拿着该 token 去异步获取用户信息,判断 token 是否有效,从而确定用户是否已经登录
if (redirectAlreadyLogin) { // token 有效,用户已经登陆,目标路径是登录后无需再访问,而是直接跳转到首页,比如登录页、注册页
next('/')
} else { // 已经登录,对目标路径直接放行
next()
}
}).catch(e => { // token 认证失败,用户无法登录,进行退出操作,跳转至登录页面,重新登录
console.error(e)
store.commit('logout')
next('login')
})
} else { // 用户没有登录,之前也没有登录过,一切是全新的"游客来访"
if (requiredLogin) { // 游客来访,目标路径是需要登录后才能访问,直接跳转至登录页面,如个人中心、购物车等,
next('login')
} else { // 游客来访,访问主页等大众开放页面,直接放行
next()
}
}
} else { // 用户已经登录
if (redirectAlreadyLogin) { // 已经登陆,目标路径是登录后无需再访问,而是直接跳转到首页,比如登录页、注册页
next('/')
} else { // 已经登录,对目标路径直接放行
next()
}
}
})
export default router 【Vue】Vue-Roter 实现路由配置、权限访问控制
本原创文章未经允许不得转载 | 当前页面:坏蛋格鲁 » 【Vue】Vue-Roter 实现路由配置、权限访问控制
坏蛋格鲁