当前位置:首页 > VUE

vue权限实现

2026-03-07 01:35:41VUE

vue权限实现方案

在Vue项目中实现权限控制通常涉及路由权限、按钮权限和API权限三个方面。以下是常见的实现方法:

路由权限控制

基于用户角色动态生成可访问路由表,使用vue-router的导航守卫进行拦截:

// 在router.beforeEach中校验权限
router.beforeEach((to, from, next) => {
  const hasToken = localStorage.getItem('token')
  if (to.meta.requiresAuth && !hasToken) {
    next('/login')
  } else {
    next()
  }
})

动态添加路由方案:

// 根据用户权限过滤异步路由
const filterAsyncRoutes = (routes, roles) => {
  return routes.filter(route => {
    if (hasPermission(roles, route)) {
      if (route.children) {
        route.children = filterAsyncRoutes(route.children, roles)
      }
      return true
    }
    return false
  })
}

按钮级权限控制

使用自定义指令v-permission实现按钮显隐控制:

vue权限实现

// 注册全局指令
Vue.directive('permission', {
  inserted(el, binding) {
    const { value } = binding
    const permissions = store.getters.permissions
    if (value && !permissions.includes(value)) {
      el.parentNode && el.parentNode.removeChild(el)
    }
  }
})

使用方式:

<button v-permission="'user:add'">添加用户</button>

权限数据管理

建议使用Vuex集中管理权限数据:

// store/modules/permission.js
const state = {
  routes: [],
  addRoutes: []
}

const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes
    state.routes = constantRoutes.concat(routes)
  }
}

后端配合方案

前端应获取后端返回的权限结构数据:

vue权限实现

{
  "roles": ["admin"],
  "permissions": ["user:add", "user:edit"]
}

建议采用JWT进行接口权限验证,在axios拦截器中添加token:

service.interceptors.request.use(config => {
  config.headers['Authorization'] = getToken()
  return config
})

权限指令扩展

对于更复杂的权限判断,可以扩展权限指令:

Vue.directive('permission', {
  bind(el, binding) {
    const permission = binding.value
    const hasPermission = checkPermission(permission)
    if (!hasPermission) {
      el.style.display = 'none'
    }
  }
})

动态菜单实现

根据权限数据生成侧边栏菜单:

computed: {
  routes() {
    return this.$router.options.routes.filter(route => {
      return hasPermission(this.roles, route)
    })
  }
}

以上方案可根据实际项目需求进行组合或调整,建议将权限逻辑封装成独立模块便于维护。

标签: 权限vue
分享给朋友:

相关文章

vue查看更多怎么实现

vue查看更多怎么实现

实现 Vue 的“查看更多”功能 数据截取与显示控制 通过 v-if 或 v-show 控制内容的显示与隐藏。初始状态下只显示部分内容,点击“查看更多”后展开完整内容。 <template&g…

vue实现右下角弹框

vue实现右下角弹框

实现右下角弹框的基本思路 在Vue中实现右下角弹框,通常需要结合CSS定位和Vue的组件化特性。弹框可以通过绝对定位固定在右下角,并通过Vue控制其显示与隐藏。 创建弹框组件 新建一个Vue组件(如…

vue实现打印二维码

vue实现打印二维码

安装二维码生成库 使用 qrcode 或 vue-qrcode 库生成二维码。通过 npm 安装: npm install qrcode vue-qrcode 生成二维码 在 Vue 组…

vue实现后退

vue实现后退

Vue 实现后退功能的方法 在 Vue 中实现后退功能通常可以通过以下几种方式完成,具体取决于应用场景和需求。 使用 window.history API 通过原生 JavaScript 的 win…

vue实现遮罩

vue实现遮罩

Vue 实现遮罩层的方法 在 Vue 中实现遮罩层可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 v-show 或 v-if 控制显示 通过 Vue 的指令动态控制遮罩层的显示与隐藏。…

vue分类实现

vue分类实现

Vue分类实现方法 在Vue中实现分类功能通常涉及数据分组、动态渲染和交互逻辑。以下是几种常见的实现方式: 基于计算属性的分类 通过计算属性对原始数据进行分组处理,适合静态或少量数据分类: com…