@jiangood/open-admin 2.4.7 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/.umi-production/appData.json +58 -78
- package/src/.umi-production/core/route.tsx +1 -3
- package/src/framework/components/ContextMenu/index.tsx +91 -0
- package/src/framework/components/Page/index.less +19 -6
- package/src/framework/components/Page/index.tsx +23 -3
- package/src/framework/components/ProTable/index.less +60 -9
- package/src/framework/components/ProTable/index.tsx +31 -48
- package/src/framework/components/index.ts +1 -0
- package/src/framework/fields/FieldTableSelect/index.tsx +0 -1
- package/src/layouts/admin/HeaderRight.jsx +1 -6
- package/src/layouts/admin/TabPageRender.jsx +80 -23
- package/src/layouts/admin/index.jsx +16 -22
- package/src/layouts/admin/index.less +31 -20
- package/src/layouts/index.jsx +0 -9
- package/src/pages/about.jsx +1 -1
- package/src/pages/index.jsx +1 -1
- package/src/pages/login.jsx +1 -5
- package/src/pages/system/dict/index.jsx +56 -53
- package/src/pages/system/file/index.jsx +1 -7
- package/src/pages/system/job/index.jsx +9 -14
- package/src/pages/system/log/index.jsx +1 -1
- package/src/pages/system/org/index.jsx +153 -173
- package/src/pages/system/role/index.jsx +21 -12
- package/src/pages/system/role/perm.jsx +1 -2
- package/src/pages/system/user/index.jsx +28 -43
- package/src/pages/userCenter/index.jsx +3 -2
- package/src/pages/userCenter/message.jsx +1 -1
- package/src/style/global.less +1 -1
- package/src/framework/components/ProTable/components/ToolBar/index.less +0 -53
- package/src/framework/components/ProTable/components/ToolBar/index.tsx +0 -123
- package/src/pages/system/manual/index.jsx +0 -128
- package/src/pages/userCenter/manual.jsx +0 -57
|
@@ -1,38 +1,35 @@
|
|
|
1
|
-
import {DeleteOutlined, EditOutlined, PlusOutlined, SyncOutlined} from '@ant-design/icons';
|
|
2
|
-
import {Button, Card, Checkbox,
|
|
1
|
+
import {DeleteOutlined, EditOutlined, PlusOutlined, SettingOutlined, SyncOutlined} from '@ant-design/icons';
|
|
2
|
+
import {Button, Card, Checkbox, Descriptions, Form, Input, InputNumber, Modal, Popconfirm, Popover, Space, Splitter, Switch, Tree, Typography} from 'antd';
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import {
|
|
5
5
|
FieldBoolean,
|
|
6
6
|
FieldDictSelect,
|
|
7
7
|
FieldRemoteTreeSelect,
|
|
8
8
|
FieldUserSelect,
|
|
9
|
-
Gap,
|
|
10
9
|
HttpUtils,
|
|
11
10
|
NamedIcon,
|
|
12
|
-
Page
|
|
11
|
+
Page,
|
|
12
|
+
ViewBooleanEnableDisable,
|
|
13
13
|
} from "../../../framework";
|
|
14
14
|
|
|
15
|
-
|
|
16
15
|
export default class extends React.Component {
|
|
17
16
|
|
|
18
17
|
state = {
|
|
19
|
-
|
|
20
|
-
formValues: undefined,
|
|
21
|
-
submitLoading: false,
|
|
22
|
-
formEditing: false,
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
selectedOrg: null,
|
|
25
19
|
params: {
|
|
26
20
|
onlyShowEnabled: true,
|
|
27
21
|
onlyShowUnit: false,
|
|
28
|
-
searchText: null
|
|
22
|
+
searchText: null,
|
|
29
23
|
},
|
|
30
|
-
|
|
31
24
|
treeData: [],
|
|
32
25
|
treeLoading: false,
|
|
33
26
|
draggable: false,
|
|
27
|
+
|
|
28
|
+
modalOpen: false,
|
|
29
|
+
modalValues: {},
|
|
30
|
+
modalLoading: false,
|
|
34
31
|
}
|
|
35
|
-
|
|
32
|
+
formRef = React.createRef();
|
|
36
33
|
treeRef = React.createRef();
|
|
37
34
|
|
|
38
35
|
componentDidMount() {
|
|
@@ -41,205 +38,191 @@ export default class extends React.Component {
|
|
|
41
38
|
|
|
42
39
|
loadTree = () => {
|
|
43
40
|
this.setState({treeLoading: true})
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
HttpUtils.get('admin/sysOrg/tree', params).then(rs => {
|
|
47
|
-
const treeData = rs;
|
|
48
|
-
this.setState({treeData})
|
|
41
|
+
HttpUtils.get('admin/sysOrg/tree', this.state.params).then(rs => {
|
|
42
|
+
this.setState({treeData: rs})
|
|
49
43
|
}).finally(() => {
|
|
50
44
|
this.setState({treeLoading: false});
|
|
51
45
|
})
|
|
52
46
|
}
|
|
53
47
|
|
|
54
|
-
handleDelete =
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
48
|
+
handleDelete = () => {
|
|
49
|
+
const {selectedOrg} = this.state
|
|
50
|
+
if (!selectedOrg) return
|
|
51
|
+
HttpUtils.post('admin/sysOrg/delete', {id: selectedOrg.id}).then(() => {
|
|
52
|
+
this.setState({selectedOrg: null})
|
|
53
|
+
this.loadTree()
|
|
54
|
+
})
|
|
60
55
|
}
|
|
61
56
|
|
|
62
|
-
|
|
63
57
|
onSelect = (selectedKeys) => {
|
|
64
58
|
if (selectedKeys.length === 0) {
|
|
65
|
-
this.setState({
|
|
59
|
+
this.setState({selectedOrg: null})
|
|
66
60
|
return
|
|
67
61
|
}
|
|
62
|
+
HttpUtils.get("admin/sysOrg/detail", {id: selectedKeys[0]}).then(rs => {
|
|
63
|
+
this.setState({selectedOrg: rs})
|
|
64
|
+
})
|
|
65
|
+
}
|
|
68
66
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
67
|
+
handleAdd = () => {
|
|
68
|
+
const {selectedOrg} = this.state
|
|
69
|
+
this.setState({
|
|
70
|
+
modalOpen: true,
|
|
71
|
+
modalValues: {pid: selectedOrg?.id, enabled: true},
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
handleEdit = () => {
|
|
76
|
+
this.setState({
|
|
77
|
+
modalOpen: true,
|
|
78
|
+
modalValues: {...this.state.selectedOrg},
|
|
75
79
|
})
|
|
76
80
|
}
|
|
77
81
|
|
|
78
|
-
|
|
79
|
-
this.setState({
|
|
80
|
-
const isNew = !values.id
|
|
81
|
-
const url = isNew ? 'admin/sysOrg/create' : 'admin/sysOrg/update'
|
|
82
|
-
HttpUtils.post(url, values).then(
|
|
82
|
+
handleModalFinish = (values) => {
|
|
83
|
+
this.setState({modalLoading: true})
|
|
84
|
+
const isNew = !values.id
|
|
85
|
+
const url = isNew ? 'admin/sysOrg/create' : 'admin/sysOrg/update'
|
|
86
|
+
HttpUtils.post(url, values).then(() => {
|
|
87
|
+
this.setState({modalOpen: false})
|
|
83
88
|
this.loadTree()
|
|
84
89
|
}).finally(() => {
|
|
85
|
-
this.setState({
|
|
90
|
+
this.setState({modalLoading: false})
|
|
86
91
|
})
|
|
87
92
|
}
|
|
88
93
|
|
|
89
|
-
|
|
90
94
|
onDraggableChange = e => {
|
|
91
95
|
this.setState({draggable: e})
|
|
92
96
|
};
|
|
93
97
|
|
|
94
|
-
|
|
95
98
|
render() {
|
|
96
|
-
const {
|
|
97
|
-
const
|
|
98
|
-
const params = this.state.params;
|
|
99
|
-
return <Page>
|
|
100
|
-
<Card>
|
|
101
|
-
<Space>
|
|
99
|
+
const {selectedOrg} = this.state
|
|
100
|
+
const params = this.state.params
|
|
102
101
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
this.setState({params}, this.loadTree)
|
|
106
|
-
}}/>
|
|
107
|
-
<Checkbox checked={params.onlyShowEnabled}
|
|
108
|
-
onChange={e => {
|
|
109
|
-
params.onlyShowEnabled = e.target.checked;
|
|
110
|
-
this.setState({params}, this.loadTree);
|
|
111
|
-
}}>仅显示启用</Checkbox>
|
|
112
|
-
|
|
113
|
-
<Checkbox checked={params.onlyShowUnit}
|
|
114
|
-
onChange={e => {
|
|
115
|
-
params.onlyShowUnit = e.target.checked;
|
|
116
|
-
this.setState({params}, this.loadTree);
|
|
117
|
-
}}>仅显示单位</Checkbox>
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
</Space>
|
|
121
|
-
</Card>
|
|
122
|
-
<Gap/>
|
|
102
|
+
return <Page title="组织机构" description="管理组织机构树"
|
|
103
|
+
actions={<Button type='primary' perm='sys-org:create' icon={<PlusOutlined/>} onClick={this.handleAdd}>新增</Button>}>
|
|
123
104
|
<Splitter>
|
|
124
|
-
<Splitter.Panel defaultSize={
|
|
105
|
+
<Splitter.Panel defaultSize={400} style={{paddingRight: 8}}>
|
|
125
106
|
<Card loading={this.state.treeLoading}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
107
|
+
size='small'
|
|
108
|
+
>
|
|
109
|
+
<div style={{display: 'flex', alignItems: 'center', gap: 4, marginBottom: 8}}>
|
|
110
|
+
<Input.Search placeholder='搜索' value={params.searchText} onChange={e => {
|
|
111
|
+
params.searchText = e.target.value
|
|
112
|
+
this.setState({params}, this.loadTree)
|
|
113
|
+
}} style={{flex: 1}}/>
|
|
114
|
+
<Popover
|
|
115
|
+
trigger='click'
|
|
116
|
+
placement='bottomRight'
|
|
117
|
+
title='设置'
|
|
118
|
+
content={<Space direction='vertical'>
|
|
119
|
+
<Checkbox checked={params.onlyShowEnabled}
|
|
120
|
+
onChange={e => {
|
|
121
|
+
params.onlyShowEnabled = e.target.checked;
|
|
122
|
+
this.setState({params}, this.loadTree);
|
|
123
|
+
}}>仅显示启用</Checkbox>
|
|
124
|
+
<Checkbox checked={params.onlyShowUnit}
|
|
125
|
+
onChange={e => {
|
|
126
|
+
params.onlyShowUnit = e.target.checked;
|
|
127
|
+
this.setState({params}, this.loadTree);
|
|
128
|
+
}}>仅显示单位</Checkbox>
|
|
129
|
+
<div>
|
|
130
|
+
拖拽排序 <Switch
|
|
131
|
+
value={this.state.draggable}
|
|
132
|
+
onChange={this.onDraggableChange}/>
|
|
133
|
+
</div>
|
|
134
|
+
<Button size='small' shape='round' icon={<SyncOutlined/>} onClick={this.loadTree}>刷新</Button>
|
|
135
|
+
</Space>}
|
|
136
|
+
>
|
|
137
|
+
<Button type='text' size='small' icon={<SettingOutlined/>}/>
|
|
138
|
+
</Popover>
|
|
139
|
+
</div>
|
|
139
140
|
<Tree ref={this.treeRef}
|
|
140
141
|
treeData={this.state.treeData}
|
|
141
142
|
onSelect={this.onSelect}
|
|
142
143
|
showIcon
|
|
143
144
|
blockNode
|
|
144
|
-
icon={item => {
|
|
145
|
-
return <NamedIcon name={item.data.iconName}/>;
|
|
146
|
-
}}
|
|
145
|
+
icon={item => <NamedIcon name={item.data.iconName}/>}
|
|
147
146
|
draggable={this.state.draggable}
|
|
148
147
|
onDrop={this.onDrop}
|
|
149
148
|
showLine
|
|
150
149
|
defaultExpandAll
|
|
151
150
|
/>
|
|
152
|
-
{this.state.treeData.length === 0 && <Empty/>}
|
|
153
151
|
</Card>
|
|
154
152
|
</Splitter.Panel>
|
|
155
153
|
|
|
156
|
-
<Splitter>
|
|
157
|
-
<Card
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
<
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
</Popconfirm>
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
</Space>}
|
|
188
|
-
>
|
|
189
|
-
|
|
190
|
-
{formValues == null ? <Empty description='未选择机构'/> : <Form
|
|
191
|
-
disabled={!this.state.formEditing}
|
|
192
|
-
labelCol={{flex: '150px'}}
|
|
193
|
-
wrapperCol={{flex: '400px'}}
|
|
194
|
-
initialValues={formValues}
|
|
195
|
-
onFinish={this.onFinish}
|
|
196
|
-
>
|
|
197
|
-
<Form.Item noStyle name='id'>
|
|
198
|
-
</Form.Item>
|
|
199
|
-
<Form.Item label='父节点' name='pid'>
|
|
200
|
-
<FieldRemoteTreeSelect url='admin/sysOrg/tree'/>
|
|
201
|
-
</Form.Item>
|
|
202
|
-
<Form.Item label='名称' name='name' rules={[{required: true}]}>
|
|
203
|
-
<Input/>
|
|
204
|
-
</Form.Item>
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
<Form.Item label='类型' name='type' rules={[{required: true}]}>
|
|
208
|
-
<FieldDictSelect typeCode='orgType'/>
|
|
209
|
-
</Form.Item>
|
|
210
|
-
|
|
211
|
-
<Form.Item label='部门领导' name={['leader', 'id']}>
|
|
212
|
-
<FieldUserSelect/>
|
|
213
|
-
</Form.Item>
|
|
214
|
-
<Form.Item label='启用' name='enabled' rules={[{required: true}]}>
|
|
215
|
-
<FieldBoolean/>
|
|
216
|
-
</Form.Item>
|
|
217
|
-
<Form.Item label='扩展字段1' name='extra1'>
|
|
218
|
-
<Input/>
|
|
219
|
-
</Form.Item>
|
|
220
|
-
<Form.Item label='扩展字段2' name='extra2'>
|
|
221
|
-
<Input/>
|
|
222
|
-
</Form.Item>
|
|
223
|
-
<Form.Item label='扩展字段3' name='extra3'>
|
|
224
|
-
<Input/>
|
|
225
|
-
</Form.Item>
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
<Form.Item label=' ' colon={false}>
|
|
229
|
-
<Button type="primary" htmlType='submit'
|
|
230
|
-
loading={this.state.submitLoading}>保存</Button>
|
|
231
|
-
</Form.Item>
|
|
232
|
-
|
|
233
|
-
</Form>
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
|
|
154
|
+
<Splitter.Panel style={{paddingLeft: 8}}>
|
|
155
|
+
<Card size='small' style={{marginBottom: 8}}>
|
|
156
|
+
<div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8}}>
|
|
157
|
+
<Typography.Text strong>机构信息</Typography.Text>
|
|
158
|
+
{selectedOrg && (
|
|
159
|
+
<span>
|
|
160
|
+
<Button size='small' icon={<EditOutlined/>} perm='sys-org:update'
|
|
161
|
+
onClick={this.handleEdit} style={{marginRight: 4}}>编辑</Button>
|
|
162
|
+
<Popconfirm perm='sys-org:delete' title='是否确定删除组织机构'
|
|
163
|
+
onConfirm={this.handleDelete}>
|
|
164
|
+
<Button size='small' icon={<DeleteOutlined/>}>删除</Button>
|
|
165
|
+
</Popconfirm>
|
|
166
|
+
</span>
|
|
167
|
+
)}
|
|
168
|
+
</div>
|
|
169
|
+
{selectedOrg && (
|
|
170
|
+
<Descriptions size='small' column={2}>
|
|
171
|
+
<Descriptions.Item label="名称">{selectedOrg.name}</Descriptions.Item>
|
|
172
|
+
<Descriptions.Item label="类型">{selectedOrg.typeLabel}</Descriptions.Item>
|
|
173
|
+
<Descriptions.Item label="上级机构">{selectedOrg.parentName || '-'}</Descriptions.Item>
|
|
174
|
+
<Descriptions.Item label="序号">{selectedOrg.seq ?? '-'}</Descriptions.Item>
|
|
175
|
+
<Descriptions.Item label="部门领导">{selectedOrg.leader?.name || '-'}</Descriptions.Item>
|
|
176
|
+
<Descriptions.Item label="启用"><ViewBooleanEnableDisable value={selectedOrg.enabled}/></Descriptions.Item>
|
|
177
|
+
{selectedOrg.extra1 && <Descriptions.Item label="扩展字段1">{selectedOrg.extra1}</Descriptions.Item>}
|
|
178
|
+
{selectedOrg.extra2 && <Descriptions.Item label="扩展字段2">{selectedOrg.extra2}</Descriptions.Item>}
|
|
179
|
+
{selectedOrg.extra3 && <Descriptions.Item label="扩展字段3">{selectedOrg.extra3}</Descriptions.Item>}
|
|
180
|
+
</Descriptions>
|
|
181
|
+
)}
|
|
237
182
|
</Card>
|
|
238
|
-
</Splitter>
|
|
239
|
-
|
|
183
|
+
</Splitter.Panel>
|
|
240
184
|
</Splitter>
|
|
241
185
|
|
|
242
|
-
|
|
186
|
+
<Modal title={this.state.modalValues?.id ? '编辑组织机构' : '新增组织机构'}
|
|
187
|
+
open={this.state.modalOpen}
|
|
188
|
+
onOk={() => this.formRef.current.submit()}
|
|
189
|
+
onCancel={() => this.setState({modalOpen: false})}
|
|
190
|
+
destroyOnClose
|
|
191
|
+
>
|
|
192
|
+
<Form ref={this.formRef} labelCol={{flex: '120px'}}
|
|
193
|
+
initialValues={this.state.modalValues}
|
|
194
|
+
onFinish={this.handleModalFinish}
|
|
195
|
+
>
|
|
196
|
+
<Form.Item name='id' noStyle/>
|
|
197
|
+
<Form.Item label='父节点' name='pid'>
|
|
198
|
+
<FieldRemoteTreeSelect url='admin/sysOrg/tree'/>
|
|
199
|
+
</Form.Item>
|
|
200
|
+
<Form.Item label='名称' name='name' rules={[{required: true}]}>
|
|
201
|
+
<Input/>
|
|
202
|
+
</Form.Item>
|
|
203
|
+
<Form.Item label='序号' name='seq'>
|
|
204
|
+
<InputNumber/>
|
|
205
|
+
</Form.Item>
|
|
206
|
+
<Form.Item label='类型' name='type' rules={[{required: true}]}>
|
|
207
|
+
<FieldDictSelect typeCode='orgType'/>
|
|
208
|
+
</Form.Item>
|
|
209
|
+
<Form.Item label='部门领导' name={['leader', 'id']}>
|
|
210
|
+
<FieldUserSelect/>
|
|
211
|
+
</Form.Item>
|
|
212
|
+
<Form.Item label='启用' name='enabled' rules={[{required: true}]}>
|
|
213
|
+
<FieldBoolean/>
|
|
214
|
+
</Form.Item>
|
|
215
|
+
<Form.Item label='扩展字段1' name='extra1'>
|
|
216
|
+
<Input/>
|
|
217
|
+
</Form.Item>
|
|
218
|
+
<Form.Item label='扩展字段2' name='extra2'>
|
|
219
|
+
<Input/>
|
|
220
|
+
</Form.Item>
|
|
221
|
+
<Form.Item label='扩展字段3' name='extra3'>
|
|
222
|
+
<Input/>
|
|
223
|
+
</Form.Item>
|
|
224
|
+
</Form>
|
|
225
|
+
</Modal>
|
|
243
226
|
</Page>
|
|
244
227
|
}
|
|
245
228
|
|
|
@@ -247,11 +230,8 @@ export default class extends React.Component {
|
|
|
247
230
|
const {dragNode, dropToGap, node} = e;
|
|
248
231
|
const dropKey = node.key;
|
|
249
232
|
const dragKey = dragNode.key;
|
|
250
|
-
|
|
251
233
|
const dropPos = e.node.pos.split('-');
|
|
252
|
-
const dropPosition = e.dropPosition - Number(dropPos[dropPos.length - 1]);
|
|
253
|
-
|
|
254
|
-
|
|
234
|
+
const dropPosition = e.dropPosition - Number(dropPos[dropPos.length - 1]);
|
|
255
235
|
HttpUtils.post('admin/sysOrg/sort', {dropPosition, dropToGap, dropKey, dragKey}).then(this.loadTree)
|
|
256
236
|
};
|
|
257
237
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {PlusOutlined} from '@ant-design/icons'
|
|
2
|
-
import {Button, Form, Input, InputNumber, Modal, Popconfirm, Transfer, Tree} from 'antd'
|
|
2
|
+
import {Button, Form, Input, InputNumber, Modal, Popconfirm, Select, Transfer, Tree} from 'antd'
|
|
3
3
|
import React from 'react'
|
|
4
4
|
import {ButtonList, FieldBoolean, HttpUtils, Page, PageUtils, ProTable, ViewText} from "../../../framework";
|
|
5
5
|
|
|
@@ -142,7 +142,7 @@ export default class extends React.Component {
|
|
|
142
142
|
onClick={() => this.handleEdit(record)}>编辑</Button>
|
|
143
143
|
<Popconfirm perm='sys-role:delete' disabled={record.builtin} title='是否确定删除系统角色'
|
|
144
144
|
onConfirm={() => this.handleDelete(record)}>
|
|
145
|
-
<Button size='small'>删除</Button>
|
|
145
|
+
<Button size='small' disabled={record.builtin}>删除</Button>
|
|
146
146
|
</Popconfirm>
|
|
147
147
|
</ButtonList>
|
|
148
148
|
);
|
|
@@ -180,20 +180,29 @@ export default class extends React.Component {
|
|
|
180
180
|
}
|
|
181
181
|
|
|
182
182
|
render() {
|
|
183
|
-
return <Page
|
|
183
|
+
return <Page
|
|
184
|
+
title="角色管理"
|
|
185
|
+
description="管理系统角色,包括角色权限分配、用户设置等"
|
|
186
|
+
actions={<Button perm='sys-role:create' type='primary' icon={<PlusOutlined/>} onClick={this.handleAdd}>新增</Button>}
|
|
187
|
+
>
|
|
184
188
|
<ProTable
|
|
185
189
|
actionRef={this.tableRef}
|
|
186
|
-
toolBarRender={() => {
|
|
187
|
-
return <ButtonList>
|
|
188
|
-
<Button perm='sys-role:create' type='primary' onClick={this.handleAdd}>
|
|
189
|
-
<PlusOutlined/> 新增
|
|
190
|
-
</Button>
|
|
191
|
-
</ButtonList>
|
|
192
|
-
}}
|
|
193
190
|
request={(params) => HttpUtils.get('admin/sysRole/page', params)}
|
|
194
191
|
columns={this.columns}
|
|
195
|
-
|
|
196
|
-
|
|
192
|
+
>
|
|
193
|
+
<Form.Item label='角色名称' name='name'>
|
|
194
|
+
<Input/>
|
|
195
|
+
</Form.Item>
|
|
196
|
+
<Form.Item label='角色编码' name='code'>
|
|
197
|
+
<Input/>
|
|
198
|
+
</Form.Item>
|
|
199
|
+
<Form.Item label='是否内置' name='builtin'>
|
|
200
|
+
<Select allowClear placeholder='全部'>
|
|
201
|
+
<Select.Option value={true}>是</Select.Option>
|
|
202
|
+
<Select.Option value={false}>否</Select.Option>
|
|
203
|
+
</Select>
|
|
204
|
+
</Form.Item>
|
|
205
|
+
</ProTable>
|
|
197
206
|
|
|
198
207
|
<Modal title='系统角色'
|
|
199
208
|
open={this.state.formOpen}
|
|
@@ -89,8 +89,7 @@ export default class extends React.Component {
|
|
|
89
89
|
|
|
90
90
|
|
|
91
91
|
render() {
|
|
92
|
-
return <Page>
|
|
93
|
-
|
|
92
|
+
return <Page title="角色权限设置" description="设置角色的菜单和权限">
|
|
94
93
|
<Card title='角色权限设置' loading={this.state.loading}
|
|
95
94
|
variant={"borderless"}
|
|
96
95
|
extra={<Button type='primary' icon={<SaveOutlined/>} onClick={this.savePerms}>保存权限</Button>}>
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {PlusOutlined} from '@ant-design/icons';
|
|
2
|
-
import {Button, Form, Input, Modal, Popconfirm,
|
|
2
|
+
import {Button, Card, Form, Input, Modal, Popconfirm, Select, Splitter} from 'antd';
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import {
|
|
5
5
|
ButtonList,
|
|
6
6
|
DictUtils,
|
|
7
7
|
FieldBoolean,
|
|
8
|
+
FieldRemoteSelect,
|
|
8
9
|
FieldSysOrgTreeSelect,
|
|
9
10
|
HttpUtils,
|
|
10
11
|
OrgTree,
|
|
11
12
|
Page,
|
|
12
13
|
ProTable,
|
|
13
|
-
RoleTree
|
|
14
14
|
} from "../../../framework";
|
|
15
15
|
import UserPerm from "./UserPerm";
|
|
16
16
|
|
|
@@ -22,7 +22,6 @@ export default class extends React.Component {
|
|
|
22
22
|
formValues: {},
|
|
23
23
|
|
|
24
24
|
currentOrgId: null,
|
|
25
|
-
currentRoleId: null,
|
|
26
25
|
}
|
|
27
26
|
permRef = React.createRef();
|
|
28
27
|
|
|
@@ -48,10 +47,6 @@ export default class extends React.Component {
|
|
|
48
47
|
this.setState({currentOrgId: key}, () => this.tableRef.current.reload())
|
|
49
48
|
}
|
|
50
49
|
|
|
51
|
-
onSelectRole = (key) => {
|
|
52
|
-
this.setState({currentRoleId: key}, () => this.tableRef.current.reload())
|
|
53
|
-
}
|
|
54
|
-
|
|
55
50
|
handleAdd = () => {
|
|
56
51
|
this.setState({formOpen: true, formValues: {}})
|
|
57
52
|
}
|
|
@@ -154,51 +149,41 @@ export default class extends React.Component {
|
|
|
154
149
|
|
|
155
150
|
render() {
|
|
156
151
|
|
|
157
|
-
return <Page>
|
|
152
|
+
return <Page title="用户管理" description="管理系统用户" actions={<Button perm='sys-user:create' type="primary" icon={<PlusOutlined/>} onClick={this.handleAdd}>新增</Button>}>
|
|
158
153
|
<Splitter>
|
|
159
|
-
<Splitter.Panel defaultSize={
|
|
160
|
-
<
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
items={[
|
|
164
|
-
{
|
|
165
|
-
key: 'org',
|
|
166
|
-
label: '按组织机构',
|
|
167
|
-
children: <OrgTree onChange={this.onSelectOrg}/>
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
key: 'role',
|
|
171
|
-
label: '按角色',
|
|
172
|
-
children: <RoleTree onSelect={this.onSelectRole}/>
|
|
173
|
-
}
|
|
174
|
-
]}/>
|
|
175
|
-
|
|
154
|
+
<Splitter.Panel defaultSize={350} style={{paddingRight: 8}}>
|
|
155
|
+
<Card size='small'>
|
|
156
|
+
<OrgTree onChange={this.onSelectOrg}/>
|
|
157
|
+
</Card>
|
|
176
158
|
</Splitter.Panel>
|
|
177
|
-
<Splitter.Panel style={{paddingLeft:
|
|
159
|
+
<Splitter.Panel style={{paddingLeft: 8}}>
|
|
178
160
|
<ProTable
|
|
161
|
+
searchColumns={3}
|
|
179
162
|
actionRef={this.tableRef}
|
|
180
|
-
toolBarRender={() => {
|
|
181
|
-
return <ButtonList>
|
|
182
|
-
<Button
|
|
183
|
-
perm='sys-user:create'
|
|
184
|
-
type="primary"
|
|
185
|
-
onClick={this.handleAdd}>
|
|
186
|
-
<PlusOutlined/> 新增
|
|
187
|
-
</Button>
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
</ButtonList>
|
|
191
|
-
}}
|
|
192
|
-
showToolbarSearch
|
|
193
163
|
request={(params) => {
|
|
194
164
|
params.orgId = this.state.currentOrgId
|
|
195
|
-
params.roleId = this.state.currentRoleId
|
|
196
165
|
return HttpUtils.get('admin/sysUser/page', params)
|
|
197
|
-
}
|
|
198
|
-
}
|
|
166
|
+
}}
|
|
199
167
|
columns={this.columns}
|
|
200
168
|
>
|
|
201
|
-
|
|
169
|
+
<Form.Item label='姓名' name='name'>
|
|
170
|
+
<Input/>
|
|
171
|
+
</Form.Item>
|
|
172
|
+
<Form.Item label='登录账号' name='account'>
|
|
173
|
+
<Input/>
|
|
174
|
+
</Form.Item>
|
|
175
|
+
<Form.Item label='手机号' name='phone'>
|
|
176
|
+
<Input/>
|
|
177
|
+
</Form.Item>
|
|
178
|
+
<Form.Item label='角色' name='roleId'>
|
|
179
|
+
<FieldRemoteSelect url='admin/sysRole/options' placeholder='请选择角色'/>
|
|
180
|
+
</Form.Item>
|
|
181
|
+
<Form.Item label='状态' name='enabled'>
|
|
182
|
+
<Select allowClear placeholder='全部'>
|
|
183
|
+
<Select.Option value={true}>启用</Select.Option>
|
|
184
|
+
<Select.Option value={false}>停用</Select.Option>
|
|
185
|
+
</Select>
|
|
186
|
+
</Form.Item>
|
|
202
187
|
</ProTable>
|
|
203
188
|
</Splitter.Panel>
|
|
204
189
|
</Splitter>
|
|
@@ -17,7 +17,8 @@ export default class extends React.Component {
|
|
|
17
17
|
|
|
18
18
|
render() {
|
|
19
19
|
const {info} = this.state;
|
|
20
|
-
return <Page backgroundGray>
|
|
20
|
+
return <Page backgroundGray title="个人中心" description="查看和编辑个人资料">
|
|
21
|
+
|
|
21
22
|
<Row gutter={[16, 16]}>
|
|
22
23
|
<Col md={6} sm={24}>
|
|
23
24
|
<Card title='个人信息'>
|
|
@@ -27,7 +28,7 @@ export default class extends React.Component {
|
|
|
27
28
|
</div>
|
|
28
29
|
|
|
29
30
|
|
|
30
|
-
<table className='
|
|
31
|
+
<table className='oa-table'>
|
|
31
32
|
<tbody>
|
|
32
33
|
<tr>
|
|
33
34
|
<td>用户名称</td>
|
package/src/style/global.less
CHANGED