1
1
import { Reducer } from 'redux' ;
2
2
import memoizeOne from 'memoize-one' ;
3
3
import isEqual from 'lodash/isEqual' ;
4
+ import Policy from '@jiumao/policy' ;
4
5
import { formatMessage } from 'umi-plugin-react/locale' ;
5
6
import { Effect } from '@/models/connect' ;
7
+ import checkAuthority from '@/components/authorized/check-authority' ;
6
8
import { IMenu } from '@/components/sidebar-menu' ;
7
9
import defaultSettings from '@/config/default-settings' ;
8
10
9
11
const { menu } = defaultSettings ;
12
+ let policy : Policy = null ;
10
13
11
- // 将路由数据转换为菜单数据
12
- function formatter (
14
+ function formatterMenu (
13
15
data : IRoute [ ] ,
14
- parentAuthority ?: string [ ] | string ,
15
16
parentName ?: string ,
16
17
) : IMenu [ ] {
17
- return data
18
- . filter ( item => item . name && item . path )
19
- . map ( item => {
20
- const locale = `${ parentName || 'menu' } .${ item . name ! } ` ;
21
- // if enableMenuLocale use item.name,
22
- // close menu international
23
- const name = menu . disableLocal
24
- ? item . name !
25
- : formatMessage ( { id : locale , defaultMessage : item . name ! } ) ;
26
- const result : IMenu = {
27
- ...item ,
28
- name,
29
- locale,
30
- routes : void 0 ,
31
- authority : item . authority || parentAuthority ,
32
- } ;
33
- if ( item . routes ) {
34
- // Reduce memory usage
35
- result . children = formatter ( item . routes , item . authority , locale ) ;
18
+ let newMenus : IMenu [ ] = [ ] ;
19
+
20
+ const menus = data . filter ( item => item . name && item . path ) ;
21
+
22
+ menus . forEach ( item => {
23
+ const locale = `${ parentName || 'menu' } .${ item . name ! } ` ;
24
+
25
+ const name = menu . disableLocal
26
+ ? item . name !
27
+ : formatMessage ( { id : locale , defaultMessage : item . name ! } ) ;
28
+
29
+ const result : IMenu = {
30
+ ...item ,
31
+ name,
32
+ locale,
33
+ routes : void 0 ,
34
+ authority : item . authority || undefined ,
35
+ } ;
36
+
37
+ if ( item . routes ) {
38
+ // Reduce memory usage
39
+ result . children = formatterMenu ( item . routes , locale ) ;
40
+
41
+ if ( ! result . children . length ) {
42
+ return ;
36
43
}
37
- return result ;
38
- } ) ;
44
+ }
45
+
46
+ // 检查权限
47
+ let authResult = checkAuthority ( policy , result . authority ) ;
48
+
49
+ if ( authResult ) {
50
+ newMenus . push ( result ) ;
51
+ }
52
+ } ) ;
53
+
54
+ return newMenus ;
39
55
}
40
56
41
57
// 获取面包屑映射
@@ -54,7 +70,7 @@ const getBreadcrumbNameMap = (menuData: IMenu[]) => {
54
70
return routerMap ;
55
71
} ;
56
72
57
- const memoizeOneFormatter = memoizeOne ( formatter , isEqual ) ;
73
+ const memoizeOneFormatter = memoizeOne ( formatterMenu , isEqual ) ;
58
74
const memoizeOneGetBreadcrumbNameMap = memoizeOne ( getBreadcrumbNameMap , isEqual ) ;
59
75
60
76
// 过滤菜单数据
@@ -97,8 +113,9 @@ const MenuModel: IMenuModel = {
97
113
} ,
98
114
effects : {
99
115
* getMenuData ( { payload, callback } , { put } ) {
100
- const { routes, authority } = payload ;
101
- const originalMenuData = memoizeOneFormatter ( routes , authority ) ;
116
+ const { routes } = payload ;
117
+ policy = payload . policy ;
118
+ const originalMenuData = memoizeOneFormatter ( routes ) ;
102
119
const menuData = filterMenuData ( originalMenuData ) ;
103
120
const breadcrumbNameMap = memoizeOneGetBreadcrumbNameMap ( originalMenuData ) ;
104
121
0 commit comments