1
1
import { cloneDeep } from 'lodash-es'
2
+ import type { RouteRecordRaw } from 'vue-router'
2
3
import useSettingsStore from './settings'
3
4
import useUserStore from './user'
4
5
import useRouteStore from './route'
5
6
import { resolveRoutePath } from '@/utils'
6
7
import apiApp from '@/api/modules/app'
7
8
import menu from '@/menu'
8
- import type { Menu } from '#/global'
9
+ import type { Menu , Route } from '#/global'
9
10
10
11
const useMenuStore = defineStore (
11
12
// 唯一ID
@@ -15,42 +16,69 @@ const useMenuStore = defineStore(
15
16
const userStore = useUserStore ( )
16
17
const routeStore = useRouteStore ( )
17
18
18
- const menus = ref < Menu . recordMainRaw [ ] > ( [ {
19
- meta : { } ,
20
- children : [ ] ,
21
- } ] )
19
+ const filesystemMenusRaw = ref < Menu . recordMainRaw [ ] > ( [ ] )
22
20
const actived = ref ( 0 )
23
21
24
- // 将多级导航的每一级 path 都转换为完整路径
25
- function convertToFullPath ( menu : any [ ] , path : string = '' ) {
26
- return menu . map ( ( item ) => {
27
- item . path = resolveRoutePath ( path , item . path )
22
+ // 将原始路由转换成导航菜单
23
+ function convertRouteToMenu ( routes : Route . recordMainRaw [ ] ) : Menu . recordMainRaw [ ] {
24
+ const returnMenus : Menu . recordMainRaw [ ] = [ ]
25
+ routes . forEach ( ( item ) => {
26
+ if ( settingsStore . settings . menu . menuMode === 'single' ) {
27
+ returnMenus . length === 0 && returnMenus . push ( {
28
+ meta : { } ,
29
+ children : [ ] ,
30
+ } )
31
+ returnMenus [ 0 ] . children . push ( ...convertRouteToMenuRecursive ( item . children ) )
32
+ }
33
+ else {
34
+ const menuItem : Menu . recordMainRaw = {
35
+ meta : {
36
+ title : item ?. meta ?. title ,
37
+ icon : item ?. meta ?. icon ,
38
+ auth : item ?. meta ?. auth ,
39
+ } ,
40
+ children : [ ] ,
41
+ }
42
+ menuItem . children = convertRouteToMenuRecursive ( item . children )
43
+ returnMenus . push ( menuItem )
44
+ }
45
+ } )
46
+ return returnMenus
47
+ }
48
+ function convertRouteToMenuRecursive ( routes : RouteRecordRaw [ ] , basePath = '' ) : Menu . recordRaw [ ] {
49
+ const returnMenus : Menu . recordRaw [ ] = [ ]
50
+ routes . forEach ( ( item ) => {
51
+ const menuItem : Menu . recordRaw = {
52
+ path : resolveRoutePath ( basePath , item . path ) ,
53
+ meta : {
54
+ title : item ?. meta ?. title ,
55
+ icon : item ?. meta ?. icon ,
56
+ defaultOpened : item ?. meta ?. defaultOpened ,
57
+ auth : item ?. meta ?. auth ,
58
+ menu : item ?. meta ?. menu ,
59
+ link : item ?. meta ?. link ,
60
+ } ,
61
+ }
28
62
if ( item . children ) {
29
- item . children = convertToFullPath ( item . children , item . path )
63
+ menuItem . children = convertRouteToMenuRecursive ( item . children , menuItem . path )
30
64
}
31
- return item
65
+ returnMenus . push ( menuItem )
32
66
} )
67
+ return returnMenus
33
68
}
69
+
34
70
// 完整导航数据
35
71
const allMenus = computed ( ( ) => {
36
- let returnMenus : Menu . recordMainRaw [ ] = [ {
37
- meta : { } ,
38
- children : [ ] ,
39
- } ]
72
+ let returnMenus : Menu . recordMainRaw [ ] = [ ]
40
73
if ( settingsStore . settings . app . routeBaseOn !== 'filesystem' ) {
41
- if ( settingsStore . settings . menu . menuMode === 'single' ) {
42
- returnMenus [ 0 ] . children = [ ]
43
- routeStore . routes . forEach ( ( item ) => {
44
- returnMenus [ 0 ] . children ?. push ( ...item . children as Menu . recordRaw [ ] )
45
- } )
46
- }
47
- else {
48
- returnMenus = routeStore . routes as Menu . recordMainRaw [ ]
74
+ returnMenus = convertRouteToMenu ( routeStore . routesRaw )
75
+ // 如果权限功能开启,则需要对导航数据进行筛选过滤
76
+ if ( settingsStore . settings . app . enablePermission ) {
77
+ returnMenus = filterAsyncMenus ( returnMenus , userStore . permissions )
49
78
}
50
- returnMenus . map ( item => convertToFullPath ( item . children ) )
51
79
}
52
80
else {
53
- returnMenus = menus . value
81
+ returnMenus = filesystemMenusRaw . value
54
82
}
55
83
return returnMenus
56
84
} )
@@ -157,7 +185,7 @@ const useMenuStore = defineStore(
157
185
else {
158
186
accessedMenus = cloneDeep ( menu )
159
187
}
160
- menus . value = accessedMenus . filter ( item => item . children . length !== 0 )
188
+ filesystemMenusRaw . value = accessedMenus . filter ( item => item . children . length !== 0 )
161
189
}
162
190
// 生成导航(后端生成)
163
191
async function generateMenusAtBack ( ) {
@@ -173,7 +201,7 @@ const useMenuStore = defineStore(
173
201
else {
174
202
accessedMenus = cloneDeep ( res . data )
175
203
}
176
- menus . value = accessedMenus . filter ( item => item . children . length !== 0 )
204
+ filesystemMenusRaw . value = accessedMenus . filter ( item => item . children . length !== 0 )
177
205
} ) . catch ( ( ) => { } )
178
206
}
179
207
// 设置主导航
0 commit comments