@jiangood/open-admin 1.1.1 → 1.1.2
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 -88
- package/src/.umi-production/core/route.tsx +1 -4
- package/src/framework/fields/FieldDictSelect/index.jsx +2 -1
- package/src/framework/utils/system/DictUtils.ts +7 -8
- package/src/pages/system/api/index.jsx +1 -1
- package/src/pages/system/dict/index.jsx +188 -12
- package/src/pages/system/file/index.jsx +1 -1
- package/src/pages/system/job/index.jsx +1 -1
- package/src/pages/system/org/index.jsx +2 -3
- package/src/pages/system/role/index.jsx +1 -1
- package/src/pages/system/sysManual/index.jsx +1 -1
- package/src/pages/system/user/index.jsx +1 -1
- package/src/pages/system/dict/Dict.jsx +0 -67
- package/src/pages/system/dict/DictItem.jsx +0 -175
- package/src/pages/ureport/index.jsx +0 -16
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"dev": "umi dev",
|
|
41
41
|
"build": "umi build"
|
|
42
42
|
},
|
|
43
|
-
"version": "1.1.
|
|
43
|
+
"version": "1.1.2"
|
|
44
44
|
},
|
|
45
45
|
"pkgPath": "/home/runner/work/open-admin/open-admin/web/package.json",
|
|
46
46
|
"plugins": {
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"config": {},
|
|
67
67
|
"time": {
|
|
68
68
|
"hooks": {},
|
|
69
|
-
"register":
|
|
69
|
+
"register": 7
|
|
70
70
|
},
|
|
71
71
|
"enableBy": "register"
|
|
72
72
|
},
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
0
|
|
84
84
|
]
|
|
85
85
|
},
|
|
86
|
-
"register":
|
|
86
|
+
"register": 2
|
|
87
87
|
},
|
|
88
88
|
"enableBy": "register"
|
|
89
89
|
},
|
|
@@ -97,10 +97,10 @@
|
|
|
97
97
|
"time": {
|
|
98
98
|
"hooks": {
|
|
99
99
|
"onStart": [
|
|
100
|
-
|
|
100
|
+
26
|
|
101
101
|
]
|
|
102
102
|
},
|
|
103
|
-
"register":
|
|
103
|
+
"register": 2
|
|
104
104
|
},
|
|
105
105
|
"enableBy": "register"
|
|
106
106
|
},
|
|
@@ -144,10 +144,10 @@
|
|
|
144
144
|
"time": {
|
|
145
145
|
"hooks": {
|
|
146
146
|
"modifyAppData": [
|
|
147
|
-
|
|
147
|
+
70
|
|
148
148
|
]
|
|
149
149
|
},
|
|
150
|
-
"register":
|
|
150
|
+
"register": 23
|
|
151
151
|
},
|
|
152
152
|
"enableBy": "register"
|
|
153
153
|
},
|
|
@@ -180,7 +180,7 @@
|
|
|
180
180
|
0
|
|
181
181
|
]
|
|
182
182
|
},
|
|
183
|
-
"register":
|
|
183
|
+
"register": 2
|
|
184
184
|
},
|
|
185
185
|
"enableBy": "register"
|
|
186
186
|
},
|
|
@@ -194,10 +194,10 @@
|
|
|
194
194
|
"time": {
|
|
195
195
|
"hooks": {
|
|
196
196
|
"onCheck": [
|
|
197
|
-
|
|
197
|
+
0
|
|
198
198
|
]
|
|
199
199
|
},
|
|
200
|
-
"register":
|
|
200
|
+
"register": 1
|
|
201
201
|
},
|
|
202
202
|
"enableBy": "register"
|
|
203
203
|
},
|
|
@@ -227,7 +227,7 @@
|
|
|
227
227
|
0
|
|
228
228
|
]
|
|
229
229
|
},
|
|
230
|
-
"register":
|
|
230
|
+
"register": 12
|
|
231
231
|
},
|
|
232
232
|
"enableBy": "register"
|
|
233
233
|
},
|
|
@@ -1079,7 +1079,7 @@
|
|
|
1079
1079
|
"config": {},
|
|
1080
1080
|
"time": {
|
|
1081
1081
|
"hooks": {},
|
|
1082
|
-
"register":
|
|
1082
|
+
"register": 1
|
|
1083
1083
|
},
|
|
1084
1084
|
"enableBy": "config"
|
|
1085
1085
|
},
|
|
@@ -1122,7 +1122,7 @@
|
|
|
1122
1122
|
"config": {},
|
|
1123
1123
|
"time": {
|
|
1124
1124
|
"hooks": {},
|
|
1125
|
-
"register":
|
|
1125
|
+
"register": 97
|
|
1126
1126
|
},
|
|
1127
1127
|
"enableBy": "register"
|
|
1128
1128
|
},
|
|
@@ -1148,7 +1148,7 @@
|
|
|
1148
1148
|
"config": {},
|
|
1149
1149
|
"time": {
|
|
1150
1150
|
"hooks": {},
|
|
1151
|
-
"register":
|
|
1151
|
+
"register": 9
|
|
1152
1152
|
},
|
|
1153
1153
|
"enableBy": "config"
|
|
1154
1154
|
},
|
|
@@ -1165,7 +1165,7 @@
|
|
|
1165
1165
|
0
|
|
1166
1166
|
]
|
|
1167
1167
|
},
|
|
1168
|
-
"register":
|
|
1168
|
+
"register": 0
|
|
1169
1169
|
},
|
|
1170
1170
|
"enableBy": "register"
|
|
1171
1171
|
},
|
|
@@ -1178,7 +1178,7 @@
|
|
|
1178
1178
|
"config": {},
|
|
1179
1179
|
"time": {
|
|
1180
1180
|
"hooks": {},
|
|
1181
|
-
"register":
|
|
1181
|
+
"register": 1
|
|
1182
1182
|
},
|
|
1183
1183
|
"enableBy": "register"
|
|
1184
1184
|
},
|
|
@@ -1204,7 +1204,7 @@
|
|
|
1204
1204
|
"config": {},
|
|
1205
1205
|
"time": {
|
|
1206
1206
|
"hooks": {},
|
|
1207
|
-
"register":
|
|
1207
|
+
"register": 36
|
|
1208
1208
|
}
|
|
1209
1209
|
},
|
|
1210
1210
|
"./node_modules/.pnpm/@umijs+preset-umi@4.6.25_@types+node@25.2.0_@types+react@19.2.10_less-loader@12.3.0_les_58df256248ff09e533aea72785e2522e/node_modules/@umijs/preset-umi/dist/features/mpa/mpa": {
|
|
@@ -1229,7 +1229,7 @@
|
|
|
1229
1229
|
"config": {},
|
|
1230
1230
|
"time": {
|
|
1231
1231
|
"hooks": {},
|
|
1232
|
-
"register":
|
|
1232
|
+
"register": 0
|
|
1233
1233
|
}
|
|
1234
1234
|
},
|
|
1235
1235
|
"./node_modules/.pnpm/@umijs+preset-umi@4.6.25_@types+node@25.2.0_@types+react@19.2.10_less-loader@12.3.0_les_58df256248ff09e533aea72785e2522e/node_modules/@umijs/preset-umi/dist/features/overrides/overrides": {
|
|
@@ -1283,7 +1283,7 @@
|
|
|
1283
1283
|
"config": {},
|
|
1284
1284
|
"time": {
|
|
1285
1285
|
"hooks": {},
|
|
1286
|
-
"register":
|
|
1286
|
+
"register": 1
|
|
1287
1287
|
},
|
|
1288
1288
|
"enableBy": "register"
|
|
1289
1289
|
},
|
|
@@ -1309,7 +1309,7 @@
|
|
|
1309
1309
|
"config": {},
|
|
1310
1310
|
"time": {
|
|
1311
1311
|
"hooks": {},
|
|
1312
|
-
"register":
|
|
1312
|
+
"register": 0
|
|
1313
1313
|
},
|
|
1314
1314
|
"enableBy": "config"
|
|
1315
1315
|
},
|
|
@@ -1322,7 +1322,7 @@
|
|
|
1322
1322
|
"config": {},
|
|
1323
1323
|
"time": {
|
|
1324
1324
|
"hooks": {},
|
|
1325
|
-
"register":
|
|
1325
|
+
"register": 1
|
|
1326
1326
|
},
|
|
1327
1327
|
"enableBy": "config"
|
|
1328
1328
|
},
|
|
@@ -1335,7 +1335,7 @@
|
|
|
1335
1335
|
"config": {},
|
|
1336
1336
|
"time": {
|
|
1337
1337
|
"hooks": {},
|
|
1338
|
-
"register":
|
|
1338
|
+
"register": 0
|
|
1339
1339
|
},
|
|
1340
1340
|
"enableBy": "register"
|
|
1341
1341
|
},
|
|
@@ -1374,7 +1374,7 @@
|
|
|
1374
1374
|
"config": {},
|
|
1375
1375
|
"time": {
|
|
1376
1376
|
"hooks": {},
|
|
1377
|
-
"register":
|
|
1377
|
+
"register": 1
|
|
1378
1378
|
}
|
|
1379
1379
|
},
|
|
1380
1380
|
"./node_modules/.pnpm/@umijs+preset-umi@4.6.25_@types+node@25.2.0_@types+react@19.2.10_less-loader@12.3.0_les_58df256248ff09e533aea72785e2522e/node_modules/@umijs/preset-umi/dist/features/ssr/ssr": {
|
|
@@ -1412,7 +1412,7 @@
|
|
|
1412
1412
|
"config": {},
|
|
1413
1413
|
"time": {
|
|
1414
1414
|
"hooks": {},
|
|
1415
|
-
"register":
|
|
1415
|
+
"register": 4
|
|
1416
1416
|
},
|
|
1417
1417
|
"enableBy": "register"
|
|
1418
1418
|
},
|
|
@@ -1425,7 +1425,7 @@
|
|
|
1425
1425
|
"config": {},
|
|
1426
1426
|
"time": {
|
|
1427
1427
|
"hooks": {},
|
|
1428
|
-
"register":
|
|
1428
|
+
"register": 3
|
|
1429
1429
|
},
|
|
1430
1430
|
"enableBy": "config"
|
|
1431
1431
|
},
|
|
@@ -1451,7 +1451,7 @@
|
|
|
1451
1451
|
"config": {},
|
|
1452
1452
|
"time": {
|
|
1453
1453
|
"hooks": {},
|
|
1454
|
-
"register":
|
|
1454
|
+
"register": 5
|
|
1455
1455
|
}
|
|
1456
1456
|
},
|
|
1457
1457
|
"./node_modules/.pnpm/@umijs+preset-umi@4.6.25_@types+node@25.2.0_@types+react@19.2.10_less-loader@12.3.0_les_58df256248ff09e533aea72785e2522e/node_modules/@umijs/preset-umi/dist/features/monorepo/redirect": {
|
|
@@ -1463,7 +1463,7 @@
|
|
|
1463
1463
|
"config": {},
|
|
1464
1464
|
"time": {
|
|
1465
1465
|
"hooks": {},
|
|
1466
|
-
"register":
|
|
1466
|
+
"register": 22
|
|
1467
1467
|
},
|
|
1468
1468
|
"enableBy": "config"
|
|
1469
1469
|
},
|
|
@@ -1488,7 +1488,7 @@
|
|
|
1488
1488
|
"config": {},
|
|
1489
1489
|
"time": {
|
|
1490
1490
|
"hooks": {},
|
|
1491
|
-
"register":
|
|
1491
|
+
"register": 0
|
|
1492
1492
|
}
|
|
1493
1493
|
},
|
|
1494
1494
|
"./node_modules/.pnpm/@umijs+preset-umi@4.6.25_@types+node@25.2.0_@types+react@19.2.10_less-loader@12.3.0_les_58df256248ff09e533aea72785e2522e/node_modules/@umijs/preset-umi/dist/features/legacy/legacy": {
|
|
@@ -1500,7 +1500,7 @@
|
|
|
1500
1500
|
"config": {},
|
|
1501
1501
|
"time": {
|
|
1502
1502
|
"hooks": {},
|
|
1503
|
-
"register":
|
|
1503
|
+
"register": 2
|
|
1504
1504
|
},
|
|
1505
1505
|
"enableBy": "config"
|
|
1506
1506
|
},
|
|
@@ -1592,7 +1592,7 @@
|
|
|
1592
1592
|
"config": {},
|
|
1593
1593
|
"time": {
|
|
1594
1594
|
"hooks": {},
|
|
1595
|
-
"register":
|
|
1595
|
+
"register": 3
|
|
1596
1596
|
}
|
|
1597
1597
|
},
|
|
1598
1598
|
"./node_modules/.pnpm/@umijs+preset-umi@4.6.25_@types+node@25.2.0_@types+react@19.2.10_less-loader@12.3.0_les_58df256248ff09e533aea72785e2522e/node_modules/@umijs/preset-umi/dist/features/routePreloadOnLoad/routePreloadOnLoad": {
|
|
@@ -1604,7 +1604,7 @@
|
|
|
1604
1604
|
"config": {},
|
|
1605
1605
|
"time": {
|
|
1606
1606
|
"hooks": {},
|
|
1607
|
-
"register":
|
|
1607
|
+
"register": 30
|
|
1608
1608
|
}
|
|
1609
1609
|
},
|
|
1610
1610
|
"./node_modules/.pnpm/@umijs+preset-umi@4.6.25_@types+node@25.2.0_@types+react@19.2.10_less-loader@12.3.0_les_58df256248ff09e533aea72785e2522e/node_modules/@umijs/preset-umi/dist/features/forget/forget": {
|
|
@@ -1616,7 +1616,7 @@
|
|
|
1616
1616
|
"config": {},
|
|
1617
1617
|
"time": {
|
|
1618
1618
|
"hooks": {},
|
|
1619
|
-
"register":
|
|
1619
|
+
"register": 1
|
|
1620
1620
|
},
|
|
1621
1621
|
"enableBy": "config"
|
|
1622
1622
|
},
|
|
@@ -1642,7 +1642,7 @@
|
|
|
1642
1642
|
"config": {},
|
|
1643
1643
|
"time": {
|
|
1644
1644
|
"hooks": {},
|
|
1645
|
-
"register":
|
|
1645
|
+
"register": 4
|
|
1646
1646
|
},
|
|
1647
1647
|
"enableBy": "register"
|
|
1648
1648
|
},
|
|
@@ -1655,7 +1655,7 @@
|
|
|
1655
1655
|
"config": {},
|
|
1656
1656
|
"time": {
|
|
1657
1657
|
"hooks": {},
|
|
1658
|
-
"register":
|
|
1658
|
+
"register": 40
|
|
1659
1659
|
},
|
|
1660
1660
|
"enableBy": "register"
|
|
1661
1661
|
},
|
|
@@ -1668,7 +1668,7 @@
|
|
|
1668
1668
|
"config": {},
|
|
1669
1669
|
"time": {
|
|
1670
1670
|
"hooks": {},
|
|
1671
|
-
"register":
|
|
1671
|
+
"register": 27
|
|
1672
1672
|
}
|
|
1673
1673
|
},
|
|
1674
1674
|
"./node_modules/.pnpm/@umijs+preset-umi@4.6.25_@types+node@25.2.0_@types+react@19.2.10_less-loader@12.3.0_les_58df256248ff09e533aea72785e2522e/node_modules/@umijs/preset-umi/dist/commands/help": {
|
|
@@ -1745,7 +1745,7 @@
|
|
|
1745
1745
|
"config": {},
|
|
1746
1746
|
"time": {
|
|
1747
1747
|
"hooks": {},
|
|
1748
|
-
"register":
|
|
1748
|
+
"register": 2
|
|
1749
1749
|
},
|
|
1750
1750
|
"enableBy": "register"
|
|
1751
1751
|
},
|
|
@@ -1758,7 +1758,7 @@
|
|
|
1758
1758
|
"config": {},
|
|
1759
1759
|
"time": {
|
|
1760
1760
|
"hooks": {},
|
|
1761
|
-
"register":
|
|
1761
|
+
"register": 0
|
|
1762
1762
|
},
|
|
1763
1763
|
"enableBy": "register"
|
|
1764
1764
|
},
|
|
@@ -1771,7 +1771,7 @@
|
|
|
1771
1771
|
"config": {},
|
|
1772
1772
|
"time": {
|
|
1773
1773
|
"hooks": {},
|
|
1774
|
-
"register":
|
|
1774
|
+
"register": 1
|
|
1775
1775
|
},
|
|
1776
1776
|
"enableBy": "register"
|
|
1777
1777
|
},
|
|
@@ -1784,7 +1784,7 @@
|
|
|
1784
1784
|
"config": {},
|
|
1785
1785
|
"time": {
|
|
1786
1786
|
"hooks": {},
|
|
1787
|
-
"register":
|
|
1787
|
+
"register": 0
|
|
1788
1788
|
},
|
|
1789
1789
|
"enableBy": "register"
|
|
1790
1790
|
},
|
|
@@ -1797,7 +1797,7 @@
|
|
|
1797
1797
|
"config": {},
|
|
1798
1798
|
"time": {
|
|
1799
1799
|
"hooks": {},
|
|
1800
|
-
"register":
|
|
1800
|
+
"register": 1
|
|
1801
1801
|
},
|
|
1802
1802
|
"enableBy": "register"
|
|
1803
1803
|
},
|
|
@@ -1810,7 +1810,7 @@
|
|
|
1810
1810
|
"config": {},
|
|
1811
1811
|
"time": {
|
|
1812
1812
|
"hooks": {},
|
|
1813
|
-
"register":
|
|
1813
|
+
"register": 0
|
|
1814
1814
|
},
|
|
1815
1815
|
"enableBy": "register"
|
|
1816
1816
|
},
|
|
@@ -1823,7 +1823,7 @@
|
|
|
1823
1823
|
"config": {},
|
|
1824
1824
|
"time": {
|
|
1825
1825
|
"hooks": {},
|
|
1826
|
-
"register":
|
|
1826
|
+
"register": 1
|
|
1827
1827
|
},
|
|
1828
1828
|
"enableBy": "register"
|
|
1829
1829
|
},
|
|
@@ -1836,7 +1836,7 @@
|
|
|
1836
1836
|
"config": {},
|
|
1837
1837
|
"time": {
|
|
1838
1838
|
"hooks": {},
|
|
1839
|
-
"register":
|
|
1839
|
+
"register": 0
|
|
1840
1840
|
},
|
|
1841
1841
|
"enableBy": "register"
|
|
1842
1842
|
},
|
|
@@ -1849,7 +1849,7 @@
|
|
|
1849
1849
|
"config": {},
|
|
1850
1850
|
"time": {
|
|
1851
1851
|
"hooks": {},
|
|
1852
|
-
"register":
|
|
1852
|
+
"register": 1
|
|
1853
1853
|
},
|
|
1854
1854
|
"enableBy": "register"
|
|
1855
1855
|
},
|
|
@@ -1862,7 +1862,7 @@
|
|
|
1862
1862
|
"config": {},
|
|
1863
1863
|
"time": {
|
|
1864
1864
|
"hooks": {},
|
|
1865
|
-
"register":
|
|
1865
|
+
"register": 0
|
|
1866
1866
|
},
|
|
1867
1867
|
"enableBy": "register"
|
|
1868
1868
|
},
|
|
@@ -1875,7 +1875,7 @@
|
|
|
1875
1875
|
"config": {},
|
|
1876
1876
|
"time": {
|
|
1877
1877
|
"hooks": {},
|
|
1878
|
-
"register":
|
|
1878
|
+
"register": 1
|
|
1879
1879
|
},
|
|
1880
1880
|
"enableBy": "register"
|
|
1881
1881
|
},
|
|
@@ -1888,7 +1888,7 @@
|
|
|
1888
1888
|
"config": {},
|
|
1889
1889
|
"time": {
|
|
1890
1890
|
"hooks": {},
|
|
1891
|
-
"register":
|
|
1891
|
+
"register": 0
|
|
1892
1892
|
},
|
|
1893
1893
|
"enableBy": "register"
|
|
1894
1894
|
},
|
|
@@ -1901,7 +1901,7 @@
|
|
|
1901
1901
|
"config": {},
|
|
1902
1902
|
"time": {
|
|
1903
1903
|
"hooks": {},
|
|
1904
|
-
"register":
|
|
1904
|
+
"register": 1
|
|
1905
1905
|
},
|
|
1906
1906
|
"enableBy": "register"
|
|
1907
1907
|
},
|
|
@@ -1914,7 +1914,7 @@
|
|
|
1914
1914
|
"config": {},
|
|
1915
1915
|
"time": {
|
|
1916
1916
|
"hooks": {},
|
|
1917
|
-
"register":
|
|
1917
|
+
"register": 23
|
|
1918
1918
|
},
|
|
1919
1919
|
"enableBy": "register"
|
|
1920
1920
|
},
|
|
@@ -1966,7 +1966,7 @@
|
|
|
1966
1966
|
"config": {},
|
|
1967
1967
|
"time": {
|
|
1968
1968
|
"hooks": {},
|
|
1969
|
-
"register":
|
|
1969
|
+
"register": 9
|
|
1970
1970
|
},
|
|
1971
1971
|
"enableBy": "register"
|
|
1972
1972
|
}
|
|
@@ -2093,20 +2093,10 @@
|
|
|
2093
2093
|
"parentId": "@@/global-layout",
|
|
2094
2094
|
"file": "system/sysManual/index.jsx",
|
|
2095
2095
|
"absPath": "/system/sysManual",
|
|
2096
|
-
"__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 HttpUtils.post('admin/sysManual/save', values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload()\n })\n }\n\n handleDelete = record => {\n HttpUtils.
|
|
2096
|
+
"__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 HttpUtils.post('admin/sysManual/save', 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='sysManual:save' onClick={() => this.handleEdit(record)}>编辑</Button>\n <Popconfirm perm='sysManual: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='sysManual:save' 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 maskClosable={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",
|
|
2097
2097
|
"__isJSFile": true,
|
|
2098
2098
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/sysManual/index.jsx"
|
|
2099
2099
|
},
|
|
2100
|
-
"system/dict/DictItem": {
|
|
2101
|
-
"path": "system/dict/DictItem",
|
|
2102
|
-
"id": "system/dict/DictItem",
|
|
2103
|
-
"parentId": "@@/global-layout",
|
|
2104
|
-
"file": "system/dict/DictItem.jsx",
|
|
2105
|
-
"absPath": "/system/dict/DictItem",
|
|
2106
|
-
"__content": "import {PlusOutlined} from '@ant-design/icons'\nimport {Button, Col, Form, Input, InputNumber, Modal, Popconfirm, Row, Tag} from 'antd'\nimport React from 'react'\n\nimport {ButtonList, FieldBoolean, HttpUtils, 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 componentDidUpdate(prevProps, prevState, snapshot) {\n if (prevProps.sysDictId !== this.props.sysDictId) {\n this.tableRef.current.reload()\n }\n }\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 values.sysDict = {id: this.props.sysDictId}\n HttpUtils.post('admin/sysDictItem/save', values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload()\n })\n }\n\n handleDelete = row => {\n HttpUtils.get('admin/sysDictItem/delete', row).then(rs => {\n this.tableRef.current.reload()\n })\n }\n\n columns = [\n {\n title: '文本',\n dataIndex: 'text',\n },\n {\n title: '编码',\n dataIndex: 'code',\n },\n\n {\n title: '启用',\n dataIndex: 'enabled',\n render(v) {\n return v ? '是' : '否'\n }\n\n },\n {\n title: '显示颜色',\n dataIndex: 'color',\n render(v) {\n return <Tag color={v}>COLOR</Tag>\n }\n },\n {\n title: '系统内置',\n dataIndex: 'builtin',\n render(v) {\n return v ? '是' : '否'\n }\n\n },\n {\n title: '序号',\n dataIndex: 'seq',\n },\n {\n title: '操作',\n dataIndex: 'option',\n render: (_, record) => {\n\n return (\n <ButtonList>\n <Button size='small' perm='sysDict:save'\n onClick={() => this.handleEdit(record)}> 编辑 </Button>\n <Popconfirm perm='sysDict: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 <>\n <ProTable\n headerTitle='字典项列表'\n actionRef={this.tableRef}\n toolBarRender={() => {\n return <ButtonList>\n <Button perm='sysDictItem:save' type='primary' onClick={this.handleAdd}>\n <PlusOutlined/> 新增\n </Button>\n </ButtonList>\n }}\n request={(params) => {\n params.sysDictId = this.props.sysDictId\n return HttpUtils.get('admin/sysDictItem/page', params);\n }}\n columns={this.columns}\n rowKey='id'\n search={false}\n />\n\n <Modal\n 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 <Row>\n <Col span={12}>\n <Form.Item label='编码' name='code' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n </Col>\n <Col span={12}>\n <Form.Item label='文本' name='text' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n </Col>\n </Row>\n\n <Row>\n <Col span={12}>\n <Form.Item label='颜色' name='color' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n </Col>\n <Col span={12}>\n <Form.Item label='序号' name='seq' rules={[{required: true}]}>\n <InputNumber/>\n </Form.Item>\n </Col>\n </Row>\n\n <Form.Item label='启用' name='enabled' rules={[{required: true}]}>\n <FieldBoolean/>\n </Form.Item>\n\n </Form>\n </Modal>\n </>\n\n\n }\n}\n\n\n\n",
|
|
2107
|
-
"__isJSFile": true,
|
|
2108
|
-
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/dict/DictItem.jsx"
|
|
2109
|
-
},
|
|
2110
2100
|
"system/user/UserPerm": {
|
|
2111
2101
|
"path": "system/user/UserPerm",
|
|
2112
2102
|
"id": "system/user/UserPerm",
|
|
@@ -2143,7 +2133,7 @@
|
|
|
2143
2133
|
"parentId": "@@/global-layout",
|
|
2144
2134
|
"file": "system/dict/index.jsx",
|
|
2145
2135
|
"absPath": "/system/dict",
|
|
2146
|
-
"__content": "import React from \"react\";\nimport
|
|
2136
|
+
"__content": "import React from \"react\";\nimport {Button, Form, Input, InputNumber, Modal, Popconfirm, Splitter, Tag, Tree, Typography} from \"antd\";\nimport {\n ButtonList,\n FieldBoolean, FieldDictSelect,\n HttpUtils,\n Page,\n PageLoading,\n ProTable,\n ViewBooleanEnableDisable\n} from \"../../../framework\";\nimport {PlusOutlined} from \"@ant-design/icons\";\n\nexport default class extends React.Component {\n\n state = {\n treeData: [],\n treeLoading: true,\n typeCode: null,\n formValues: {},\n formOpen: false\n }\n\n formRef = React.createRef()\n tableRef = React.createRef()\n\n async componentDidMount() {\n const treeData = await HttpUtils.get('admin/dict/tree');\n this.setState({treeData, treeLoading: false});\n }\n\n onSelect = (selectedKeys) => {\n const key = selectedKeys.length === 1 ? selectedKeys[0] : null;\n this.setState({typeCode: key}, () => {\n this.tableRef.current.reload()\n })\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 values.sysDict = {id: this.props.sysDictId}\n HttpUtils.post('admin/dict/save', values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload()\n })\n }\n\n handleDelete = row => {\n HttpUtils.post('admin/dict/delete', row).then(rs => {\n this.tableRef.current.reload()\n })\n }\n\n columns = [\n {\n title: '文本',\n dataIndex: 'name',\n },\n {\n title: '编码',\n dataIndex: 'code',\n },\n\n {\n title: '启用',\n dataIndex: 'enabled',\n render(v) {\n return <ViewBooleanEnableDisable value={v}/>\n }\n\n },\n {\n title: '显示颜色',\n dataIndex: 'color',\n render(v) {\n if (v) {\n return <Tag color={v.toLowerCase()}>{v}</Tag>\n }\n\n }\n },\n\n {\n title: '序号',\n dataIndex: 'seq',\n },\n {\n title: '操作',\n dataIndex: 'option',\n render: (_, record) => {\n\n return (\n <ButtonList>\n <Button size='small' perm='sysDict:save'\n onClick={() => this.handleEdit(record)}> 编辑 </Button>\n <Popconfirm perm='sysDict:delete' title='是否确定删除字典项'\n onConfirm={() => this.handleDelete(record)}>\n <Button size='small'>删除</Button>\n </Popconfirm>\n </ButtonList>\n );\n },\n },\n ]\n\n render() {\n if (this.state.treeLoading) {\n return <PageLoading/>\n }\n\n return <Page>\n <Splitter>\n <Splitter.Panel defaultSize={600} style={{paddingRight: 16}}>\n <Tree\n treeData={this.state.treeData}\n onSelect={this.onSelect}\n\n showIcon\n blockNode\n showLine\n defaultExpandAll\n >\n </Tree>\n </Splitter.Panel>\n <Splitter.Panel style={{paddingLeft: 16}}>\n {this.renderTypeInfo()}\n <ProTable\n rowKey='code'\n actionRef={this.tableRef}\n toolBarRender={() => {\n return <ButtonList>\n <Button perm='sysDict:save' type='primary' onClick={this.handleAdd} disabled={!this.state.typeCode}>\n <PlusOutlined/> 新增\n </Button>\n </ButtonList>\n }}\n request={(params) => {\n params.typeCode = this.state.typeCode\n return HttpUtils.get('admin/dict/page', params);\n }}\n columns={this.columns}\n search={false}\n />\n </Splitter.Panel>\n </Splitter>\n <Modal\n 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 <Form.Item label='类型编码' name='typeCode' rules={[{required: true}]} initialValue={this.state.typeCode}>\n <Input/>\n </Form.Item>\n <Form.Item label='编码' name='code' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n <Form.Item label='文本' name='name' rules={[{required: true}]} >\n <Input/>\n </Form.Item>\n <Form.Item label='颜色' name='color' rules={[{required: true}]}>\n <FieldDictSelect typeCode='statusColor' />\n </Form.Item>\n <Form.Item label='序号' name='seq' rules={[{required: true}]}>\n <InputNumber/>\n </Form.Item>\n\n <Form.Item label='启用' name='enabled' rules={[{required: true}]}>\n <FieldBoolean/>\n </Form.Item>\n\n </Form>\n </Modal>\n </Page>\n\n\n }\n\n renderTypeInfo() {\n if(this.state.typeCode){\n return <>\n <Typography.Text italic> 类型:</Typography.Text>\n <Typography.Text copyable>\n {this.state.typeCode}\n </Typography.Text>\n </>;\n }\n }\n}\n",
|
|
2147
2137
|
"__isJSFile": true,
|
|
2148
2138
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/dict/index.jsx"
|
|
2149
2139
|
},
|
|
@@ -2153,7 +2143,7 @@
|
|
|
2153
2143
|
"parentId": "@@/global-layout",
|
|
2154
2144
|
"file": "system/file/index.jsx",
|
|
2155
2145
|
"absPath": "/system/file",
|
|
2156
|
-
"__content": "import {Button, Form, Input, Modal, Popconfirm} from 'antd'\nimport React from 'react'\nimport {ButtonList, FieldDateRange, FieldDictSelect, FieldUploadFile, HttpUtils, ProTable} from \"../../../framework\";\nimport {CloudUploadOutlined} from \"@ant-design/icons\";\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.
|
|
2146
|
+
"__content": "import {Button, Form, Input, Modal, Popconfirm} from 'antd'\nimport React from 'react'\nimport {ButtonList, FieldDateRange, FieldDictSelect, FieldUploadFile, HttpUtils, ProTable} from \"../../../framework\";\nimport {CloudUploadOutlined} from \"@ant-design/icons\";\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={'/admin/sysFile/preview/' + record.id} target='_blank'>预览</a>]\n\n\n if (record.imageUrls?.length > 0) {\n for (let item of record.imageUrls) {\n let url = item.url;\n let 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='sysFile:delete' title='是否确定删除文件信息'\n onConfirm={() => this.handleDelete(record)}>\n <a>删除</a>\n </Popconfirm>\n </ButtonList>\n ),\n },\n ]\n\n render() {\n return <>\n <ProTable\n actionRef={this.tableRef}\n toolBarRender={() => {\n return <Button type='primary' icon={<CloudUploadOutlined/>}\n onClick={() => this.setState({formOpen: true})}>\n 上传文件\n </Button>\n }}\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 </>\n }\n}\n\n\n\n",
|
|
2157
2147
|
"__isJSFile": true,
|
|
2158
2148
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/file/index.jsx"
|
|
2159
2149
|
},
|
|
@@ -2163,7 +2153,7 @@
|
|
|
2163
2153
|
"parentId": "@@/global-layout",
|
|
2164
2154
|
"file": "system/role/index.jsx",
|
|
2165
2155
|
"absPath": "/system/role",
|
|
2166
|
-
"__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/userList', {id: record.id}).then(rs => {\n this.setState({userList: rs.list, targetKeys: rs.selectedKeys})\n })\n }\n\n onFinish = values => {\n HttpUtils.post('admin/sysRole/save', values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload()\n })\n }\n\n handleDelete = record => {\n HttpUtils.
|
|
2156
|
+
"__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/userList', {id: record.id}).then(rs => {\n this.setState({userList: rs.list, targetKeys: rs.selectedKeys})\n })\n }\n\n onFinish = values => {\n HttpUtils.post('admin/sysRole/save', 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='sysRole:manage'\n onClick={() => this.handleEditUser(record)}>用户设置</Button>\n\n <Button size='small' perm='sysRole:manage' disabled={record.builtin}\n onClick={() => PageUtils.open('/system/role/perm?id=' + record.id, '角色权限设置')}>权限设置</Button>\n\n <Button size='small' perm='sysRole:manage' disabled={record.builtin}\n onClick={() => this.handleEdit(record)}>编辑</Button>\n <Popconfirm perm='sysRole:manage' 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/grantUsers', 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 debugger\n this.setState({menuOpen: false})\n })\n }\n\n render() {\n return <Page padding>\n <ProTable\n actionRef={this.tableRef}\n toolBarRender={() => {\n return <ButtonList>\n <Button perm='sysRole:manage' type='primary' onClick={this.handleAdd}>\n <PlusOutlined/> 新增\n </Button>\n </ButtonList>\n }}\n request={(params) => HttpUtils.get('admin/sysRole/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 maskClosable={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 maskClosable={false}\n width={800}\n onCancel={() => this.setState({usersModalOpen: false})}\n onOk={this.handleSaveUsers}\n >\n\n\n <Transfer\n listStyle={{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 maskClosable={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",
|
|
2167
2157
|
"__isJSFile": true,
|
|
2168
2158
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/role/index.jsx"
|
|
2169
2159
|
},
|
|
@@ -2173,7 +2163,7 @@
|
|
|
2173
2163
|
"parentId": "@@/global-layout",
|
|
2174
2164
|
"file": "system/user/index.jsx",
|
|
2175
2165
|
"absPath": "/system/user",
|
|
2176
|
-
"__content": "import {PlusOutlined} from '@ant-design/icons';\nimport {Button, Form, Input, Modal, Popconfirm, Splitter, Tabs} from 'antd';\nimport React from 'react';\nimport {\n ButtonList,\n DictUtils,\n FieldBoolean,\n FieldSysOrgTreeSelect,\n HttpUtils,\n OrgTree,\n Page,\n ProTable,\n RoleTree\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 currentRoleId: null,\n }\n permRef = React.createRef();\n\n formRef = React.createRef()\n tableRef = React.createRef()\n\n resetPwd(row) {\n HttpUtils.post('admin/sysUser/resetPwd', {id: row.id}).then(rs => {\n Modal.success({\n title: '重置密码成功',\n content: rs\n })\n })\n }\n\n handleDelete = r => {\n HttpUtils.
|
|
2166
|
+
"__content": "import {PlusOutlined} from '@ant-design/icons';\nimport {Button, Form, Input, Modal, Popconfirm, Splitter, Tabs} from 'antd';\nimport React from 'react';\nimport {\n ButtonList,\n DictUtils,\n FieldBoolean,\n FieldSysOrgTreeSelect,\n HttpUtils,\n OrgTree,\n Page,\n ProTable,\n RoleTree\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 currentRoleId: null,\n }\n permRef = React.createRef();\n\n formRef = React.createRef()\n tableRef = React.createRef()\n\n resetPwd(row) {\n HttpUtils.post('admin/sysUser/resetPwd', {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 onSelectRole = (key) => {\n this.setState({currentRoleId: 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='sysUser:save' onClick={() => this.handleEdit(record)}> 编辑 </Button>\n\n <Button size='small' perm='sysUser:grantPerm'\n onClick={() => this.permRef.current.show(record)}> 授权 </Button>\n\n <Popconfirm perm='sysUser:resetPwd' title='确认重置密码?' onConfirm={() => this.resetPwd(record)}>\n <Button size='small'>重置密码</Button>\n </Popconfirm>\n\n <Popconfirm perm='sysUser:delete' title={'是否确定删除用户'}\n onConfirm={() => this.handleDelete(record)}>\n <Button size='small'>删除</Button>\n </Popconfirm>\n </ButtonList>;\n },\n },\n ];\n\n onFinish = values => {\n HttpUtils.post('admin/sysUser/save', values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload()\n })\n }\n\n render() {\n\n return <Page>\n <Splitter>\n <Splitter.Panel defaultSize={400}>\n <Tabs\n type='card'\n size='small'\n items={[\n {\n key: 'org',\n label: '按组织机构',\n children: <OrgTree onChange={this.onSelectOrg}/>\n },\n {\n key: 'role',\n label: '按角色',\n children: <RoleTree onSelect={this.onSelectRole}/>\n }\n ]}/>\n\n </Splitter.Panel>\n <Splitter.Panel style={{paddingLeft: 16}}>\n <ProTable\n actionRef={this.tableRef}\n toolBarRender={() => {\n return <ButtonList>\n <Button\n perm='sysUser:save'\n type=\"primary\"\n onClick={this.handleAdd}>\n <PlusOutlined/> 新增\n </Button>\n\n\n </ButtonList>\n }}\n showToolbarSearch\n request={(params) => {\n params.orgId = this.state.currentOrgId\n params.roleId = this.state.currentRoleId\n return HttpUtils.get('admin/sysUser/page', params)\n }\n }\n columns={this.columns}\n >\n\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",
|
|
2177
2167
|
"__isJSFile": true,
|
|
2178
2168
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/user/index.jsx"
|
|
2179
2169
|
},
|
|
@@ -2193,27 +2183,17 @@
|
|
|
2193
2183
|
"parentId": "@@/global-layout",
|
|
2194
2184
|
"file": "system/api/index.jsx",
|
|
2195
2185
|
"absPath": "/system/api",
|
|
2196
|
-
"__content": "import {PlusOutlined} from '@ant-design/icons'\nimport {Button, Form, Input, Modal, Popconfirm, Tabs} from 'antd'\nimport React from 'react'\nimport {\n ButtonList,\n FieldBoolean,\n FieldDate,\n HttpUtils,\n Page,\n PageUtils,\n ProTable,\n StringUtils,\n ViewPassword\n} from \"../../../framework\";\nimport {ApiDoc} from \"./ApiDoc\";\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 HttpUtils.post('admin/apiAccount/save', values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload()\n })\n }\n\n handleDelete = record => {\n HttpUtils.
|
|
2186
|
+
"__content": "import {PlusOutlined} from '@ant-design/icons'\nimport {Button, Form, Input, Modal, Popconfirm, Tabs} from 'antd'\nimport React from 'react'\nimport {\n ButtonList,\n FieldBoolean,\n FieldDate,\n HttpUtils,\n Page,\n PageUtils,\n ProTable,\n StringUtils,\n ViewPassword\n} from \"../../../framework\";\nimport {ApiDoc} from \"./ApiDoc\";\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 HttpUtils.post('admin/apiAccount/save', values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload()\n })\n }\n\n handleDelete = record => {\n HttpUtils.post('admin/apiAccount/delete', {id: record.id}).then(rs => {\n this.tableRef.current.reload()\n })\n }\n\n columns = [\n {\n title: '名称',\n dataIndex: 'name',\n },\n {\n title: 'appId',\n dataIndex: 'appId',\n },\n\n {\n title: 'appSecret',\n dataIndex: 'appSecret',\n render(v) {\n return <ViewPassword value={v}></ViewPassword>;\n }\n },\n {\n title: '准入IP',\n dataIndex: 'accessIp',\n },\n {\n title: '有效期',\n dataIndex: 'endTime',\n },\n {\n title: '启用',\n dataIndex: 'enable',\n render(v) {\n return v == null ? null : (v ? '是' : '否')\n },\n },\n {\n title: '操作',\n dataIndex: 'option',\n render: (_, record) => (\n <ButtonList>\n <Button size='small' perm='api'\n onClick={() => PageUtils.open('/system/api/perm?accountId=' + record.id, '账户权限')}\n type='primary'>权限</Button>\n <Button size='small' perm='api' onClick={() => this.handleEdit(record)}>编辑</Button>\n <Popconfirm perm='api' title='是否确定删除接口访客' onConfirm={() => this.handleDelete(record)}>\n <Button size='small'>删除</Button>\n </Popconfirm>\n </ButtonList>\n ),\n },\n ]\n\n randomAppSecret = () => {\n const appSecret = StringUtils.random(32)\n this.formRef.current.setFieldsValue({appSecret})\n }\n\n render() {\n return <Page padding>\n <Tabs items={[\n\n {\n label: '接口列表',\n key: '2',\n children: <ProTable\n rowKey='action'\n columns={[\n {dataIndex: 'name', title: '名称'},\n {dataIndex: 'action', title: '动作'},\n {dataIndex: 'desc', title: '描述'},\n\n ]}\n request={(params,) => HttpUtils.get('admin/api/resource/page', params)}\n />\n },\n\n {\n label: '账号列表',\n key: '1',\n children: <ProTable\n actionRef={this.tableRef}\n toolBarRender={() => {\n return <ButtonList>\n <Button perm='api' type='primary' onClick={this.handleAdd}>\n <PlusOutlined/> 新增\n </Button>\n </ButtonList>\n }}\n request={(params) => HttpUtils.get('admin/apiAccount/page', params)}\n columns={this.columns}\n />\n }, {\n label: '接口文档',\n key: '3',\n children: <ApiDoc/>\n },\n {\n label: '访问记录',\n key: '4',\n children: <ProTable\n request={(params) => HttpUtils.get('admin/apiAccessLog/page', params)}\n columns={[\n\n {\n title: '接口名称',\n dataIndex: 'name',\n\n\n },\n\n {\n title: '接口',\n dataIndex: 'action',\n\n\n },\n\n {\n title: 'requestId',\n dataIndex: 'requestId',\n\n },\n\n {\n title: '请求数据',\n dataIndex: 'requestData',\n\n\n },\n\n {\n title: '响应数据',\n dataIndex: 'responseData',\n\n\n },\n\n {\n title: 'ip',\n dataIndex: 'ip',\n\n\n },\n\n {\n title: 'ipLocation',\n dataIndex: 'ipLocation',\n\n\n },\n\n {\n title: '执行时间',\n dataIndex: 'executionTime',\n\n\n },\n\n {\n title: '接口账户',\n dataIndex: 'accountName',\n\n\n },\n\n\n ]}\n />\n },\n\n ]}>\n\n </Tabs>\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 maskClosable={false}\n >\n\n <Form ref={this.formRef} labelCol={{flex: '100px'}}\n initialValues={this.state.formValues}\n onFinish={this.onFinish}\n\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\n <Form.Item label='appId' name='appId'>\n <Input placeholder='多个用逗号分隔'/>\n </Form.Item>\n <Form.Item label='appSecret' name='appSecret' rules={[{required: true}, {len: 32}]}\n help={<Button size='small' type='link' onClick={this.randomAppSecret}>随机生成</Button>}\n >\n <Input/>\n </Form.Item>\n\n <Form.Item label='准入IP' name='accessIp'>\n <Input placeholder='多个用逗号分隔'/>\n </Form.Item>\n <Form.Item label='有效期' name='endTime' style={{marginTop: 32}}>\n <FieldDate type='YYYY-MM-DD'/>\n </Form.Item>\n <Form.Item label='启用' name='enable' rules={[{required: true}]}>\n <FieldBoolean/>\n </Form.Item>\n\n </Form>\n </Modal>\n </Page>\n\n\n }\n}\n\n",
|
|
2197
2187
|
"__isJSFile": true,
|
|
2198
2188
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/api/index.jsx"
|
|
2199
2189
|
},
|
|
2200
|
-
"system/dict/Dict": {
|
|
2201
|
-
"path": "system/dict/Dict",
|
|
2202
|
-
"id": "system/dict/Dict",
|
|
2203
|
-
"parentId": "@@/global-layout",
|
|
2204
|
-
"file": "system/dict/Dict.jsx",
|
|
2205
|
-
"absPath": "/system/dict/Dict",
|
|
2206
|
-
"__content": "import React from 'react'\nimport {HttpUtils, ProTable} from \"../../../framework\";\n\n\nexport default class extends React.Component {\n\n state = {\n formValues: {},\n formOpen: false,\n selectedRowKeys: []\n }\n\n formRef = React.createRef()\n tableRef = React.createRef()\n\n columns = [\n\n\n {\n title: '编码',\n dataIndex: 'code',\n\n\n },\n {\n title: '文本',\n dataIndex: 'text',\n },\n\n\n ]\n\n\n render() {\n return <>\n <ProTable\n actionRef={this.tableRef}\n\n request={(params) => HttpUtils.get('admin/sysDict/page', params)}\n columns={this.columns}\n rowKey='id'\n\n rowSelection={{\n type: 'radio',\n selectedRowKeys: this.state.selectedRowKeys,\n onChange: (selectedRowKeys, selectedRows) => {\n this.setState({selectedRowKeys: selectedRowKeys})\n this.props.onChange(selectedRowKeys[0])\n }\n }}\n onRow={(record) => ({\n onClick: () => {\n this.setState({selectedRowKeys: [record.id]})\n this.props.onChange(record.id)\n }\n })}\n />\n\n\n </>\n\n\n }\n}\n\n\n\n",
|
|
2207
|
-
"__isJSFile": true,
|
|
2208
|
-
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/dict/Dict.jsx"
|
|
2209
|
-
},
|
|
2210
2190
|
"system/job/index": {
|
|
2211
2191
|
"path": "system/job",
|
|
2212
2192
|
"id": "system/job/index",
|
|
2213
2193
|
"parentId": "@@/global-layout",
|
|
2214
2194
|
"file": "system/job/index.jsx",
|
|
2215
2195
|
"absPath": "/system/job",
|
|
2216
|
-
"__content": "import {\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 React from 'react'\nimport {PlusOutlined} from \"@ant-design/icons\";\nimport {ButtonList, HttpUtils, Page, ProTable, StringUtils, 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/jobClassOptions').then(rs => {\n this.setState({jobClassOptions: rs})\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/getJobParamFields\", jobData || {}, {className}).then(rs => {\n this.setState({paramList: rs})\n })\n }\n\n onFinish = (values) => {\n HttpUtils.post('admin/job/save', values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload();\n })\n }\n\n handleDelete = row => {\n const hide = message.loading(\"删除作业中...\")\n HttpUtils.get('admin/job/delete', {id: row.id}).then(rs => {\n this.tableRef.current.reload();\n }).catch(hide)\n }\n\n handleTriggerJob = row => {\n HttpUtils.get('admin/job/triggerJob', {id: row.id}).then(rs => {\n this.tableRef.current.reload();\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' onClick={() => this.handleTriggerJob(record)}>执行一次</Button>\n <Button size='small' onClick={() => this.handleEdit(record)}> 编辑 </Button>\n <Popconfirm 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 })\n };\n\n showExecuteRecord(record) {\n this.setState({executeRecordOpen: true, formValues: record})\n }\n\n\n render() {\n return <Page padding>\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 message={<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 let url = '/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/executeRecord', 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 let {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",
|
|
2196
|
+
"__content": "import {\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 React from 'react'\nimport {PlusOutlined} from \"@ant-design/icons\";\nimport {ButtonList, HttpUtils, Page, ProTable, StringUtils, 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/jobClassOptions').then(rs => {\n this.setState({jobClassOptions: rs})\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/getJobParamFields\", jobData || {}, {className}).then(rs => {\n this.setState({paramList: rs})\n })\n }\n\n onFinish = (values) => {\n HttpUtils.post('admin/job/save', values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload();\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(hide)\n }\n\n handleTriggerJob = row => {\n HttpUtils.get('admin/job/triggerJob', {id: row.id}).then(rs => {\n this.tableRef.current.reload();\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' onClick={() => this.handleTriggerJob(record)}>执行一次</Button>\n <Button size='small' onClick={() => this.handleEdit(record)}> 编辑 </Button>\n <Popconfirm 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 })\n };\n\n showExecuteRecord(record) {\n this.setState({executeRecordOpen: true, formValues: record})\n }\n\n\n render() {\n return <Page padding>\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 message={<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 let url = '/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/executeRecord', 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 let {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",
|
|
2217
2197
|
"__isJSFile": true,
|
|
2218
2198
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/job/index.jsx"
|
|
2219
2199
|
},
|
|
@@ -2233,7 +2213,7 @@
|
|
|
2233
2213
|
"parentId": "@@/global-layout",
|
|
2234
2214
|
"file": "system/org/index.jsx",
|
|
2235
2215
|
"absPath": "/system/org",
|
|
2236
|
-
"__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 let treeData = rs;\n this.setState({treeData})\n }).finally(() => {\n this.setState({treeLoading: false});\n })\n }\n\n handleDelete = record => {\n HttpUtils.
|
|
2216
|
+
"__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 let 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 HttpUtils.post('admin/sysOrg/save', 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 let {formValues} = this.state;\n let disabled = formValues == null;\n let params = this.state.params;\n return <Page padding>\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 console.log(dragNode.title, '->', node.title, 'dropToGap:', dropToGap, \"dropPosition:\", dropPosition)\n HttpUtils.post('admin/sysOrg/sort', {dropPosition, dropToGap, dropKey, dragKey}).then(this.loadTree)\n };\n}\n\n\n\n",
|
|
2237
2217
|
"__isJSFile": true,
|
|
2238
2218
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/org/index.jsx"
|
|
2239
2219
|
},
|
|
@@ -2267,16 +2247,6 @@
|
|
|
2267
2247
|
"__isJSFile": true,
|
|
2268
2248
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/api/perm.jsx"
|
|
2269
2249
|
},
|
|
2270
|
-
"ureport/index": {
|
|
2271
|
-
"path": "ureport",
|
|
2272
|
-
"id": "ureport/index",
|
|
2273
|
-
"parentId": "@@/global-layout",
|
|
2274
|
-
"file": "ureport/index.jsx",
|
|
2275
|
-
"absPath": "/ureport",
|
|
2276
|
-
"__content": "import React from 'react'\nimport {Button} from \"antd\";\n\nexport default class extends React.Component {\n\n render() {\n return <div style={{display: 'flex', alignItems: 'center', justifyContent: 'center'}}>\n <Button type='primary' href='/ureport/designer'>打开设计器</Button>\n </div>\n }\n\n\n}\n\n\n\n",
|
|
2277
|
-
"__isJSFile": true,
|
|
2278
|
-
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/ureport/index.jsx"
|
|
2279
|
-
},
|
|
2280
2250
|
"test/views": {
|
|
2281
2251
|
"path": "test/views",
|
|
2282
2252
|
"id": "test/views",
|