@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
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"dev": "umi dev",
|
|
38
38
|
"build": "umi build"
|
|
39
39
|
},
|
|
40
|
-
"version": "2.
|
|
40
|
+
"version": "2.5.0"
|
|
41
41
|
},
|
|
42
42
|
"pkgPath": "/home/runner/work/open-admin/open-admin/web/package.json",
|
|
43
43
|
"plugins": {
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"config": {},
|
|
64
64
|
"time": {
|
|
65
65
|
"hooks": {},
|
|
66
|
-
"register":
|
|
66
|
+
"register": 4
|
|
67
67
|
},
|
|
68
68
|
"enableBy": "register"
|
|
69
69
|
},
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
0
|
|
81
81
|
]
|
|
82
82
|
},
|
|
83
|
-
"register":
|
|
83
|
+
"register": 3
|
|
84
84
|
},
|
|
85
85
|
"enableBy": "register"
|
|
86
86
|
},
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
"time": {
|
|
95
95
|
"hooks": {
|
|
96
96
|
"onStart": [
|
|
97
|
-
|
|
97
|
+
0
|
|
98
98
|
]
|
|
99
99
|
},
|
|
100
100
|
"register": 2
|
|
@@ -141,10 +141,10 @@
|
|
|
141
141
|
"time": {
|
|
142
142
|
"hooks": {
|
|
143
143
|
"modifyAppData": [
|
|
144
|
-
|
|
144
|
+
67
|
|
145
145
|
]
|
|
146
146
|
},
|
|
147
|
-
"register":
|
|
147
|
+
"register": 21
|
|
148
148
|
},
|
|
149
149
|
"enableBy": "register"
|
|
150
150
|
},
|
|
@@ -157,7 +157,7 @@
|
|
|
157
157
|
"config": {},
|
|
158
158
|
"time": {
|
|
159
159
|
"hooks": {},
|
|
160
|
-
"register":
|
|
160
|
+
"register": 1
|
|
161
161
|
},
|
|
162
162
|
"enableBy": "register"
|
|
163
163
|
},
|
|
@@ -194,7 +194,7 @@
|
|
|
194
194
|
0
|
|
195
195
|
]
|
|
196
196
|
},
|
|
197
|
-
"register":
|
|
197
|
+
"register": 0
|
|
198
198
|
},
|
|
199
199
|
"enableBy": "register"
|
|
200
200
|
},
|
|
@@ -236,7 +236,7 @@
|
|
|
236
236
|
"enableBy": "register",
|
|
237
237
|
"time": {
|
|
238
238
|
"hooks": {},
|
|
239
|
-
"register":
|
|
239
|
+
"register": 1
|
|
240
240
|
}
|
|
241
241
|
},
|
|
242
242
|
"virtual: config-styles": {
|
|
@@ -1076,7 +1076,7 @@
|
|
|
1076
1076
|
"config": {},
|
|
1077
1077
|
"time": {
|
|
1078
1078
|
"hooks": {},
|
|
1079
|
-
"register":
|
|
1079
|
+
"register": 1
|
|
1080
1080
|
},
|
|
1081
1081
|
"enableBy": "config"
|
|
1082
1082
|
},
|
|
@@ -1093,7 +1093,7 @@
|
|
|
1093
1093
|
1
|
|
1094
1094
|
]
|
|
1095
1095
|
},
|
|
1096
|
-
"register":
|
|
1096
|
+
"register": 0
|
|
1097
1097
|
},
|
|
1098
1098
|
"enableBy": "register"
|
|
1099
1099
|
},
|
|
@@ -1119,7 +1119,7 @@
|
|
|
1119
1119
|
"config": {},
|
|
1120
1120
|
"time": {
|
|
1121
1121
|
"hooks": {},
|
|
1122
|
-
"register":
|
|
1122
|
+
"register": 96
|
|
1123
1123
|
},
|
|
1124
1124
|
"enableBy": "register"
|
|
1125
1125
|
},
|
|
@@ -1132,7 +1132,7 @@
|
|
|
1132
1132
|
"config": {},
|
|
1133
1133
|
"time": {
|
|
1134
1134
|
"hooks": {},
|
|
1135
|
-
"register":
|
|
1135
|
+
"register": 28
|
|
1136
1136
|
},
|
|
1137
1137
|
"enableBy": "config"
|
|
1138
1138
|
},
|
|
@@ -1201,7 +1201,7 @@
|
|
|
1201
1201
|
"config": {},
|
|
1202
1202
|
"time": {
|
|
1203
1203
|
"hooks": {},
|
|
1204
|
-
"register":
|
|
1204
|
+
"register": 31
|
|
1205
1205
|
}
|
|
1206
1206
|
},
|
|
1207
1207
|
"./node_modules/@umijs/preset-umi/dist/features/mpa/mpa": {
|
|
@@ -1213,7 +1213,7 @@
|
|
|
1213
1213
|
"config": {},
|
|
1214
1214
|
"time": {
|
|
1215
1215
|
"hooks": {},
|
|
1216
|
-
"register":
|
|
1216
|
+
"register": 1
|
|
1217
1217
|
},
|
|
1218
1218
|
"enableBy": "config"
|
|
1219
1219
|
},
|
|
@@ -1226,7 +1226,7 @@
|
|
|
1226
1226
|
"config": {},
|
|
1227
1227
|
"time": {
|
|
1228
1228
|
"hooks": {},
|
|
1229
|
-
"register":
|
|
1229
|
+
"register": 0
|
|
1230
1230
|
}
|
|
1231
1231
|
},
|
|
1232
1232
|
"./node_modules/@umijs/preset-umi/dist/features/overrides/overrides": {
|
|
@@ -1265,7 +1265,7 @@
|
|
|
1265
1265
|
"time": {
|
|
1266
1266
|
"hooks": {
|
|
1267
1267
|
"modifyConfig": [
|
|
1268
|
-
|
|
1268
|
+
0
|
|
1269
1269
|
]
|
|
1270
1270
|
},
|
|
1271
1271
|
"register": 1
|
|
@@ -1280,7 +1280,7 @@
|
|
|
1280
1280
|
"config": {},
|
|
1281
1281
|
"time": {
|
|
1282
1282
|
"hooks": {},
|
|
1283
|
-
"register":
|
|
1283
|
+
"register": 1
|
|
1284
1284
|
},
|
|
1285
1285
|
"enableBy": "register"
|
|
1286
1286
|
},
|
|
@@ -1306,7 +1306,7 @@
|
|
|
1306
1306
|
"config": {},
|
|
1307
1307
|
"time": {
|
|
1308
1308
|
"hooks": {},
|
|
1309
|
-
"register":
|
|
1309
|
+
"register": 0
|
|
1310
1310
|
},
|
|
1311
1311
|
"enableBy": "config"
|
|
1312
1312
|
},
|
|
@@ -1319,7 +1319,7 @@
|
|
|
1319
1319
|
"config": {},
|
|
1320
1320
|
"time": {
|
|
1321
1321
|
"hooks": {},
|
|
1322
|
-
"register":
|
|
1322
|
+
"register": 1
|
|
1323
1323
|
},
|
|
1324
1324
|
"enableBy": "config"
|
|
1325
1325
|
},
|
|
@@ -1332,7 +1332,7 @@
|
|
|
1332
1332
|
"config": {},
|
|
1333
1333
|
"time": {
|
|
1334
1334
|
"hooks": {},
|
|
1335
|
-
"register":
|
|
1335
|
+
"register": 0
|
|
1336
1336
|
},
|
|
1337
1337
|
"enableBy": "register"
|
|
1338
1338
|
},
|
|
@@ -1383,7 +1383,7 @@
|
|
|
1383
1383
|
"config": {},
|
|
1384
1384
|
"time": {
|
|
1385
1385
|
"hooks": {},
|
|
1386
|
-
"register":
|
|
1386
|
+
"register": 1
|
|
1387
1387
|
},
|
|
1388
1388
|
"enableBy": "config"
|
|
1389
1389
|
},
|
|
@@ -1460,7 +1460,7 @@
|
|
|
1460
1460
|
"config": {},
|
|
1461
1461
|
"time": {
|
|
1462
1462
|
"hooks": {},
|
|
1463
|
-
"register":
|
|
1463
|
+
"register": 21
|
|
1464
1464
|
},
|
|
1465
1465
|
"enableBy": "config"
|
|
1466
1466
|
},
|
|
@@ -1485,7 +1485,7 @@
|
|
|
1485
1485
|
"config": {},
|
|
1486
1486
|
"time": {
|
|
1487
1487
|
"hooks": {},
|
|
1488
|
-
"register":
|
|
1488
|
+
"register": 1
|
|
1489
1489
|
}
|
|
1490
1490
|
},
|
|
1491
1491
|
"./node_modules/@umijs/preset-umi/dist/features/legacy/legacy": {
|
|
@@ -1510,7 +1510,7 @@
|
|
|
1510
1510
|
"config": {},
|
|
1511
1511
|
"time": {
|
|
1512
1512
|
"hooks": {},
|
|
1513
|
-
"register":
|
|
1513
|
+
"register": 0
|
|
1514
1514
|
},
|
|
1515
1515
|
"enableBy": "config"
|
|
1516
1516
|
},
|
|
@@ -1523,7 +1523,7 @@
|
|
|
1523
1523
|
"config": {},
|
|
1524
1524
|
"time": {
|
|
1525
1525
|
"hooks": {},
|
|
1526
|
-
"register":
|
|
1526
|
+
"register": 1
|
|
1527
1527
|
}
|
|
1528
1528
|
},
|
|
1529
1529
|
"./node_modules/@umijs/preset-umi/dist/features/swc/swc": {
|
|
@@ -1539,7 +1539,7 @@
|
|
|
1539
1539
|
0
|
|
1540
1540
|
]
|
|
1541
1541
|
},
|
|
1542
|
-
"register":
|
|
1542
|
+
"register": 0
|
|
1543
1543
|
},
|
|
1544
1544
|
"enableBy": "register"
|
|
1545
1545
|
},
|
|
@@ -1552,7 +1552,7 @@
|
|
|
1552
1552
|
"config": {},
|
|
1553
1553
|
"time": {
|
|
1554
1554
|
"hooks": {},
|
|
1555
|
-
"register":
|
|
1555
|
+
"register": 3
|
|
1556
1556
|
}
|
|
1557
1557
|
},
|
|
1558
1558
|
"./node_modules/@umijs/preset-umi/dist/features/mako/mako": {
|
|
@@ -1601,7 +1601,7 @@
|
|
|
1601
1601
|
"config": {},
|
|
1602
1602
|
"time": {
|
|
1603
1603
|
"hooks": {},
|
|
1604
|
-
"register":
|
|
1604
|
+
"register": 27
|
|
1605
1605
|
}
|
|
1606
1606
|
},
|
|
1607
1607
|
"./node_modules/@umijs/preset-umi/dist/features/forget/forget": {
|
|
@@ -1652,7 +1652,7 @@
|
|
|
1652
1652
|
"config": {},
|
|
1653
1653
|
"time": {
|
|
1654
1654
|
"hooks": {},
|
|
1655
|
-
"register":
|
|
1655
|
+
"register": 43
|
|
1656
1656
|
},
|
|
1657
1657
|
"enableBy": "register"
|
|
1658
1658
|
},
|
|
@@ -1677,7 +1677,7 @@
|
|
|
1677
1677
|
"config": {},
|
|
1678
1678
|
"time": {
|
|
1679
1679
|
"hooks": {},
|
|
1680
|
-
"register":
|
|
1680
|
+
"register": 1
|
|
1681
1681
|
},
|
|
1682
1682
|
"enableBy": "register"
|
|
1683
1683
|
},
|
|
@@ -1690,7 +1690,7 @@
|
|
|
1690
1690
|
"config": {},
|
|
1691
1691
|
"time": {
|
|
1692
1692
|
"hooks": {},
|
|
1693
|
-
"register":
|
|
1693
|
+
"register": 0
|
|
1694
1694
|
},
|
|
1695
1695
|
"enableBy": "register"
|
|
1696
1696
|
},
|
|
@@ -1742,7 +1742,7 @@
|
|
|
1742
1742
|
"config": {},
|
|
1743
1743
|
"time": {
|
|
1744
1744
|
"hooks": {},
|
|
1745
|
-
"register":
|
|
1745
|
+
"register": 2
|
|
1746
1746
|
},
|
|
1747
1747
|
"enableBy": "register"
|
|
1748
1748
|
},
|
|
@@ -1755,7 +1755,7 @@
|
|
|
1755
1755
|
"config": {},
|
|
1756
1756
|
"time": {
|
|
1757
1757
|
"hooks": {},
|
|
1758
|
-
"register":
|
|
1758
|
+
"register": 0
|
|
1759
1759
|
},
|
|
1760
1760
|
"enableBy": "register"
|
|
1761
1761
|
},
|
|
@@ -1768,7 +1768,7 @@
|
|
|
1768
1768
|
"config": {},
|
|
1769
1769
|
"time": {
|
|
1770
1770
|
"hooks": {},
|
|
1771
|
-
"register":
|
|
1771
|
+
"register": 1
|
|
1772
1772
|
},
|
|
1773
1773
|
"enableBy": "register"
|
|
1774
1774
|
},
|
|
@@ -1781,7 +1781,7 @@
|
|
|
1781
1781
|
"config": {},
|
|
1782
1782
|
"time": {
|
|
1783
1783
|
"hooks": {},
|
|
1784
|
-
"register":
|
|
1784
|
+
"register": 0
|
|
1785
1785
|
},
|
|
1786
1786
|
"enableBy": "register"
|
|
1787
1787
|
},
|
|
@@ -1794,7 +1794,7 @@
|
|
|
1794
1794
|
"config": {},
|
|
1795
1795
|
"time": {
|
|
1796
1796
|
"hooks": {},
|
|
1797
|
-
"register":
|
|
1797
|
+
"register": 1
|
|
1798
1798
|
},
|
|
1799
1799
|
"enableBy": "register"
|
|
1800
1800
|
},
|
|
@@ -1807,7 +1807,7 @@
|
|
|
1807
1807
|
"config": {},
|
|
1808
1808
|
"time": {
|
|
1809
1809
|
"hooks": {},
|
|
1810
|
-
"register":
|
|
1810
|
+
"register": 0
|
|
1811
1811
|
},
|
|
1812
1812
|
"enableBy": "register"
|
|
1813
1813
|
},
|
|
@@ -1833,7 +1833,7 @@
|
|
|
1833
1833
|
"config": {},
|
|
1834
1834
|
"time": {
|
|
1835
1835
|
"hooks": {},
|
|
1836
|
-
"register":
|
|
1836
|
+
"register": 1
|
|
1837
1837
|
},
|
|
1838
1838
|
"enableBy": "register"
|
|
1839
1839
|
},
|
|
@@ -1846,7 +1846,7 @@
|
|
|
1846
1846
|
"config": {},
|
|
1847
1847
|
"time": {
|
|
1848
1848
|
"hooks": {},
|
|
1849
|
-
"register":
|
|
1849
|
+
"register": 0
|
|
1850
1850
|
},
|
|
1851
1851
|
"enableBy": "register"
|
|
1852
1852
|
},
|
|
@@ -1859,7 +1859,7 @@
|
|
|
1859
1859
|
"config": {},
|
|
1860
1860
|
"time": {
|
|
1861
1861
|
"hooks": {},
|
|
1862
|
-
"register":
|
|
1862
|
+
"register": 1
|
|
1863
1863
|
},
|
|
1864
1864
|
"enableBy": "register"
|
|
1865
1865
|
},
|
|
@@ -1872,7 +1872,7 @@
|
|
|
1872
1872
|
"config": {},
|
|
1873
1873
|
"time": {
|
|
1874
1874
|
"hooks": {},
|
|
1875
|
-
"register":
|
|
1875
|
+
"register": 0
|
|
1876
1876
|
},
|
|
1877
1877
|
"enableBy": "register"
|
|
1878
1878
|
},
|
|
@@ -1898,7 +1898,7 @@
|
|
|
1898
1898
|
"config": {},
|
|
1899
1899
|
"time": {
|
|
1900
1900
|
"hooks": {},
|
|
1901
|
-
"register":
|
|
1901
|
+
"register": 0
|
|
1902
1902
|
},
|
|
1903
1903
|
"enableBy": "register"
|
|
1904
1904
|
},
|
|
@@ -1937,7 +1937,7 @@
|
|
|
1937
1937
|
"config": {},
|
|
1938
1938
|
"time": {
|
|
1939
1939
|
"hooks": {},
|
|
1940
|
-
"register":
|
|
1940
|
+
"register": 1
|
|
1941
1941
|
},
|
|
1942
1942
|
"enableBy": "register"
|
|
1943
1943
|
},
|
|
@@ -1950,7 +1950,7 @@
|
|
|
1950
1950
|
"config": {},
|
|
1951
1951
|
"time": {
|
|
1952
1952
|
"hooks": {},
|
|
1953
|
-
"register":
|
|
1953
|
+
"register": 1
|
|
1954
1954
|
},
|
|
1955
1955
|
"enableBy": "register"
|
|
1956
1956
|
},
|
|
@@ -2058,23 +2058,13 @@
|
|
|
2058
2058
|
"__isJSFile": true,
|
|
2059
2059
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/user/UserPerm.jsx"
|
|
2060
2060
|
},
|
|
2061
|
-
"system/manual/index": {
|
|
2062
|
-
"path": "system/manual",
|
|
2063
|
-
"id": "system/manual/index",
|
|
2064
|
-
"parentId": "@@/global-layout",
|
|
2065
|
-
"file": "system/manual/index.jsx",
|
|
2066
|
-
"absPath": "/system/manual",
|
|
2067
|
-
"__content": "import {PlusOutlined} from '@ant-design/icons'\nimport {Button, Form, Input, Modal, Popconfirm} from 'antd'\nimport React from 'react'\nimport {ButtonList, FieldUploadFile, HttpUtils, Page, ProTable} from \"../../../framework\";\n\n\nexport default class extends React.Component {\n\n state = {\n formValues: {},\n formOpen: false\n }\n\n formRef = React.createRef()\n tableRef = React.createRef()\n\n handleAdd = () => {\n this.setState({formOpen: true, formValues: {}})\n }\n\n handleEdit = record => {\n this.setState({formOpen: true, formValues: record})\n }\n\n onFinish = values => {\n const isNew = !values.id;\n const url = isNew ? 'admin/sysManual/create' : 'admin/sysManual/update';\n HttpUtils.post(url, values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload()\n })\n }\n\n handleDelete = record => {\n HttpUtils.post('admin/sysManual/delete', {id: record.id}).then(rs => {\n this.tableRef.current.reload()\n })\n }\n\n columns = [\n\n {\n title: '名称',\n dataIndex: 'name',\n\n\n },\n\n {\n title: '版本',\n dataIndex: 'version',\n render(version) {\n return 'v' + version;\n }\n },\n\n {\n title: '文件',\n dataIndex: 'fileId',\n render(id) {\n const url = 'admin/sysFile/preview/' + id;\n return <a href={url} target='_blank'>查看文件</a>\n }\n\n },\n {\n title: '操作',\n dataIndex: 'option',\n render: (_, record) => (\n <ButtonList>\n <Button size='small' perm='sys-manual:update' onClick={() => this.handleEdit(record)}>编辑</Button>\n <Popconfirm perm='sys-manual:delete' title='是否确定删除操作手册'\n onConfirm={() => this.handleDelete(record)}>\n <Button size='small'>删除</Button>\n </Popconfirm>\n </ButtonList>\n ),\n },\n\n ]\n\n render() {\n return <Page>\n <ProTable\n actionRef={this.tableRef}\n toolBarRender={(params, {selectedRows, selectedRowKeys}) => {\n return <ButtonList>\n <Button perm='sys-manual:create' type='primary' onClick={this.handleAdd}>\n <PlusOutlined/> 新增\n </Button>\n </ButtonList>\n }}\n request={(params) => HttpUtils.get('admin/sysManual/page', params)}\n columns={this.columns}\n\n />\n\n <Modal title='操作手册'\n open={this.state.formOpen}\n onOk={() => this.formRef.current.submit()}\n onCancel={() => this.setState({formOpen: false})}\n destroyOnHidden\n mask={{ closable: false }}\n >\n\n <Form ref={this.formRef} labelCol={{flex: '100px'}}\n initialValues={this.state.formValues}\n onFinish={this.onFinish}\n >\n <Form.Item name='id' noStyle></Form.Item>\n\n <Form.Item label='名称' name='name' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n\n <Form.Item label='文件' name='fileId' rules={[{required: true}]}>\n <FieldUploadFile accept=\".pdf\" maxCount={1}/>\n </Form.Item>\n\n </Form>\n </Modal>\n </Page>\n\n\n }\n}\n\n\n",
|
|
2068
|
-
"__isJSFile": true,
|
|
2069
|
-
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/manual/index.jsx"
|
|
2070
|
-
},
|
|
2071
2061
|
"userCenter/message": {
|
|
2072
2062
|
"path": "userCenter/message",
|
|
2073
2063
|
"id": "userCenter/message",
|
|
2074
2064
|
"parentId": "@@/global-layout",
|
|
2075
2065
|
"file": "userCenter/message.jsx",
|
|
2076
2066
|
"absPath": "/userCenter/message",
|
|
2077
|
-
"__content": "import React from \"react\";\nimport {Button, Card, Tabs, Tag} from \"antd\";\nimport {HttpUtils, Page, ProTable} from \"../../framework\";\n\nexport default class extends React.Component {\n\n tableRef = React.createRef()\n\n read = (record) => {\n HttpUtils.post(\"admin/user/msg/read\", record).then(rs => {\n this.tableRef.current.reload()\n })\n }\n\n columns = [\n {\n title: '时间',\n dataIndex: 'createTime',\n width: 150\n },\n {\n title: '标题',\n dataIndex: 'title',\n },\n {\n title: '内容',\n dataIndex: 'content',\n render(content, row) {\n return <div dangerouslySetInnerHTML={{__html: content}}/>\n }\n },\n {\n title: '已读时间',\n dataIndex: 'readTime',\n width: 150\n },\n {\n title: '状态',\n dataIndex: 'isRead',\n render: (v, row) => {\n return v == true ? <Tag color='green'>已读</Tag> : <Tag color='red'>未读</Tag>;\n },\n width: 80\n },\n\n {\n title: '-',\n dataIndex: 'option',\n render: (read, row) => {\n if (!row.isRead)\n return <Button size='small' onClick={() => this.read(row)}> 标记已读 </Button>\n }, width: 80\n }\n ]\n\n render() {\n return <Page>\n <Card variant={\"borderless\"}>\n\n <Tabs defaultActiveKey=\"0\" destroyOnClose\n >\n <Tabs.TabPane key='0' tab='所有消息'>\n <ProTable\n actionRef={this.tableRef}\n request={(params) => HttpUtils.get(\"admin/user/msg/page\", params)}\n columns={this.columns}\n toolbarOptions={{showSearch: false}}\n size='small'\n />\n </Tabs.TabPane>\n <Tabs.TabPane key='1' tab='未读消息'>\n <ProTable\n actionRef={this.tableRef}\n request={(params) => HttpUtils.get(\"admin/user/msg/page?read=false\", params)}\n columns={this.columns}\n rowSelection={false}\n rowKey='id'\n toolbarOptions={{showSearch: false}}\n size='small'\n />\n\n\n </Tabs.TabPane>\n <Tabs.TabPane key='2' tab='已读消息'>\n\n <ProTable\n actionRef={this.tableRef}\n request={(params) => HttpUtils.get(\"admin/user/msg/page?read=true\", params)}\n rowSelection={false}\n rowKey='id'\n toolbarOptions={{showSearch: false}}\n options={false}\n size='small'\n columns={this.columns}\n />\n\n\n </Tabs.TabPane>\n\n </Tabs>\n\n </Card>\n </Page>\n }\n}\n",
|
|
2067
|
+
"__content": "import React from \"react\";\nimport {Button, Card, Tabs, Tag} from \"antd\";\nimport {HttpUtils, Page, ProTable} from \"../../framework\";\n\nexport default class extends React.Component {\n\n tableRef = React.createRef()\n\n read = (record) => {\n HttpUtils.post(\"admin/user/msg/read\", record).then(rs => {\n this.tableRef.current.reload()\n })\n }\n\n columns = [\n {\n title: '时间',\n dataIndex: 'createTime',\n width: 150\n },\n {\n title: '标题',\n dataIndex: 'title',\n },\n {\n title: '内容',\n dataIndex: 'content',\n render(content, row) {\n return <div dangerouslySetInnerHTML={{__html: content}}/>\n }\n },\n {\n title: '已读时间',\n dataIndex: 'readTime',\n width: 150\n },\n {\n title: '状态',\n dataIndex: 'isRead',\n render: (v, row) => {\n return v == true ? <Tag color='green'>已读</Tag> : <Tag color='red'>未读</Tag>;\n },\n width: 80\n },\n\n {\n title: '-',\n dataIndex: 'option',\n render: (read, row) => {\n if (!row.isRead)\n return <Button size='small' onClick={() => this.read(row)}> 标记已读 </Button>\n }, width: 80\n }\n ]\n\n render() {\n return <Page title=\"消息中心\" description=\"查看系统消息通知\">\n <Card variant={\"borderless\"}>\n\n <Tabs defaultActiveKey=\"0\" destroyOnClose\n >\n <Tabs.TabPane key='0' tab='所有消息'>\n <ProTable\n actionRef={this.tableRef}\n request={(params) => HttpUtils.get(\"admin/user/msg/page\", params)}\n columns={this.columns}\n toolbarOptions={{showSearch: false}}\n size='small'\n />\n </Tabs.TabPane>\n <Tabs.TabPane key='1' tab='未读消息'>\n <ProTable\n actionRef={this.tableRef}\n request={(params) => HttpUtils.get(\"admin/user/msg/page?read=false\", params)}\n columns={this.columns}\n rowSelection={false}\n rowKey='id'\n toolbarOptions={{showSearch: false}}\n size='small'\n />\n\n\n </Tabs.TabPane>\n <Tabs.TabPane key='2' tab='已读消息'>\n\n <ProTable\n actionRef={this.tableRef}\n request={(params) => HttpUtils.get(\"admin/user/msg/page?read=true\", params)}\n rowSelection={false}\n rowKey='id'\n toolbarOptions={{showSearch: false}}\n options={false}\n size='small'\n columns={this.columns}\n />\n\n\n </Tabs.TabPane>\n\n </Tabs>\n\n </Card>\n </Page>\n }\n}\n",
|
|
2078
2068
|
"__isJSFile": true,
|
|
2079
2069
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/userCenter/message.jsx"
|
|
2080
2070
|
},
|
|
@@ -2084,7 +2074,7 @@
|
|
|
2084
2074
|
"parentId": "@@/global-layout",
|
|
2085
2075
|
"file": "system/dict/index.jsx",
|
|
2086
2076
|
"absPath": "/system/dict",
|
|
2087
|
-
"__content": "import {DeleteOutlined, EditOutlined, PlusOutlined, SyncOutlined} from '@ant-design/icons';\nimport {Button, Card, Empty, Form, Input, InputNumber, Modal, Popconfirm, Space, Splitter, Tree, Tag, TreeSelect} from 'antd';\nimport React from 'react';\nimport {\n ButtonList,\n FieldBoolean,\n FieldDictSelect,\n Gap,\n HttpUtils,\n Page,\n ProTable,\n ViewBooleanEnableDisable,\n} from \"../../../framework\";\n\nexport default class extends React.Component {\n\n state = {\n typeTree: [],\n treeLoading: false,\n selectedType: null,\n selectedTypeCode: null,\n\n formOpen: false,\n formValues: {},\n typeFormOpen: false,\n typeFormValues: {},\n }\n\n formRef = React.createRef();\n typeFormRef = React.createRef();\n tableRef = React.createRef();\n\n componentDidMount() {\n this.loadTree()\n }\n\n loadTree = () => {\n this.setState({treeLoading: true})\n HttpUtils.get('admin/dict/type-tree').then(rs => {\n this.setState({typeTree: rs})\n }).finally(() => {\n this.setState({treeLoading: false})\n })\n }\n\n handleTypeAdd = () => {\n this.setState({\n typeFormOpen: true,\n typeFormValues: {pid: this.state.selectedType?.id, enabled: true},\n })\n }\n\n handleTypeEdit = () => {\n const {selectedType} = this.state\n if (!selectedType) return\n this.setState({typeFormOpen: true, typeFormValues: {...selectedType}})\n }\n\n handleTypeDelete = () => {\n const {selectedType} = this.state\n if (!selectedType) return\n HttpUtils.post('admin/dict/type-delete', {id: selectedType.id}).then(() => {\n this.setState({selectedType: null, selectedTypeCode: null})\n this.loadTree()\n })\n }\n\n handleTypeFormFinish = values => {\n const isNew = !values.id\n const url = isNew ? 'admin/dict/type-create' : 'admin/dict/type-update'\n HttpUtils.post(url, values).then(rs => {\n this.setState({typeFormOpen: false})\n this.loadTree()\n })\n }\n\n onTreeSelect = (selectedKeys) => {\n if (selectedKeys.length === 0) {\n this.setState({selectedType: null, selectedTypeCode: null})\n return\n }\n const findNode = (nodes, key) => {\n for (const n of nodes) {\n if (n.id === key) return n\n if (n.children) {\n const found = findNode(n.children, key)\n if (found) return found\n }\n }\n return null\n }\n const node = findNode(this.state.typeTree, selectedKeys[0])\n this.setState({\n selectedType: node,\n selectedTypeCode: node?.typeCode || null\n },()=>this.tableRef.current.reload())\n }\n\n handleItemAdd = () => {\n this.setState({formOpen: true, formValues: {typeCode: this.state.selectedTypeCode}})\n }\n\n handleItemEdit = record => {\n this.setState({formOpen: true, formValues: record})\n }\n\n handleItemDelete = row => {\n HttpUtils.post('admin/dict/delete', row).then(rs => {\n this.tableRef.current.reload()\n })\n }\n\n onItemFormFinish = values => {\n const isNew = !values.id\n const url = isNew ? 'admin/dict/create' : 'admin/dict/update'\n HttpUtils.post(url, values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload()\n })\n }\n\n columns = [\n {title: '编码', dataIndex: 'code'},\n {title: '标签', dataIndex: 'label'},\n {\n title: '颜色', dataIndex: 'color',\n render(v) {\n if (v) return <Tag color={v.toLowerCase()}>{v}</Tag>\n }\n },\n {\n title: '启用', dataIndex: 'enabled',\n render(v) {\n return <ViewBooleanEnableDisable value={v}/>\n }\n },\n {title: '序号', dataIndex: 'seq'},\n {\n title: '操作', dataIndex: 'option',\n render: (_, record) => {\n return (\n <ButtonList>\n <Button size='small' perm='sys-dict:update'\n onClick={() => this.handleItemEdit(record)}>编辑</Button>\n <Popconfirm perm='sys-dict:delete' title='是否确定删除字典项'\n onConfirm={() => this.handleItemDelete(record)}>\n <Button size='small'>删除</Button>\n </Popconfirm>\n </ButtonList>\n );\n },\n },\n ]\n\n render() {\n const {selectedType, selectedTypeCode} = this.state\n const hasTypeSelected = selectedType != null && selectedTypeCode != null\n\n return <Page>\n <Splitter>\n <Splitter.Panel defaultSize={300}>\n <Card loading={this.state.treeLoading}\n title='字典类型'\n extra={<Space>\n <Button size='small' shape='round' icon={<SyncOutlined/>}\n onClick={this.loadTree}/>\n </Space>}\n >\n <ButtonList>\n <Button type='primary' size='small' onClick={this.handleTypeAdd}>\n <PlusOutlined/> 新增类型\n </Button>\n <Button size='small' disabled={!selectedType} onClick={this.handleTypeEdit}>\n <EditOutlined/> 编辑\n </Button>\n <Popconfirm title='是否确定删除此类型及其所有子类型和字典项?'\n disabled={!selectedType}\n onConfirm={this.handleTypeDelete}>\n <Button size='small' disabled={!selectedType}>\n <DeleteOutlined/> 删除\n </Button>\n </Popconfirm>\n </ButtonList>\n <Gap/>\n <Tree\n treeData={this.state.typeTree}\n onSelect={this.onTreeSelect}\n fieldNames={{title: 'typeLabel', key: 'id'}}\n showLine\n defaultExpandAll\n blockNode\n />\n {this.state.typeTree.length === 0 && <Empty/>}\n\n\n </Card>\n </Splitter.Panel>\n\n <Splitter.Panel>\n <Card title={hasTypeSelected ? `${selectedType.typeLabel} 的字典项` : '字典项'}\n extra={\n hasTypeSelected\n ? <Button type='primary' onClick={this.handleItemAdd}>\n <PlusOutlined/> 新增\n </Button>\n : null\n }\n >\n {!hasTypeSelected\n ? <Empty description='请在左侧选择一个字典类型'/>\n : <ProTable\n rowKey='uid'\n actionRef={this.tableRef}\n request={(params) => {\n params.typeCode = selectedTypeCode\n return HttpUtils.get('admin/dict/page', params)\n }}\n columns={this.columns}\n showToolbarSearch\n />\n }\n </Card>\n </Splitter.Panel>\n </Splitter>\n\n <Modal title={this.state.typeFormValues?.id ? '编辑字典类型' : '新增字典类型'}\n open={this.state.typeFormOpen}\n onOk={() => this.typeFormRef.current.submit()}\n onCancel={() => this.setState({typeFormOpen: false})}\n destroyOnClose\n >\n <Form ref={this.typeFormRef} labelCol={{flex: '100px'}}\n initialValues={this.state.typeFormValues}\n onFinish={this.handleTypeFormFinish}\n >\n <Form.Item name='id' noStyle/>\n <Form.Item label='父类型' name='pid'>\n <TreeSelect treeData={this.state.typeTree}\n fieldNames={{label: 'typeLabel', value: 'id'}}\n allowClear\n />\n </Form.Item>\n <Form.Item label='类型编码' name='typeCode' rules={[{required: true}]}>\n <Input placeholder='举例: orderStatus'/>\n </Form.Item>\n <Form.Item label='类型名称' name='typeLabel' rules={[{required: true}]}>\n <Input placeholder='举例: 订单状态'/>\n </Form.Item>\n <Form.Item label='启用' name='enabled' rules={[{required: true}]}>\n <FieldBoolean/>\n </Form.Item>\n <Form.Item label='序号' name='seq'>\n <InputNumber/>\n </Form.Item>\n </Form>\n </Modal>\n\n <Modal title='编辑字典项'\n open={this.state.formOpen}\n onOk={() => this.formRef.current.submit()}\n onCancel={() => this.setState({formOpen: false})}\n destroyOnClose\n >\n <Form ref={this.formRef} labelCol={{flex: '100px'}}\n initialValues={this.state.formValues}\n onFinish={this.onItemFormFinish}\n >\n <Form.Item name='id' noStyle/>\n <Form.Item label='类型编码' name='typeCode'>\n <Input disabled/>\n </Form.Item>\n <Form.Item label='编码' name='code' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n <Form.Item label='标签' name='label' rules={[{required: true}]} help='显示文本'>\n <Input/>\n </Form.Item>\n <Form.Item label='颜色' name='color'>\n <FieldDictSelect typeCode='statusColor'/>\n </Form.Item>\n <Form.Item label='序号' name='seq'>\n <InputNumber/>\n </Form.Item>\n <Form.Item label='启用' name='enabled' rules={[{required: true}]}>\n <FieldBoolean/>\n </Form.Item>\n </Form>\n </Modal>\n </Page>\n }\n}\n",
|
|
2077
|
+
"__content": "import {DeleteOutlined, EditOutlined, PlusOutlined} from '@ant-design/icons';\nimport {Button, Card, Descriptions, Empty, Form, Input, InputNumber, Modal, Popconfirm, Splitter, Tree, Tag, TreeSelect, Typography} from 'antd';\nimport React from 'react';\nimport {\n ButtonList,\n FieldBoolean,\n FieldDictSelect,\n HttpUtils,\n Page,\n ProTable,\n ViewBooleanEnableDisable,\n} from \"../../../framework\";\n\nexport default class extends React.Component {\n\n state = {\n typeTree: [],\n treeLoading: false,\n selectedType: null,\n selectedTypeCode: null,\n\n formOpen: false,\n formValues: {},\n typeFormOpen: false,\n typeFormValues: {},\n\n }\n\n formRef = React.createRef();\n typeFormRef = React.createRef();\n tableRef = React.createRef();\n\n componentDidMount() {\n this.loadTree()\n }\n\n loadTree = () => {\n this.setState({treeLoading: true})\n HttpUtils.get('admin/dict/type-tree').then(rs => {\n this.setState({typeTree: rs})\n }).finally(() => {\n this.setState({treeLoading: false})\n })\n }\n\n handleTypeAdd = () => {\n this.setState({\n typeFormOpen: true,\n typeFormValues: {pid: this.state.selectedType?.id, enabled: true},\n })\n }\n\n handleTypeEdit = () => {\n const {selectedType} = this.state\n if (!selectedType) return\n this.setState({typeFormOpen: true, typeFormValues: {...selectedType}})\n }\n\n handleTypeDelete = () => {\n const {selectedType} = this.state\n if (!selectedType) return\n HttpUtils.post('admin/dict/type-delete', {id: selectedType.id}).then(() => {\n this.setState({selectedType: null, selectedTypeCode: null})\n this.loadTree()\n })\n }\n\n handleTypeFormFinish = values => {\n const isNew = !values.id\n const url = isNew ? 'admin/dict/type-create' : 'admin/dict/type-update'\n HttpUtils.post(url, values).then(rs => {\n this.setState({typeFormOpen: false})\n this.loadTree()\n })\n }\n\n findNode = (nodes, key) => {\n for (const n of nodes) {\n if (n.id === key) return n\n if (n.children) {\n const found = this.findNode(n.children, key)\n if (found) return found\n }\n }\n return null\n }\n\n getParentLabel = () => {\n const {selectedType, typeTree} = this.state\n if (!selectedType?.pid) return null\n const parent = this.findNode(typeTree, selectedType.pid)\n return parent?.typeLabel || null\n }\n\n onTreeSelect = (selectedKeys) => {\n if (selectedKeys.length === 0) {\n this.setState({selectedType: null, selectedTypeCode: null})\n return\n }\n const node = this.findNode(this.state.typeTree, selectedKeys[0])\n this.setState({\n selectedType: node,\n selectedTypeCode: node?.typeCode || null\n },()=>this.tableRef.current.reload())\n }\n\n handleItemAdd = () => {\n this.setState({formOpen: true, formValues: {typeCode: this.state.selectedTypeCode}})\n }\n\n handleItemEdit = record => {\n this.setState({formOpen: true, formValues: record})\n }\n\n handleItemDelete = row => {\n HttpUtils.post('admin/dict/delete', row).then(rs => {\n this.tableRef.current.reload()\n })\n }\n\n onItemFormFinish = values => {\n const isNew = !values.id\n const url = isNew ? 'admin/dict/create' : 'admin/dict/update'\n HttpUtils.post(url, values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload()\n })\n }\n\n columns = [\n {title: '编码', dataIndex: 'code'},\n {title: '标签', dataIndex: 'label'},\n {\n title: '颜色', dataIndex: 'color',\n render(v) {\n if (v) return <Tag color={v.toLowerCase()}>{v}</Tag>\n }\n },\n {\n title: '启用', dataIndex: 'enabled',\n render(v) {\n return <ViewBooleanEnableDisable value={v}/>\n }\n },\n {title: '序号', dataIndex: 'seq'},\n {\n title: '操作', dataIndex: 'option',\n render: (_, record) => {\n return (\n <ButtonList>\n <Button size='small' perm='sys-dict:update'\n onClick={() => this.handleItemEdit(record)}>编辑</Button>\n <Popconfirm perm='sys-dict:delete' title='是否确定删除字典项'\n onConfirm={() => this.handleItemDelete(record)}>\n <Button size='small'>删除</Button>\n </Popconfirm>\n </ButtonList>\n );\n },\n },\n ]\n\n render() {\n const {selectedType, selectedTypeCode} = this.state\n const hasTypeSelected = selectedType != null && selectedTypeCode != null\n\n return <Page title=\"数据字典\" description=\"管理数据字典类型和字典项\"\n actions={<Button perm='sys-dict:create' icon={<PlusOutlined/>} onClick={this.handleTypeAdd}>新增类型</Button>}>\n <Splitter>\n <Splitter.Panel defaultSize={300} style={{paddingRight: 8}}>\n <Card loading={this.state.treeLoading}\n size='small'\n >\n <Typography.Text strong style={{marginBottom: 8, display: 'block'}}>字典类型</Typography.Text>\n <Tree\n treeData={this.state.typeTree}\n onSelect={this.onTreeSelect}\n fieldNames={{title: 'typeLabel', key: 'id'}}\n showLine\n defaultExpandAll\n blockNode\n />\n {this.state.typeTree.length === 0 && <Empty/>}\n </Card>\n </Splitter.Panel>\n\n <Splitter.Panel style={{paddingLeft: 8}}>\n <Card size='small' style={{marginBottom: 8}}>\n <div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8}}>\n <Typography.Text strong>类型信息</Typography.Text>\n {hasTypeSelected && (\n <span>\n <Button size='small' icon={<EditOutlined/>} perm='sys-dict:update'\n onClick={this.handleTypeEdit} style={{marginRight: 4}}>编辑</Button>\n <Popconfirm perm='sys-dict:delete' title='是否确定删除此类型及其所有子类型和字典项?'\n onConfirm={this.handleTypeDelete}>\n <Button size='small' icon={<DeleteOutlined/>}>删除</Button>\n </Popconfirm>\n </span>\n )}\n </div>\n {hasTypeSelected && <Descriptions size='small' column={3}>\n <Descriptions.Item label=\"名称\">{selectedType.typeLabel}</Descriptions.Item>\n <Descriptions.Item label=\"类型编码\">{selectedType.typeCode}</Descriptions.Item>\n <Descriptions.Item label=\"分类\">{this.getParentLabel() || '-'}</Descriptions.Item>\n <Descriptions.Item label=\"序号\">{selectedType.seq}</Descriptions.Item>\n <Descriptions.Item label=\"启用\"><ViewBooleanEnableDisable value={selectedType.enabled}/></Descriptions.Item>\n </Descriptions>}\n </Card>\n <Card size='small'>\n <div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8}}>\n <Typography.Text strong>字典项</Typography.Text>\n {hasTypeSelected && <Button type='primary' icon={<PlusOutlined/>} onClick={this.handleItemAdd}>新增字典项</Button>}\n </div>\n {hasTypeSelected && <ProTable\n rowKey='uid'\n actionRef={this.tableRef}\n request={(params) => {\n params.typeCode = selectedTypeCode\n return HttpUtils.get('admin/dict/page', params)\n }}\n columns={this.columns}\n />\n }\n </Card>\n </Splitter.Panel>\n </Splitter>\n\n <Modal title={this.state.typeFormValues?.id ? '编辑字典类型' : '新增字典类型'}\n open={this.state.typeFormOpen}\n onOk={() => this.typeFormRef.current.submit()}\n onCancel={() => this.setState({typeFormOpen: false})}\n destroyOnClose\n >\n <Form ref={this.typeFormRef} labelCol={{flex: '100px'}}\n initialValues={this.state.typeFormValues}\n onFinish={this.handleTypeFormFinish}\n >\n <Form.Item name='id' noStyle/>\n <Form.Item label='父类型' name='pid'>\n <TreeSelect treeData={this.state.typeTree}\n fieldNames={{label: 'typeLabel', value: 'id'}}\n allowClear\n />\n </Form.Item>\n <Form.Item label='类型编码' name='typeCode' rules={[{required: true}]}>\n <Input placeholder='举例: orderStatus'/>\n </Form.Item>\n <Form.Item label='类型名称' name='typeLabel' rules={[{required: true}]}>\n <Input placeholder='举例: 订单状态'/>\n </Form.Item>\n <Form.Item label='启用' name='enabled' rules={[{required: true}]}>\n <FieldBoolean/>\n </Form.Item>\n <Form.Item label='序号' name='seq'>\n <InputNumber/>\n </Form.Item>\n </Form>\n </Modal>\n\n <Modal title='编辑字典项'\n open={this.state.formOpen}\n onOk={() => this.formRef.current.submit()}\n onCancel={() => this.setState({formOpen: false})}\n destroyOnClose\n >\n <Form ref={this.formRef} labelCol={{flex: '100px'}}\n initialValues={this.state.formValues}\n onFinish={this.onItemFormFinish}\n >\n <Form.Item name='id' noStyle/>\n <Form.Item label='类型编码' name='typeCode'>\n <Input disabled/>\n </Form.Item>\n <Form.Item label='编码' name='code' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n <Form.Item label='标签' name='label' rules={[{required: true}]} help='显示文本'>\n <Input/>\n </Form.Item>\n <Form.Item label='颜色' name='color'>\n <FieldDictSelect typeCode='statusColor'/>\n </Form.Item>\n <Form.Item label='序号' name='seq'>\n <InputNumber/>\n </Form.Item>\n <Form.Item label='启用' name='enabled' rules={[{required: true}]}>\n <FieldBoolean/>\n </Form.Item>\n </Form>\n </Modal>\n </Page>\n }\n}\n",
|
|
2088
2078
|
"__isJSFile": true,
|
|
2089
2079
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/dict/index.jsx"
|
|
2090
2080
|
},
|
|
@@ -2094,7 +2084,7 @@
|
|
|
2094
2084
|
"parentId": "@@/global-layout",
|
|
2095
2085
|
"file": "system/file/index.jsx",
|
|
2096
2086
|
"absPath": "/system/file",
|
|
2097
|
-
"__content": "import React from 'react'\nimport {Button, Form, Input, Modal, Popconfirm} from 'antd'\nimport {CloudUploadOutlined} from \"@ant-design/icons\";\n\nimport {ButtonList, FieldDateRange, FieldDictSelect, FieldUploadFile, HttpUtils, Page, ProTable, SysUtils} from \"../../../framework\";\n\nexport default class extends React.Component {\n\n state = {\n formOpen: false,\n formValues: {}\n }\n\n tableRef = React.createRef()\n formRef = React.createRef()\n\n handleDelete = row => {\n HttpUtils.post('admin/sysFile/delete', row).then(rs => {\n this.tableRef.current.reload()\n })\n }\n\n columns = [\n {\n title: '原始名称',\n tooltip: '上传时候的文件名',\n dataIndex: 'originName',\n width: 200,\n },\n {\n title: '存储名称',\n dataIndex: 'objectName',\n tooltip: '文件唯一标识id'\n },\n\n {\n title: '文件大小',\n dataIndex: 'sizeInfo',\n },\n\n {\n title: 'mime',\n dataIndex: 'mimeType',\n },\n {\n title: '扩展名',\n dataIndex: 'suffix',\n },\n\n {\n title: '上传时间',\n dataIndex: 'createTime',\n },\n {\n title: '上传者',\n dataIndex: 'createUserLabel',\n },\n {\n title: '预览',\n dataIndex: 'id',\n render(id, record) {\n const nodes = [<a href={SysUtils.contextPath('/admin/sysFile/preview/' + record.id)} target='_blank'>预览</a>]\n\n\n if (record.imageUrls?.length > 0) {\n for (let item of record.imageUrls) {\n const url = item.url;\n const label = item.label;\n nodes.push(<a href={(url)} target='_blank' style={{marginLeft: 8}}>{label}</a>)\n }\n }\n\n return nodes;\n\n }\n },\n {\n title: '操作',\n dataIndex: 'option',\n render: (_, record) => (\n <ButtonList>\n <Popconfirm perm='sys-file:delete' title='是否确定删除文件信息'\n onConfirm={() => this.handleDelete(record)}>\n <a>删除</a>\n </Popconfirm>\n </ButtonList>\n ),\n },\n ]\n\n render() {\n return <Page
|
|
2087
|
+
"__content": "import React from 'react'\nimport {Button, Form, Input, Modal, Popconfirm} from 'antd'\nimport {CloudUploadOutlined} from \"@ant-design/icons\";\n\nimport {ButtonList, FieldDateRange, FieldDictSelect, FieldUploadFile, HttpUtils, Page, ProTable, SysUtils} from \"../../../framework\";\n\nexport default class extends React.Component {\n\n state = {\n formOpen: false,\n formValues: {}\n }\n\n tableRef = React.createRef()\n formRef = React.createRef()\n\n handleDelete = row => {\n HttpUtils.post('admin/sysFile/delete', row).then(rs => {\n this.tableRef.current.reload()\n })\n }\n\n columns = [\n {\n title: '原始名称',\n tooltip: '上传时候的文件名',\n dataIndex: 'originName',\n width: 200,\n },\n {\n title: '存储名称',\n dataIndex: 'objectName',\n tooltip: '文件唯一标识id'\n },\n\n {\n title: '文件大小',\n dataIndex: 'sizeInfo',\n },\n\n {\n title: 'mime',\n dataIndex: 'mimeType',\n },\n {\n title: '扩展名',\n dataIndex: 'suffix',\n },\n\n {\n title: '上传时间',\n dataIndex: 'createTime',\n },\n {\n title: '上传者',\n dataIndex: 'createUserLabel',\n },\n {\n title: '预览',\n dataIndex: 'id',\n render(id, record) {\n const nodes = [<a href={SysUtils.contextPath('/admin/sysFile/preview/' + record.id)} target='_blank'>预览</a>]\n\n\n if (record.imageUrls?.length > 0) {\n for (let item of record.imageUrls) {\n const url = item.url;\n const label = item.label;\n nodes.push(<a href={(url)} target='_blank' style={{marginLeft: 8}}>{label}</a>)\n }\n }\n\n return nodes;\n\n }\n },\n {\n title: '操作',\n dataIndex: 'option',\n render: (_, record) => (\n <ButtonList>\n <Popconfirm perm='sys-file:delete' title='是否确定删除文件信息'\n onConfirm={() => this.handleDelete(record)}>\n <a>删除</a>\n </Popconfirm>\n </ButtonList>\n ),\n },\n ]\n\n render() {\n return <Page title=\"文件管理\" description=\"管理系统上传文件\" actions={<Button type='primary' icon={<CloudUploadOutlined/>} onClick={() => this.setState({formOpen: true})}>上传文件</Button>}>\n <ProTable\n actionRef={this.tableRef}\n request={(params) => {\n return HttpUtils.get('admin/sysFile/page', params);\n }}\n\n columns={this.columns}\n\n >\n <Form.Item label='文件名' name='originName'>\n <Input/>\n </Form.Item>\n <Form.Item label='对象名称' name='objectName'>\n <Input/>\n </Form.Item>\n <Form.Item label='类型' name='type'>\n <FieldDictSelect typeCode='materialType'/>\n </Form.Item>\n\n <Form.Item label='上传时间' name='dateRange'>\n <FieldDateRange/>\n </Form.Item>\n </ProTable>\n\n <Modal open={this.state.formOpen} title='上传文件'\n width={800}\n onCancel={() => {\n this.setState({formOpen: false})\n this.tableRef.current.reload()\n }}\n footer={null}\n destroyOnHidden\n >\n <Form ref={this.formRef}\n initialValues={this.state.formValues}\n >\n <Form.Item name='文件'>\n <FieldUploadFile accept=\"*/*\"/>\n </Form.Item>\n\n\n </Form>\n </Modal>\n\n </Page>\n }\n}\n\n\n\n",
|
|
2098
2088
|
"__isJSFile": true,
|
|
2099
2089
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/file/index.jsx"
|
|
2100
2090
|
},
|
|
@@ -2104,7 +2094,7 @@
|
|
|
2104
2094
|
"parentId": "@@/global-layout",
|
|
2105
2095
|
"file": "system/role/index.jsx",
|
|
2106
2096
|
"absPath": "/system/role",
|
|
2107
|
-
"__content": "import {PlusOutlined} from '@ant-design/icons'\nimport {Button, Form, Input, InputNumber, Modal, Popconfirm, Transfer, Tree} from 'antd'\nimport React from 'react'\nimport {ButtonList, FieldBoolean, HttpUtils, Page, PageUtils, ProTable, ViewText} from \"../../../framework\";\n\n\nexport default class extends React.Component {\n\n state = {\n formValues: {},\n formOpen: false,\n\n usersModalOpen: false,\n\n\n userList: [],\n targetKeys: [],\n selectedKeys: [],\n\n menuOpen: false,\n menuTree: [],\n menuTreeLoading: false,\n menuChecked: [],\n menuHalfChecked: []\n }\n\n formRef = React.createRef()\n tableRef = React.createRef()\n\n handleAdd = () => {\n this.setState({formOpen: true, formValues: {}})\n }\n\n handleEdit = record => {\n this.setState({formOpen: true, formValues: record}, () => {\n\n })\n }\n\n handleEditUser = record => {\n this.setState({usersModalOpen: true, formValues: record})\n HttpUtils.get('admin/sysRole/user-list', {id: record.id}).then(rs => {\n this.setState({userList: rs.list, targetKeys: rs.selectedKeys})\n })\n }\n\n onFinish = values => {\n const isNew = !values.id;\n const url = isNew ? 'admin/sysRole/create' : 'admin/sysRole/update';\n HttpUtils.post(url, values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload()\n })\n }\n\n handleDelete = record => {\n HttpUtils.post('admin/sysRole/delete', {id: record.id}).then(rs => {\n this.tableRef.current.reload()\n })\n }\n\n columns = [\n\n {\n title: '名称',\n dataIndex: 'name',\n\n\n },\n\n {\n title: '编号',\n dataIndex: 'code',\n\n\n },\n\n {\n title: '排序',\n dataIndex: 'seq',\n\n\n },\n\n {\n title: '备注',\n dataIndex: 'remark',\n\n\n },\n\n {\n title: '启用',\n dataIndex: 'enabled',\n\n\n render(v) {\n return v == null ? null : (v ? '是' : '否')\n },\n\n\n },\n {\n title: '是否内置',\n dataIndex: 'builtin',\n\n\n render(v) {\n return v == null ? null : (v ? '是' : '否')\n },\n\n\n },\n\n {\n title: '权限码',\n dataIndex: 'perms',\n width: 300,\n render(v) {\n if (v) {\n return <ViewText value={v.join(',')} ellipsis={true} />\n }\n }\n\n },\n\n\n {\n title: '操作',\n dataIndex: 'option',\n render: (_, record) => {\n\n return (\n <ButtonList>\n <Button size='small' perm='sys-role:grant-permission'\n onClick={() => this.handleEditUser(record)}>用户设置</Button>\n\n <Button size='small' perm='sys-role:grant-permission' disabled={record.builtin}\n onClick={() => PageUtils.open('/system/role/perm?id=' + record.id, '角色权限设置')}>权限设置</Button>\n\n <Button size='small' perm='sys-role:update' disabled={record.builtin}\n onClick={() => this.handleEdit(record)}>编辑</Button>\n <Popconfirm perm='sys-role:delete' disabled={record.builtin} title='是否确定删除系统角色'\n onConfirm={() => this.handleDelete(record)}>\n <Button size='small'>删除</Button>\n </Popconfirm>\n </ButtonList>\n );\n },\n },\n ]\n\n handleSaveUsers = () => {\n const params = {\n id: this.state.formValues.id,\n userIdList: this.state.targetKeys\n }\n HttpUtils.post('admin/sysRole/grant-users', params).then(rs => {\n this.setState({usersModalOpen: false})\n })\n }\n\n handleEditMenu = (record) => {\n this.setState({menuOpen: true, formValues: record, menuTreeLoading: true})\n HttpUtils.get('admin/sysRole/ownMenu', {id: record.id}).then(rs => {\n this.setState({menuChecked: rs.checked, menuHalfChecked: rs.halfChecked})\n })\n HttpUtils.get('admin/sysRole/menuTree').then(rs => {\n this.setState({menuTree: rs, menuTreeLoading: false})\n })\n }\n handleGrantMenu = () => {\n const params = {\n id: this.state.formValues.id,\n menuIds: [...this.state.menuChecked, ...this.state.menuHalfChecked]\n }\n HttpUtils.post('admin/sysRole/grantMenu', params).then(rs => {\n this.setState({menuOpen: false})\n })\n }\n\n render() {\n return <Page
|
|
2097
|
+
"__content": "import {PlusOutlined} from '@ant-design/icons'\nimport {Button, Form, Input, InputNumber, Modal, Popconfirm, Select, Transfer, Tree} from 'antd'\nimport React from 'react'\nimport {ButtonList, FieldBoolean, HttpUtils, Page, PageUtils, ProTable, ViewText} from \"../../../framework\";\n\n\nexport default class extends React.Component {\n\n state = {\n formValues: {},\n formOpen: false,\n\n usersModalOpen: false,\n\n\n userList: [],\n targetKeys: [],\n selectedKeys: [],\n\n menuOpen: false,\n menuTree: [],\n menuTreeLoading: false,\n menuChecked: [],\n menuHalfChecked: []\n }\n\n formRef = React.createRef()\n tableRef = React.createRef()\n\n handleAdd = () => {\n this.setState({formOpen: true, formValues: {}})\n }\n\n handleEdit = record => {\n this.setState({formOpen: true, formValues: record}, () => {\n\n })\n }\n\n handleEditUser = record => {\n this.setState({usersModalOpen: true, formValues: record})\n HttpUtils.get('admin/sysRole/user-list', {id: record.id}).then(rs => {\n this.setState({userList: rs.list, targetKeys: rs.selectedKeys})\n })\n }\n\n onFinish = values => {\n const isNew = !values.id;\n const url = isNew ? 'admin/sysRole/create' : 'admin/sysRole/update';\n HttpUtils.post(url, values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload()\n })\n }\n\n handleDelete = record => {\n HttpUtils.post('admin/sysRole/delete', {id: record.id}).then(rs => {\n this.tableRef.current.reload()\n })\n }\n\n columns = [\n\n {\n title: '名称',\n dataIndex: 'name',\n\n\n },\n\n {\n title: '编号',\n dataIndex: 'code',\n\n\n },\n\n {\n title: '排序',\n dataIndex: 'seq',\n\n\n },\n\n {\n title: '备注',\n dataIndex: 'remark',\n\n\n },\n\n {\n title: '启用',\n dataIndex: 'enabled',\n\n\n render(v) {\n return v == null ? null : (v ? '是' : '否')\n },\n\n\n },\n {\n title: '是否内置',\n dataIndex: 'builtin',\n\n\n render(v) {\n return v == null ? null : (v ? '是' : '否')\n },\n\n\n },\n\n {\n title: '权限码',\n dataIndex: 'perms',\n width: 300,\n render(v) {\n if (v) {\n return <ViewText value={v.join(',')} ellipsis={true} />\n }\n }\n\n },\n\n\n {\n title: '操作',\n dataIndex: 'option',\n render: (_, record) => {\n\n return (\n <ButtonList>\n <Button size='small' perm='sys-role:grant-permission'\n onClick={() => this.handleEditUser(record)}>用户设置</Button>\n\n <Button size='small' perm='sys-role:grant-permission' disabled={record.builtin}\n onClick={() => PageUtils.open('/system/role/perm?id=' + record.id, '角色权限设置')}>权限设置</Button>\n\n <Button size='small' perm='sys-role:update' disabled={record.builtin}\n onClick={() => this.handleEdit(record)}>编辑</Button>\n <Popconfirm perm='sys-role:delete' disabled={record.builtin} title='是否确定删除系统角色'\n onConfirm={() => this.handleDelete(record)}>\n <Button size='small' disabled={record.builtin}>删除</Button>\n </Popconfirm>\n </ButtonList>\n );\n },\n },\n ]\n\n handleSaveUsers = () => {\n const params = {\n id: this.state.formValues.id,\n userIdList: this.state.targetKeys\n }\n HttpUtils.post('admin/sysRole/grant-users', params).then(rs => {\n this.setState({usersModalOpen: false})\n })\n }\n\n handleEditMenu = (record) => {\n this.setState({menuOpen: true, formValues: record, menuTreeLoading: true})\n HttpUtils.get('admin/sysRole/ownMenu', {id: record.id}).then(rs => {\n this.setState({menuChecked: rs.checked, menuHalfChecked: rs.halfChecked})\n })\n HttpUtils.get('admin/sysRole/menuTree').then(rs => {\n this.setState({menuTree: rs, menuTreeLoading: false})\n })\n }\n handleGrantMenu = () => {\n const params = {\n id: this.state.formValues.id,\n menuIds: [...this.state.menuChecked, ...this.state.menuHalfChecked]\n }\n HttpUtils.post('admin/sysRole/grantMenu', params).then(rs => {\n this.setState({menuOpen: false})\n })\n }\n\n render() {\n return <Page\n title=\"角色管理\"\n description=\"管理系统角色,包括角色权限分配、用户设置等\"\n actions={<Button perm='sys-role:create' type='primary' icon={<PlusOutlined/>} onClick={this.handleAdd}>新增</Button>}\n >\n <ProTable\n actionRef={this.tableRef}\n request={(params) => HttpUtils.get('admin/sysRole/page', params)}\n columns={this.columns}\n >\n <Form.Item label='角色名称' name='name'>\n <Input/>\n </Form.Item>\n <Form.Item label='角色编码' name='code'>\n <Input/>\n </Form.Item>\n <Form.Item label='是否内置' name='builtin'>\n <Select allowClear placeholder='全部'>\n <Select.Option value={true}>是</Select.Option>\n <Select.Option value={false}>否</Select.Option>\n </Select>\n </Form.Item>\n </ProTable>\n\n <Modal title='系统角色'\n open={this.state.formOpen}\n onOk={() => this.formRef.current.submit()}\n onCancel={() => this.setState({formOpen: false})}\n destroyOnHidden\n mask={{ closable: false }}\n width={600}\n >\n\n <Form ref={this.formRef} labelCol={{flex: '100px'}}\n initialValues={this.state.formValues}\n onFinish={this.onFinish}\n >\n <Form.Item name='id' noStyle></Form.Item>\n\n\n <Form.Item label='名称' name='name' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n\n <Form.Item label='编码' name='code' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n\n\n <Form.Item label='排序' name='seq'>\n <InputNumber/>\n </Form.Item>\n\n\n <Form.Item label='备注' name='remark'>\n <Input/>\n </Form.Item>\n\n <Form.Item label='启用' name='enabled' rules={[{required: true}]}>\n <FieldBoolean/>\n </Form.Item>\n\n\n </Form>\n </Modal>\n\n\n <Modal title={'角色用户' + \"【\" + this.state.formValues?.name + '】'}\n open={this.state.usersModalOpen}\n destroyOnHidden\n mask={{ closable: false }}\n width={800}\n onCancel={() => this.setState({usersModalOpen: false})}\n onOk={this.handleSaveUsers}\n >\n\n\n <Transfer\n styles={{ section: { height: '60vh', width: 300 } }}\n\n dataSource={this.state.userList} titles={[\"未选择\", \"已选择\"]}\n targetKeys={this.state.targetKeys}\n selectedKeys={this.state.selectedKeys}\n render={item => item.title}\n onChange={(nextTargetKeys, direction, moveKeys) => {\n this.setState({\n targetKeys: nextTargetKeys\n })\n }}\n onSelectChange={(sourceSelectedKeys, targetSelectedKeys) => {\n this.setState({\n selectedKeys: [...sourceSelectedKeys, ...targetSelectedKeys]\n })\n }}\n showSearch\n />\n\n\n </Modal>\n\n <Modal title={'角色授权菜单权限' + \"【\" + this.state.formValues?.name + '】'}\n open={this.state.menuOpen}\n destroyOnHidden\n mask={{ closable: false }}\n width={800}\n onCancel={() => this.setState({menuOpen: false})}\n onOk={this.handleGrantMenu}\n loading={this.state.menuTreeLoading}\n >\n <Tree\n height={600}\n treeData={this.state.menuTree}\n multiple\n checkable\n checkedKeys={{checked: this.state.menuChecked}}\n onCheck={(keys, e) => {\n this.setState({menuChecked: keys, menuHalfChecked: e.halfCheckedKeys})\n }}\n defaultExpandAll\n titleRender={node => {\n return <span title={node.perm}>{node.title}</span>\n }}\n />\n </Modal>\n </Page>\n\n\n }\n}\n\n",
|
|
2108
2098
|
"__isJSFile": true,
|
|
2109
2099
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/role/index.jsx"
|
|
2110
2100
|
},
|
|
@@ -2114,27 +2104,17 @@
|
|
|
2114
2104
|
"parentId": "@@/global-layout",
|
|
2115
2105
|
"file": "system/user/index.jsx",
|
|
2116
2106
|
"absPath": "/system/user",
|
|
2117
|
-
"__content": "import {PlusOutlined} from '@ant-design/icons';\nimport {Button, Form, Input, Modal, Popconfirm,
|
|
2107
|
+
"__content": "import {PlusOutlined} from '@ant-design/icons';\nimport {Button, Card, Form, Input, Modal, Popconfirm, Select, Splitter} from 'antd';\nimport React from 'react';\nimport {\n ButtonList,\n DictUtils,\n FieldBoolean,\n FieldRemoteSelect,\n FieldSysOrgTreeSelect,\n HttpUtils,\n OrgTree,\n Page,\n ProTable,\n} from \"../../../framework\";\nimport UserPerm from \"./UserPerm\";\n\nexport default class extends React.Component {\n\n state = {\n showAddForm: false,\n showEditForm: false,\n formValues: {},\n\n currentOrgId: null,\n }\n permRef = React.createRef();\n\n formRef = React.createRef()\n tableRef = React.createRef()\n\n resetPwd(row) {\n HttpUtils.post('admin/sysUser/reset-pwd', {id: row.id}).then(rs => {\n Modal.success({\n title: '重置密码成功',\n content: rs\n })\n })\n }\n\n handleDelete = r => {\n HttpUtils.post('admin/sysUser/delete', {id: r.id}).then(rs => {\n this.tableRef.current.reload();\n })\n }\n\n onSelectOrg = (key) => {\n this.setState({currentOrgId: key}, () => this.tableRef.current.reload())\n }\n\n handleAdd = () => {\n this.setState({formOpen: true, formValues: {}})\n }\n\n handleEdit = record => {\n record.deptId = record.deptId || record.unitId\n this.setState({formOpen: true, formValues: record})\n }\n\n columns = [\n {\n title: '单位',\n dataIndex: 'unitLabel',\n },\n {\n title: '部门',\n dataIndex: 'deptLabel',\n },\n {\n title: '姓名',\n dataIndex: 'name',\n sorter: true\n },\n {\n title: '登录账号',\n dataIndex: 'account',\n sorter: true\n },\n\n\n {\n title: '手机',\n dataIndex: 'phone'\n },\n {\n title: '邮箱',\n dataIndex: 'email'\n },\n\n {\n title: '角色',\n dataIndex: 'roleIds',\n render: (_, row) => {\n if (row.roleNames) {\n return row.roleNames.join(',')\n }\n },\n },\n {\n title: '状态',\n dataIndex: 'enabled',\n render(v) {\n return v == null ? null : (v ? '是' : '否')\n },\n },\n {\n title: '数据权限',\n dataIndex: 'dataPermType',\n render(v) {\n return DictUtils.dictTag('dataPermType', v)\n }\n },\n\n {\n title: '创建时间',\n dataIndex: 'createTime',\n },\n {\n title: '操作',\n dataIndex: 'option',\n fixed: 'right',\n render: (_, record) => {\n return <ButtonList>\n <Button size='small' perm='sys-user:update' onClick={() => this.handleEdit(record)}> 编辑 </Button>\n\n <Button size='small' perm='sys-user:grant-permission'\n onClick={() => this.permRef.current.show(record)}> 授权 </Button>\n\n <Popconfirm perm='sys-user:reset-password' title='确认重置密码?' onConfirm={() => this.resetPwd(record)}>\n <Button size='small'>重置密码</Button>\n </Popconfirm>\n\n <Popconfirm perm='sys-user:delete' title={'是否确定删除用户'}\n onConfirm={() => this.handleDelete(record)}>\n <Button size='small'>删除</Button>\n </Popconfirm>\n </ButtonList>;\n },\n },\n ];\n\n onFinish = values => {\n const isNew = !values.id;\n const url = isNew ? 'admin/sysUser/create' : 'admin/sysUser/update';\n HttpUtils.post(url, values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload()\n })\n }\n\n render() {\n\n return <Page title=\"用户管理\" description=\"管理系统用户\" actions={<Button perm='sys-user:create' type=\"primary\" icon={<PlusOutlined/>} onClick={this.handleAdd}>新增</Button>}>\n <Splitter>\n <Splitter.Panel defaultSize={350} style={{paddingRight: 8}}>\n <Card size='small'>\n <OrgTree onChange={this.onSelectOrg}/>\n </Card>\n </Splitter.Panel>\n <Splitter.Panel style={{paddingLeft: 8}}>\n <ProTable\n searchColumns={3}\n actionRef={this.tableRef}\n request={(params) => {\n params.orgId = this.state.currentOrgId\n return HttpUtils.get('admin/sysUser/page', params)\n }}\n columns={this.columns}\n >\n <Form.Item label='姓名' name='name'>\n <Input/>\n </Form.Item>\n <Form.Item label='登录账号' name='account'>\n <Input/>\n </Form.Item>\n <Form.Item label='手机号' name='phone'>\n <Input/>\n </Form.Item>\n <Form.Item label='角色' name='roleId'>\n <FieldRemoteSelect url='admin/sysRole/options' placeholder='请选择角色'/>\n </Form.Item>\n <Form.Item label='状态' name='enabled'>\n <Select allowClear placeholder='全部'>\n <Select.Option value={true}>启用</Select.Option>\n <Select.Option value={false}>停用</Select.Option>\n </Select>\n </Form.Item>\n </ProTable>\n </Splitter.Panel>\n </Splitter>\n\n\n <Modal title='系统用户'\n open={this.state.formOpen}\n onOk={() => this.formRef.current.submit()}\n onCancel={() => this.setState({formOpen: false})}\n destroyOnHidden\n >\n\n <Form ref={this.formRef} labelCol={{flex: '100px'}}\n initialValues={this.state.formValues}\n onFinish={this.onFinish}>\n <Form.Item name='id' noStyle></Form.Item>\n\n <Form.Item label='所属机构' name='deptId' rules={[{required: true}]}>\n <FieldSysOrgTreeSelect/>\n </Form.Item>\n\n <Form.Item label='姓名' name='name' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n <Form.Item label='账号' name='account' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n\n\n <Form.Item label='电话' name='phone'>\n <Input/>\n </Form.Item>\n <Form.Item label='邮箱' name='email'>\n <Input/>\n </Form.Item>\n\n <Form.Item label='启用状态' name='enabled' rules={[{required: true}]}>\n <FieldBoolean/>\n </Form.Item>\n\n </Form>\n </Modal>\n\n\n <UserPerm ref={this.permRef} onOk={() => this.tableRef.current.reload()}/>\n\n </Page>\n }\n\n\n}\n\n\n\n",
|
|
2118
2108
|
"__isJSFile": true,
|
|
2119
2109
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/user/index.jsx"
|
|
2120
2110
|
},
|
|
2121
|
-
"userCenter/manual": {
|
|
2122
|
-
"path": "userCenter/manual",
|
|
2123
|
-
"id": "userCenter/manual",
|
|
2124
|
-
"parentId": "@@/global-layout",
|
|
2125
|
-
"file": "userCenter/manual.jsx",
|
|
2126
|
-
"absPath": "/userCenter/manual",
|
|
2127
|
-
"__content": "import React from 'react'\nimport {HttpUtils, Page, ProTable} from \"../../framework\";\n\n\nexport default class extends React.Component {\n\n\n tableRef = React.createRef()\n\n columns = [\n\n {\n title: '名称',\n dataIndex: 'name',\n\n\n },\n\n {\n title: '版本',\n dataIndex: 'version',\n render(version) {\n return 'v' + version;\n }\n },\n\n {\n title: '文件',\n dataIndex: 'fileId',\n render(id) {\n const url = ('admin/sysFile/preview/' + id);\n return <a href={url} target='_blank'>查看文件</a>\n }\n\n },\n\n {\n title: '更新时间',\n dataIndex: 'updateTime',\n },\n ]\n\n\n render() {\n return <Page>\n <ProTable\n actionRef={this.tableRef}\n request={(params) => HttpUtils.get('admin/sysManual/page-for-user', params)}\n columns={this.columns}\n />\n </Page>\n\n\n }\n}\n\n\n",
|
|
2128
|
-
"__isJSFile": true,
|
|
2129
|
-
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/userCenter/manual.jsx"
|
|
2130
|
-
},
|
|
2131
2111
|
"system/job/index": {
|
|
2132
2112
|
"path": "system/job",
|
|
2133
2113
|
"id": "system/job/index",
|
|
2134
2114
|
"parentId": "@@/global-layout",
|
|
2135
2115
|
"file": "system/job/index.jsx",
|
|
2136
2116
|
"absPath": "/system/job",
|
|
2137
|
-
"__content": "import React from 'react'\nimport {\n Alert,\n AutoComplete,\n Button,\n Divider,\n Form,\n Input,\n message,\n Modal,\n Popconfirm,\n Select,\n Space,\n Switch,\n Tag\n} from 'antd'\nimport {PlusOutlined} from \"@ant-design/icons\";\n\nimport {ButtonList, HttpUtils, Page, ProTable, StringUtils, SysUtils, ValueType} from \"../../../framework\";\n\n\nconst cronOptions = [\n {\n label: '*/5 * * * * ? 每隔5秒',\n value: '*/5 * * * * ?'\n },\n {\n label: '0 */5 * * * ? 每隔5分钟',\n value: '0 */5 * * * ?'\n },\n {\n label: '0 0 22 * * ? 每天22点',\n value: '0 0 22 * * ?'\n },\n {\n label: '0 0 1 * * ? 每天1点',\n value: '0 0 1 * * ?'\n },\n {\n label: '0 0 1 1 * ? 每月1号凌晨1点',\n value: '0 0 1 1 * ?'\n }\n]\n\n\nexport default class extends React.Component {\n\n state = {\n formValues: {},\n formOpen: false,\n\n selectedRowKeys: [],\n\n jobClassOptions: [],\n\n paramList: [],\n\n statusOpen: false,\n status: null,\n\n executeRecordOpen: false,\n }\n tableRef = React.createRef()\n formRef = React.createRef()\n\n componentDidMount() {\n HttpUtils.get('admin/job/job-class-options').then(rs => {\n this.setState({jobClassOptions: rs})\n }).catch(e => {\n console.error('[Job] 加载作业类选项失败:', e);\n })\n }\n\n handleAdd = () => {\n this.setState({formOpen: true, formValues: {}, paramList: []})\n }\n\n handleEdit = (record) => {\n this.loadJobParamFields(record.jobClass, record.jobData)\n this.setState({formOpen: true, formValues: record,})\n }\n\n loadJobParamFields(className, jobData) {\n HttpUtils.post(\"admin/job/get-job-param-fields\", jobData || {}, {className}).then(rs => {\n this.setState({paramList: rs})\n }).catch(e => {\n console.error('[Job] 加载作业参数字段失败:', e);\n })\n }\n\n onFinish = (values) => {\n const isNew = !values.id;\n const url = isNew ? 'admin/job/create' : 'admin/job/update';\n HttpUtils.post(url, values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload();\n }).catch(e => {\n console.error('[Job] 保存作业失败:', e);\n })\n }\n\n handleDelete = row => {\n const hide = message.loading(\"删除作业中...\")\n HttpUtils.post('admin/job/delete', {id: row.id}).then(rs => {\n this.tableRef.current.reload();\n }).catch(e => {\n console.error('[Job] 删除作业失败:', e);\n hide();\n })\n }\n\n handleTriggerJob = row => {\n HttpUtils.get('admin/job/trigger-job', {id: row.id}).then(rs => {\n this.tableRef.current.reload();\n }).catch(e => {\n console.error('[Job] 触发作业失败:', e);\n })\n }\n\n columns = [\n {\n title: '名称',\n dataIndex: 'name',\n\n },\n {\n title: '执行类',\n dataIndex: 'jobClass',\n\n },\n\n {\n title: 'cron',\n dataIndex: 'cron',\n },\n\n\n {\n title: '参数',\n dataIndex: 'jobData',\n render(list) {\n if (list)\n return JSON.stringify(list)\n }\n },\n\n\n {\n title: '启用状态',\n dataIndex: 'enabled',\n render: (v, record) => {\n return record.enabled ? <Tag color='green'>启用</Tag> : <Tag color='red'>停用</Tag>\n },\n },\n\n {\n title: '操作',\n dataIndex: 'option',\n fixed: 'right',\n render: (_, record) => {\n\n return (\n <Space>\n <Button size='small' onClick={() => this.showExecuteRecord(record)}>执行记录</Button>\n <Button size='small' perm='job:trigger' onClick={() => this.handleTriggerJob(record)}>执行一次</Button>\n <Button size='small' perm='job:update' onClick={() => this.handleEdit(record)}> 编辑 </Button>\n <Popconfirm perm='job:delete' title='是否确定删除?' onConfirm={() => this.handleDelete(record)}>\n <Button size='small'>删除</Button>\n </Popconfirm>\n </Space>\n );\n },\n },\n\n ]\n\n showStatus = () => {\n this.setState({statusOpen: true})\n HttpUtils.get('admin/job/status').then(rs => {\n this.setState({status: rs})\n }).catch(e => {\n console.error('[Job] 加载状态失败:', e);\n })\n };\n\n showExecuteRecord(record) {\n this.setState({executeRecordOpen: true, formValues: record})\n }\n\n\n render() {\n return <Page>\n <ProTable\n actionRef={this.tableRef}\n toolBarRender={() => {\n return <ButtonList>\n <Button type='primary' onClick={() => this.handleAdd()} icon={<PlusOutlined/>}>\n 新增\n </Button>\n <Button onClick={this.showStatus}>\n 查看状态\n </Button>\n </ButtonList>\n }}\n request={(params) => HttpUtils.get('admin/job/page', params)}\n columns={this.columns}\n showToolbarSearch\n />\n\n\n <Modal title='作业调度'\n open={this.state.formOpen}\n destroyOnHidden\n width={800}\n onOk={() => this.formRef.current.submit()}\n onCancel={() => this.setState({formOpen: false})}\n >\n\n <Form ref={this.formRef} labelCol={{flex: '100px'}}\n initialValues={this.state.formValues}\n onValuesChange={this.onValuesChange}\n onFinish={this.onFinish}>\n <Form.Item name='id' noStyle>\n </Form.Item>\n <Form.Item label='执行类' name='jobClass' rules={[{required: true}]}\n tooltip='org.quartz.Job接口,参考io.tmgg.job.builtin.DemoJob'>\n <Select options={this.state.jobClassOptions}/>\n </Form.Item>\n <Form.Item label='名称' name='name' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n\n <Form.Item label='cron表达式' name='cron' help='格式:秒分时日月周,留空表示手动执行'\n rules={[{required: true}]}>\n <AutoComplete placeholder='如 0 */5 * * * ?' options={cronOptions}/>\n </Form.Item>\n\n <Form.Item label='启用' name='enabled' valuePropName='checked' rules={[{required: true}]}>\n <Switch/>\n </Form.Item>\n\n\n {this.state.paramList?.map(p => (\n <div key={p.name}>\n <Divider>作业参数</Divider>\n <Form.Item label={p.label}\n name={['jobData', p.name]}\n key={p.name}\n rules={[{required: p.required}]}>\n {ValueType.renderField(p.componentType, p.componentProps)}\n </Form.Item>\n </div>\n ))}\n </Form>\n </Modal>\n\n <Modal title='作业调度状态'\n open={this.state.statusOpen}\n onCancel={() => this.setState({statusOpen: false})}\n footer={null}\n width={1024}\n >\n <Alert title={<pre>{this.state.status}</pre>}></Alert>\n\n </Modal>\n\n <Modal title='作业调度记录'\n open={this.state.executeRecordOpen}\n onCancel={() => this.setState({executeRecordOpen: false})}\n footer={null}\n width={1024}\n destroyOnHidden\n >\n <ProTable columns={[{\n title: '开始时间',\n dataIndex: 'beginTime',\n },\n {\n title: '结束时间',\n dataIndex: 'endTime',\n },\n {\n title: '耗时',\n dataIndex: 'jobRunTimeLabel',\n\n },\n {\n title: '是否成功',\n dataIndex: 'success',\n width: 200,\n render: v => {\n if (v != null) {\n return v ? '成功' : '异常'\n }\n }\n },\n {\n title: '返回结果',\n dataIndex: 'result',\n width: 300\n },\n\n {\n title: '操作',\n dataIndex: 'option',\n render: (_, record) => {\n const url = SysUtils.contextPath('/admin/sys/log/' + record.id);\n return <a href={url} target='_blank'>日志</a>;\n },\n }\n ]} request={params => {\n params.jobId = this.state.formValues.id\n return HttpUtils.get('admin/job/execute-record', params);\n }}></ProTable>\n\n </Modal>\n </Page>\n }\n\n onValuesChange = (changed, values) => {\n if (changed.jobClass) {\n this.loadJobParamFields(values.jobClass)\n const option = this.state.jobClassOptions.find(o => o.value === changed.jobClass)\n if (option) {\n const {label} = option;\n if (StringUtils.contains(label, \" \")) { // 取中文名部门设置为name\n this.formRef.current.setFieldValue(\"name\", label.split(\" \")[1])\n }\n }\n }\n\n if (changed.jobData) {\n this.loadJobParamFields(values.jobClass, values.jobData)\n }\n\n };\n}\n\n\n\n",
|
|
2117
|
+
"__content": "import React from 'react'\nimport {\n Alert,\n AutoComplete,\n Button,\n Divider,\n Form,\n Input,\n message,\n Modal,\n Popconfirm,\n Select,\n Space,\n Switch,\n Tag\n} from 'antd'\nimport {PlusOutlined} from \"@ant-design/icons\";\nimport {ButtonList, HttpUtils, Page, ProTable, StringUtils, SysUtils, ValueType} from \"../../../framework\";\n\n\nconst cronOptions = [\n {\n label: '*/5 * * * * ? 每隔5秒',\n value: '*/5 * * * * ?'\n },\n {\n label: '0 */5 * * * ? 每隔5分钟',\n value: '0 */5 * * * ?'\n },\n {\n label: '0 0 22 * * ? 每天22点',\n value: '0 0 22 * * ?'\n },\n {\n label: '0 0 1 * * ? 每天1点',\n value: '0 0 1 * * ?'\n },\n {\n label: '0 0 1 1 * ? 每月1号凌晨1点',\n value: '0 0 1 1 * ?'\n }\n]\n\n\nexport default class extends React.Component {\n\n state = {\n formValues: {},\n formOpen: false,\n\n selectedRowKeys: [],\n\n jobClassOptions: [],\n\n paramList: [],\n\n statusOpen: false,\n status: null,\n\n executeRecordOpen: false,\n }\n tableRef = React.createRef()\n formRef = React.createRef()\n\n componentDidMount() {\n HttpUtils.get('admin/job/job-class-options').then(rs => {\n this.setState({jobClassOptions: rs})\n }).catch(e => {\n console.error('[Job] 加载作业类选项失败:', e);\n })\n }\n\n handleAdd = () => {\n this.setState({formOpen: true, formValues: {}, paramList: []})\n }\n\n handleEdit = (record) => {\n this.loadJobParamFields(record.jobClass, record.jobData)\n this.setState({formOpen: true, formValues: record,})\n }\n\n loadJobParamFields(className, jobData) {\n HttpUtils.post(\"admin/job/get-job-param-fields\", jobData || {}, {className}).then(rs => {\n this.setState({paramList: rs})\n }).catch(e => {\n console.error('[Job] 加载作业参数字段失败:', e);\n })\n }\n\n onFinish = (values) => {\n const isNew = !values.id;\n const url = isNew ? 'admin/job/create' : 'admin/job/update';\n HttpUtils.post(url, values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload();\n }).catch(e => {\n console.error('[Job] 保存作业失败:', e);\n })\n }\n\n handleDelete = row => {\n const hide = message.loading(\"删除作业中...\")\n HttpUtils.post('admin/job/delete', {id: row.id}).then(rs => {\n this.tableRef.current.reload();\n }).catch(e => {\n console.error('[Job] 删除作业失败:', e);\n hide();\n })\n }\n\n handleTriggerJob = row => {\n HttpUtils.get('admin/job/trigger-job', {id: row.id}).then(rs => {\n this.tableRef.current.reload();\n }).catch(e => {\n console.error('[Job] 触发作业失败:', e);\n })\n }\n\n columns = [\n {\n title: '名称',\n dataIndex: 'name',\n\n },\n {\n title: '执行类',\n dataIndex: 'jobClass',\n\n },\n\n {\n title: 'cron',\n dataIndex: 'cron',\n },\n\n\n {\n title: '参数',\n dataIndex: 'jobData',\n render(list) {\n if (list)\n return JSON.stringify(list)\n }\n },\n\n\n {\n title: '启用状态',\n dataIndex: 'enabled',\n render: (v, record) => {\n return record.enabled ? <Tag color='green'>启用</Tag> : <Tag color='red'>停用</Tag>\n },\n },\n\n {\n title: '操作',\n dataIndex: 'option',\n fixed: 'right',\n render: (_, record) => {\n\n return (\n <Space>\n <Button size='small' onClick={() => this.showExecuteRecord(record)}>执行记录</Button>\n <Button size='small' perm='job:trigger' onClick={() => this.handleTriggerJob(record)}>执行一次</Button>\n <Button size='small' perm='job:update' onClick={() => this.handleEdit(record)}> 编辑 </Button>\n <Popconfirm perm='job:delete' title='是否确定删除?' onConfirm={() => this.handleDelete(record)}>\n <Button size='small'>删除</Button>\n </Popconfirm>\n </Space>\n );\n },\n },\n\n ]\n\n showStatus = () => {\n this.setState({statusOpen: true})\n HttpUtils.get('admin/job/status').then(rs => {\n this.setState({status: rs})\n }).catch(e => {\n console.error('[Job] 加载状态失败:', e);\n })\n };\n\n showExecuteRecord(record) {\n this.setState({executeRecordOpen: true, formValues: record})\n }\n\n\n render() {\n return <Page title=\"作业调度\" description=\"管理定时作业任务\" actions={<><Button type='primary' icon={<PlusOutlined/>} onClick={() => this.handleAdd()}>新增</Button><Button onClick={this.showStatus}>查看状态</Button></>}>\n <ProTable\n actionRef={this.tableRef}\n request={(params) => HttpUtils.get('admin/job/page', params)}\n columns={this.columns}\n >\n <Form.Item label='名称' name='name'>\n <Input/>\n </Form.Item>\n <Form.Item label='执行类' name='jobClass'>\n <Input/>\n </Form.Item>\n </ProTable>\n\n\n <Modal title='作业调度'\n open={this.state.formOpen}\n destroyOnHidden\n width={800}\n onOk={() => this.formRef.current.submit()}\n onCancel={() => this.setState({formOpen: false})}\n >\n\n <Form ref={this.formRef} labelCol={{flex: '100px'}}\n initialValues={this.state.formValues}\n onValuesChange={this.onValuesChange}\n onFinish={this.onFinish}>\n <Form.Item name='id' noStyle>\n </Form.Item>\n <Form.Item label='执行类' name='jobClass' rules={[{required: true}]}\n tooltip='org.quartz.Job接口,参考io.tmgg.job.builtin.DemoJob'>\n <Select options={this.state.jobClassOptions}/>\n </Form.Item>\n <Form.Item label='名称' name='name' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n\n <Form.Item label='cron表达式' name='cron' help='格式:秒分时日月周,留空表示手动执行'\n rules={[{required: true}]}>\n <AutoComplete placeholder='如 0 */5 * * * ?' options={cronOptions}/>\n </Form.Item>\n\n <Form.Item label='启用' name='enabled' valuePropName='checked' rules={[{required: true}]}>\n <Switch/>\n </Form.Item>\n\n\n {this.state.paramList?.map(p => (\n <div key={p.name}>\n <Divider>作业参数</Divider>\n <Form.Item label={p.label}\n name={['jobData', p.name]}\n key={p.name}\n rules={[{required: p.required}]}>\n {ValueType.renderField(p.componentType, p.componentProps)}\n </Form.Item>\n </div>\n ))}\n </Form>\n </Modal>\n\n <Modal title='作业调度状态'\n open={this.state.statusOpen}\n onCancel={() => this.setState({statusOpen: false})}\n footer={null}\n width={1024}\n >\n <Alert title={<pre>{this.state.status}</pre>}></Alert>\n\n </Modal>\n\n <Modal title='作业调度记录'\n open={this.state.executeRecordOpen}\n onCancel={() => this.setState({executeRecordOpen: false})}\n footer={null}\n width={1024}\n destroyOnHidden\n >\n <ProTable columns={[{\n title: '开始时间',\n dataIndex: 'beginTime',\n },\n {\n title: '结束时间',\n dataIndex: 'endTime',\n },\n {\n title: '耗时',\n dataIndex: 'jobRunTimeLabel',\n\n },\n {\n title: '是否成功',\n dataIndex: 'success',\n width: 200,\n render: v => {\n if (v != null) {\n return v ? '成功' : '异常'\n }\n }\n },\n {\n title: '返回结果',\n dataIndex: 'result',\n width: 300\n },\n\n {\n title: '操作',\n dataIndex: 'option',\n render: (_, record) => {\n const url = SysUtils.contextPath('/admin/sys/log/' + record.id);\n return <a href={url} target='_blank'>日志</a>;\n },\n }\n ]} request={params => {\n params.jobId = this.state.formValues.id\n return HttpUtils.get('admin/job/execute-record', params);\n }}></ProTable>\n\n </Modal>\n </Page>\n }\n\n onValuesChange = (changed, values) => {\n if (changed.jobClass) {\n this.loadJobParamFields(values.jobClass)\n const option = this.state.jobClassOptions.find(o => o.value === changed.jobClass)\n if (option) {\n const {label} = option;\n if (StringUtils.contains(label, \" \")) { // 取中文名部门设置为name\n this.formRef.current.setFieldValue(\"name\", label.split(\" \")[1])\n }\n }\n }\n\n if (changed.jobData) {\n this.loadJobParamFields(values.jobClass, values.jobData)\n }\n\n };\n}\n\n\n\n",
|
|
2138
2118
|
"__isJSFile": true,
|
|
2139
2119
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/job/index.jsx"
|
|
2140
2120
|
},
|
|
@@ -2144,7 +2124,7 @@
|
|
|
2144
2124
|
"parentId": "@@/global-layout",
|
|
2145
2125
|
"file": "system/log/index.jsx",
|
|
2146
2126
|
"absPath": "/system/log",
|
|
2147
|
-
"__content": "import React from 'react';\nimport {Form, Input, Tag} from \"antd\";\nimport {ViewText, FieldDateRange, HttpUtils, Page, ProTable} from \"../../../framework\";\n\nexport default class extends React.Component {\n\n\n columns = [\n {\n title: '操作者',\n dataIndex: 'username'\n },\n {\n title: '操作',\n dataIndex: 'operation',\n },\n\n\n {\n title: 'ip',\n dataIndex: 'ip',\n },\n\n\n {\n title: '时间',\n dataIndex: 'operationTime',\n sorter: true,\n },\n {\n title: '参数',\n dataIndex: 'params',\n render(v) {\n return <ViewText value={v} ellipsis={true} />\n }\n\n },\n {\n title: '结果',\n dataIndex: 'success',\n render(v) {\n return <>\n <Tag color={v ? 'green' : 'red'}>{v ? '成功' : '失败'}</Tag>\n </>\n }\n },\n {\n title: '错误消息',\n dataIndex: 'error',\n render(v) {\n return <ViewText value={v} ellipsis={true} />\n }\n },\n ];\n\n\n render() {\n return <Page>\n <ProTable\n request={(params) => HttpUtils.get('admin/sysLog/page', params)}\n columns={this.columns}\n >\n <Form.Item label='操作' name='operation'>\n <Input/>\n </Form.Item>\n <Form.Item label='时间' name='dateRange'>\n <FieldDateRange/>\n </Form.Item>\n </ProTable>\n </Page>\n }\n\n\n}\n\n\n\n",
|
|
2127
|
+
"__content": "import React from 'react';\nimport {Form, Input, Tag} from \"antd\";\nimport {ViewText, FieldDateRange, HttpUtils, Page, ProTable} from \"../../../framework\";\n\nexport default class extends React.Component {\n\n\n columns = [\n {\n title: '操作者',\n dataIndex: 'username'\n },\n {\n title: '操作',\n dataIndex: 'operation',\n },\n\n\n {\n title: 'ip',\n dataIndex: 'ip',\n },\n\n\n {\n title: '时间',\n dataIndex: 'operationTime',\n sorter: true,\n },\n {\n title: '参数',\n dataIndex: 'params',\n render(v) {\n return <ViewText value={v} ellipsis={true} />\n }\n\n },\n {\n title: '结果',\n dataIndex: 'success',\n render(v) {\n return <>\n <Tag color={v ? 'green' : 'red'}>{v ? '成功' : '失败'}</Tag>\n </>\n }\n },\n {\n title: '错误消息',\n dataIndex: 'error',\n render(v) {\n return <ViewText value={v} ellipsis={true} />\n }\n },\n ];\n\n\n render() {\n return <Page title=\"操作日志\" description=\"查看系统操作日志\">\n <ProTable\n request={(params) => HttpUtils.get('admin/sysLog/page', params)}\n columns={this.columns}\n >\n <Form.Item label='操作' name='operation'>\n <Input/>\n </Form.Item>\n <Form.Item label='时间' name='dateRange'>\n <FieldDateRange/>\n </Form.Item>\n </ProTable>\n </Page>\n }\n\n\n}\n\n\n\n",
|
|
2148
2128
|
"__isJSFile": true,
|
|
2149
2129
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/log/index.jsx"
|
|
2150
2130
|
},
|
|
@@ -2154,7 +2134,7 @@
|
|
|
2154
2134
|
"parentId": "@@/global-layout",
|
|
2155
2135
|
"file": "system/org/index.jsx",
|
|
2156
2136
|
"absPath": "/system/org",
|
|
2157
|
-
"__content": "import {DeleteOutlined, EditOutlined, PlusOutlined, SyncOutlined} from '@ant-design/icons';\nimport {Button, Card, Checkbox, Empty, Form, Input, Popconfirm, Space, Splitter, Switch, Tree} from 'antd';\nimport React from 'react';\nimport {\n FieldBoolean,\n FieldDictSelect,\n FieldRemoteTreeSelect,\n FieldUserSelect,\n Gap,\n HttpUtils,\n NamedIcon,\n Page\n} from \"../../../framework\";\n\n\nexport default class extends React.Component {\n\n state = {\n formLoading: false,\n formValues: undefined,\n submitLoading: false,\n formEditing: false,\n\n\n params: {\n onlyShowEnabled: true,\n onlyShowUnit: false,\n searchText: null\n },\n\n treeData: [],\n treeLoading: false,\n draggable: false,\n }\n actionRef = React.createRef();\n treeRef = React.createRef();\n\n componentDidMount() {\n this.loadTree()\n }\n\n loadTree = () => {\n this.setState({treeLoading: true})\n\n const {params} = this.state\n HttpUtils.get('admin/sysOrg/tree', params).then(rs => {\n const treeData = rs;\n this.setState({treeData})\n }).finally(() => {\n this.setState({treeLoading: false});\n })\n }\n\n handleDelete = record => {\n HttpUtils.post('admin/sysOrg/delete', {id: record.id})\n .then(rs => {\n this.setState({formValues: null})\n this.loadTree()\n })\n }\n\n\n onSelect = (selectedKeys) => {\n if (selectedKeys.length === 0) {\n this.setState({formValues: null})\n return\n }\n\n const key = selectedKeys[0]\n this.setState({formLoading: true, formEditing: false})\n HttpUtils.get(\"admin/sysOrg/detail\", {id: key}).then(rs => {\n this.setState({formValues: rs})\n }).finally(() => {\n this.setState({formLoading: false})\n })\n }\n\n onFinish = (values) => {\n this.setState({submitLoading: true, formEditing: false})\n const isNew = !values.id;\n const url = isNew ? 'admin/sysOrg/create' : 'admin/sysOrg/update';\n HttpUtils.post(url, values).then(rs => {\n this.loadTree()\n }).finally(() => {\n this.setState({submitLoading: false})\n })\n }\n\n\n onDraggableChange = e => {\n this.setState({draggable: e})\n };\n\n\n render() {\n const {formValues} = this.state;\n const disabled = formValues == null;\n const params = this.state.params;\n return <Page>\n <Card>\n <Space>\n\n <Input.Search placeholder='搜索' value={params.searchText} onChange={e => {\n params.searchText = e.target.value\n this.setState({params}, this.loadTree)\n }}/>\n <Checkbox checked={params.onlyShowEnabled}\n onChange={e => {\n params.onlyShowEnabled = e.target.checked;\n this.setState({params}, this.loadTree);\n }}>仅显示启用</Checkbox>\n\n <Checkbox checked={params.onlyShowUnit}\n onChange={e => {\n params.onlyShowUnit = e.target.checked;\n this.setState({params}, this.loadTree);\n }}>仅显示单位</Checkbox>\n\n\n </Space>\n </Card>\n <Gap/>\n <Splitter>\n <Splitter.Panel defaultSize={500}>\n <Card loading={this.state.treeLoading}\n title='组织机构'\n extra={<Space>\n\n <div>\n 拖拽排序 <Switch\n value={this.state.draggable}\n onChange={this.onDraggableChange}/>\n </div>\n <Button size='small' shape={\"round\"} icon={<SyncOutlined/>}\n onClick={this.loadTree}></Button>\n </Space>}>\n\n\n <Tree ref={this.treeRef}\n treeData={this.state.treeData}\n onSelect={this.onSelect}\n showIcon\n blockNode\n icon={item => {\n return <NamedIcon name={item.data.iconName}/>;\n }}\n draggable={this.state.draggable}\n onDrop={this.onDrop}\n showLine\n defaultExpandAll\n />\n {this.state.treeData.length === 0 && <Empty/>}\n </Card>\n </Splitter.Panel>\n\n <Splitter>\n <Card\n loading={this.state.formLoading}\n extra={<Space>\n <Button type='primary' onClick={() => {\n this.setState({\n formLoading: true,\n formEditing: true,\n formValues: {\n pid: formValues?.id,\n }\n }, () => {\n this.setState({formLoading: false})\n })\n }}>\n <PlusOutlined/> 新增\n </Button>\n <Button disabled={disabled} onClick={() => {\n this.setState({\n formEditing: true\n })\n }}>\n <EditOutlined/> 编辑\n </Button>\n\n <Popconfirm title={'是否确定删除组织机构'} disabled={disabled}\n onConfirm={() => this.handleDelete(formValues)}>\n <Button icon={<DeleteOutlined/>} disabled={disabled}>删除</Button>\n </Popconfirm>\n\n\n </Space>}\n >\n\n {formValues == null ? <Empty description='未选择机构'/> : <Form\n disabled={!this.state.formEditing}\n labelCol={{flex: '150px'}}\n wrapperCol={{flex: '400px'}}\n initialValues={formValues}\n onFinish={this.onFinish}\n >\n <Form.Item noStyle name='id'>\n </Form.Item>\n <Form.Item label='父节点' name='pid'>\n <FieldRemoteTreeSelect url='admin/sysOrg/tree'/>\n </Form.Item>\n <Form.Item label='名称' name='name' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n\n\n <Form.Item label='类型' name='type' rules={[{required: true}]}>\n <FieldDictSelect typeCode='orgType'/>\n </Form.Item>\n\n <Form.Item label='部门领导' name={['leader', 'id']}>\n <FieldUserSelect/>\n </Form.Item>\n <Form.Item label='启用' name='enabled' rules={[{required: true}]}>\n <FieldBoolean/>\n </Form.Item>\n <Form.Item label='扩展字段1' name='extra1'>\n <Input/>\n </Form.Item>\n <Form.Item label='扩展字段2' name='extra2'>\n <Input/>\n </Form.Item>\n <Form.Item label='扩展字段3' name='extra3'>\n <Input/>\n </Form.Item>\n\n\n <Form.Item label=' ' colon={false}>\n <Button type=\"primary\" htmlType='submit'\n loading={this.state.submitLoading}>保存</Button>\n </Form.Item>\n\n </Form>\n }\n\n\n </Card>\n </Splitter>\n\n </Splitter>\n\n\n </Page>\n }\n\n onDrop = (e) => {\n const {dragNode, dropToGap, node} = e;\n const dropKey = node.key;\n const dragKey = dragNode.key;\n\n const dropPos = e.node.pos.split('-');\n const dropPosition = e.dropPosition - Number(dropPos[dropPos.length - 1]); // the drop position relative to the drop node, inside 0, top -1, bottom 1\n\n\n HttpUtils.post('admin/sysOrg/sort', {dropPosition, dropToGap, dropKey, dragKey}).then(this.loadTree)\n };\n}\n\n\n\n",
|
|
2137
|
+
"__content": "import {DeleteOutlined, EditOutlined, PlusOutlined, SettingOutlined, SyncOutlined} from '@ant-design/icons';\nimport {Button, Card, Checkbox, Descriptions, Form, Input, InputNumber, Modal, Popconfirm, Popover, Space, Splitter, Switch, Tree, Typography} from 'antd';\nimport React from 'react';\nimport {\n FieldBoolean,\n FieldDictSelect,\n FieldRemoteTreeSelect,\n FieldUserSelect,\n HttpUtils,\n NamedIcon,\n Page,\n ViewBooleanEnableDisable,\n} from \"../../../framework\";\n\nexport default class extends React.Component {\n\n state = {\n selectedOrg: null,\n params: {\n onlyShowEnabled: true,\n onlyShowUnit: false,\n searchText: null,\n },\n treeData: [],\n treeLoading: false,\n draggable: false,\n\n modalOpen: false,\n modalValues: {},\n modalLoading: false,\n }\n formRef = React.createRef();\n treeRef = React.createRef();\n\n componentDidMount() {\n this.loadTree()\n }\n\n loadTree = () => {\n this.setState({treeLoading: true})\n HttpUtils.get('admin/sysOrg/tree', this.state.params).then(rs => {\n this.setState({treeData: rs})\n }).finally(() => {\n this.setState({treeLoading: false});\n })\n }\n\n handleDelete = () => {\n const {selectedOrg} = this.state\n if (!selectedOrg) return\n HttpUtils.post('admin/sysOrg/delete', {id: selectedOrg.id}).then(() => {\n this.setState({selectedOrg: null})\n this.loadTree()\n })\n }\n\n onSelect = (selectedKeys) => {\n if (selectedKeys.length === 0) {\n this.setState({selectedOrg: null})\n return\n }\n HttpUtils.get(\"admin/sysOrg/detail\", {id: selectedKeys[0]}).then(rs => {\n this.setState({selectedOrg: rs})\n })\n }\n\n handleAdd = () => {\n const {selectedOrg} = this.state\n this.setState({\n modalOpen: true,\n modalValues: {pid: selectedOrg?.id, enabled: true},\n })\n }\n\n handleEdit = () => {\n this.setState({\n modalOpen: true,\n modalValues: {...this.state.selectedOrg},\n })\n }\n\n handleModalFinish = (values) => {\n this.setState({modalLoading: true})\n const isNew = !values.id\n const url = isNew ? 'admin/sysOrg/create' : 'admin/sysOrg/update'\n HttpUtils.post(url, values).then(() => {\n this.setState({modalOpen: false})\n this.loadTree()\n }).finally(() => {\n this.setState({modalLoading: false})\n })\n }\n\n onDraggableChange = e => {\n this.setState({draggable: e})\n };\n\n render() {\n const {selectedOrg} = this.state\n const params = this.state.params\n\n return <Page title=\"组织机构\" description=\"管理组织机构树\"\n actions={<Button type='primary' perm='sys-org:create' icon={<PlusOutlined/>} onClick={this.handleAdd}>新增</Button>}>\n <Splitter>\n <Splitter.Panel defaultSize={400} style={{paddingRight: 8}}>\n <Card loading={this.state.treeLoading}\n size='small'\n >\n <div style={{display: 'flex', alignItems: 'center', gap: 4, marginBottom: 8}}>\n <Input.Search placeholder='搜索' value={params.searchText} onChange={e => {\n params.searchText = e.target.value\n this.setState({params}, this.loadTree)\n }} style={{flex: 1}}/>\n <Popover\n trigger='click'\n placement='bottomRight'\n title='设置'\n content={<Space direction='vertical'>\n <Checkbox checked={params.onlyShowEnabled}\n onChange={e => {\n params.onlyShowEnabled = e.target.checked;\n this.setState({params}, this.loadTree);\n }}>仅显示启用</Checkbox>\n <Checkbox checked={params.onlyShowUnit}\n onChange={e => {\n params.onlyShowUnit = e.target.checked;\n this.setState({params}, this.loadTree);\n }}>仅显示单位</Checkbox>\n <div>\n 拖拽排序 <Switch\n value={this.state.draggable}\n onChange={this.onDraggableChange}/>\n </div>\n <Button size='small' shape='round' icon={<SyncOutlined/>} onClick={this.loadTree}>刷新</Button>\n </Space>}\n >\n <Button type='text' size='small' icon={<SettingOutlined/>}/>\n </Popover>\n </div>\n <Tree ref={this.treeRef}\n treeData={this.state.treeData}\n onSelect={this.onSelect}\n showIcon\n blockNode\n icon={item => <NamedIcon name={item.data.iconName}/>}\n draggable={this.state.draggable}\n onDrop={this.onDrop}\n showLine\n defaultExpandAll\n />\n </Card>\n </Splitter.Panel>\n\n <Splitter.Panel style={{paddingLeft: 8}}>\n <Card size='small' style={{marginBottom: 8}}>\n <div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8}}>\n <Typography.Text strong>机构信息</Typography.Text>\n {selectedOrg && (\n <span>\n <Button size='small' icon={<EditOutlined/>} perm='sys-org:update'\n onClick={this.handleEdit} style={{marginRight: 4}}>编辑</Button>\n <Popconfirm perm='sys-org:delete' title='是否确定删除组织机构'\n onConfirm={this.handleDelete}>\n <Button size='small' icon={<DeleteOutlined/>}>删除</Button>\n </Popconfirm>\n </span>\n )}\n </div>\n {selectedOrg && (\n <Descriptions size='small' column={2}>\n <Descriptions.Item label=\"名称\">{selectedOrg.name}</Descriptions.Item>\n <Descriptions.Item label=\"类型\">{selectedOrg.typeLabel}</Descriptions.Item>\n <Descriptions.Item label=\"上级机构\">{selectedOrg.parentName || '-'}</Descriptions.Item>\n <Descriptions.Item label=\"序号\">{selectedOrg.seq ?? '-'}</Descriptions.Item>\n <Descriptions.Item label=\"部门领导\">{selectedOrg.leader?.name || '-'}</Descriptions.Item>\n <Descriptions.Item label=\"启用\"><ViewBooleanEnableDisable value={selectedOrg.enabled}/></Descriptions.Item>\n {selectedOrg.extra1 && <Descriptions.Item label=\"扩展字段1\">{selectedOrg.extra1}</Descriptions.Item>}\n {selectedOrg.extra2 && <Descriptions.Item label=\"扩展字段2\">{selectedOrg.extra2}</Descriptions.Item>}\n {selectedOrg.extra3 && <Descriptions.Item label=\"扩展字段3\">{selectedOrg.extra3}</Descriptions.Item>}\n </Descriptions>\n )}\n </Card>\n </Splitter.Panel>\n </Splitter>\n\n <Modal title={this.state.modalValues?.id ? '编辑组织机构' : '新增组织机构'}\n open={this.state.modalOpen}\n onOk={() => this.formRef.current.submit()}\n onCancel={() => this.setState({modalOpen: false})}\n destroyOnClose\n >\n <Form ref={this.formRef} labelCol={{flex: '120px'}}\n initialValues={this.state.modalValues}\n onFinish={this.handleModalFinish}\n >\n <Form.Item name='id' noStyle/>\n <Form.Item label='父节点' name='pid'>\n <FieldRemoteTreeSelect url='admin/sysOrg/tree'/>\n </Form.Item>\n <Form.Item label='名称' name='name' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n <Form.Item label='序号' name='seq'>\n <InputNumber/>\n </Form.Item>\n <Form.Item label='类型' name='type' rules={[{required: true}]}>\n <FieldDictSelect typeCode='orgType'/>\n </Form.Item>\n <Form.Item label='部门领导' name={['leader', 'id']}>\n <FieldUserSelect/>\n </Form.Item>\n <Form.Item label='启用' name='enabled' rules={[{required: true}]}>\n <FieldBoolean/>\n </Form.Item>\n <Form.Item label='扩展字段1' name='extra1'>\n <Input/>\n </Form.Item>\n <Form.Item label='扩展字段2' name='extra2'>\n <Input/>\n </Form.Item>\n <Form.Item label='扩展字段3' name='extra3'>\n <Input/>\n </Form.Item>\n </Form>\n </Modal>\n </Page>\n }\n\n onDrop = (e) => {\n const {dragNode, dropToGap, node} = e;\n const dropKey = node.key;\n const dragKey = dragNode.key;\n const dropPos = e.node.pos.split('-');\n const dropPosition = e.dropPosition - Number(dropPos[dropPos.length - 1]);\n HttpUtils.post('admin/sysOrg/sort', {dropPosition, dropToGap, dropKey, dragKey}).then(this.loadTree)\n };\n}\n\n\n\n",
|
|
2158
2138
|
"__isJSFile": true,
|
|
2159
2139
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/org/index.jsx"
|
|
2160
2140
|
},
|
|
@@ -2164,7 +2144,7 @@
|
|
|
2164
2144
|
"parentId": "@@/global-layout",
|
|
2165
2145
|
"file": "system/role/perm.jsx",
|
|
2166
2146
|
"absPath": "/system/role/perm",
|
|
2167
|
-
"__content": "import React from \"react\";\nimport {Button, Card, Checkbox, Table, Typography} from \"antd\";\nimport {SaveOutlined} from \"@ant-design/icons\";\nimport {ArrayUtils, HttpUtils, Page, PageUtils} from \"../../../framework\";\nexport default class extends React.Component {\n\n\n state = {\n loading: false,\n roleInfo: {},\n\n dataSource: [],\n rowSelectedKeys: {},\n }\n\n columns = [\n {\n title: '菜单',\n dataIndex: 'name',\n },\n\n {\n title: '权限',\n dataIndex: 'permCodes',\n render: (permCodes, record) => {\n if (permCodes == null) {\n return\n }\n const {permNames} = record\n const options = [];\n for (let i = 0; i < permCodes.length; i++) {\n const label = permNames[i];\n const value = permCodes[i];\n options.push({label, value});\n }\n\n\n const rowSelectedKey = this.state.rowSelectedKeys[record.id];\n return <Checkbox.Group options={options}\n value={rowSelectedKey}\n onChange={(ks) => {\n const rowSelectedKeys = this.state.rowSelectedKeys;\n rowSelectedKeys[record.id] = ks;\n this.setState({rowSelectedKeys})\n }}/>\n }\n }\n ]\n\n componentDidMount() {\n this.roleId = PageUtils.currentParams().id;\n this.loadData();\n }\n\n\n loadData() {\n this.setState({loading: true})\n Promise.all([\n HttpUtils.get('admin/sysRole/get', {id: this.roleId}).then(rs => {\n this.setState({roleInfo: rs})\n }),\n HttpUtils.get('admin/sysRole/perm-tree-table', {id: this.roleId}).then(rs => {\n this.setState({dataSource: rs})\n }),\n HttpUtils.get('admin/sysRole/own-perms', {id: this.roleId}).then(rs => {\n this.setState({rowSelectedKeys: rs})\n })\n ]).then(rs => {\n this.setState({loading: false})\n })\n }\n\n savePerms = () => {\n const {rowSelectedKeys} = this.state;\n const perms = [];\n const menus = []\n for (let menuId in rowSelectedKeys) {\n const ks = rowSelectedKeys[menuId];\n if (ks == null || ks.length === 0) {\n continue;\n }\n menus.push(menuId)\n ArrayUtils.addAll(perms, ks)\n }\n HttpUtils.post('admin/sysRole/save-perms', {id: this.roleId, perms, menus}).then(rs => {\n // Page.open(PageUtils.currentPathname(), PageUtils.currentLabel())\n })\n };\n\n\n render() {\n return <Page>\n
|
|
2147
|
+
"__content": "import React from \"react\";\nimport {Button, Card, Checkbox, Table, Typography} from \"antd\";\nimport {SaveOutlined} from \"@ant-design/icons\";\nimport {ArrayUtils, HttpUtils, Page, PageUtils} from \"../../../framework\";\nexport default class extends React.Component {\n\n\n state = {\n loading: false,\n roleInfo: {},\n\n dataSource: [],\n rowSelectedKeys: {},\n }\n\n columns = [\n {\n title: '菜单',\n dataIndex: 'name',\n },\n\n {\n title: '权限',\n dataIndex: 'permCodes',\n render: (permCodes, record) => {\n if (permCodes == null) {\n return\n }\n const {permNames} = record\n const options = [];\n for (let i = 0; i < permCodes.length; i++) {\n const label = permNames[i];\n const value = permCodes[i];\n options.push({label, value});\n }\n\n\n const rowSelectedKey = this.state.rowSelectedKeys[record.id];\n return <Checkbox.Group options={options}\n value={rowSelectedKey}\n onChange={(ks) => {\n const rowSelectedKeys = this.state.rowSelectedKeys;\n rowSelectedKeys[record.id] = ks;\n this.setState({rowSelectedKeys})\n }}/>\n }\n }\n ]\n\n componentDidMount() {\n this.roleId = PageUtils.currentParams().id;\n this.loadData();\n }\n\n\n loadData() {\n this.setState({loading: true})\n Promise.all([\n HttpUtils.get('admin/sysRole/get', {id: this.roleId}).then(rs => {\n this.setState({roleInfo: rs})\n }),\n HttpUtils.get('admin/sysRole/perm-tree-table', {id: this.roleId}).then(rs => {\n this.setState({dataSource: rs})\n }),\n HttpUtils.get('admin/sysRole/own-perms', {id: this.roleId}).then(rs => {\n this.setState({rowSelectedKeys: rs})\n })\n ]).then(rs => {\n this.setState({loading: false})\n })\n }\n\n savePerms = () => {\n const {rowSelectedKeys} = this.state;\n const perms = [];\n const menus = []\n for (let menuId in rowSelectedKeys) {\n const ks = rowSelectedKeys[menuId];\n if (ks == null || ks.length === 0) {\n continue;\n }\n menus.push(menuId)\n ArrayUtils.addAll(perms, ks)\n }\n HttpUtils.post('admin/sysRole/save-perms', {id: this.roleId, perms, menus}).then(rs => {\n // Page.open(PageUtils.currentPathname(), PageUtils.currentLabel())\n })\n };\n\n\n render() {\n return <Page title=\"角色权限设置\" description=\"设置角色的菜单和权限\">\n <Card title='角色权限设置' loading={this.state.loading}\n variant={\"borderless\"}\n extra={<Button type='primary' icon={<SaveOutlined/>} onClick={this.savePerms}>保存权限</Button>}>\n <Typography.Text>角色名称:{this.state.roleInfo.name}, 编码:{this.state.roleInfo.code} </Typography.Text>\n <Table dataSource={this.state.dataSource}\n columns={this.columns}\n size='small' bordered pagination={false} rowKey='id'\n expandable={{defaultExpandAllRows: true}}\n ></Table>\n </Card>\n </Page>\n }\n}\n",
|
|
2168
2148
|
"__isJSFile": true,
|
|
2169
2149
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/role/perm.jsx"
|
|
2170
2150
|
},
|
|
@@ -2174,7 +2154,7 @@
|
|
|
2174
2154
|
"parentId": "@@/global-layout",
|
|
2175
2155
|
"file": "userCenter/index.jsx",
|
|
2176
2156
|
"absPath": "/userCenter",
|
|
2177
|
-
"__content": "import React from \"react\";\nimport {Avatar, Card, Col, Row, Tabs} from \"antd\";\nimport ChangePassword from \"./ChangePassword\";\nimport {HttpUtils, Page} from \"../../framework\";\n\nexport default class extends React.Component {\n\n state = {\n info: {}\n }\n\n componentDidMount() {\n HttpUtils.get('admin/userCenter/info').then(rs => {\n this.setState({info: rs})\n })\n }\n\n render() {\n const {info} = this.state;\n return <Page backgroundGray>\n <Row gutter={[16, 16]}>\n <Col md={6} sm={24}>\n <Card title='个人信息'>\n\n <div className='flex-center' style={{marginBottom: 32}}>\n <Avatar size={128} title='点击修改头像'/>\n </div>\n\n\n <table className='
|
|
2157
|
+
"__content": "import React from \"react\";\nimport {Avatar, Card, Col, Row, Tabs} from \"antd\";\nimport ChangePassword from \"./ChangePassword\";\nimport {HttpUtils, Page} from \"../../framework\";\n\nexport default class extends React.Component {\n\n state = {\n info: {}\n }\n\n componentDidMount() {\n HttpUtils.get('admin/userCenter/info').then(rs => {\n this.setState({info: rs})\n })\n }\n\n render() {\n const {info} = this.state;\n return <Page backgroundGray title=\"个人中心\" description=\"查看和编辑个人资料\">\n\n <Row gutter={[16, 16]}>\n <Col md={6} sm={24}>\n <Card title='个人信息'>\n\n <div className='flex-center' style={{marginBottom: 32}}>\n <Avatar size={128} title='点击修改头像'/>\n </div>\n\n\n <table className='oa-table'>\n <tbody>\n <tr>\n <td>用户名称</td>\n <td align='right'>{info.name}</td>\n </tr>\n <tr>\n <td>账号</td>\n <td align='right'>{info.account}</td>\n </tr>\n <tr>\n <td>手机号码</td>\n <td>{info.phone}</td>\n </tr>\n <tr>\n <td>用户邮箱</td>\n <td>{info.email}</td>\n </tr>\n <tr>\n <td>所属部门</td>\n <td>{info.unit} {info.dept}</td>\n </tr>\n <tr>\n <td>所属角色</td>\n <td>{info.roles}</td>\n </tr>\n <tr>\n <td>创建日期</td>\n <td>{info.createTime}</td>\n </tr>\n </tbody>\n </table>\n </Card>\n </Col>\n <Col md={18} sm={24}>\n <Card title='个人设置'>\n <Tabs\n items={[\n {\n label: '修改密码', key: 'pwd', children: <div>\n <ChangePassword/>\n </div>\n },\n {\n label: '消息订阅', key: 'topic', children: <div>\n 当账号管理邮箱后,系统消息会发送邮件给您\n </div>\n }\n ]}\n tabPlacement='left'\n >\n </Tabs>\n </Card>\n </Col>\n </Row>\n\n\n </Page>\n\n }\n}\n",
|
|
2178
2158
|
"__isJSFile": true,
|
|
2179
2159
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/userCenter/index.jsx"
|
|
2180
2160
|
},
|
|
@@ -2184,7 +2164,7 @@
|
|
|
2184
2164
|
"parentId": "@@/global-layout",
|
|
2185
2165
|
"file": "about.jsx",
|
|
2186
2166
|
"absPath": "/about",
|
|
2187
|
-
"__content": "import React from \"react\";\nimport {Page} from \"../framework\";\n\nexport default class extends React.Component {\n\n\n render() {\n return <Page>\n <h1>关于</h1>\n </Page>\n }\n}\n",
|
|
2167
|
+
"__content": "import React from \"react\";\nimport {Page} from \"../framework\";\n\nexport default class extends React.Component {\n\n\n render() {\n return <Page title=\"关于\" description=\"了解系统版本与相关信息\">\n <h1>关于</h1>\n </Page>\n }\n}\n",
|
|
2188
2168
|
"__isJSFile": true,
|
|
2189
2169
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/about.jsx"
|
|
2190
2170
|
},
|
|
@@ -2194,7 +2174,7 @@
|
|
|
2194
2174
|
"parentId": "@@/global-layout",
|
|
2195
2175
|
"file": "index.jsx",
|
|
2196
2176
|
"absPath": "/",
|
|
2197
|
-
"__content": "import React from \"react\";\nimport {Card} from \"antd\";\nimport {Page} from \"../framework\";\n\nexport default function () {\n return <Page>\n <Card>欢迎使用本系统</Card>\n </Page>\n}\n",
|
|
2177
|
+
"__content": "import React from \"react\";\nimport {Card} from \"antd\";\nimport {Page} from \"../framework\";\n\nexport default function () {\n return <Page title=\"首页\" description=\"欢迎使用本系统\">\n <Card>欢迎使用本系统</Card>\n </Page>\n}\n",
|
|
2198
2178
|
"__isJSFile": true,
|
|
2199
2179
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/index.jsx"
|
|
2200
2180
|
},
|
|
@@ -2204,7 +2184,7 @@
|
|
|
2204
2184
|
"parentId": "@@/global-layout",
|
|
2205
2185
|
"file": "login.jsx",
|
|
2206
2186
|
"absPath": "/login",
|
|
2207
|
-
"__content": "import React from 'react';\nimport {Button, Form, Input, message} from 'antd';\nimport {LockOutlined, UserOutlined, WarningOutlined} from '@ant-design/icons';\nimport {history} from 'umi';\nimport {EventBusUtils, HttpUtils, PageUtils, SysUtils} from \"../framework/utils\";\n\nimport \"./login.less\"\n\nfunction getRedirect() {\n let redirect = PageUtils.currentParams()['redirect'];\n if (redirect) {\n redirect = decodeURIComponent(redirect)\n } else {\n redirect = '/'\n }\n return redirect;\n}\n\nfunction postLogin(values) {\n return new Promise((resolve, reject) => {\n HttpUtils.post('/admin/auth/login', values).then(rs => {\n EventBusUtils.emit('loginSuccess')\n history.push(getRedirect())\n resolve(rs)\n }).catch(e => {\n console.error('[Login] 登录失败:', e);\n reject(e)\n })\n })\n}\n\nfunction encodePassword(pwd) {\n const chars = [];\n for (let i = 0; i < pwd.length; i++)\n chars.push(pwd.charCodeAt(i) + i + 2);\n return btoa(String.fromCharCode(...chars));\n}\n\nexport default class extends React.Component {\n\n state = {\n logging: false,\n siteInfo: {}\n }\n\n async componentDidMount() {\n const siteInfo = SysUtils.getSiteInfo()\n if (siteInfo && siteInfo.title) {\n this.setState({siteInfo})\n return\n }\n // localStorage 中无站点信息,从服务端重新加载\n try {\n const rs = await HttpUtils.get('/admin/public/site-info')\n SysUtils.setSiteInfo(rs)\n this.setState({siteInfo: rs})\n } catch (e) {\n console.error('[Login] 加载站点信息失败:', e);\n message.error('加载站点信息失败,请刷新页面重试')\n }\n }\n\n submit = values => {\n this.setState({logging: true})\n values.password = encodePassword(values.password)\n postLogin(values).finally(() => {\n this.setState({logging: false})\n })\n }\n\n render() {\n const {siteInfo} = this.state\n\n const pageStyle = {\n backgroundImage: `url(\"
|
|
2187
|
+
"__content": "import React from 'react';\nimport {Button, Form, Input, message} from 'antd';\nimport {LockOutlined, UserOutlined, WarningOutlined} from '@ant-design/icons';\nimport {history} from 'umi';\nimport {EventBusUtils, HttpUtils, PageUtils, SysUtils} from \"../framework/utils\";\n\nimport \"./login.less\"\n\nfunction getRedirect() {\n let redirect = PageUtils.currentParams()['redirect'];\n if (redirect) {\n redirect = decodeURIComponent(redirect)\n } else {\n redirect = '/'\n }\n return redirect;\n}\n\nfunction postLogin(values) {\n return new Promise((resolve, reject) => {\n HttpUtils.post('/admin/auth/login', values).then(rs => {\n EventBusUtils.emit('loginSuccess')\n history.push(getRedirect())\n resolve(rs)\n }).catch(e => {\n console.error('[Login] 登录失败:', e);\n reject(e)\n })\n })\n}\n\nfunction encodePassword(pwd) {\n const chars = [];\n for (let i = 0; i < pwd.length; i++)\n chars.push(pwd.charCodeAt(i) + i + 2);\n return btoa(String.fromCharCode(...chars));\n}\n\nexport default class extends React.Component {\n\n state = {\n logging: false,\n siteInfo: {}\n }\n\n async componentDidMount() {\n const siteInfo = SysUtils.getSiteInfo()\n if (siteInfo && siteInfo.title) {\n this.setState({siteInfo})\n return\n }\n // localStorage 中无站点信息,从服务端重新加载\n try {\n const rs = await HttpUtils.get('/admin/public/site-info')\n SysUtils.setSiteInfo(rs)\n this.setState({siteInfo: rs})\n } catch (e) {\n console.error('[Login] 加载站点信息失败:', e);\n message.error('加载站点信息失败,请刷新页面重试')\n }\n }\n\n submit = values => {\n this.setState({logging: true})\n values.password = encodePassword(values.password)\n postLogin(values).finally(() => {\n this.setState({logging: false})\n })\n }\n\n render() {\n const {siteInfo} = this.state\n\n const pageStyle = {\n backgroundImage: `url(\"./login_bg.jpg\")`\n }\n\n return (\n <section className='login-page' style={pageStyle}>\n <div className=\"login-content\">\n <h1>{siteInfo.title}</h1>\n {this.getForm(siteInfo)}\n {this.renderFormBottom()}\n </div>\n </section>\n );\n }\n\n getForm = siteInfo => {\n const form = (\n <Form\n name=\"normal_login\"\n className=\"login-form\"\n initialValues={{remember: true}}\n onFinish={this.submit}\n requiredMark={false}\n colon={false}\n >\n <Form.Item name=\"username\" rules={[{required: true, message: '请输入用户名!'}]}>\n <Input size='large' prefix={<UserOutlined/>} placeholder=\"用户名\" autoComplete=\"off\"/>\n </Form.Item>\n <Form.Item name=\"password\" rules={[{required: true, message: '请输入密码!'}]}>\n <Input autoComplete=\"off\" prefix={<LockOutlined/>} type=\"password\" placeholder=\"密码\"\n size='large'\n />\n </Form.Item>\n\n <Form.Item style={{marginTop: 10}}>\n <Button loading={this.state.logging} type=\"primary\" htmlType=\"submit\"\n block size='large'>\n 登录\n </Button>\n </Form.Item>\n </Form>\n );\n\n if (this.props.formRender) {\n return this.props.formRender(form);\n }\n return form;\n };\n\n renderFormBottom() {\n const siteInfo = this.state.siteInfo;\n if (siteInfo.loginBoxBottomTip) {\n return (\n <div style={{color: 'white', marginTop: 50, fontSize: '14px', textAlign: 'center'}}>\n <WarningOutlined/> {siteInfo.loginBoxBottomTip}\n </div>\n )\n }\n }\n}\n",
|
|
2208
2188
|
"__isJSFile": true,
|
|
2209
2189
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/login.jsx"
|
|
2210
2190
|
},
|