当前位置:首页 > VUE

vue权限管理实现

2026-01-19 09:43:20VUE

Vue 权限管理实现方案

基于路由的动态权限控制

router/index.js中定义静态路由和动态路由,通过addRoute方法动态添加路由。结合后端返回的权限标识过滤路由表:

// 示例:过滤动态路由
function 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自定义指令,用于控制DOM元素的显示/隐藏:

// directives/permission.js
export default {
  inserted(el, binding, vnode) {
    const { value } = binding
    const permissions = store.getters && store.getters.permissions

    if (value && value instanceof Array && value.length > 0) {
      const hasPermission = permissions.some(perm => {
        return value.includes(perm)
      })

      if (!hasPermission) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    }
  }
}

按钮级权限控制

在组件中使用权限判断方法控制按钮显示:

vue权限管理实现

<template>
  <button v-if="checkPermission(['admin'])">管理员按钮</button>
</template>

<script>
export default {
  methods: {
    checkPermission(perms) {
      return this.$store.getters.permissions.some(p => perms.includes(p))
    }
  }
}
</script>

菜单权限过滤

根据用户权限过滤导航菜单数据:

// utils/permission.js
export function filterMenus(menus, permissions) {
  return menus.filter(menu => {
    if (menu.meta && menu.meta.permissions) {
      return menu.meta.permissions.some(p => permissions.includes(p))
    }
    return true
  })
}

权限数据持久化

使用vuex-persistedstate插件保持权限状态:

vue权限管理实现

// store/index.js
import createPersistedState from 'vuex-persistedstate'

export default new Vuex.Store({
  plugins: [createPersistedState({
    key: 'auth',
    paths: ['permissions', 'roles']
  })]
})

接口权限拦截

在axios拦截器中验证API权限:

// utils/request.js
service.interceptors.request.use(config => {
  const permission = store.getters.permissions
  if (config.url.includes('/admin/') && !permission.includes('admin')) {
    return Promise.reject(new Error('无权限访问'))
  }
  return config
})

权限初始化流程

在应用入口文件完成权限初始化:

// main.js
router.beforeEach(async (to, from, next) => {
  if (!store.getters.permissions.length) {
    const { permissions } = await store.dispatch('user/getInfo')
    const accessRoutes = await store.dispatch('permission/generateRoutes', permissions)
    router.addRoutes(accessRoutes)
    next({ ...to, replace: true })
  } else {
    next()
  }
})

权限数据格式示例

建议的权限数据结构:

{
  "roles": ["editor"],
  "permissions": ["article:edit", "user:view"],
  "menus": [
    {
      "path": "/articles",
      "meta": { "permissions": ["article:view"] }
    }
  ]
}

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

相关文章

vue表格实现教学

vue表格实现教学

Vue 表格实现方法 使用原生HTML表格 在Vue模板中直接使用HTML的<table>标签,结合v-for动态渲染数据: <template> <table&…

vue查看更多怎么实现

vue查看更多怎么实现

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

vue实现滚动截屏

vue实现滚动截屏

实现滚动截屏的基本思路 滚动截屏通常指对超出可视区域的长页面进行完整截图。在Vue中,可以通过结合DOM操作、Canvas绘制及第三方库实现。以下是具体方法: 使用html2canvas库实现 安装…

在线脑图 vue 实现

在线脑图 vue 实现

在线脑图 Vue 实现方案 使用开源库实现 推荐使用 mind-elixir 或 jsmind 这类开源库,它们专为脑图设计且支持 Vue 集成。 安装依赖: npm install mind…

vue设计与实现目录

vue设计与实现目录

以下是《Vue设计与实现》一书的典型目录结构(根据常见技术书籍及Vue核心内容整理): 响应式系统 响应式数据的基本原理 依赖收集与触发更新 实现简易响应式系统 Proxy与Refle…

vue异步组建实现原理

vue异步组建实现原理

Vue 异步组件实现原理 Vue 的异步组件允许将组件按需加载,通常用于代码分割或延迟加载非关键组件。其核心原理基于 Promise 和动态导入。 基本实现方式 通过 defineAsyncCom…