当前位置:首页 > 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)
    })
  }
}

动态路由添加

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

vue element 实现权限

// 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
分享给朋友:

相关文章

vue实现发表

vue实现发表

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

vue实现tap

vue实现tap

Vue 实现 Tap 事件 在移动端开发中,Tap 事件比 Click 事件更常用,因为 Click 事件有 300ms 延迟。以下是几种在 Vue 中实现 Tap 事件的方法。 使用第三方库 安装…

vue实现滚屏

vue实现滚屏

实现滚屏的基本方法 在Vue中实现滚屏效果可以通过多种方式完成,常见的有原生JavaScript滚动方法、第三方库或CSS动画。以下是几种常见实现方式: 使用window.scrollTo或Elem…

vue实现复制

vue实现复制

Vue 实现复制功能 在 Vue 中实现复制功能可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 Clipboard API Clipboard API 是现代浏览器提供的一种原生 AP…

vue实现搜索提示

vue实现搜索提示

Vue实现搜索提示的方法 使用v-model绑定输入框 通过v-model将输入框的值与Vue实例中的数据进行双向绑定,实时获取用户输入内容。 <input v-model="searchQu…

vue实现word在线

vue实现word在线

Vue 实现 Word 在线编辑与预览 方案一:使用 docx.js 与前端解析 安装依赖库 docx 和 file-saver,用于生成和下载 Word 文件: npm install docx…