当前位置:首页 > VUE

vue项目权限菜单实现

2026-02-25 08:26:24VUE

Vue 项目权限菜单实现方法

基于路由的权限控制

通过路由配置动态生成菜单,结合用户角色过滤可访问的路由。路由配置中添加 meta 字段标记权限:

const routes = [
  {
    path: '/admin',
    component: AdminPanel,
    meta: { requiresAuth: true, roles: ['admin'] }
  }
];

在路由全局守卫中校验权限:

router.beforeEach((to, from, next) => {
  const userRoles = store.getters.roles;
  if (to.matched.some(record => record.meta.roles)) {
    if (!userRoles.some(role => to.meta.roles.includes(role))) {
      next({ path: '/403' });
    }
  }
  next();
});

后端返回菜单结构

后端接口返回用户权限菜单的树形结构,前端动态渲染。接口数据示例:

{
  "menus": [
    {
      "name": "Dashboard",
      "path": "/dashboard",
      "children": []
    }
  ]
}

前端通过递归组件渲染菜单:

vue项目权限菜单实现

<template>
  <el-menu>
    <menu-item v-for="item in menus" :key="item.path" :menu="item" />
  </el-menu>
</template>

<script>
export default {
  components: {
    MenuItem: {
      props: ['menu'],
      template: `
        <el-submenu v-if="menu.children" :index="menu.path">
          <template #title>{{ menu.name }}</template>
          <menu-item v-for="child in menu.children" :key="child.path" :menu="child" />
        </el-submenu>
        <el-menu-item v-else :index="menu.path">{{ menu.name }}</el-menu-item>
      `
    }
  }
}
</script>

权限指令实现

自定义指令控制按钮级权限:

Vue.directive('permission', {
  inserted(el, binding, vnode) {
    const { value } = binding;
    const permissions = store.getters.permissions;
    if (!permissions.includes(value)) {
      el.parentNode.removeChild(el);
    }
  }
});

使用方式:

<button v-permission="'user:delete'">删除用户</button>

动态路由加载

根据权限异步加载路由配置:

vue项目权限菜单实现

// 前端维护全部路由
const asyncRoutes = [
  { path: '/settings', component: () => import('./Settings.vue'), meta: { role: 'admin' } }
];

// 过滤路由
function filterRoutes(routes, roles) {
  return routes.filter(route => {
    if (route.meta && route.meta.roles) {
      return roles.some(role => route.meta.roles.includes(role));
    }
    return true;
  });
}

// 动态添加路由
const allowedRoutes = filterRoutes(asyncRoutes, userRoles);
router.addRoutes(allowedRoutes);

状态管理集成

Vuex 存储权限信息:

const store = new Vuex.Store({
  state: {
    menus: [],
    permissions: []
  },
  mutations: {
    SET_PERMISSIONS(state, payload) {
      state.permissions = payload.permissions;
      state.menus = payload.menus;
    }
  },
  actions: {
    async fetchPermissions({ commit }) {
      const res = await api.getPermissions();
      commit('SET_PERMISSIONS', res.data);
    }
  }
});

按钮级权限组件

封装权限判断组件:

<template>
  <slot v-if="checkPermission" />
</template>

<script>
export default {
  props: {
    permission: String
  },
  computed: {
    checkPermission() {
      return this.$store.getters.permissions.includes(this.permission);
    }
  }
}
</script>

使用方式:

<permission-check permission="user:edit">
  <button>编辑</button>
</permission-check>

标签: 菜单权限
分享给朋友:

相关文章

vue实现菜单调用

vue实现菜单调用

Vue 实现动态菜单调用的方法 使用路由配置生成菜单 在 Vue 项目中,可以通过路由配置自动生成菜单结构。路由配置通常包含 path、name、meta 等信息,这些信息可用于构建菜单项。 //…

css div 制作导航菜单

css div 制作导航菜单

使用 CSS 和 Div 制作导航菜单 导航菜单是网站的重要组成部分,以下是通过 CSS 和 div 元素制作导航菜单的方法。 基本 HTML 结构 创建一个简单的 div 结构作为导航菜单的基础:…

vue前端实现权限

vue前端实现权限

Vue 前端权限实现方案 路由权限控制 使用 Vue Router 的全局前置守卫 beforeEach 进行路由拦截,结合用户的权限列表过滤可访问路由。 router.beforeEach((to…

js实现菜单导航

js实现菜单导航

实现基础菜单导航结构 使用HTML和CSS创建菜单的基本结构,再通过JavaScript添加交互功能。HTML部分通常使用<ul>和<li>标签构建层级: <nav i…

uniapp 长按菜单

uniapp 长按菜单

实现长按菜单的方法 在UniApp中实现长按菜单功能,可以通过以下几种方式完成,具体取决于平台和需求。 使用@longpress事件绑定 在模板中为元素添加@longpress事件监听,触发后显示自…

uniapp权限分配

uniapp权限分配

权限分配的基本概念 在UniApp中,权限分配通常涉及前端权限控制(如页面访问、按钮操作)和后端权限验证(如API接口权限)。前端权限可通过路由守卫、自定义指令等方式实现,后端权限需结合服务端逻辑(如…