wujianwei
2025-08-18 d2afd43a81204ba0a7d7bd3b269565a9f3158be4
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
import {constantRoutes} from '@/router'
import {getRouters} from "@/api/menu";
import {RouteRecordRaw} from "vue-router";
 
import Layout from '@/layout/index.vue'
import ParentView from '@/components/ParentView/index.vue'
import InnerLink from '@/layout/components/InnerLink/index.vue'
import {defineStore} from "pinia";
// 匹配views里面所有的.vue文件 不能用@符号代替 src
const modules = import.meta.glob('@/views/**/*.vue');
 
export interface PermissionState {
    routes: RouteRecordRaw[],
    addRoutes: RouteRecordRaw[],
    defaultRoutes: RouteRecordRaw[],
    topBarRouters: RouteRecordRaw[],
    sidebarRouters: RouteRecordRaw[],
}
 
 
 
 
// 遍历后台传来的路由字符串,转换为组件对象
function filterAsyncRouter(asyncRouterMap: any, lastRouter: boolean = false, type: boolean = false) {
    return asyncRouterMap.filter((route: any) => {
        if (type && route.children) {
            route.children = filterChildren(route.children)
        }
        if (route.component) {
            // Layout ParentView 组件特殊处理
            if (route.component === 'Layout') {
                route.component = Layout
            } else if (route.component === 'ParentView') {
                route.component = ParentView
            } else if (route.component === 'InnerLink') {
                route.component = InnerLink
            } 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) {
    var children: any[] = []
    childrenMap.forEach((el: { children: any[]; component: string; path: string; }, index: any) => {
        if (el.children && el.children.length) {
            if (el.component === 'ParentView' && !lastRouter) {
                el.children.forEach((c) => {
                    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: string) => {
    let res;
 
    for (const path in modules) {
        const dir = path.split('views/')[1].split('.vue')[0];
        if (dir === view) {
            res = () => modules[path]();
        }
    }
    return res;
}
 
 
export const usePermissionStore = defineStore('permission',{
    state:():PermissionState =>({
        routes: [],
        addRoutes: [],
        defaultRoutes: [],
        topBarRouters: [],
        sidebarRouters: [],
    }),
    actions:{
        // 生成路由
        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.addRoutes = rewriteRoutes;
                    this.routes = constantRoutes.concat(rewriteRoutes);
                    this.sidebarRouters = constantRoutes.concat(sidebarRoutes);
                    this.defaultRoutes = constantRoutes.concat(sidebarRoutes);
                    this.topBarRouters = defaultRoutes;
                    resolve(rewriteRoutes)
                })
            })
        },
    }
 
})