Vue 菜单权限控制

components.ts

// components.js 所有的页面资源  
const Home = () => import('@/views/Home/index.vue');
const CompanyInfo = () => import('@/views/Information/components/CompanyInfo.vue');


export default {
  Home,
  CompanyInfo,
  ....

};

router.ts

import Vue from 'vue'
import VueRouter, { RawLocation }  from 'vue-router'
import Login from '../views/Login/index.vue'
import Home from '../views/Home/index.vue'
import Index from '../views/Index/index.vue'
import store from '@/store'
import { generateRoutes } from './permission'
import service from '@/service/index'
import routeMap  from "@/router/components";

/**
 * 重写路由的push方法
 */
const routerPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location: RawLocation) {
  return (<any>(routerPush.call(this, location))).catch((error: any)=> error)
}

Vue.use(VueRouter)

// 公共路由,全部角色均具有该部分路由权限
const routes = [
  {
    path: '/login',
    name: 'login',
    hidden: true,
    component: Login
  },

  {
    path: '/',
    component: Home,
    redirect: '/dashboard',
    name: '',
    iconCls: 'el-icon-s-help',
    leaf: true,
    children: [
      {
        path: '/dashboard',
        name: '首页',
        component: () => import('../views/Dashboard/index.vue')
      }
    ]
  },
  {
    path: '/',
    component: Home,
    name: '',
    iconCls: 'el-icon-star-on',
    leaf: true,
    hidden: true,  // 路由是否在侧边导航栏中显示
    children: [
      {
        name: '404页面',
        path: '/404',
        component: () => import('../views/ErrorPage/404.vue')
      }
    ]
  }
]


const router = new VueRouter({
  // mode: 'history',
  base: process.env.VUE_APP_BASE_URL,
  routes
})

const formatRoutes = function (routeData) {
  if (!routeData) {
    routeData = {
      name: 'home',
      path: '/home',
      // 组件匹配成功的话才可以访问具体的页面
      component: Home,
      children: [],
    };
  }
  dfsTransFn(routeData,(node)=>{
    node.component=routeMap[node.component]
  })
  return routeData;
};

/**
 *  深度优先遍历
 *  @params {Array} tree 树数据
 *  @params {Array} func 操作函数
 */
const dfsTransFn = (tree, func) => {
  tree.forEach((node) => {
    func(node);
    // 如果子树存在,递归调用
    if (node.children&&node.children.length) {
      dfsTransFn(node.children, func);
    }
  });
  return tree;
};

var flag = true  // 页面刷新标志

router.beforeEach((to, from, next) => {
  if (to.path == '/login') {
    sessionStorage.removeItem('name');
    sessionStorage.removeItem('token');
    // 全局路由tag重置
    // store.dispatch('app/ResetRouter');
    flag = true
  }
  let name = <String>sessionStorage.getItem('name');
  if (!name && to.path !== '/login') {
    next({ path: '/login' })
  } else {
    // 该处进行动态路由生成(当页面刷新时或首次进入该系统时,生成路由)
    if (flag && to.path !== '/login') {
      // flag = false
      router['options'].routes = routes
      // 根据登录角色生成动态路由
      //let generateAsyncRoutes = generateRoutes(asyncRoutes, <string>sessionStorage.getItem('name'))
      service.getAuths({name:name}).then(res => {
        flag = false;
        router['options'].routes = routes
        let {code, msg, data} = res
        if (code==0){
          const menuData =data
          // sessionStorage.setItem('menuData', JSON.stringify(menuData));
          var routeData = formatRoutes(menuData);
          // console.log("==routeData:",routeData)
          router.addRoutes(routeData.concat([
            {path:'*',redirect: '/404'}]));
          router['options'].routes = router['options'].routes.concat(routeData)
          // @ts-ignore
          // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
          next({ ...to, replace: true })
        } else {
          flag = true;
        }
      })
     } else {
      // 以下部分为向全局变量中添加路由历史,形成tag标签
      if (to.path !== '/login') {
        let newPath = {
          name: to.name,
          path: to.fullPath
        }
        // 向全局变量中添加路由
        // store.dispatch("app/AddRouter", newPath)
      }
      next()
    }
  }
});

export default router

后端返回数据格式

[
    {
      "id": 1,
      "path": "/company",
      "component": "Home",
      "name": "企业信息",
      "iconCls": "el-icon-news",
      "leaf": false,
      "hidden": false,
      "pid": 0,
      "children": [
        {
          "id": 2,
          "path": "/companyinfo",
          "component": "CompanyInfo",
          "name": "企业信息查询",
          "iconCls": "el-icon-search",
          "leaf": true,
          "hidden": false,
          "pid": 1,
          "children": null
        },
        {
          "id": 3,
          "path": "/taxcompanyimport",
          "component": "TaxCompanyImport",
          "name": "税务企业导入",
          "iconCls": "el-icon-upload",
          "leaf": true,
          "hidden": false,
          "pid": 1,
          "children": null
        },
        {
          "id": 4,
          "path": "/taxcompanyquery",
          "component": "TaxCompanyQuery",
          "name": "税务企业查询",
          "iconCls": "el-icon-mobile",
          "leaf": true,
          "hidden": false,
          "pid": 1,
          "children": null
        }
      ]
    }
  ]
  
  

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue动态菜单权限控制指的是根据用户的角色或权限动态生成菜单,并根据用户的权限控制菜单的展示和访问。 实现Vue动态菜单权限控制的一种常用方法是通过在前端使用路由和菜单配置来实现。首先,我们需要在后端返回当前用户的角色或权限信息。然后,在前端根据这些信息生成对应的路由和菜单配置。 在Vue中,可以使用`vue-router`来管理路由,使用`v-if`或`v-show`来控制菜单的展示和隐藏。我们可以根据当前用户的权限来动态生成路由和菜单配置,并在路由配置中设置相应的权限验证。 具体的实现步骤如下: 1. 获取用户的角色或权限信息。 2. 根据角色或权限信息动态生成路由配置。可以根据角色配置不同的路由,或者通过权限配置动态生成需要鉴权的路由。 3. 在Vue的路由配置中将生成的路由配置添加到路由表中。 4. 在菜单组件中根据当前用户的角色或权限信息生成菜单配置,并通过`v-if`或`v-show`控制菜单的展示和隐藏。 5. 在路由守卫中进行权限验证,判断当前用户是否有权限访问该路由。如果没有权限,则进行相应的处理,如跳转到登录页或展示无权限页面。 通过以上步骤,我们可以实现Vue动态菜单权限控制。通过根据用户的角色或权限信息生成对应的路由和菜单配置,并在路由配置和菜单组件中进行权限验证和展示控制,实现不同用户的菜单权限控制。这样可以提高系统的安全性和灵活性,使得不同用户可以根据其角色或权限访问对应的功能页面。同时也可以保护敏感操作,提升系统的稳定性和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值