• 使用 vue-element-admin 动态路由渲染


       附上:vue-element-admin 官方文档 vue-element-admin https://panjiachen.github.io/vue-element-admin-site/zh/guide/

       大佬写的权限发现在自己公司上面用并不好使做了点修改费了老大劲 

        1,首先数据库表结构为

    1 CREATE TABLE [dbo].[QD_Router](
    2     Id INT IDENTITY(1,1) NOT NULL,--唯一id
    3     SySCName NVARCHAR](50) NULL,--菜单中文名称
    4     name NVARCHAR(50) NULL ,--菜单英文名称
    5     SysLayer INT NULL,--菜单等级
    6     SysUpId INT NULL,--菜单上级id
    7     )

      2,需要修改srcstoremodulesuser.js 下GetInfo方法

     1  GetInfo({ commit, state }) {
     2       return new Promise((resolve, reject) => {
     3         QueryUserRole().then(response => {
     4           console.log(response)
     5         
     6           resolve(response)
     7         }).catch(error => {
     8           reject(error)
     9         })
    10       })
    11     },

     3. 新建dynamicRoutes.js:该文件中定义需要根据用户权限动态挂载显示的路由

     1 import Layout from '@/layout'
     2 /**
     3  * 动态路由,需要根据用户权限动态挂载
     4  */
     5 const DynamicRoutes = [
     6   {
     7     path: '/system',
     8     component: Layout,
     9     redirect: '/system/user',
    10     name: 'System',
    11     meta: {
    12       title: '系统管理',
    13       icon: 'example',
    14       permission: 'MENU_SYSTEM'
    15     },
    16     children: [
    17       {
    18         path: 'user',
    19         name: 'User',
    20         component: () => import('@/views/system/user/index'),
    21         meta: {
    22           title: '用户管理',
    23           icon: 'table',
    24           permission: 'MENU_SYSTEM_USER'
    25         }
    26       },
    27       {
    28         path: 'role',
    29         name: 'Role',
    30         component: () => import('@/views/system/role/index'),
    31         meta: {
    32           title: '角色管理',
    33           icon: 'table',
    34           permission: 'MENU_SYSTEM_ROLE'
    35         }
    36       },
    37       {
    38         path: 'dict',
    39         name: 'Dict',
    40         component: () => import('@/views/system/dict/index'),
    41         meta: {
    42           title: '字典管理',
    43           icon: 'table',
    44           permission: 'MENU_SYSTEM_DICT'
    45         }
    46       }
    47     ]
    48   },
    49 ]
    50 
    51 export default DynamicRoutes

    4,permission.js:该文件用于路由跳转前的权限校验,如:token校验、获取用户信息生成用户动态菜单等

           

     1 import router from './router'
     2 import store from './store'
     3 import NProgress from 'nprogress' // progress bar
     4 import 'nprogress/nprogress.css' // progress bar style
     5 import { Message } from 'element-ui'
     6 import { getToken } from '@/utils/auth' // getToken from cookie
     7 import { loginCheck } from "@/api/login";
     8 import asyncRouterMap from './router/dynamicRoutes'
     9 
    10 
    11 NProgress.configure({ showSpinner: false })// NProgress configuration
    12 
    13 
    14 const whiteList = ['/login'] // 不重定向白名单
    15 
    16 
    17 //将后台传输的数据与当前路由对比生成用户所属路由
    18 export function recursionRouter(userRouter = [], allRouter = []) {
    19   var realRoutes = []
    20   allRouter.forEach((v) => {
    21 
    22     userRouter.forEach((item) => {
    23       if (v.name == item.name) {
    24 
    25         v.children = recursionRouter(item.SysLayer, v.children)
    26         realRoutes.push(v)
    27 
    28       }
    29     })
    30   })
    31 
    32   return realRoutes
    33 }
    34 //获取后台传输过来的用户权限
    35 export function arrayToTree(arr, SysUpId) {
    36   let temp = [];
    37   let treeArr = arr;
    38   treeArr.forEach((item, index) => {
    39     if (item.SysUpId == SysUpId) {
    40       if (arrayToTree(treeArr, treeArr[index].Id).length > 0) {
    41         treeArr[index].SysLayer = arrayToTree(treeArr, treeArr[index].Id);
    42       }
    43       temp.push(treeArr[index]);
    44     }
    45   });
    46   return temp;
    47 }
    48 router.beforeEach((to, from, next) => {
    49   NProgress.start()
    50   if (getToken()) {
    51     if (to.path === '/login') {
    52       next({ path: '/' })
    53       NProgress.done() /
    54     } else {
    55       if (store.getters.roles.length === 0) {
    56         store.dispatch('GetInfo').then(res => {    
    57          let Hroel = arrayToTree(res,0)
    58          let newRole =  recursionRouter(Hroel,asyncRouterMap)
    59          router.addRoutes(newRole)
    60          router.options.routes = newRole
    61           //在每次刷新时校验token是否过期
    62           loginCheck(getToken()).then(result => {
    63             if (result.code != 200) {
    64               store.dispatch('FedLogOut').then(() => {
    65                 Message.error(err || '登录失效请重新登录')
    66                 next({ path: '/' })
    67               })
    68             }
    69           })
    70           next()
    71         }).catch((err) => {
    72           store.dispatch('FedLogOut').then(() => {
    73             Message.error(err || '登录失效请重新登录')
    74             next({ path: '/' })
    75           })
    76         })
    77       } else {
    78         next()
    79       }
    80     }
    81   } else {
    82     if (whiteList.indexOf(to.path) !== -1) {
    83       next()
    84     } else {
    85       next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页
    86       NProgress.done()
    87     }
    88   }
    89 })
    90 router.afterEach(() => {
    91   NProgress.done() // 结束Progress
    92 })

         

  • 相关阅读:
    html5手机摇一摇
    js全屏滚动效果
    js的 && 和 || 的应用
    VOLTDB基础知识
    WildFly 报错 java.lang.NoClassDefFoundError
    -Linux基础知识2 -文件系统的操作 压缩,解压缩
    Linux基础知识1
    Linux chgrp chown chmod 基础知识
    实例化list
    判断条件为空时需要注意
  • 原文地址:https://www.cnblogs.com/provedl/p/11871317.html
Copyright © 2020-2023  润新知