当前位置:首页 > 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实现放大效果

使用 CSS transform 实现放大效果 在 Vue 中实现放大效果可以通过 CSS 的 transform: scale() 属性。这种方法简单高效,适合大多数交互场景。 定义一个 CSS…

vue前端分页怎么实现

vue前端分页怎么实现

前端分页实现方法 在Vue中实现前端分页通常涉及数据分割和页面控制逻辑。以下是常见的实现方式: 使用计算属性分页 通过计算属性对数据进行切片处理: computed: { paginatedD…

vue实现多用户登录

vue实现多用户登录

实现多用户登录的基本思路 在Vue中实现多用户登录通常需要结合后端API完成身份验证,并通过前端路由、状态管理(如Vuex或Pinia)和本地存储(如localStorage)来管理用户会话。以下是关…

vue实现菜单栏锚点

vue实现菜单栏锚点

实现锚点菜单的基本思路 在Vue中实现菜单栏锚点功能,主要涉及两个方面:创建可跳转的锚点位置,以及菜单项的点击滚动控制。通过监听滚动事件可以高亮当前可见区域的对应菜单项。 创建页面锚点位置 在需要跳…

vue实现发表

vue实现发表

Vue 实现发表功能 在 Vue 中实现发表功能通常涉及表单处理、数据绑定和网络请求。以下是实现步骤和代码示例: 表单设计与数据绑定 创建一个表单用于输入发表内容,使用 v-model 进行数据双…

vue实现a

vue实现a

Vue 实现 A 功能的方法 在 Vue 中实现 A 功能可以通过多种方式,具体取决于 A 功能的具体需求。以下是几种常见的实现方法: 使用 Vue 组件 通过创建自定义组件来实现 A 功能。组件可…