Yansen пре 2 година
родитељ
комит
c286a8b0ed

+ 1
- 1
src/layouts/AuthLayout/components/SiderBar.jsx Прегледај датотеку

@@ -15,7 +15,7 @@ export default (props) => {
15 15
 
16 16
 
17 17
   return (
18
-    <Sider className='layout-sidebar' theme={theme} collapsible width={width}>
18
+    <Sider className='layout-sidebar' theme={theme} defaultCollapsed collapsible width={width}>
19 19
       <Menus theme={theme} items={menus} location={location} />
20 20
     </Sider>
21 21
   );

+ 0
- 23
src/layouts/PageContainer.jsx Прегледај датотеку

@@ -1,23 +0,0 @@
1
-import React from 'react';
2
-import { Typography } from 'antd';
3
-import { Outlet } from 'react-router-dom';
4
-import useRoute from '@/utils/hooks/useRoute';
5
-
6
-const containerStyle = {
7
-  // margin: '24px 24px 0 24px',
8
-  margin: '24px',
9
-  minHeight: 'calc(100% - 48px)',
10
-}
11
-const { Title } = Typography;
12
-
13
-export default (props) => {
14
-  const { meta = {} } = useRoute() || {};
15
-  const style = meta.noLayout ? { height: '100%' } : containerStyle;
16
-
17
-  return (
18
-    <div style={style}>
19
-      { meta.title && !meta.noLayout && <Title level={4} style={{ paddingBottom: '12px' }}>{ meta.title }</Title> }
20
-      <Outlet />
21
-    </div>
22
-  )
23
-}

+ 23
- 0
src/pages/role/index.jsx Прегледај датотеку

@@ -0,0 +1,23 @@
1
+import React from 'react';
2
+import { Row, Col } from 'antd';
3
+import Page from '@/components/Page';
4
+import RoleList from './list';
5
+import MenuList from './menus';
6
+
7
+export default (props) => {
8
+
9
+  const [current, setCurrent] = React.useState();
10
+
11
+  return (
12
+    <Page>
13
+      <Row gutter={24}>
14
+        <Col span={8}>
15
+          <RoleList onChange={setCurrent} current={current} />
16
+        </Col>
17
+        <Col span={16}>
18
+          <MenuList role={current} />
19
+        </Col>
20
+      </Row>
21
+    </Page>
22
+  )
23
+}

+ 141
- 0
src/pages/role/list.jsx Прегледај датотеку

@@ -0,0 +1,141 @@
1
+import React from 'react';
2
+import { Button, Input, List, Popconfirm, Spin, Modal, message } from 'antd';
3
+import useBool from '@/utils/hooks/useBool';
4
+import classNames from 'classnames';
5
+import {
6
+  getSysRole,
7
+  postSysRole,
8
+  putSysRole,
9
+  deleteSysRole,
10
+} from '@/service/sysrole';
11
+import './style.less';
12
+
13
+const Header = (props) => {
14
+  return (
15
+    <div className='role-list-header'>
16
+      <div className='role-list-header-body'>{props.children}</div>
17
+      <div className='role-list-header-action'>{props.action}</div>
18
+    </div>
19
+  )
20
+}
21
+
22
+export default (props) => {
23
+  const { current, onChange } = props;
24
+
25
+  const [loading, startLoading, cancelLoading] = useBool();
26
+  const [visible, openModel, hideModel] = useBool();
27
+  const [finished, setFinished] = React.useState(false);
28
+  const [inText, setInText] = React.useState();
29
+  const [list, setList] = React.useState([]);
30
+
31
+  const onAdd = () => {
32
+    openModel();
33
+    setInText();
34
+    onChange();
35
+  }
36
+
37
+  const onEdit = (item) => {
38
+    openModel();
39
+    setInText(item.name);
40
+    onChange(item);
41
+  }
42
+
43
+  const onDelete = (item) => {
44
+    startLoading();
45
+    // 删除角色
46
+    deleteSysRole(item.roleId).then(() => {
47
+      setList(list.filter(x => x.roleId !== item.roleId));
48
+      cancelLoading();
49
+      hideModel();
50
+      onChange();
51
+    }).catch(() => {
52
+      cancelLoading();
53
+    })
54
+  }
55
+
56
+  const handleOk = () => {
57
+    if (!inText) {
58
+      message.warn('请输入角色名称');
59
+      return;
60
+    }
61
+    startLoading();
62
+    const data = { name: inText };
63
+
64
+    if (current) {
65
+      // 修改角色
66
+      putSysRole(current.roleId, data).then(res => {
67
+        setList(list.map(x => x.roleId === current.roleId ? res : x));
68
+        cancelLoading();
69
+        hideModel();
70
+      }).catch(() => {
71
+        cancelLoading();
72
+      })
73
+    } else {
74
+      // 新增角色
75
+      postSysRole(data).then((res) => {
76
+        setList([res].concat(list));
77
+        cancelLoading();
78
+        hideModel();
79
+        onChange(res);
80
+      }).catch(() => {
81
+        cancelLoading();
82
+      })
83
+    }
84
+  }
85
+
86
+  const handleCancel = () => {
87
+    if (loading) {
88
+      return ;
89
+    }
90
+
91
+    hideModel();
92
+  }
93
+
94
+  const queryRoles = React.useCallback((params) => {
95
+    startLoading();
96
+    getSysRole(params).then(res => {
97
+      setList(res.records);
98
+      cancelLoading();
99
+      setFinished(res.current >= res.pages);
100
+    }).catch(() => {
101
+      cancelLoading();
102
+    });
103
+  }, []);
104
+
105
+  React.useEffect(() => {
106
+    queryRoles({ pageNum: 1, pageSize: 500 });
107
+  }, []);
108
+
109
+  return (
110
+    <Spin spinning={loading}>
111
+      <List
112
+        header={<Header action={<Button type='primary' onClick={onAdd}>新增</Button>}>角色列表</Header>}
113
+        style={{ background: '#fff' }}
114
+        bordered
115
+        dataSource={list}
116
+        renderItem={item => (
117
+          <List.Item
118
+            className={classNames('role-list-item', { active: current && current.roleId === item.roleId })}
119
+            onClick={() => onChange(item)}
120
+            actions={[
121
+              <Button key='edit' type='link' onClick={() => onEdit(item)}>编辑</Button>,
122
+              <Popconfirm key='delete' title="确认删除?" onConfirm={() => onDelete(item)}>
123
+                <Button type='link' danger>删除</Button>
124
+              </Popconfirm>
125
+            ]}
126
+          >
127
+            {item.name}
128
+          </List.Item>
129
+        )}
130
+      />
131
+      <Modal
132
+        title="请输入角色名称"
133
+        open={visible}
134
+        onOk={handleOk}
135
+        onCancel={handleCancel}
136
+      >
137
+        <Input value={inText} onChange={e => setInText(e.target.value)} />
138
+      </Modal>
139
+    </Spin>
140
+  )
141
+}

+ 125
- 0
src/pages/role/menus.jsx Прегледај датотеку

@@ -0,0 +1,125 @@
1
+import React from 'react';
2
+import { Button, Card, Tree, message } from 'antd';
3
+import useBool from '@/utils/hooks/useBool';
4
+import { arr2Tree } from '@/utils/array';
5
+import { getSysResource } from '@/service/sysresource';
6
+import { authRoleResource } from '@/service/sysroleresource';
7
+
8
+export default (props) => {
9
+  const { role } = props;
10
+  
11
+  const [loading, startLoading, cancelLoading] = useBool();
12
+  const [list, setList] = React.useState([]);
13
+  const [expandedKeys, setExpandedKeys] = React.useState([]);
14
+  const [treeData, setTreeData] = React.useState([]);
15
+  const treeDictRef = React.useRef();
16
+  const [checkedKeys, setCheckedKeys] = React.useState({ checked: [], halfChecked: [] });
17
+  const keys = checkedKeys.checked.concat(checkedKeys.halfChecked);
18
+
19
+  const title = role ? `${role.name} - 授权菜单` : '未选角色 - 授权菜单';
20
+
21
+  const getListData = () => {
22
+    return new Promise((resolve, reject) => {
23
+      getSysResource({ typeCode: 'menu' }).then((res = []) => {
24
+        setList(res);
25
+        resolve(res)
26
+      }).catch(reject);
27
+    });
28
+  }
29
+
30
+  const onCheck = (keys, { halfCheckedKeys }) => {
31
+    setCheckedKeys({ checked: keys, halfChecked: halfCheckedKeys });
32
+  };
33
+
34
+  const onSubmit = () => {
35
+    // 如果一个都不选,代表清空授权
36
+    const data = [];
37
+    const roleId = role.roleId;
38
+    for (let resourceId of keys) {
39
+      data.push({ roleId, resourceId });
40
+    }
41
+    startLoading();
42
+    authRoleResource(roleId, data).then((res) => {
43
+      cancelLoading();
44
+    }).catch(() => {
45
+      cancelLoading();
46
+    })
47
+  }
48
+
49
+  React.useEffect(() => {
50
+    const p = !list.length ? getListData : () => Promise.resolve(list);
51
+    if (!role || !role.roleId) {
52
+      p();
53
+    } else {
54
+      startLoading();
55
+      p().then((allData) => {
56
+        getSysResource({ typeCode: 'menu', roleId: role.roleId }).then((res = []) => {
57
+          cancelLoading();
58
+          
59
+          // 数据分为2部分, 一部分叶子节点, 一部分非叶子节点
60
+          const checked = [], halfChecked = [];
61
+          for (let item of res) {
62
+            // 获取子节点, 没有的话则为叶子节点, 否则为非叶子节点
63
+            const children = allData.filter(x => x.parentId === item.resourceId);
64
+            if (!children.length) {
65
+              // 没有子节点, 则为叶子节点, 算入选中节点
66
+              checked.push(item.resourceId);
67
+            } else {
68
+              // 获取选中子节点
69
+              const checkedChildren = res.filter(x => x.parentId === item.resourceId);
70
+              if (checkedChildren.length === children.length) {
71
+                // 非叶子节点如果 子节点全部包含, 那么算入选中节点
72
+                checked.push(item.resourceId);
73
+              } else {
74
+                halfChecked.push(item.resourceId);
75
+              }
76
+            }
77
+          }
78
+
79
+          setCheckedKeys({ checked, halfChecked });
80
+        }).catch(() => {
81
+          cancelLoading();
82
+        })
83
+      }).catch(() => {
84
+        cancelLoading();
85
+      })
86
+    }
87
+  }, [role]);
88
+  
89
+  React.useEffect(() => {
90
+    // 展开节点
91
+    setExpandedKeys((list).filter(x => x.parentId === '-1').map(x => x.resourceId));
92
+    // 先转为需要的格式
93
+    const arr = list.map(x => ({ title: x.name, key: x.resourceId, parentId: x.parentId }));
94
+    // 再转为 tree
95
+    const [tree, dict] = arr2Tree(arr);
96
+    setTreeData(tree);
97
+    treeDictRef.current = dict;
98
+  }, [list]);
99
+
100
+  return (
101
+    <Card
102
+      loading={loading}
103
+      title={title}
104
+      extra={<Button type='primary' disabled={!role || !role.roleId} ghost onClick={onSubmit}>保存</Button>}
105
+    >
106
+      <Tree
107
+        checkable
108
+        autoExpandParent
109
+        expandedKeys={expandedKeys}
110
+        checkStrictly={false}
111
+        selectable={false}
112
+        checkedKeys={checkedKeys}
113
+        onCheck={onCheck}
114
+        onExpand={setExpandedKeys}
115
+        treeData={treeData}
116
+      />
117
+    </Card>
118
+  )
119
+}
120
+
121
+// function getKeysWithParent(node, dict) {
122
+//   if (node.parentId === -1) return [node.key];
123
+//   const parentKeys = getKeysWithParent(dict[node.parentId], dict);
124
+//   return parentKeys ? [node.key].concat(parentKeys) : [node.key];
125
+// }

+ 19
- 0
src/pages/role/style.less Прегледај датотеку

@@ -0,0 +1,19 @@
1
+
2
+.role-list-header {
3
+  width: 100%;
4
+  display: flex;
5
+
6
+  .role-list-header-body {
7
+    flex: 1;
8
+  }
9
+
10
+  .role-list-header-action {
11
+    flex: 0
12
+  }
13
+}
14
+
15
+.role-list-item {
16
+  &.active {
17
+    background: #e6f7ff;
18
+  }
19
+}

+ 113
- 0
src/pages/user/Account.jsx Прегледај датотеку

@@ -0,0 +1,113 @@
1
+import React from 'react';
2
+import { Modal, Form, Input, Button } from 'antd';
3
+import useBool from '@/utils/hooks/useBool';
4
+import { getSysLogin, postSysLogin } from '@/service/syslogin';
5
+import md5 from 'md5';
6
+
7
+const formItemLayout = {
8
+  labelCol: {
9
+    xs: { span: 24 },
10
+    sm: { span: 8 },
11
+  },
12
+  wrapperCol: {
13
+    xs: { span: 24 },
14
+    sm: { span: 16 },
15
+  },
16
+};
17
+const tailFormItemLayout = {
18
+  wrapperCol: {
19
+    xs: {
20
+      span: 24,
21
+      offset: 0,
22
+    },
23
+    sm: {
24
+      span: 16,
25
+      offset: 8,
26
+    },
27
+  },
28
+};
29
+
30
+const defaultPass = '123456';
31
+
32
+export default (props) => {
33
+  const { user, onSuccess, onCancel, ...leftProps } = props;
34
+
35
+  const [loading, startLoading, cancelLoading] = useBool();
36
+  const [form] = Form.useForm();
37
+  const [account, setAccount] = React.useState();
38
+
39
+  const onFinish = (values) => {
40
+    const loginId = account ? account.loginId : undefined;
41
+    const password = values.password ? md5(values.password) : (
42
+      loginId ? undefined : md5(defaultPass)
43
+    );
44
+
45
+    const data = {
46
+      ...values,
47
+      password,
48
+      loginId,
49
+      userId: user.userId,
50
+    }
51
+
52
+    startLoading();
53
+    postSysLogin(data).then(res => {
54
+      onSuccess();
55
+      cancelLoading();
56
+    }).catch(() => {
57
+      cancelLoading();
58
+    });
59
+  };
60
+
61
+  React.useEffect(() => {
62
+    if (user?.userId) {
63
+      startLoading();
64
+      getSysLogin(user.userId).then(res => {
65
+        console.log('res', res)
66
+        if (res) {
67
+          setAccount(res);
68
+          form.setFieldsValue(res);
69
+        } else {
70
+          form.setFieldsValue({ account: user.phone })
71
+        }
72
+        cancelLoading();
73
+      }).catch((err) => {
74
+        console.error(err)
75
+        cancelLoading();
76
+      });
77
+    }
78
+  }, [user, form])
79
+
80
+  return (
81
+    <Modal title="账号维护" footer={null} width={600} onCancel={onCancel} {...leftProps}>
82
+      <Form {...formItemLayout} form={form} scrollToFirstError style={{ width: '480px' }} onFinish={onFinish}>
83
+        <Form.Item
84
+          name="account"
85
+          label="账号"
86
+          rules={[
87
+            {
88
+              required: true,
89
+              message: '请填写姓名',
90
+            },
91
+          ]}
92
+        >
93
+          <Input />
94
+        </Form.Item>
95
+        <Form.Item
96
+          name="password"
97
+          label="密码"
98
+          help={`默认密码 ${defaultPass}`}
99
+        >
100
+          <Input.Password allowClear/>
101
+        </Form.Item>
102
+          <Form.Item {...tailFormItemLayout}>
103
+            <Button loading={loading} type="primary" htmlType="submit">
104
+              保存
105
+            </Button>
106
+            <Button style={{ marginLeft: '2em' }} onClick={onCancel}>
107
+              取消
108
+            </Button>
109
+          </Form.Item>
110
+      </Form>
111
+    </Modal>
112
+  )
113
+}

+ 158
- 0
src/pages/user/Edit.jsx Прегледај датотеку

@@ -0,0 +1,158 @@
1
+import React from 'react';
2
+import { Button, Card, Form, Input, Select } from 'antd';
3
+import useBool from '@/utils/hooks/useBool';
4
+import { getSysRole } from '@/service/sysrole';
5
+import { postSysUser, getSysUserById } from '@/service/sysuser';
6
+import { useSearchParams, useNavigate } from 'react-router-dom';
7
+import Page from '@/components/Page';
8
+import Account from './Account';
9
+
10
+const formItemLayout = {
11
+  labelCol: {
12
+    xs: { span: 24 },
13
+    sm: { span: 8 },
14
+  },
15
+  wrapperCol: {
16
+    xs: { span: 24 },
17
+    sm: { span: 16 },
18
+  },
19
+};
20
+const tailFormItemLayout = {
21
+  wrapperCol: {
22
+    xs: {
23
+      span: 24,
24
+      offset: 0,
25
+    },
26
+    sm: {
27
+      span: 16,
28
+      offset: 8,
29
+    },
30
+  },
31
+};
32
+
33
+const { Option } = Select;
34
+
35
+export default (props) => {
36
+  const [loading, startLoading, cancelLoading] = useBool();
37
+  const [submiting, startSubmit, cancelSubmit] = useBool();
38
+  const [open, setShow, setHidden] = useBool(false);
39
+  const [roleList, setRoleList] = React.useState([]);
40
+  const [searchParams] = useSearchParams();
41
+  const [form] = Form.useForm();
42
+  const [user, setUser] = React.useState();
43
+  const navigate = useNavigate();
44
+
45
+  const id = searchParams.get('id');
46
+
47
+  const onFinish = (values) => {
48
+    const rolesList = (values.rolesList || []).map(x => ({ roleId: x }));
49
+
50
+    startSubmit();
51
+    postSysUser({ ...values, rolesList, userId: id }).then(res => {
52
+      cancelSubmit();
53
+      if (id) {
54
+        navigate(-1);
55
+      } else {
56
+        navigate(`/system/user/edit?id=${res.userId}`, { replace: true })
57
+      }
58
+    }).catch(() => {
59
+      cancelSubmit();
60
+    });
61
+  }
62
+
63
+  React.useEffect(() => {
64
+    getSysRole({ pageSize: 500 }).then(res => setRoleList(res.records));
65
+  }, []);
66
+  
67
+  React.useEffect(() => {
68
+    if (id) {
69
+      startLoading();
70
+      getSysUserById(id).then(res => {
71
+        setUser(res);
72
+        form.setFieldsValue({
73
+          ...res,
74
+          rolesList: (res.rolesList || []).map(x => x.roleId),
75
+        });
76
+        cancelLoading();
77
+      }).catch(() => {
78
+        cancelLoading();
79
+      });
80
+    } else {
81
+      // form.setFieldsValue({ password: '123456' });
82
+    }
83
+  }, [id]);
84
+
85
+  return (
86
+    <Page>
87
+      <Card loading={loading}>
88
+        <Form onFinish={onFinish} form={form} {...formItemLayout} scrollToFirstError style={{ maxWidth: '1000px' }}>
89
+          <Form.Item
90
+            name="name"
91
+            label="姓名"
92
+            rules={[
93
+              {
94
+                required: true,
95
+                message: '请填写姓名',
96
+              },
97
+            ]}
98
+          >
99
+            <Input />
100
+          </Form.Item>
101
+          <Form.Item
102
+            name="phone"
103
+            label="手机号"
104
+            rules={[
105
+              {
106
+                required: true,
107
+                message: '请填写手机号',
108
+              },
109
+            ]}
110
+          >
111
+            <Input />
112
+          </Form.Item>
113
+          <Form.Item
114
+            name="orgId"
115
+            label="单位"
116
+          >
117
+            <Input />
118
+          </Form.Item>
119
+          <Form.Item
120
+            name="positionId"
121
+            label="岗位"
122
+          >
123
+            <Input />
124
+          </Form.Item>
125
+          <Form.Item
126
+            name="rolesList"
127
+            label="角色"
128
+          >
129
+            <Select
130
+              mode="multiple"
131
+              allowClear
132
+              style={{ width: '100%' }}
133
+              placeholder="请选择角色"
134
+            >
135
+              {
136
+                roleList.map(role => (<Option key={role.roleId}>{role.name}</Option>))
137
+              }
138
+            </Select>
139
+          </Form.Item>
140
+          <Form.Item {...tailFormItemLayout}>
141
+            <Button loading={submiting} type="primary" htmlType="submit">
142
+              保存
143
+            </Button>
144
+            <Button style={{ marginLeft: '2em' }} onClick={() => navigate(-1)}>
145
+              返回
146
+            </Button>
147
+            <Button disabled={!id} style={{ marginLeft: '2em' }} onClick={setShow}>
148
+              登录账户
149
+            </Button>
150
+          </Form.Item>
151
+        </Form>
152
+      </Card>
153
+      <Account open={open} user={user} onSuccess={setHidden} onCancel={setHidden} />
154
+    </Page>
155
+  )
156
+}
157
+
158
+

+ 130
- 0
src/pages/user/index.jsx Прегледај датотеку

@@ -0,0 +1,130 @@
1
+import React from "react";
2
+import { useNavigate } from "react-router-dom";
3
+import { queryTable } from "@/utils/request";
4
+import { ProTable } from "@ant-design/pro-components";
5
+import Page from "@/components/Page";
6
+import { Button, message, Popconfirm } from "antd";
7
+import { getSysUser, updateUserStatus, deleteSysUser } from "@/service/sysuser";
8
+
9
+const queryUserList = queryTable(getSysUser);
10
+
11
+export default (props) => {
12
+  const actionRef = React.useRef();
13
+  const navigate = useNavigate();
14
+
15
+  const updateStatus = (user) => {
16
+    const status = user.status === 1 ? 0 : 1;
17
+    const hide = message.loading("请稍候...", 0);
18
+    updateUserStatus(user.id, status)
19
+      .then((res) => {
20
+        hide();
21
+        actionRef.current.reload();
22
+      })
23
+      .catch(() => {
24
+        hide();
25
+      });
26
+  };
27
+  const handleDelete = (id) => {
28
+    if (id) {
29
+      deleteSysUser(id).then((res) => {
30
+        actionRef.current.reload();
31
+      });
32
+    }
33
+  };
34
+
35
+  const columns = [
36
+    {
37
+      title: "单位",
38
+      dataIndex: "orgId",
39
+    },
40
+    {
41
+      title: "姓名",
42
+      dataIndex: "name",
43
+    },
44
+    {
45
+      title: "手机号",
46
+      dataIndex: "phone",
47
+    },
48
+    {
49
+      title: "岗位",
50
+      dataIndex: "positionId",
51
+    },
52
+    {
53
+      title: "状态",
54
+      dataIndex: "status",
55
+      search: false,
56
+      valueEnum: {
57
+        1: {
58
+          text: "正常",
59
+          status: "Processing",
60
+        },
61
+        0: {
62
+          text: "禁用",
63
+          status: "Error",
64
+        },
65
+      },
66
+    },
67
+    {
68
+      title: "操作",
69
+      valueType: "option",
70
+      width: 200,
71
+      render: (_, record) => [
72
+        <Button
73
+          key={1}
74
+          style={{ padding: 0 }}
75
+          type="link"
76
+          onClick={() => {
77
+            updateStatus(record);
78
+          }}
79
+        >
80
+          {record.status === 1 ? "禁用" : "启用"}
81
+        </Button>,
82
+        <Button
83
+          key={2}
84
+          style={{ padding: 0 }}
85
+          type="link"
86
+          onClick={() => {
87
+            console.log(record, "]]");
88
+            navigate(`/system/user/edit?id=${record.userId}`);
89
+          }}
90
+        >
91
+          编辑
92
+        </Button>,
93
+        <Popconfirm
94
+          key={3}
95
+          title="您是否确认删除 ?"
96
+          onConfirm={() => handleDelete(record.userId)}
97
+          okText="确定"
98
+          cancelText="取消"
99
+        >
100
+          {/* manualPush */}
101
+          <Button style={{ padding: 0 }} type="link">
102
+            删除
103
+          </Button>
104
+        </Popconfirm>,
105
+      ],
106
+    },
107
+  ];
108
+
109
+  return (
110
+    <Page>
111
+      <ProTable
112
+        actionRef={actionRef}
113
+        rowKey="userId"
114
+        toolBarRender={() => [
115
+          <Button
116
+            key="1"
117
+            type="primary"
118
+            onClick={() => {
119
+              navigate("/system/user/edit");
120
+            }}
121
+          >
122
+            新增
123
+          </Button>,
124
+        ]}
125
+        request={queryUserList}
126
+        columns={columns}
127
+      />
128
+    </Page>
129
+  );
130
+};

+ 21
- 5
src/routes/routes.jsx Прегледај датотеку

@@ -6,11 +6,17 @@ import {
6 6
   MenuFoldOutlined,
7 7
   MenuUnfoldOutlined,
8 8
   PieChartOutlined,
9
+  SettingOutlined,
9 10
 } from '@ant-design/icons';
11
+import { Outlet } from 'react-router-dom';
10 12
 import AuthLayout from "@/layouts/AuthLayout";
11
-import PageContainer from "@/layouts/PageContainer";
12 13
 import Login from '@/pages/login';
13 14
 import Page404 from '@/pages/404';
15
+import Role from '@/pages/role/index';
16
+import User from '@/pages/user/index';
17
+import UserEdit from '@/pages/user/Edit';
18
+
19
+
14 20
 import Index from '@/pages/index';
15 21
 import Home from "@/pages/sample/home";
16 22
 import BasicForm from '@/pages/sample/form';
@@ -36,25 +42,35 @@ export const authRoutes = [
36 42
   },
37 43
   {
38 44
     path: "system",
39
-    element: <PageContainer />,
45
+    element: <Outlet />,
40 46
     meta: {
41 47
       title: '系统管理',
42
-      // icon: <AppstoreOutlined />,
48
+      icon: <SettingOutlined />,
43 49
       // permission: 'form',
44 50
     },
45 51
     children: [
46 52
       {
47 53
         path: "user",
48
-        element: <Index />,
54
+        element: <User />,
49 55
         meta: {
50 56
           title: '人员管理',
51 57
           // icon: <AppstoreOutlined />,
52 58
           // permission: 'form',
53 59
         },
54 60
       },
61
+      {
62
+        path: "user/edit",
63
+        element: <UserEdit />,
64
+        meta: {
65
+          title: '人员维护',
66
+          hideInMenu: true,
67
+          // icon: <AppstoreOutlined />,
68
+          // permission: 'form',
69
+        },
70
+      },
55 71
       {
56 72
         path: "role",
57
-        element: <Index />,
73
+        element: <Role />,
58 74
         meta: {
59 75
           title: '角色管理',
60 76
           // icon: <AppstoreOutlined />,

+ 1
- 1
src/service/syslogin.js Прегледај датотеку

@@ -3,7 +3,7 @@ import request from '@/utils/request';
3 3
 /*
4 4
  * 分页查询
5 5
  */
6
-export const getSysLogin = (params) => request('/api/sysLogin', { params });
6
+export const getSysLogin = (userId) => request(`/api/sysLogin?userId=${userId}`);
7 7
 
8 8
 /*
9 9
  * 新增数据

+ 2
- 24
src/service/sysroleresource.js Прегледај датотеку

@@ -1,26 +1,4 @@
1 1
 import request from '@/utils/request';
2 2
 
3
-/*
4
- * 分页查询
5
- */
6
-export const getSysRoleResource = (params) => request('/api/sysRoleResource', { params });
7
-
8
-/*
9
- * 新增数据
10
- */
11
-export const postSysRoleResource = (data) => request('/api/sysRoleResource', { data, method: 'post' });
12
-
13
-/*
14
- * 通过ID查询单条数据
15
- */
16
-export const getSysRoleResourceById = (id) => request(`/api/sysRoleResource/${id}`);
17
-
18
-/*
19
- * 更新数据
20
- */
21
-export const putSysRoleResource = (id, data) => request(`/api/sysRoleResource/${id}`, { data, method: 'put' });
22
-
23
-/*
24
- * 通过主键删除数据
25
- */
26
-export const deleteSysRoleResource = (id) => request(`/api/sysRoleResource/${id}`, { method: 'delete' });
3
+// 授权菜单
4
+export const authRoleResource = (roleId, data) => request.post(`/api/role/${roleId}/resources`, data);

+ 5
- 0
src/service/sysuser.js Прегледај датотеку

@@ -29,3 +29,8 @@ export const putSysUser = (id, data) => request(`/api/sysUser/${id}`, { data, me
29 29
  * 通过主键删除数据
30 30
  */
31 31
 export const deleteSysUser = (id) => request(`/api/sysUser/${id}`, { method: 'delete' });
32
+
33
+/*
34
+ * 更新状态
35
+ */
36
+export const updateUserStatus = (id, status) => request(`/api/sysUser/${id}?status=${status}`, { method: 'put' });

+ 1
- 2
src/utils/array.js Прегледај датотеку

@@ -6,7 +6,7 @@
6 6
  * @param {*} key 
7 7
  * @returns 
8 8
  */
9
-export function arr2Tree(arr = [], parent = 'parentId', key = 'key') {
9
+export function arr2Tree(arr = [], parent = 'parentId', key = 'key', rootId = '-1') {
10 10
   // 转换为字典
11 11
   const dict = arr.reduce((acc, item) => {
12 12
     return {
@@ -19,7 +19,6 @@ export function arr2Tree(arr = [], parent = 'parentId', key = 'key') {
19 19
   }, {});
20 20
 
21 21
   // 挂载父子节点
22
-  const rootId = -1;
23 22
   const tree = [];
24 23
   for (let item of arr) {
25 24
     const parentNodeId = item[parent];

+ 1
- 1
src/utils/request.js Прегледај датотеку

@@ -46,7 +46,7 @@ instance.interceptors.response.use(function (response) {
46 46
   }
47 47
 
48 48
   if (data.code === 1000) {
49
-    if (data.data.token) {
49
+    if (data.data?.token) {
50 50
       localStorage.setItem('token', data.data.token);
51 51
     }
52 52