马宇豪
2025-02-25 31dcd2ac79af82cc149f34fbfb6ffd3d4a91a3cd
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
import { RouteRecordRaw } from 'vue-router';
import { storeToRefs } from 'pinia';
import { formatTwoStageRoutes, formatFlatteningRoutes, router } from '/@/router/index';
import { dynamicRoutes, notFoundAndNoPower } from '/@/router/route';
import pinia from '/@/stores/index';
import { Session } from '/@/utils/storage';
import { useUserInfo } from '/@/stores/userInfo';
import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
import { useRoutesList } from '/@/stores/routesList';
import { NextLoading } from '/@/utils/loading';
 
 
export async function initFrontEndControlRoutes() {
    if (window.nextLoading === undefined) NextLoading.start();
    if (!Session.get('token')) return false;
    // useUserInfo(pinia).setUserInfos();
    await setAddRoute();
    await setFilterMenuAndCacheTagsViewRoutes();
}
 
 
export async function setAddRoute() {
    await setFilterRouteEnd().forEach((route: RouteRecordRaw) => {
        router.addRoute(route);
    });
}
 
 
export async function frontEndsResetRoute() {
    await setFilterRouteEnd().forEach((route: RouteRecordRaw) => {
        const routeName: any = route.name;
        router.hasRoute(routeName) && router.removeRoute(routeName);
    });
}
 
 
export function setFilterRouteEnd() {
    let filterRouteEnd: any = formatTwoStageRoutes(formatFlatteningRoutes(dynamicRoutes));
    filterRouteEnd[0].children = [...setFilterRoute(filterRouteEnd[0].children), ...notFoundAndNoPower];
    return filterRouteEnd;
}
 
 
export function setFilterRoute(chil: any) {
    const stores = useUserInfo(pinia);
    const { userInfos } = storeToRefs(stores);
    let filterRoute: any = [];
    chil.forEach((route: any) => {
        if (route.meta.roles) {
            route.meta.roles.forEach((metaRoles: any) => {
                userInfos.value.roles.forEach((roles: any) => {
                    if (metaRoles === roles) filterRoute.push({ ...route });
                });
            });
        }
    });
    return filterRoute;
}
 
 
export function setCacheTagsViewRoutes() {
    // 获取有权限的路由,否则 tagsView、菜单搜索中无权限的路由也将显示
    const stores = useUserInfo(pinia);
    const storesTagsView = useTagsViewRoutes(pinia);
    const { userInfos } = storeToRefs(stores);
    let rolesRoutes = setFilterHasRolesMenu(dynamicRoutes, userInfos.value.roles);
    // 添加到 pinia setTagsViewRoutes 中
    storesTagsView.setTagsViewRoutes(formatTwoStageRoutes(formatFlatteningRoutes(rolesRoutes))[0].children);
}
 
 
export function setFilterMenuAndCacheTagsViewRoutes() {
    const stores = useUserInfo(pinia);
    const storesRoutesList = useRoutesList(pinia);
    const { userInfos } = storeToRefs(stores);
    storesRoutesList.setRoutesList(setFilterHasRolesMenu(dynamicRoutes[0].children, userInfos.value.roles));
    setCacheTagsViewRoutes();
}
 
 
export function hasRoles(roles: any, route: any) {
    if (route.meta && route.meta.roles) return roles.some((role: any) => route.meta.roles.includes(role));
    else return true;
}
 
 
export function setFilterHasRolesMenu(routes: any, roles: any) {
    const menu: any = [];
    routes.forEach((route: any) => {
        const item = { ...route };
        if (hasRoles(roles, item)) {
            if (item.children) item.children = setFilterHasRolesMenu(item.children, roles);
            menu.push(item);
        }
    });
    return menu;
}