ke_junjie
2025-06-04 84620534eb627e95811b971a4b552b6a177829bf
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
import * as VueRouter from 'vue-router';
 
export default function($store,$ui){
    const routes = [
      { name: 'default', path: '/', component: () => import('@/pages/screen/Screen1.vue') },
        { name: 'screen1', path: '/1', component: () => import('@/pages/screen/Screen1.vue') },
        { name: 'screen3', path: '/2', component: () => import('@/pages/screen/Screen3.vue') }
    ]
    
    const router = VueRouter.createRouter({
      history: VueRouter.createWebHashHistory(),
      routes
    })
    
    router.beforeEach((to, from) => {
        /* 登录需求判断 */
        if (to.meta.login) {
            let token = $store.getters['user/getToken'];
            if (!token) {
                return {path:'/login'}
            }
        }
        /* 数据出错,页面不在用户权限 */
        if (to.fullPath.startsWith('/sub-')) {
            let __menus = $store.getters['user/getMenusList'];
        }
        
        
        /* 获取路由的完整路径 */
        const __getCurrentRoutePath = function(compareVar,isRoot=true) {
            let res = {error:false,response:[]};
            let _homeRoute = {
                id:'-999999',
                name:'首页',
                path:'/sub-home'
            }
            if (compareVar==='/sub-home') {
                res.response = [_homeRoute]
            } else {
                let menus = $store.getters['user/getMenusList'];
                const parentFields = 'pid';
                let compareFields = 'path';
                if (!isRoot) {
                    compareFields = 'id';
                }
                for (let i=0;i<menus.length;i++) {
                    if (menus[i][compareFields] === compareVar) {
                        res.response.push(menus[i]);
                        if (menus[i][parentFields]) {
                            let childRes = __getCurrentRoutePath(menus[i][parentFields],false)
                            res.response = [...childRes.response,...res.response]
                        }
                        break;
                    }
                }
                /* 路由不在用户菜单权限中 */
                if (isRoot && res.response.length<=0) {
                    res.response = [_homeRoute]
                    res.error = true
                }
            }
            
            return res;
        }
        
        /* 设置菜单tab */
        const __dealMenuTabs = function(isErr) {
            let uobj = $store.getters['user/getUserInfo'];
            if (isErr) {
                $store.commit('system/setMenuTabs',{
                    uid:uobj['user_id'],
                    tabs:[]
                })
                return []
            }
            let oldTemp = $store.getters['system/getMenuTabs'];
            if (to.fullPath==='/sub-home') {
                if (oldTemp.uid !== uobj['user_id']) {
                    $store.commit('system/setMenuTabs',{
                        uid:uobj['user_id'],
                        tabs:[]
                    })
                    return []
                } else {
                    return oldTemp.tabs
                }
            } else {
                let menus = $store.getters['user/getMenusList'];
                let currentMenu = {};
                for (let i=0;i<menus.length;i++) {
                    if (menus[i].path === to.fullPath) {
                        currentMenu = menus[i];
                        break;
                    }
                }
                if (!currentMenu.id) {
                    return oldTemp.tabs;
                } 
                
                if (oldTemp.uid === uobj['user_id']) {
                    let tempFlag = false, newTemp = {...oldTemp};
                    for (let j=0;j<newTemp.tabs.length;j++) {
                        if (newTemp.tabs[j].id === currentMenu.id) {
                            newTemp.tabs[j] = currentMenu;
                            tempFlag = true;
                            break;
                        }
                    }
                    if (!tempFlag) {
                        newTemp.tabs.push(currentMenu)
                    }
                    $store.commit('system/setMenuTabs',newTemp)
                    return newTemp.tabs;
                } else {
                    $store.commit('system/setMenuTabs',{
                        uid:uobj['user_id'],
                        tabs:[currentMenu]
                    })
                    return [currentMenu]
                }
            }
        }
        
        /* 计算设置 需要加载的子页面的组件 */
        const _setNewActiveSubpages = function(tabs,toPage) {
            let temp = $store.getters['system/getActiveSubpages'];
            let res = [...temp];
            let refreshFlag = false, _count=0,doNew=true;
            while(_count<res.length) {
                if (doNew && res[_count]===toPage) {
                    doNew = false
                }
                /* 除home,不在tab中的页面不需要预加载和保存,如此方可保证再次打开这些页面的时候会刷新该页面 */
                let needDel = true;
                if (res[_count]==='home') {
                    needDel = false;
                } else {
                    for (let i=0;i<tabs.length;i++) {
                        if (tabs[i].path === '/sub-'+ res[_count]) {
                            needDel = false;
                            break;
                        }
                    }    
                }
                if (needDel) {
                    res.splice(_count,1);
                    refreshFlag = true;
                } else {
                    _count++;
                }
            }
            if (doNew) {
                res.push(toPage)
                refreshFlag = true;
            }
            if (refreshFlag) {
                $store.commit('system/setActiveSubpages',res)
            }
        }
        
        /* 子页面数据处理 */
        const __dealSubpagesData = function(toObj){
            let res = {flag:true,path:''}
            if (toObj.fullPath.startsWith('/sub-')) {
                /* 当前路由的子页面 */
                let _changePage = toObj.params.pagePath;
                /* 当前子页面的菜单路径 */
                let fullCurPath = __getCurrentRoutePath(toObj.fullPath);
                if (fullCurPath.error) {
                    res.flag = false
                    res.path = '/sub-home'
                    _changePage = 'home'
                } 
                
                /* 保存当前需要显示的子页面的菜单路径 */
                $store.commit('system/setCurrentFullMenuPath',fullCurPath.response)
                /* 保存当前需要显示的子页面的后缀 */
                $store.commit('system/setVisibleSubpage',_changePage);
                
                /* 保存当前需要显示的菜单tab */
                let newTabs = __dealMenuTabs(fullCurPath.error)
                
                /* 保存当前需要加载的子页面的组件,需要确认新的菜单tabs之后再执行 */
                _setNewActiveSubpages(newTabs,_changePage)
            }
            return res;
        }
        
        /* 最终页面跳转 */
        let finalFlag = __dealSubpagesData(to);
        if (!finalFlag.flag) {
            $ui.ElMessage.error('页面无权访问!')
            return {path:finalFlag.path}
        } 
        
        return true
    })
    
    return router
}