wyg
2024-06-14 a57dc2fae73d6e0dd315a120ca43ee685a6c7b7c
提交 | 用户 | 时间
a57dc2 1 import auth from '@/plugins/auth'
W 2 import router, { constantRoutes, dynamicRoutes } from '@/router'
3 import { getRouters } from '@/api/menu'
4 import Layout from '@/layout/index'
5 import ParentView from '@/components/ParentView'
6 import InnerLink from '@/layout/components/InnerLink'
7
8 const permission = {
9   state: {
10     routes: [],
11     addRoutes: [],
12     defaultRoutes: [],
13     topbarRouters: [],
14     sidebarRouters: []
15   },
16   mutations: {
17     SET_ROUTES: (state, routes) => {
18       state.addRoutes = routes
19       state.routes = constantRoutes.concat(routes)
20     },
21     SET_DEFAULT_ROUTES: (state, routes) => {
22       state.defaultRoutes = constantRoutes.concat(routes)
23     },
24     SET_TOPBAR_ROUTES: (state, routes) => {
25       state.topbarRouters = routes
26     },
27     SET_SIDEBAR_ROUTERS: (state, routes) => {
28       state.sidebarRouters = routes
29     },
30   },
31   actions: {
32     // 生成路由
33     GenerateRoutes({ commit }) {
34       return new Promise(resolve => {
35         // 向后端请求路由数据
36         getRouters().then(res => {
37           const sdata = JSON.parse(JSON.stringify(res.data))
38           const rdata = JSON.parse(JSON.stringify(res.data))
39           const sidebarRoutes = filterAsyncRouter(sdata)
40           const rewriteRoutes = filterAsyncRouter(rdata, false, true)
41           const asyncRoutes = filterDynamicRoutes(dynamicRoutes);
42           rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true })
43           router.addRoutes(asyncRoutes);
44           commit('SET_ROUTES', rewriteRoutes)
45           commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(sidebarRoutes))
46           commit('SET_DEFAULT_ROUTES', sidebarRoutes)
47           commit('SET_TOPBAR_ROUTES', sidebarRoutes)
48           resolve(rewriteRoutes)
49         })
50       })
51     }
52   }
53 }
54
55 // 遍历后台传来的路由字符串,转换为组件对象
56 function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
57   return asyncRouterMap.filter(route => {
58     if (type && route.children) {
59       route.children = filterChildren(route.children)
60     }
61     if (route.component) {
62       // Layout ParentView 组件特殊处理
63       if (route.component === 'Layout') {
64         route.component = Layout
65       } else if (route.component === 'ParentView') {
66         route.component = ParentView
67       } else if (route.component === 'InnerLink') {
68         route.component = InnerLink
69       } else {
70         route.component = loadView(route.component)
71       }
72     }
73     if (route.children != null && route.children && route.children.length) {
74       route.children = filterAsyncRouter(route.children, route, type)
75     } else {
76       delete route['children']
77       delete route['redirect']
78     }
79     return true
80   })
81 }
82
83 function filterChildren(childrenMap, lastRouter = false) {
84   var children = []
85   childrenMap.forEach((el, index) => {
86     if (el.children && el.children.length) {
87       if (el.component === 'ParentView' && !lastRouter) {
88         el.children.forEach(c => {
89           c.path = el.path + '/' + c.path
90           if (c.children && c.children.length) {
91             children = children.concat(filterChildren(c.children, c))
92             return
93           }
94           children.push(c)
95         })
96         return
97       }
98     }
99     if (lastRouter) {
100       el.path = lastRouter.path + '/' + el.path
101     }
102     children = children.concat(el)
103   })
104   return children
105 }
106
107 // 动态路由遍历,验证是否具备权限
108 export function filterDynamicRoutes(routes) {
109   const res = []
110   routes.forEach(route => {
111     if (route.permissions) {
112       if (auth.hasPermiOr(route.permissions)) {
113         res.push(route)
114       }
115     } else if (route.roles) {
116       if (auth.hasRoleOr(route.roles)) {
117         res.push(route)
118       }
119     }
120   })
121   return res
122 }
123
124 export const loadView = (view) => {
125   if (process.env.NODE_ENV === 'development') {
126     return (resolve) => require([`@/views/${view}`], resolve)
127   } else {
128     // 使用 import 实现生产环境的路由懒加载
129     return () => import(`@/views/${view}`)
130   }
131 }
132
133 export default permission