vue路由的使用与鉴权

在 Vue 项目中,使用 vue-router 实现路由管理是构建单页应用(SPA)的核心部分。结合 鉴权机制 可以实现登录验证、权限控制等常见业务需求。


一、Vue Router 基本使用

1. 安装

npm install vue-router@4

2. 配置路由

// src/router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'
import LoginView from '../views/LoginView.vue'

const routes = [
  {
    path: '/',
    name: 'home',
    component: HomeView,
    meta: { requiresAuth: true }
  },
  {
    path: '/login',
    name: 'login',
    component: LoginView
  }
]

const router = createRouter({
  history: createWebHistory(),
  routes
})

export default router

3. 挂载到 Vue 应用

// main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'

createApp(App).use(router).mount('#app')

4. 使用 <router-view><router-link>

<template>
  <div>
    <nav>
      <router-link to="/">首页</router-link> |
      <router-link to="/login">登录</router-link>
    </nav>
    <router-view />
  </div>
</template>

二、路由鉴权实现(登录验证 + 权限控制)

1. 路由元信息(meta)

通过 meta.requiresAuth 标记哪些页面需要登录才能访问。

{
  path: '/dashboard',
  name: 'dashboard',
  component: () => import('../views/Dashboard.vue'),
  meta: { requiresAuth: true }
}

2. 全局前置守卫(导航守卫)

// src/router/index.js
router.beforeEach((to, from, next) => {
  const isAuthenticated = localStorage.getItem('token') // 示例:判断是否登录

  if (to.meta.requiresAuth && !isAuthenticated) {
    next({ name: 'login' }) // 未登录跳转登录页
  } else {
    next() // 正常跳转
  }
})

3. 动态添加路由(按角色权限加载不同页面)

// 用户登录后根据角色添加路由
router.addRoute({
  path: '/admin',
  name: 'admin',
  component: () => import('../views/Admin.vue'),
  meta: { roles: ['admin'] }
})

4. 组件内守卫(可选)

用于组件级别的控制:

export default {
  beforeRouteEnter(to, from, next) {
    // 进入前执行
    next()
  },
  beforeRouteUpdate(to, from, next) {
    // 当前路由变化时触发
    next()
  },
  beforeRouteLeave(to, from, next) {
    // 离开当前组件前确认操作
    const answer = window.confirm('确定要离开吗?')
    if (answer) next()
    else next(false)
  }
}

三、完整鉴权流程示例

1. 登录页面提交逻辑

// LoginView.vue
function login() {
  // 模拟请求登录接口
  api.login(username, password).then(res => {
    localStorage.setItem('token', res.token)
    localStorage.setItem('role', res.role)
    router.push('/')
  })
}

2. 路由守卫中校验角色

router.beforeEach((to, from, next) => {
  const token = localStorage.getItem('token')
  const role = localStorage.getItem('role')

  if (to.meta.requiresAuth && !token) {
    next('/login')
  } else if (to.meta.roles && !to.meta.roles.includes(role)) {
    next('/unauthorized') // 无权限页面
  } else {
    next()
  }
})

四、建议

场景推荐做法
路由懒加载使用 () => import('路径') 提升首屏加载速度
登录状态存储使用 localStorage / vuex/pinia 存储 token/用户信息
权限控制在路由 meta 中设置 roles,并在守卫中校验
未授权页面添加 /unauthorized 页面提示权限不足
异步加载权限路由登录后根据角色动态加载对应菜单
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香蕉可乐荷包蛋

努力写有用的code

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值