1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| import { constantRoutes } from '@/router' import { getRouters } from '@/api/menu' import Layout from '@/layout/index.vue' import ParentView from '@/components/ParentView/index.vue' import { defineStore } from 'pinia'
const modules = import.meta.glob('../views/**/*.vue')
export const usePermissionStore = defineStore({ id: 'permission', state: () => { return { routes: [], addRoutes: [], defaultRoutes: [], topbarRouters: [], sidebarRouters: [] } }, actions: { setRoutes(routes: any) { this.addRoutes = routes this.routes = constantRoutes.concat(routes) as any }, setDefaultRoutes(routes: any) { this.defaultRoutes = constantRoutes.concat(routes) as any }, setTopbarRoutes(routes: any) { this.topbarRouters = routes }, setSidebarRouters(routes: any) { this.sidebarRouters = routes }, generateRoutes() { return new Promise((resolve) => { getRouters().then((res) => { const sdata = JSON.parse(JSON.stringify(res.data)) const rdata = JSON.parse(JSON.stringify(res.data)) const defaultData = JSON.parse(JSON.stringify(res.data)) const sidebarRoutes = filterAsyncRouter(sdata) const rewriteRoutes = filterAsyncRouter(rdata, false, true) const defaultRoutes = filterAsyncRouter(defaultData) this.setRoutes(rewriteRoutes) this.setSidebarRouters(constantRoutes.concat(sidebarRoutes)) this.setDefaultRoutes(sidebarRoutes) this.setTopbarRoutes(defaultRoutes) resolve(rewriteRoutes) }) }) } } })
function filterAsyncRouter( asyncRouterMap: any, lastRouter = false, type = false ) { return asyncRouterMap.filter((route: any) => { if (type && route.children) { route.children = filterChildren(route.children) } if (route.component) { if (route.component === 'Layout') { route.component = Layout } else if (route.component === 'ParentView') { route.component = ParentView } else { route.component = loadView(route.component) } } if (route.children != null && route.children && route.children.length) { route.children = filterAsyncRouter(route.children, route, type) } else { delete route.children delete route.redirect } return true }) }
function filterChildren(childrenMap: any, lastRouter: any = false) { let children: any = [] childrenMap.forEach((el: any, index: number) => { if (el.children && el.children.length) { if (el.component === 'ParentView' && !lastRouter) { el.children.forEach((c: any) => { c.path = el.path + '/' + c.path if (c.children && c.children.length) { children = children.concat(filterChildren(c.children, c)) return } children.push(c) }) return } } if (lastRouter) { el.path = lastRouter.path + '/' + el.path } children = children.concat(el) }) return children }
export const loadView = (view: any) => { let res for (const path in modules) { const dir = path.split('views/')[1].split('.vue')[0] if (dir === view) { res = () => modules[path]() } } return res }
|