当前位置:首页 > VUE

vue element 实现权限

2026-01-15 22:10:00VUE

权限控制实现方式

在Vue项目中使用Element UI实现权限控制通常涉及前端路由权限和界面元素权限两部分。以下是常见的实现方法:

路由权限控制

基于用户角色动态生成可访问路由列表,通过路由守卫进行拦截:

// router/index.js
router.beforeEach((to, from, next) => {
  const hasToken = localStorage.getItem('token')
  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!hasToken) {
      next('/login')
    } else {
      if (hasPermission(to.meta.roles)) {
        next()
      } else {
        next('/403')
      }
    }
  } else {
    next()
  }
})

function hasPermission(roles) {
  const currentRoles = store.getters.roles
  return roles.some(role => currentRoles.includes(role))
}

界面元素权限控制

使用自定义指令v-permission控制Element UI组件的显示:

// main.js
Vue.directive('permission', {
  inserted(el, binding, vnode) {
    const { value } = binding
    const roles = store.getters.roles

    if (value && value instanceof Array) {
      const hasPermission = roles.some(role => {
        return value.includes(role)
      })

      if (!hasPermission) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    } else {
      throw new Error(`需要指定权限数组,如v-permission="['admin']"`)
    }
  }
})

权限按钮使用示例

在模板中使用v-permission指令控制按钮显示:

<el-button 
  v-permission="['admin']"
  type="primary"
  @click="handleEdit">
  编辑
</el-button>

<el-button 
  v-permission="['admin', 'editor']"
  type="danger"
  @click="handleDelete">
  删除
</el-button>

菜单权限实现

根据用户权限动态生成侧边栏菜单:

// utils/permission.js
export function filterAsyncRoutes(routes, roles) {
  const res = []

  routes.forEach(route => {
    const tmp = { ...route }
    if (hasPermission(roles, tmp)) {
      if (tmp.children) {
        tmp.children = filterAsyncRoutes(tmp.children, roles)
      }
      res.push(tmp)
    }
  })

  return res
}

权限数据管理

建议使用Vuex集中管理权限状态:

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

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

const actions = {
  generateRoutes({ commit }, roles) {
    return new Promise(resolve => {
      let accessedRoutes
      if (roles.includes('admin')) {
        accessedRoutes = asyncRoutes
      } else {
        accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
      }
      commit('SET_ROUTES', accessedRoutes)
      resolve(accessedRoutes)
    })
  }
}

动态路由添加

在用户登录后动态添加权限路由:

// views/login.vue
this.$store.dispatch('user/login', this.loginForm)
  .then(() => {
    this.$store.dispatch('permission/generateRoutes', this.roles)
      .then(accessedRoutes => {
        router.addRoutes(accessedRoutes)
        next({ ...to, replace: true })
      })
  })

以上实现方案结合了Vue Router、Vuex和自定义指令,可以灵活控制路由访问权限和界面元素显示权限。实际项目中可根据具体需求调整权限校验逻辑。

vue element 实现权限

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

相关文章

vue实现按钮组轮换

vue实现按钮组轮换

实现按钮组轮换的方法 在Vue中实现按钮组轮换效果可以通过动态绑定类和事件处理来完成。以下是一种常见的实现方式: 模板部分 <template> <div class="…

vue实现点击旋转轮盘

vue实现点击旋转轮盘

实现点击旋转轮盘效果 在Vue中实现点击旋转轮盘效果,可以通过CSS动画和Vue的数据绑定结合完成。以下是一个完整的实现方案: 准备工作 需要安装Vue.js环境,可以通过CDN引入或使用Vue C…

vue实现通知

vue实现通知

Vue 实现通知功能的方法 使用 Vue 实现通知功能可以通过多种方式实现,以下是一些常见的方法: 使用 Vue 的全局事件总线 在 Vue 中可以通过事件总线实现通知功能。创建一个全局事件总线,…

vue实现计算

vue实现计算

Vue 实现计算的方法 在 Vue 中实现计算功能可以通过多种方式完成,主要包括计算属性(computed)、方法(methods)和侦听器(watch)。以下是具体的实现方法: 计算属性(Comp…

vue实现换肤

vue实现换肤

使用 CSS 变量实现换肤 在 Vue 项目中,可以通过 CSS 变量(Custom Properties)动态切换主题色。CSS 变量可以在运行时修改,适合实现换肤功能。 定义全局 CSS 变量…

vue实现selectable

vue实现selectable

Vue 实现可选择的 Select 组件 在 Vue 中实现一个可选择的 Select 组件,可以通过以下几种方式: 使用原生 HTML select 元素 <template>…