当前位置:首页 > 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 实现流程的基本步骤 安装 Vue.js 可以通过 CDN 引入或使用 npm/yarn 安装。 CDN 方式: <script src="https://cdn.jsdelivr.…

vue实现文字

vue实现文字

Vue 中实现文字显示的方法 在 Vue 中实现文字显示可以通过多种方式,包括插值表达式、指令、组件等。以下是几种常见的实现方法: 插值表达式 使用双大括号 {{ }} 进行文本插值,这是 Vue…

vue实现换行

vue实现换行

Vue 中实现换行的几种方法 在 Vue 中实现换行可以通过多种方式,具体取决于使用场景和需求。以下是常见的几种方法: 使用 HTML 的 <br> 标签 在模板中直接使用 <br…

vue实现swiper

vue实现swiper

Vue 中实现 Swiper 的方法 安装 Swiper 依赖 在 Vue 项目中安装 Swiper 和相关依赖: npm install swiper vue-awesome-swiper 全局引…

vue toast实现

vue toast实现

Vue Toast 实现方法 使用第三方库(推荐) 安装 vue-toastification 库,这是一个功能丰富且轻量级的 Vue Toast 插件。 npm install vue-toast…

vue实现气泡

vue实现气泡

Vue 实现气泡效果的方法 在 Vue 中实现气泡效果可以通过 CSS 动画、第三方库或自定义组件完成。以下是几种常见实现方式: 使用纯 CSS 和 Vue 过渡 通过 Vue 的过渡系统结合 CS…