fangmingyue 2 年之前
父節點
當前提交
99cb2fca04
共有 5 個文件被更改,包括 170 次插入51 次删除
  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 查看文件

@@ -1,7 +1,8 @@
1 1
 import React from 'react';
2
-import { Button, Card, Tree, Modal } from 'antd';
2
+import { Button, Card, Tree, message } from 'antd';
3 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 7
 export default (props) => {
7 8
   const { role } = props;
@@ -9,16 +10,44 @@ export default (props) => {
9 10
   const [loading, startLoading, cancelLoading] = useBool();
10 11
   const [list, setList] = React.useState([]);
11 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 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 51
   React.useEffect(() => {
23 52
     if (!role) {
24 53
       setList([]);
@@ -29,21 +58,32 @@ export default (props) => {
29 58
     // 先转为需要的格式
30 59
     const arr = list.map(x => ({ title: x.name, key: x.id, parentId: x.parentId }));
31 60
     // 再转为 tree
32
-    setTreeData(arr2Tree(arr));
61
+    const [tree, dict] = arr2Tree(arr);
62
+    setTreeData(tree);
63
+    treeDictRef.current = dict;
33 64
   }, [list]);
34 65
 
35 66
   return (
36 67
     <Card
37 68
       loading={loading}
38 69
       title={title}
39
-      extra={<Button type='primary' ghost>保存</Button>}
70
+      extra={<Button type='primary' ghost onClick={onSubmit}>保存</Button>}
40 71
     >
41 72
       <Tree
42 73
         checkable
43
-        onSelect={onSelect}
74
+        autoExpandParent
75
+        checkStrictly={false}
76
+        selectable={false}
77
+        checkedKeys={checkedKeys}
44 78
         onCheck={onCheck}
45 79
         treeData={treeData}
46 80
       />
47 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 查看文件

@@ -159,13 +159,6 @@ export default [
159 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,18 +172,25 @@ export default [
179 172
             index: true,
180 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 183
             path: 'rotationChart/list',
184 184
             element: <RotationChartList />,
185 185
             meta: {
186
-              title: '轮播图管理',
186
+              title: '公告内容',
187 187
             },
188 188
           },
189 189
           {
190 190
             path: 'rotationChart/edit',
191 191
             element: <RotationChartEdit />,
192 192
             meta: {
193
-              title: '轮播图维护',
193
+              title: '公告维护',
194 194
             },
195 195
           },
196 196
           {
@@ -200,6 +200,27 @@ export default [
200 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,12 +256,26 @@ export default [
235 256
               hideInMenu: true,
236 257
             },
237 258
           },
259
+          {
260
+            path: 'log',
261
+            element: <StockLog />,
262
+            meta: {
263
+              title: '库存操作日志',
264
+            },
265
+          },
238 266
           {
239 267
             path: 'roles',
240 268
             element: <Roles />,
241 269
             meta: {
242 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 查看文件

@@ -12,6 +12,15 @@ import { restful } from '@/utils/request';
12 12
   deleteRole,
13 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 25
  export {
17 26
   getRoleList,
@@ -19,4 +28,10 @@ import { restful } from '@/utils/request';
19 28
   saveRole,
20 29
   updateRole,
21 30
   deleteRole,
31
+  
32
+  getResourceList,
33
+  getResourceDetail,
34
+  saveResource,
35
+  updateResource,
36
+  deleteResource,
22 37
  }

+ 0
- 32
src/utils/arr2Tree.js 查看文件

@@ -1,32 +0,0 @@
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 查看文件

@@ -0,0 +1,61 @@
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
+}