fangmingyue 2 years ago
parent
commit
99cb2fca04
5 changed files with 170 additions and 51 deletions
  1. 50
    10
      src/pages/roles/menus.jsx
  2. 44
    9
      src/routes/routes.jsx
  3. 15
    0
      src/services/role.js
  4. 0
    32
      src/utils/arr2Tree.js
  5. 61
    0
      src/utils/array.js

+ 50
- 10
src/pages/roles/menus.jsx View File

1
 import React from 'react';
1
 import React from 'react';
2
-import { Button, Card, Tree, Modal } from 'antd';
2
+import { Button, Card, Tree, message } from 'antd';
3
 import useBool from '@/utils/hooks/useBool';
3
 import useBool from '@/utils/hooks/useBool';
4
-import arr2Tree from '@/utils/arr2Tree';
4
+import { arr2Tree, uniq } from '@/utils/array';
5
+import { getResourceList } from '@/services/role';
5
 
6
 
6
 export default (props) => {
7
 export default (props) => {
7
   const { role } = props;
8
   const { role } = props;
9
   const [loading, startLoading, cancelLoading] = useBool();
10
   const [loading, startLoading, cancelLoading] = useBool();
10
   const [list, setList] = React.useState([]);
11
   const [list, setList] = React.useState([]);
11
   const [treeData, setTreeData] = React.useState([]);
12
   const [treeData, setTreeData] = React.useState([]);
13
+  const treeDictRef = React.useRef();
14
+  const [checkedKeys, setCheckedKeys] = React.useState([]);
15
+  const checkedNodesRef = React.useState([]);
12
 
16
 
13
   const title = role ? `${role.name} - 授权菜单` : '授权菜单';
17
   const title = role ? `${role.name} - 授权菜单` : '授权菜单';
14
 
18
 
15
-  const onSelect = (selectedKeys, info) => {
16
-    console.log('selected', selectedKeys, info);
17
-  };
18
-  const onCheck = (checkedKeys, info) => {
19
-    console.log('onCheck', checkedKeys, info);
19
+  const onCheck = (keys, info) => {
20
+    const { checkedNodes } = info;
21
+    checkedNodesRef.current = checkedNodes;
22
+    // const keys = checkedNodes.map(node => getKeysWithParent(node, treeDictRef.current));
23
+    // setCheckedKeys(uniq(keys));
24
+    setCheckedKeys(keys);
20
   };
25
   };
21
 
26
 
27
+  const onSubmit = () => {
28
+    if (!checkedNodesRef.current) {
29
+      return;
30
+    }
31
+
32
+    if (checkedNodesRef.current.length !== checkedKeys.length) {
33
+      message.warn('未知错误, 请刷新重试');
34
+      return;
35
+    }
36
+
37
+    const keys = checkedNodesRef.current.map(node => getKeysWithParent(node, treeDictRef.current));
38
+
39
+  }
40
+
41
+  React.useEffect(() => {
42
+    startLoading();
43
+    getResourceList({ pageSize: 500, type: 'menu' }).then((res) => {
44
+      cancelLoading();
45
+      setList(res.records || []);
46
+    }).catch(() => {
47
+      cancelLoading();
48
+    })
49
+  }, []);
50
+
22
   React.useEffect(() => {
51
   React.useEffect(() => {
23
     if (!role) {
52
     if (!role) {
24
       setList([]);
53
       setList([]);
29
     // 先转为需要的格式
58
     // 先转为需要的格式
30
     const arr = list.map(x => ({ title: x.name, key: x.id, parentId: x.parentId }));
59
     const arr = list.map(x => ({ title: x.name, key: x.id, parentId: x.parentId }));
31
     // 再转为 tree
60
     // 再转为 tree
32
-    setTreeData(arr2Tree(arr));
61
+    const [tree, dict] = arr2Tree(arr);
62
+    setTreeData(tree);
63
+    treeDictRef.current = dict;
33
   }, [list]);
64
   }, [list]);
34
 
65
 
35
   return (
66
   return (
36
     <Card
67
     <Card
37
       loading={loading}
68
       loading={loading}
38
       title={title}
69
       title={title}
39
-      extra={<Button type='primary' ghost>保存</Button>}
70
+      extra={<Button type='primary' ghost onClick={onSubmit}>保存</Button>}
40
     >
71
     >
41
       <Tree
72
       <Tree
42
         checkable
73
         checkable
43
-        onSelect={onSelect}
74
+        autoExpandParent
75
+        checkStrictly={false}
76
+        selectable={false}
77
+        checkedKeys={checkedKeys}
44
         onCheck={onCheck}
78
         onCheck={onCheck}
45
         treeData={treeData}
79
         treeData={treeData}
46
       />
80
       />
47
     </Card>
81
     </Card>
48
   )
82
   )
49
 }
83
 }
84
+
85
+function getKeysWithParent(node, dict) {
86
+  if (node.parentId === -1) return [node.key];
87
+  const parentKeys = getKeysWithParent(dict[node.parentId], dict);
88
+  return parentKeys ? [node.key].concat(parentKeys) : [node.key];
89
+}

+ 44
- 9
src/routes/routes.jsx View File

159
               title: '库存维护',
159
               title: '库存维护',
160
             },
160
             },
161
           },
161
           },
162
-          {
163
-            path: 'log',
164
-            element: <StockLog />,
165
-            meta: {
166
-              title: '库存日志',
167
-            },
168
-          },
169
         ],
162
         ],
170
       },
163
       },
171
       {
164
       {
179
             index: true,
172
             index: true,
180
             element: <Navigate to='rotationChart/list' replace />,
173
             element: <Navigate to='rotationChart/list' replace />,
181
           },
174
           },
175
+          {
176
+            path: 'station',
177
+            element: null,
178
+            meta: {
179
+              title: '本站信息',
180
+            },
181
+          },
182
           {
182
           {
183
             path: 'rotationChart/list',
183
             path: 'rotationChart/list',
184
             element: <RotationChartList />,
184
             element: <RotationChartList />,
185
             meta: {
185
             meta: {
186
-              title: '轮播图管理',
186
+              title: '公告内容',
187
             },
187
             },
188
           },
188
           },
189
           {
189
           {
190
             path: 'rotationChart/edit',
190
             path: 'rotationChart/edit',
191
             element: <RotationChartEdit />,
191
             element: <RotationChartEdit />,
192
             meta: {
192
             meta: {
193
-              title: '轮播图维护',
193
+              title: '公告维护',
194
             },
194
             },
195
           },
195
           },
196
           {
196
           {
200
               title: '本站信息简介',
200
               title: '本站信息简介',
201
             },
201
             },
202
           },
202
           },
203
+          {
204
+            path: 'regulation',
205
+            element: null,
206
+            meta: {
207
+              title: '规章制度',
208
+            },
209
+          },
210
+          {
211
+            path: 'emergency-plan',
212
+            element: null,
213
+            meta: {
214
+              title: '应急预案',
215
+            },
216
+          },
217
+          {
218
+            path: 'files',
219
+            element: null,
220
+            meta: {
221
+              title: '文件管理',
222
+            },
223
+          },
203
         ],
224
         ],
204
       },
225
       },
205
       {
226
       {
235
               hideInMenu: true,
256
               hideInMenu: true,
236
             },
257
             },
237
           },
258
           },
259
+          {
260
+            path: 'log',
261
+            element: <StockLog />,
262
+            meta: {
263
+              title: '库存操作日志',
264
+            },
265
+          },
238
           {
266
           {
239
             path: 'roles',
267
             path: 'roles',
240
             element: <Roles />,
268
             element: <Roles />,
241
             meta: {
269
             meta: {
242
               title: '系统角色管理',
270
               title: '系统角色管理',
243
             },
271
             },
272
+          },
273
+          {
274
+            path: 'user',
275
+            element: null,
276
+            meta: {
277
+              title: '系统用户管理',
278
+            },
244
           }
279
           }
245
         ],
280
         ],
246
       },
281
       },

+ 15
- 0
src/services/role.js View File

12
   deleteRole,
12
   deleteRole,
13
  ] = restful('/roles');
13
  ] = restful('/roles');
14
 
14
 
15
+ 
16
+ const [
17
+  getResourceList,
18
+  getResourceDetail,
19
+  saveResource,
20
+  updateResource,
21
+  deleteResource,
22
+ ] = restful('/resources');
23
+
15
 
24
 
16
  export {
25
  export {
17
   getRoleList,
26
   getRoleList,
19
   saveRole,
28
   saveRole,
20
   updateRole,
29
   updateRole,
21
   deleteRole,
30
   deleteRole,
31
+  
32
+  getResourceList,
33
+  getResourceDetail,
34
+  saveResource,
35
+  updateResource,
36
+  deleteResource,
22
  }
37
  }

+ 0
- 32
src/utils/arr2Tree.js View File

1
-
2
-export default function arr2Tree(arr = [], parent = 'parentId') {
3
-  // 转换为字典
4
-  const dict = arr.reduce((acc, item) => {
5
-    return {
6
-      ...acc,
7
-      [item.id]: {
8
-        ...item,
9
-        children: []
10
-      }
11
-    }
12
-  }, {});
13
-
14
-  // 挂载父子节点
15
-  const rootId = -1;
16
-  const tree = [];
17
-  for (let item of arr) {
18
-    const parentNodeId = item[parent];
19
-
20
-    if (parentNodeId === rootId) {
21
-      tree.push(item);
22
-    } else {
23
-      const parentNode = dict[parentNodeId];
24
-      if (parentNode) {
25
-        parentNode.children.push(item);
26
-      }
27
-    }
28
-  }
29
-
30
-  return tree;
31
-}
32
-

+ 61
- 0
src/utils/array.js View File

1
+
2
+/**
3
+ * 数组 转 Tree
4
+ * @param {*} arr 
5
+ * @param {*} parent 
6
+ * @param {*} key 
7
+ * @returns 
8
+ */
9
+export function arr2Tree(arr = [], parent = 'parentId', key = 'key') {
10
+  // 转换为字典
11
+  const dict = arr.reduce((acc, item) => {
12
+    return {
13
+      ...acc,
14
+      [item[key]]: {
15
+        ...item,
16
+        children: []
17
+      }
18
+    }
19
+  }, {});
20
+
21
+  // 挂载父子节点
22
+  const rootId = -1;
23
+  const tree = [];
24
+  for (let item of arr) {
25
+    const parentNodeId = item[parent];
26
+
27
+    if (parentNodeId === rootId) {
28
+      tree.push(dict[item[key]]);
29
+    } else {
30
+      const parentNode = dict[parentNodeId];
31
+      if (parentNode) {
32
+        parentNode.children.push(item);
33
+      }
34
+    }
35
+  }
36
+
37
+  return [tree, dict];
38
+}
39
+
40
+/**
41
+ * 深度展平数组
42
+ * @param {*} arr 
43
+ * @returns 
44
+ */
45
+export function flatten(arr = []) {
46
+  return arr.reduce((acc, it) => {
47
+    const list = Array.isArray(it) ? flatten(it) : it
48
+    return acc.concat(list);
49
+  }, []);
50
+}
51
+
52
+/**
53
+ * 深度数组去重
54
+ * @param {*} arr 
55
+ */
56
+export function uniq(arr = []) {
57
+  const list = flatten(arr);
58
+  return list.reduce((acc, it) => {
59
+    return acc.indexOf(it) > -1 ? acc : acc.concat(it)
60
+  }, []);
61
+}