@jiangood/open-admin 2.0.0 → 2.2.4
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/config/config.js +9 -22
- package/package.json +5 -1
- package/src/.umi-production/appData.json +67 -108
- package/src/.umi-production/core/route.tsx +1 -2
- package/src/.umi-production/umi.ts +2 -2
- package/src/framework/components/Gap/index.tsx +37 -41
- package/src/framework/components/Page/index.less +1 -1
- package/src/framework/components/Page/index.tsx +19 -22
- package/src/framework/components/ViewRange/index.tsx +12 -17
- package/src/framework/components/system/ButtonList.tsx +12 -32
- package/src/framework/fields/FieldEditor/index.tsx +3 -2
- package/src/framework/fields/FieldUploadFile/index.tsx +8 -4
- package/src/framework/utils/MessageUtils.tsx +21 -99
- package/src/framework/utils/system/HttpUtils.ts +2 -1
- package/src/framework/utils/system/SysUtils.ts +8 -0
- package/src/layouts/PageRender.d.ts +2 -17
- package/src/layouts/PageRender.jsx +14 -76
- package/src/layouts/admin/TabPageRender.jsx +138 -158
- package/src/layouts/admin/index.jsx +120 -17
- package/src/layouts/admin/index.less +123 -5
- package/src/layouts/index.jsx +78 -161
- package/src/loading.jsx +17 -16
- package/src/pages/404.jsx +7 -5
- package/src/pages/about.jsx +3 -3
- package/src/pages/index.jsx +4 -5
- package/src/pages/login.jsx +16 -9
- package/src/pages/login.less +0 -1
- package/src/pages/system/dict/index.jsx +7 -10
- package/src/pages/system/file/index.jsx +5 -5
- package/src/pages/system/job/index.jsx +9 -7
- package/src/pages/system/log/index.jsx +4 -5
- package/src/pages/system/manual/index.jsx +6 -4
- package/src/pages/system/org/index.jsx +4 -2
- package/src/pages/system/role/index.jsx +9 -7
- package/src/pages/system/role/perm.jsx +3 -4
- package/src/pages/system/user/index.jsx +8 -6
- package/src/pages/userCenter/index.jsx +1 -1
- package/src/pages/userCenter/message.jsx +4 -2
- package/src/pages/system/api/index.jsx +0 -279
|
@@ -24,6 +24,10 @@
|
|
|
24
24
|
"umi": "^4.0.0"
|
|
25
25
|
},
|
|
26
26
|
"name": "@jiangood/open-admin",
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "https://github.com/jiangood/open-admin"
|
|
30
|
+
},
|
|
27
31
|
"description": "open-admin",
|
|
28
32
|
"files": [
|
|
29
33
|
"src/*",
|
|
@@ -36,7 +40,7 @@
|
|
|
36
40
|
"dev": "umi dev",
|
|
37
41
|
"build": "umi build"
|
|
38
42
|
},
|
|
39
|
-
"version": "2.
|
|
43
|
+
"version": "2.2.4"
|
|
40
44
|
},
|
|
41
45
|
"pkgPath": "/home/runner/work/open-admin/open-admin/web/package.json",
|
|
42
46
|
"plugins": {
|
|
@@ -49,7 +53,7 @@
|
|
|
49
53
|
"config": {},
|
|
50
54
|
"time": {
|
|
51
55
|
"hooks": {},
|
|
52
|
-
"register":
|
|
56
|
+
"register": 1
|
|
53
57
|
},
|
|
54
58
|
"enableBy": "register"
|
|
55
59
|
},
|
|
@@ -93,7 +97,7 @@
|
|
|
93
97
|
"time": {
|
|
94
98
|
"hooks": {
|
|
95
99
|
"onStart": [
|
|
96
|
-
|
|
100
|
+
1
|
|
97
101
|
]
|
|
98
102
|
},
|
|
99
103
|
"register": 2
|
|
@@ -140,10 +144,10 @@
|
|
|
140
144
|
"time": {
|
|
141
145
|
"hooks": {
|
|
142
146
|
"modifyAppData": [
|
|
143
|
-
|
|
147
|
+
58
|
|
144
148
|
]
|
|
145
149
|
},
|
|
146
|
-
"register":
|
|
150
|
+
"register": 22
|
|
147
151
|
},
|
|
148
152
|
"enableBy": "register"
|
|
149
153
|
},
|
|
@@ -206,7 +210,7 @@
|
|
|
206
210
|
"config": {},
|
|
207
211
|
"time": {
|
|
208
212
|
"hooks": {},
|
|
209
|
-
"register":
|
|
213
|
+
"register": 0
|
|
210
214
|
},
|
|
211
215
|
"enableBy": "config"
|
|
212
216
|
},
|
|
@@ -223,7 +227,7 @@
|
|
|
223
227
|
0
|
|
224
228
|
]
|
|
225
229
|
},
|
|
226
|
-
"register":
|
|
230
|
+
"register": 6
|
|
227
231
|
},
|
|
228
232
|
"enableBy": "register"
|
|
229
233
|
},
|
|
@@ -1075,7 +1079,7 @@
|
|
|
1075
1079
|
"config": {},
|
|
1076
1080
|
"time": {
|
|
1077
1081
|
"hooks": {},
|
|
1078
|
-
"register":
|
|
1082
|
+
"register": 0
|
|
1079
1083
|
},
|
|
1080
1084
|
"enableBy": "config"
|
|
1081
1085
|
},
|
|
@@ -1089,7 +1093,7 @@
|
|
|
1089
1093
|
"time": {
|
|
1090
1094
|
"hooks": {
|
|
1091
1095
|
"onStart": [
|
|
1092
|
-
|
|
1096
|
+
0
|
|
1093
1097
|
]
|
|
1094
1098
|
},
|
|
1095
1099
|
"register": 1
|
|
@@ -1118,7 +1122,7 @@
|
|
|
1118
1122
|
"config": {},
|
|
1119
1123
|
"time": {
|
|
1120
1124
|
"hooks": {},
|
|
1121
|
-
"register":
|
|
1125
|
+
"register": 95
|
|
1122
1126
|
},
|
|
1123
1127
|
"enableBy": "register"
|
|
1124
1128
|
},
|
|
@@ -1131,7 +1135,7 @@
|
|
|
1131
1135
|
"config": {},
|
|
1132
1136
|
"time": {
|
|
1133
1137
|
"hooks": {},
|
|
1134
|
-
"register":
|
|
1138
|
+
"register": 30
|
|
1135
1139
|
},
|
|
1136
1140
|
"enableBy": "config"
|
|
1137
1141
|
},
|
|
@@ -1161,7 +1165,7 @@
|
|
|
1161
1165
|
0
|
|
1162
1166
|
]
|
|
1163
1167
|
},
|
|
1164
|
-
"register":
|
|
1168
|
+
"register": 0
|
|
1165
1169
|
},
|
|
1166
1170
|
"enableBy": "register"
|
|
1167
1171
|
},
|
|
@@ -1174,7 +1178,7 @@
|
|
|
1174
1178
|
"config": {},
|
|
1175
1179
|
"time": {
|
|
1176
1180
|
"hooks": {},
|
|
1177
|
-
"register":
|
|
1181
|
+
"register": 1
|
|
1178
1182
|
},
|
|
1179
1183
|
"enableBy": "register"
|
|
1180
1184
|
},
|
|
@@ -1200,7 +1204,7 @@
|
|
|
1200
1204
|
"config": {},
|
|
1201
1205
|
"time": {
|
|
1202
1206
|
"hooks": {},
|
|
1203
|
-
"register":
|
|
1207
|
+
"register": 30
|
|
1204
1208
|
}
|
|
1205
1209
|
},
|
|
1206
1210
|
"./node_modules/@umijs/preset-umi/dist/features/mpa/mpa": {
|
|
@@ -1225,7 +1229,7 @@
|
|
|
1225
1229
|
"config": {},
|
|
1226
1230
|
"time": {
|
|
1227
1231
|
"hooks": {},
|
|
1228
|
-
"register":
|
|
1232
|
+
"register": 0
|
|
1229
1233
|
}
|
|
1230
1234
|
},
|
|
1231
1235
|
"./node_modules/@umijs/preset-umi/dist/features/overrides/overrides": {
|
|
@@ -1237,7 +1241,7 @@
|
|
|
1237
1241
|
"config": {},
|
|
1238
1242
|
"time": {
|
|
1239
1243
|
"hooks": {},
|
|
1240
|
-
"register":
|
|
1244
|
+
"register": 1
|
|
1241
1245
|
},
|
|
1242
1246
|
"enableBy": "register"
|
|
1243
1247
|
},
|
|
@@ -1250,7 +1254,7 @@
|
|
|
1250
1254
|
"config": {},
|
|
1251
1255
|
"time": {
|
|
1252
1256
|
"hooks": {},
|
|
1253
|
-
"register":
|
|
1257
|
+
"register": 0
|
|
1254
1258
|
},
|
|
1255
1259
|
"enableBy": "config"
|
|
1256
1260
|
},
|
|
@@ -1267,7 +1271,7 @@
|
|
|
1267
1271
|
0
|
|
1268
1272
|
]
|
|
1269
1273
|
},
|
|
1270
|
-
"register":
|
|
1274
|
+
"register": 2
|
|
1271
1275
|
}
|
|
1272
1276
|
},
|
|
1273
1277
|
"./node_modules/@umijs/preset-umi/dist/features/polyfill/publicPathPolyfill": {
|
|
@@ -1434,7 +1438,7 @@
|
|
|
1434
1438
|
"config": {},
|
|
1435
1439
|
"time": {
|
|
1436
1440
|
"hooks": {},
|
|
1437
|
-
"register":
|
|
1441
|
+
"register": 1
|
|
1438
1442
|
},
|
|
1439
1443
|
"enableBy": "config"
|
|
1440
1444
|
},
|
|
@@ -1459,7 +1463,7 @@
|
|
|
1459
1463
|
"config": {},
|
|
1460
1464
|
"time": {
|
|
1461
1465
|
"hooks": {},
|
|
1462
|
-
"register":
|
|
1466
|
+
"register": 22
|
|
1463
1467
|
},
|
|
1464
1468
|
"enableBy": "config"
|
|
1465
1469
|
},
|
|
@@ -1472,7 +1476,7 @@
|
|
|
1472
1476
|
"config": {},
|
|
1473
1477
|
"time": {
|
|
1474
1478
|
"hooks": {},
|
|
1475
|
-
"register":
|
|
1479
|
+
"register": 0
|
|
1476
1480
|
}
|
|
1477
1481
|
},
|
|
1478
1482
|
"./node_modules/@umijs/preset-umi/dist/features/clickToComponent/clickToComponent": {
|
|
@@ -1551,7 +1555,7 @@
|
|
|
1551
1555
|
"config": {},
|
|
1552
1556
|
"time": {
|
|
1553
1557
|
"hooks": {},
|
|
1554
|
-
"register":
|
|
1558
|
+
"register": 2
|
|
1555
1559
|
}
|
|
1556
1560
|
},
|
|
1557
1561
|
"./node_modules/@umijs/preset-umi/dist/features/mako/mako": {
|
|
@@ -1563,7 +1567,7 @@
|
|
|
1563
1567
|
"config": {},
|
|
1564
1568
|
"time": {
|
|
1565
1569
|
"hooks": {},
|
|
1566
|
-
"register":
|
|
1570
|
+
"register": 1
|
|
1567
1571
|
},
|
|
1568
1572
|
"enableBy": "config"
|
|
1569
1573
|
},
|
|
@@ -1576,7 +1580,7 @@
|
|
|
1576
1580
|
"config": {},
|
|
1577
1581
|
"time": {
|
|
1578
1582
|
"hooks": {},
|
|
1579
|
-
"register":
|
|
1583
|
+
"register": 0
|
|
1580
1584
|
}
|
|
1581
1585
|
},
|
|
1582
1586
|
"./node_modules/@umijs/preset-umi/dist/features/hmrGuardian/hmrGuardian": {
|
|
@@ -1600,7 +1604,7 @@
|
|
|
1600
1604
|
"config": {},
|
|
1601
1605
|
"time": {
|
|
1602
1606
|
"hooks": {},
|
|
1603
|
-
"register":
|
|
1607
|
+
"register": 26
|
|
1604
1608
|
}
|
|
1605
1609
|
},
|
|
1606
1610
|
"./node_modules/@umijs/preset-umi/dist/features/forget/forget": {
|
|
@@ -1638,7 +1642,7 @@
|
|
|
1638
1642
|
"config": {},
|
|
1639
1643
|
"time": {
|
|
1640
1644
|
"hooks": {},
|
|
1641
|
-
"register":
|
|
1645
|
+
"register": 4
|
|
1642
1646
|
},
|
|
1643
1647
|
"enableBy": "register"
|
|
1644
1648
|
},
|
|
@@ -1651,7 +1655,7 @@
|
|
|
1651
1655
|
"config": {},
|
|
1652
1656
|
"time": {
|
|
1653
1657
|
"hooks": {},
|
|
1654
|
-
"register":
|
|
1658
|
+
"register": 42
|
|
1655
1659
|
},
|
|
1656
1660
|
"enableBy": "register"
|
|
1657
1661
|
},
|
|
@@ -1676,7 +1680,7 @@
|
|
|
1676
1680
|
"config": {},
|
|
1677
1681
|
"time": {
|
|
1678
1682
|
"hooks": {},
|
|
1679
|
-
"register":
|
|
1683
|
+
"register": 1
|
|
1680
1684
|
},
|
|
1681
1685
|
"enableBy": "register"
|
|
1682
1686
|
},
|
|
@@ -1702,7 +1706,7 @@
|
|
|
1702
1706
|
"config": {},
|
|
1703
1707
|
"time": {
|
|
1704
1708
|
"hooks": {},
|
|
1705
|
-
"register":
|
|
1709
|
+
"register": 0
|
|
1706
1710
|
},
|
|
1707
1711
|
"enableBy": "register"
|
|
1708
1712
|
},
|
|
@@ -1715,7 +1719,7 @@
|
|
|
1715
1719
|
"config": {},
|
|
1716
1720
|
"time": {
|
|
1717
1721
|
"hooks": {},
|
|
1718
|
-
"register":
|
|
1722
|
+
"register": 1
|
|
1719
1723
|
},
|
|
1720
1724
|
"enableBy": "register"
|
|
1721
1725
|
},
|
|
@@ -1728,7 +1732,7 @@
|
|
|
1728
1732
|
"config": {},
|
|
1729
1733
|
"time": {
|
|
1730
1734
|
"hooks": {},
|
|
1731
|
-
"register":
|
|
1735
|
+
"register": 0
|
|
1732
1736
|
},
|
|
1733
1737
|
"enableBy": "register"
|
|
1734
1738
|
},
|
|
@@ -1741,7 +1745,7 @@
|
|
|
1741
1745
|
"config": {},
|
|
1742
1746
|
"time": {
|
|
1743
1747
|
"hooks": {},
|
|
1744
|
-
"register":
|
|
1748
|
+
"register": 2
|
|
1745
1749
|
},
|
|
1746
1750
|
"enableBy": "register"
|
|
1747
1751
|
},
|
|
@@ -1884,7 +1888,7 @@
|
|
|
1884
1888
|
"config": {},
|
|
1885
1889
|
"time": {
|
|
1886
1890
|
"hooks": {},
|
|
1887
|
-
"register":
|
|
1891
|
+
"register": 1
|
|
1888
1892
|
},
|
|
1889
1893
|
"enableBy": "register"
|
|
1890
1894
|
},
|
|
@@ -1897,7 +1901,7 @@
|
|
|
1897
1901
|
"config": {},
|
|
1898
1902
|
"time": {
|
|
1899
1903
|
"hooks": {},
|
|
1900
|
-
"register":
|
|
1904
|
+
"register": 1
|
|
1901
1905
|
},
|
|
1902
1906
|
"enableBy": "register"
|
|
1903
1907
|
},
|
|
@@ -1936,7 +1940,7 @@
|
|
|
1936
1940
|
"config": {},
|
|
1937
1941
|
"time": {
|
|
1938
1942
|
"hooks": {},
|
|
1939
|
-
"register":
|
|
1943
|
+
"register": 1
|
|
1940
1944
|
},
|
|
1941
1945
|
"enableBy": "register"
|
|
1942
1946
|
},
|
|
@@ -1949,7 +1953,7 @@
|
|
|
1949
1953
|
"config": {},
|
|
1950
1954
|
"time": {
|
|
1951
1955
|
"hooks": {},
|
|
1952
|
-
"register":
|
|
1956
|
+
"register": 1
|
|
1953
1957
|
},
|
|
1954
1958
|
"enableBy": "register"
|
|
1955
1959
|
},
|
|
@@ -1962,7 +1966,7 @@
|
|
|
1962
1966
|
"config": {},
|
|
1963
1967
|
"time": {
|
|
1964
1968
|
"hooks": {},
|
|
1965
|
-
"register":
|
|
1969
|
+
"register": 6
|
|
1966
1970
|
},
|
|
1967
1971
|
"enableBy": "register"
|
|
1968
1972
|
}
|
|
@@ -1973,6 +1977,10 @@
|
|
|
1973
1977
|
"_": []
|
|
1974
1978
|
},
|
|
1975
1979
|
"userConfig": {
|
|
1980
|
+
"define": {
|
|
1981
|
+
"SERVLET_CONTEXT": "/change-this-servlet-context"
|
|
1982
|
+
},
|
|
1983
|
+
"publicPath": "./",
|
|
1976
1984
|
"hash": true,
|
|
1977
1985
|
"history": {
|
|
1978
1986
|
"type": "hash"
|
|
@@ -1983,30 +1991,9 @@
|
|
|
1983
1991
|
"./config/common-plugin"
|
|
1984
1992
|
],
|
|
1985
1993
|
"proxy": {
|
|
1986
|
-
"/
|
|
1987
|
-
"target": "http://127.0.0.1:8080",
|
|
1988
|
-
"changeOrigin": true
|
|
1989
|
-
},
|
|
1990
|
-
"/preview": {
|
|
1991
|
-
"target": "http://127.0.0.1:8080",
|
|
1992
|
-
"changeOrigin": true
|
|
1993
|
-
},
|
|
1994
|
-
"/ureport": {
|
|
1995
|
-
"target": "http://127.0.0.1:8080",
|
|
1996
|
-
"changeOrigin": true
|
|
1997
|
-
},
|
|
1998
|
-
"/swagger-ui": {
|
|
1994
|
+
"/change-this-servlet-context": {
|
|
1999
1995
|
"target": "http://127.0.0.1:8080",
|
|
2000
1996
|
"changeOrigin": true
|
|
2001
|
-
},
|
|
2002
|
-
"/v3/api-docs": {
|
|
2003
|
-
"target": "http://127.0.0.1:8080",
|
|
2004
|
-
"changeOrigin": true
|
|
2005
|
-
},
|
|
2006
|
-
"/admin/ws": {
|
|
2007
|
-
"target": "ws://127.0.0.1:8080",
|
|
2008
|
-
"changeOrigin": true,
|
|
2009
|
-
"ws": true
|
|
2010
1997
|
}
|
|
2011
1998
|
}
|
|
2012
1999
|
},
|
|
@@ -2021,7 +2008,7 @@
|
|
|
2021
2008
|
},
|
|
2022
2009
|
"base": "/",
|
|
2023
2010
|
"svgr": {},
|
|
2024
|
-
"publicPath": "
|
|
2011
|
+
"publicPath": "./",
|
|
2025
2012
|
"mfsu": false,
|
|
2026
2013
|
"ignoreMomentLocale": true,
|
|
2027
2014
|
"externals": {},
|
|
@@ -2036,36 +2023,18 @@
|
|
|
2036
2023
|
"@@": "/home/runner/work/open-admin/open-admin/web/src/.umi-production",
|
|
2037
2024
|
"regenerator-runtime": "/home/runner/work/open-admin/open-admin/web/node_modules/regenerator-runtime"
|
|
2038
2025
|
},
|
|
2026
|
+
"define": {
|
|
2027
|
+
"SERVLET_CONTEXT": "/change-this-servlet-context"
|
|
2028
|
+
},
|
|
2039
2029
|
"hash": true,
|
|
2040
2030
|
"esbuildMinifyIIFE": true,
|
|
2041
2031
|
"plugins": [
|
|
2042
2032
|
"./config/common-plugin"
|
|
2043
2033
|
],
|
|
2044
2034
|
"proxy": {
|
|
2045
|
-
"/
|
|
2046
|
-
"target": "http://127.0.0.1:8080",
|
|
2047
|
-
"changeOrigin": true
|
|
2048
|
-
},
|
|
2049
|
-
"/preview": {
|
|
2050
|
-
"target": "http://127.0.0.1:8080",
|
|
2051
|
-
"changeOrigin": true
|
|
2052
|
-
},
|
|
2053
|
-
"/ureport": {
|
|
2035
|
+
"/change-this-servlet-context": {
|
|
2054
2036
|
"target": "http://127.0.0.1:8080",
|
|
2055
2037
|
"changeOrigin": true
|
|
2056
|
-
},
|
|
2057
|
-
"/swagger-ui": {
|
|
2058
|
-
"target": "http://127.0.0.1:8080",
|
|
2059
|
-
"changeOrigin": true
|
|
2060
|
-
},
|
|
2061
|
-
"/v3/api-docs": {
|
|
2062
|
-
"target": "http://127.0.0.1:8080",
|
|
2063
|
-
"changeOrigin": true
|
|
2064
|
-
},
|
|
2065
|
-
"/admin/ws": {
|
|
2066
|
-
"target": "ws://127.0.0.1:8080",
|
|
2067
|
-
"changeOrigin": true,
|
|
2068
|
-
"ws": true
|
|
2069
2038
|
}
|
|
2070
2039
|
},
|
|
2071
2040
|
"targets": {
|
|
@@ -2079,7 +2048,7 @@
|
|
|
2079
2048
|
"parentId": "@@/global-layout",
|
|
2080
2049
|
"file": "404.jsx",
|
|
2081
2050
|
"absPath": "/*",
|
|
2082
|
-
"__content": "import React from \"react\";\nimport {Result} from \"antd\";\n\nexport default class extends React.Component {\n\n render() {\n return <Result\n
|
|
2051
|
+
"__content": "import React from \"react\";\nimport {Result} from \"antd\";\nimport {Page} from \"../framework\";\n\nexport default class extends React.Component {\n\n render() {\n return <Page>\n <Result\n status={404}\n title='页面不存在'\n />\n </Page>\n }\n}\n",
|
|
2083
2052
|
"__isJSFile": true,
|
|
2084
2053
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/404.jsx"
|
|
2085
2054
|
},
|
|
@@ -2109,7 +2078,7 @@
|
|
|
2109
2078
|
"parentId": "@@/global-layout",
|
|
2110
2079
|
"file": "system/manual/index.jsx",
|
|
2111
2080
|
"absPath": "/system/manual",
|
|
2112
|
-
"__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
|
|
2081
|
+
"__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 destroyOnClose\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",
|
|
2113
2082
|
"__isJSFile": true,
|
|
2114
2083
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/manual/index.jsx"
|
|
2115
2084
|
},
|
|
@@ -2119,7 +2088,7 @@
|
|
|
2119
2088
|
"parentId": "@@/global-layout",
|
|
2120
2089
|
"file": "userCenter/message.jsx",
|
|
2121
2090
|
"absPath": "/userCenter/message",
|
|
2122
|
-
"__content": "import React from \"react\";\nimport {Button, Card, Tabs, Tag} from \"antd\";\nimport {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 <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 }\n}\n",
|
|
2091
|
+
"__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",
|
|
2123
2092
|
"__isJSFile": true,
|
|
2124
2093
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/userCenter/message.jsx"
|
|
2125
2094
|
},
|
|
@@ -2129,7 +2098,7 @@
|
|
|
2129
2098
|
"parentId": "@@/global-layout",
|
|
2130
2099
|
"file": "system/dict/index.jsx",
|
|
2131
2100
|
"absPath": "/system/dict",
|
|
2132
|
-
"__content": "import React from \"react\";\nimport {Button, Form, Input, InputNumber, Modal, Popconfirm, Splitter, Tag, Tree, Typography} from \"antd\";\nimport {PlusOutlined} from \"@ant-design/icons\";\n\nimport {\n ButtonList,\n FieldBoolean, FieldDictSelect, FieldRemoteSelect,\n HttpUtils,\n Page,\n ProTable,\n ViewBooleanEnableDisable, ViewText\n} from \"../../../framework\";\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\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
|
|
2101
|
+
"__content": "import React from \"react\";\nimport {Button, Form, Input, InputNumber, Modal, Popconfirm, Splitter, Tag, Tree, Typography} from \"antd\";\nimport {PlusOutlined} from \"@ant-design/icons\";\n\nimport {\n ButtonList,\n FieldBoolean, FieldDictSelect, FieldRemoteSelect,\n HttpUtils,\n Page,\n ProTable,\n ViewBooleanEnableDisable, ViewText\n} from \"../../../framework\";\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\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 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 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: 'typeLabel',\n },\n {\n title: '类型编码',\n dataIndex: 'typeCode',\n },\n {\n title: '标签',\n dataIndex: 'label',\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 return (\n <ButtonList>\n <Button size='small' perm='sys-dict:update'\n onClick={() => this.handleEdit(record)}> 编辑 </Button>\n <Popconfirm perm='sys-dict: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 rowKey='uid'\n actionRef={this.tableRef}\n toolBarRender={() => {\n return <ButtonList>\n <Button perm='sys-dict:create' type='primary' onClick={this.handleAdd} >\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 showToolbarSearch={true}\n />\n <Modal\n title='编辑数据字典项'\n open={this.state.formOpen}\n onOk={() => this.formRef.current.submit()}\n onCancel={() => this.setState({formOpen: false})}\n destroyOnClose\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='color' rules={[{required: true}]} >\n <ViewText />\n </Form.Item>\n <Form.Item label='类型' name='typeCode' rules={[{required: true}]} >\n <FieldRemoteSelect url='/admin/dict/type-options' />\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' 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\n}\n",
|
|
2133
2102
|
"__isJSFile": true,
|
|
2134
2103
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/dict/index.jsx"
|
|
2135
2104
|
},
|
|
@@ -2139,7 +2108,7 @@
|
|
|
2139
2108
|
"parentId": "@@/global-layout",
|
|
2140
2109
|
"file": "system/file/index.jsx",
|
|
2141
2110
|
"absPath": "/system/file",
|
|
2142
|
-
"__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, ProTable} 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={'/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='
|
|
2111
|
+
"__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>\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 destroyOnClose\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",
|
|
2143
2112
|
"__isJSFile": true,
|
|
2144
2113
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/file/index.jsx"
|
|
2145
2114
|
},
|
|
@@ -2149,7 +2118,7 @@
|
|
|
2149
2118
|
"parentId": "@@/global-layout",
|
|
2150
2119
|
"file": "system/role/index.jsx",
|
|
2151
2120
|
"absPath": "/system/role",
|
|
2152
|
-
"__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
|
|
2121
|
+
"__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>\n <ProTable\n actionRef={this.tableRef}\n toolBarRender={() => {\n return <ButtonList>\n <Button perm='sys-role:create' 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 destroyOnClose\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 destroyOnClose\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 destroyOnClose\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",
|
|
2153
2122
|
"__isJSFile": true,
|
|
2154
2123
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/role/index.jsx"
|
|
2155
2124
|
},
|
|
@@ -2159,7 +2128,7 @@
|
|
|
2159
2128
|
"parentId": "@@/global-layout",
|
|
2160
2129
|
"file": "system/user/index.jsx",
|
|
2161
2130
|
"absPath": "/system/user",
|
|
2162
|
-
"__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/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 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='
|
|
2131
|
+
"__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/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 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='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>\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='sys-user:create'\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 destroyOnClose\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",
|
|
2163
2132
|
"__isJSFile": true,
|
|
2164
2133
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/user/index.jsx"
|
|
2165
2134
|
},
|
|
@@ -2173,23 +2142,13 @@
|
|
|
2173
2142
|
"__isJSFile": true,
|
|
2174
2143
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/userCenter/manual.jsx"
|
|
2175
2144
|
},
|
|
2176
|
-
"system/api/index": {
|
|
2177
|
-
"path": "system/api",
|
|
2178
|
-
"id": "system/api/index",
|
|
2179
|
-
"parentId": "@@/global-layout",
|
|
2180
|
-
"file": "system/api/index.jsx",
|
|
2181
|
-
"absPath": "/system/api",
|
|
2182
|
-
"__content": "import {PlusOutlined} from '@ant-design/icons'\nimport {Button, Form, Input, message, Modal, Popconfirm, Switch, Table, Tabs} from 'antd'\nimport React from 'react'\nimport {\n ArrayUtils,\n ButtonList,\n FieldBoolean,\n FieldDate,\n HttpUtils, ObjectUtils,\n Page,\n ProTable,\n StringUtils,\n ViewPassword\n} from \"../../../framework\";\n\n\nexport default class extends React.Component {\n\n state = {\n formValues: {},\n formOpen: false,\n\n list: [],\n grantFormOpen: false\n }\n\n formRef = React.createRef()\n tableRef = React.createRef()\n\n componentDidMount() {\n HttpUtils.get(\"/admin/apiAccount/perm-list\").then(rs => {\n this.setState({list: rs})\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 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: '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: 'enabled',\n render(v) {\n return v == null ? null : (v ? '是' : '否')\n },\n },\n {\n title: '权限',\n dataIndex: 'perms',\n render(perms) {\n if (!perms) {\n return\n }\n return perms.join(', ')\n }\n },\n {\n title: '操作',\n dataIndex: 'option',\n render: (_, record) => (\n <ButtonList>\n <Button size='small' perm='api'\n onClick={() => {\n this.handlePreGrant(record);\n }}\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 <Button size='small' perm='api' href={'/admin/apiAccount/export/' + record.id} target={'_blank'}>下载文档</Button>\n </ButtonList>\n ),\n },\n ]\n\n handlePreGrant(record) {\n this.setState({grantFormOpen: true, formValues: ObjectUtils.clone(record)})\n }\n\n randomAppSecret = () => {\n const appSecret = StringUtils.random(32)\n this.formRef.current.setFieldsValue({appSecret})\n }\n\n onGrantItemChange = (id, checked) => {\n const perms = this.state.formValues.perms\n if (checked) {\n ArrayUtils.add(perms, id)\n } else {\n ArrayUtils.remove(perms, id)\n }\n this.setState({formValues: this.state.formValues})\n }\n\n onGrant = () => {\n const hide = message.loading('授权中...', 0)\n const accountId = this.state.formValues.id;\n HttpUtils.post('admin/apiAccount/grant/'+accountId, this.state.formValues.perms).then(rs => {\n this.setState({grantFormOpen: false})\n this.tableRef.current.reload()\n }).finally(hide)\n };\n\n\n render() {\n return <Page padding>\n <Tabs items={[\n {\n label: '接口文档',\n key: 'doc',\n children: <iframe src={'/admin/swagger-ui/index.html'} width=\"100%\" height=\"1000px\"></iframe>\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 {\n label: '访问记录',\n key: 'log',\n children: <ProTable\n request={(params) => HttpUtils.get('admin/apiLog/page', params)}\n columns={[\n {\n title: '接口',\n dataIndex: 'url',\n },\n {\n title: 'ip',\n dataIndex: 'ip',\n },\n {\n title: 'ipLocation',\n dataIndex: 'ipLocation',\n },\n {\n title: '执行时间',\n dataIndex: 'executionTime',\n },\n {\n title: '接口账户',\n dataIndex: 'accountName',\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 destroyOnClose\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 >\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='enabled' rules={[{required: true}]}>\n <FieldBoolean/>\n </Form.Item>\n\n </Form>\n </Modal>\n\n\n <Modal title='权限列表' destroyOnClose={true} width={800}\n open={this.state.grantFormOpen}\n onCancel={() => this.setState({grantFormOpen: false, formValues: null})}\n onOk={this.onGrant}\n >\n <Table\n dataSource={this.state.list}\n pagination={false}\n rowKey='id'\n size={'small'}\n columns={[\n {dataIndex: 'id', title: '标识'},\n {dataIndex: 'name', title: '名称'},\n {dataIndex: 'description', title: '描述'},\n {dataIndex: 'path', title: '路径'},\n {\n dataIndex: 'option', title: '操作',\n render: (_, record) => {\n const id = record.id;\n return <Switch checked={this.state.formValues.perms.includes(id)}\n onChange={(checked) => {\n this.onGrantItemChange(id, checked)\n }} />\n }\n }\n ]}\n\n />\n </Modal>\n </Page>\n\n\n }\n}\n\n",
|
|
2183
|
-
"__isJSFile": true,
|
|
2184
|
-
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/api/index.jsx"
|
|
2185
|
-
},
|
|
2186
2145
|
"system/job/index": {
|
|
2187
2146
|
"path": "system/job",
|
|
2188
2147
|
"id": "system/job/index",
|
|
2189
2148
|
"parentId": "@@/global-layout",
|
|
2190
2149
|
"file": "system/job/index.jsx",
|
|
2191
2150
|
"absPath": "/system/job",
|
|
2192
|
-
"__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, 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 })\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 })\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/trigger-job', {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 destroyOnClose\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 destroyOnClose\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 = '/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",
|
|
2151
|
+
"__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 })\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 })\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 })\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/trigger-job', {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' 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 })\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 destroyOnClose\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 destroyOnClose\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",
|
|
2193
2152
|
"__isJSFile": true,
|
|
2194
2153
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/job/index.jsx"
|
|
2195
2154
|
},
|
|
@@ -2199,7 +2158,7 @@
|
|
|
2199
2158
|
"parentId": "@@/global-layout",
|
|
2200
2159
|
"file": "system/log/index.jsx",
|
|
2201
2160
|
"absPath": "/system/log",
|
|
2202
|
-
"__content": "import React
|
|
2161
|
+
"__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: 'operation',\n },\n {\n title: '操作者',\n dataIndex: 'username'\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",
|
|
2203
2162
|
"__isJSFile": true,
|
|
2204
2163
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/log/index.jsx"
|
|
2205
2164
|
},
|
|
@@ -2209,7 +2168,7 @@
|
|
|
2209
2168
|
"parentId": "@@/global-layout",
|
|
2210
2169
|
"file": "system/org/index.jsx",
|
|
2211
2170
|
"absPath": "/system/org",
|
|
2212
|
-
"__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
|
|
2171
|
+
"__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",
|
|
2213
2172
|
"__isJSFile": true,
|
|
2214
2173
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/org/index.jsx"
|
|
2215
2174
|
},
|
|
@@ -2219,7 +2178,7 @@
|
|
|
2219
2178
|
"parentId": "@@/global-layout",
|
|
2220
2179
|
"file": "system/role/perm.jsx",
|
|
2221
2180
|
"absPath": "/system/role/perm",
|
|
2222
|
-
"__content": "import React from \"react\";\nimport {Button, Card, Checkbox, Table, Typography} from \"antd\";\nimport {SaveOutlined} from \"@ant-design/icons\";\nimport {ArrayUtils, HttpUtils, 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
|
|
2181
|
+
"__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\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",
|
|
2223
2182
|
"__isJSFile": true,
|
|
2224
2183
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/role/perm.jsx"
|
|
2225
2184
|
},
|
|
@@ -2229,7 +2188,7 @@
|
|
|
2229
2188
|
"parentId": "@@/global-layout",
|
|
2230
2189
|
"file": "userCenter/index.jsx",
|
|
2231
2190
|
"absPath": "/userCenter",
|
|
2232
|
-
"__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
|
|
2191
|
+
"__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='tmgg-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 tabPosition='left'\n >\n </Tabs>\n </Card>\n </Col>\n </Row>\n\n\n </Page>\n\n }\n}\n",
|
|
2233
2192
|
"__isJSFile": true,
|
|
2234
2193
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/userCenter/index.jsx"
|
|
2235
2194
|
},
|
|
@@ -2239,7 +2198,7 @@
|
|
|
2239
2198
|
"parentId": "@@/global-layout",
|
|
2240
2199
|
"file": "about.jsx",
|
|
2241
2200
|
"absPath": "/about",
|
|
2242
|
-
"__content": "import React from \"react\";\n\nexport default class extends React.Component {\n\n\n render() {\n return
|
|
2201
|
+
"__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",
|
|
2243
2202
|
"__isJSFile": true,
|
|
2244
2203
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/about.jsx"
|
|
2245
2204
|
},
|
|
@@ -2249,7 +2208,7 @@
|
|
|
2249
2208
|
"parentId": "@@/global-layout",
|
|
2250
2209
|
"file": "index.jsx",
|
|
2251
2210
|
"absPath": "/",
|
|
2252
|
-
"__content": "import React from \"react\";\nimport {Card} from \"antd\";\
|
|
2211
|
+
"__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",
|
|
2253
2212
|
"__isJSFile": true,
|
|
2254
2213
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/index.jsx"
|
|
2255
2214
|
},
|
|
@@ -2259,7 +2218,7 @@
|
|
|
2259
2218
|
"parentId": "@@/global-layout",
|
|
2260
2219
|
"file": "login.jsx",
|
|
2261
2220
|
"absPath": "/login",
|
|
2262
|
-
"__content": "import React from 'react';\nimport {Button, Form, Input, message, Space} from 'antd';\nimport {LockOutlined, SafetyCertificateOutlined, UserOutlined, WarningOutlined} from '@ant-design/icons';\nimport {JSEncrypt} from \"jsencrypt\";\nimport {history} from 'umi';\nimport {EventBusUtils, HttpUtils, PageUtils, MessageUtils, 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 reject(e)\n })\n })\n}\n\nexport default class extends React.Component {\n\n state = {\n logging: false,\n siteInfo: {},\n random: Math.random()\n }\n\n async componentDidMount() {\n if (
|
|
2221
|
+
"__content": "import React from 'react';\nimport {Button, Form, Input, message, Space} from 'antd';\nimport {LockOutlined, SafetyCertificateOutlined, UserOutlined, WarningOutlined} from '@ant-design/icons';\nimport {JSEncrypt} from \"jsencrypt\";\nimport {history} from 'umi';\nimport {EventBusUtils, HttpUtils, PageUtils, MessageUtils, 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 reject(e)\n })\n })\n}\n\nexport default class extends React.Component {\n\n state = {\n logging: false,\n siteInfo: {},\n random: Math.random()\n }\n\n async componentDidMount() {\n const siteInfo = SysUtils.getSiteInfo()\n if (siteInfo && siteInfo.rsaPublicKey) {\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 message.error('加载站点信息失败,请刷新页面重试')\n }\n }\n\n submit = values => {\n this.setState({logging: true})\n\n const pubkey = this.state.siteInfo.rsaPublicKey;\n if (!pubkey) {\n message.error(\"未获取密钥,请刷新浏览器再试\")\n this.setState({logging: false})\n return\n }\n const crypt = new JSEncrypt();\n crypt.setPublicKey(pubkey);\n values.password = crypt.encrypt(values.password)\n\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(\"${SysUtils.contextPath('/admin/public/login_bg.jpg')}\")`\n }\n if (siteInfo.loginBackground) {\n const url = SysUtils.contextPath('/admin/sysFile/preview/' + siteInfo.loginBackground);\n pageStyle.backgroundImage = 'url(\"' + url + '\")'\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 {siteInfo.captcha && (\n <Form.Item name='captchaCode' rules={[{required: true}]}>\n <Space style={{alignItems: 'center'}}>\n <Input size='large' placeholder='验证码' prefix={<SafetyCertificateOutlined/>}/>\n <img height={36} width={100}\n src={SysUtils.contextPath(\"/admin/auth/captcha-image?_random=\" + this.state.random)}\n onClick={() => this.setState({random: Math.random()})}/>\n </Space>\n </Form.Item>\n )}\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",
|
|
2263
2222
|
"__isJSFile": true,
|
|
2264
2223
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/login.jsx"
|
|
2265
2224
|
},
|
|
@@ -2276,7 +2235,7 @@
|
|
|
2276
2235
|
"hasSrcDir": true,
|
|
2277
2236
|
"npmClient": "cnpm",
|
|
2278
2237
|
"umi": {
|
|
2279
|
-
"version": "4.6.
|
|
2238
|
+
"version": "4.6.57",
|
|
2280
2239
|
"name": "Umi",
|
|
2281
2240
|
"importSource": "umi",
|
|
2282
2241
|
"cliName": "umi"
|