Compare commits
961 Commits
2.2402.5-2
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ae1dad1fc3 | ||
|
|
4c6e90c5c4 | ||
|
|
e98ee3ee1e | ||
|
|
e4628040c9 | ||
|
|
343b1612aa | ||
|
|
73eb70b7d8 | ||
|
|
ceea517613 | ||
|
|
6ab4e80b38 | ||
|
|
e2cf4b6500 | ||
|
|
3896b61b13 | ||
|
|
ffced06df8 | ||
|
|
4e63395383 | ||
|
|
956cbfc3a3 | ||
|
|
f5b843d9a8 | ||
|
|
1246308a3d | ||
|
|
0cb7158f57 | ||
|
|
63c7ae2538 | ||
|
|
48ddafaec9 | ||
|
|
eeeae3dd12 | ||
|
|
f0a5da681c | ||
|
|
35c7b86865 | ||
|
|
cef90a49f9 | ||
|
|
c9a0fd7818 | ||
|
|
7e35dca9d8 | ||
|
|
860e06e7b0 | ||
|
|
b352533523 | ||
|
|
a8a5c0a31e | ||
|
|
26686f88db | ||
|
|
fb3f1daecf | ||
|
|
3680da64c1 | ||
|
|
f87fcb73b9 | ||
|
|
c11227d747 | ||
|
|
8a612e0760 | ||
|
|
29f5e41976 | ||
|
|
3ab0b47095 | ||
|
|
aa04abdbb4 | ||
|
|
db95099934 | ||
|
|
71ef748af8 | ||
|
|
91c9829d77 | ||
|
|
5304b298f6 | ||
|
|
e09369aa5a | ||
|
|
3363e36669 | ||
|
|
ea2ce56e52 | ||
|
|
dee60e0699 | ||
|
|
e62fc0c039 | ||
|
|
de16b96971 | ||
|
|
f0e34726ec | ||
|
|
2cbd2e0aa7 | ||
|
|
16913aa721 | ||
|
|
ba426d7737 | ||
|
|
8df5e278c8 | ||
|
|
ea8fb7cad2 | ||
|
|
b7b8b11860 | ||
|
|
bae61108be | ||
|
|
f60e530636 | ||
|
|
b3e9761305 | ||
|
|
fbd2867ad2 | ||
|
|
2ca23ad99a | ||
|
|
4b032d74be | ||
|
|
8bfa73a67a | ||
|
|
f188e193f3 | ||
|
|
b362855a60 | ||
|
|
4c28d6b98c | ||
|
|
2276f2281a | ||
|
|
7ccb580e91 | ||
|
|
0346dfd584 | ||
|
|
5a64afe209 | ||
|
|
fd82d710b6 | ||
|
|
fbc1535015 | ||
|
|
36de89570f | ||
|
|
22e595131c | ||
|
|
208d14d65a | ||
|
|
80b9cd83fb | ||
|
|
721ec4a5da | ||
|
|
34f558199a | ||
|
|
07eab9378a | ||
|
|
806cbbd9ed | ||
|
|
8adf2a3dd0 | ||
|
|
2164ffc9b2 | ||
|
|
7091f1ffa6 | ||
|
|
fa44f6abe0 | ||
|
|
8586d7f1ce | ||
|
|
b2d818fc30 | ||
|
|
a20d5ee99f | ||
|
|
74b55423d5 | ||
|
|
96acbc0919 | ||
|
|
322b5f18ed | ||
|
|
e36dac9b81 | ||
|
|
8214175890 | ||
|
|
9e55768312 | ||
|
|
98ed8adfe3 | ||
|
|
f5938110f4 | ||
|
|
acd8a33b4a | ||
|
|
7ab2b3b546 | ||
|
|
b490e4f5b9 | ||
|
|
fe82336937 | ||
|
|
35a7ed5b35 | ||
|
|
56def56b58 | ||
|
|
6074078f5d | ||
|
|
428adb5186 | ||
|
|
1cbce9ad03 | ||
|
|
2138896d43 | ||
|
|
c40ee9c8cc | ||
|
|
d33183ca5e | ||
|
|
9ff9529402 | ||
|
|
51a8d6d3a0 | ||
|
|
c22663505c | ||
|
|
9b589a0e69 | ||
|
|
b0b9c69ad2 | ||
|
|
5a3fa2a6ba | ||
|
|
5c0909e356 | ||
|
|
b7da976819 | ||
|
|
41e37766b7 | ||
|
|
44612081bc | ||
|
|
4929ed30bc | ||
|
|
eea4e0069d | ||
|
|
2b69b8d72b | ||
|
|
1f130098ee | ||
|
|
5a4ab62e97 | ||
|
|
139a14fd3d | ||
|
|
6e7402fd63 | ||
|
|
302ea84cde | ||
|
|
7d470fd681 | ||
|
|
b64c4c66ab | ||
|
|
15ac549532 | ||
|
|
9bff669769 | ||
|
|
8a53ac8b9f | ||
|
|
d3a18f95db | ||
|
|
11649c3fb1 | ||
|
|
09fd8bc4dc | ||
|
|
5a704146a5 | ||
|
|
e25cd91df1 | ||
|
|
71f2e596fe | ||
|
|
7e60f0dd05 | ||
|
|
a94f9414a4 | ||
|
|
7f69bc69bc | ||
|
|
4b1058cff3 | ||
|
|
a6bab3fa0b | ||
|
|
c44fae8d13 | ||
|
|
bcb214448c | ||
|
|
65db17a319 | ||
|
|
6969669027 | ||
|
|
38a698f07b | ||
|
|
9f121505d1 | ||
|
|
6add41254d | ||
|
|
85bc4aea53 | ||
|
|
9167da1bc5 | ||
|
|
69dfc2a1f5 | ||
|
|
b1a699252b | ||
|
|
a0886abd38 | ||
|
|
9383c17484 | ||
|
|
512bd6d8eb | ||
|
|
b8b66fe610 | ||
|
|
154569304c | ||
|
|
cc3432ca06 | ||
|
|
68b9c5fa5e | ||
|
|
6620ac7279 | ||
|
|
a9a094d04a | ||
|
|
5d4a04ecf2 | ||
|
|
1b28260680 | ||
|
|
83cb3f8728 | ||
|
|
7d69d3c21d | ||
|
|
ebde50f58b | ||
|
|
b8924d161f | ||
|
|
ccb52ea94f | ||
|
|
72abbe1c53 | ||
|
|
f318f61b4a | ||
|
|
45d8314e29 | ||
|
|
886a1c8667 | ||
|
|
378729720d | ||
|
|
c2a3d4b8a8 | ||
|
|
8444de8e98 | ||
|
|
874e01996a | ||
|
|
fb855fd74e | ||
|
|
78f963fbea | ||
|
|
cf0116b5c6 | ||
|
|
80b07c462f | ||
|
|
5a8ab1343f | ||
|
|
67349e24d8 | ||
|
|
f59697a2f2 | ||
|
|
8c197bee04 | ||
|
|
f866fbf153 | ||
|
|
d7b4fd3f71 | ||
|
|
29449cc597 | ||
|
|
7615bccf04 | ||
|
|
f5f27d78f1 | ||
|
|
ebc46ff7d4 | ||
|
|
2513baf48e | ||
|
|
ac2483d690 | ||
|
|
a85f87f3fc | ||
|
|
68e002776c | ||
|
|
9322f52c9a | ||
|
|
2c9807f9b8 | ||
|
|
f8f4dc0f2e | ||
|
|
49bd59c639 | ||
|
|
6bd7a28458 | ||
|
|
053517324d | ||
|
|
256802e698 | ||
|
|
851e8a461e | ||
|
|
d8d49f23c4 | ||
|
|
1511792e3b | ||
|
|
045a25f3ae | ||
|
|
b6d1ba6766 | ||
|
|
e8e0e07189 | ||
|
|
1672c6c6ba | ||
|
|
ac251c2c00 | ||
|
|
9b9c0b39fd | ||
|
|
31bca2b98f | ||
|
|
bf94591035 | ||
|
|
d523b60311 | ||
|
|
e0990a40df | ||
|
|
20c1c455c4 | ||
|
|
dab76add73 | ||
|
|
101cb70893 | ||
|
|
348b11e201 | ||
|
|
a9fdda3f5e | ||
|
|
89d22e55c7 | ||
|
|
40f2a78717 | ||
|
|
80ee1c05ff | ||
|
|
021f9f28f6 | ||
|
|
d7990a6ee5 | ||
|
|
3561a5dc39 | ||
|
|
247a009eef | ||
|
|
fcd4db8217 | ||
|
|
3e03d47520 | ||
|
|
414afea783 | ||
|
|
df7c455881 | ||
|
|
1644765ce2 | ||
|
|
db16cdb79b | ||
|
|
800547d1ef | ||
|
|
5614be7877 | ||
|
|
0644e49161 | ||
|
|
15b81eef97 | ||
|
|
5ddf83d1fd | ||
|
|
6326f46bf2 | ||
|
|
f75719ca37 | ||
|
|
21cf86baff | ||
|
|
6583bc9972 | ||
|
|
886ea37702 | ||
|
|
23116db988 | ||
|
|
8283523327 | ||
|
|
33159befc3 | ||
|
|
c567b19fb2 | ||
|
|
d8487d7cd7 | ||
|
|
347c9f1d3b | ||
|
|
a731a6408b | ||
|
|
c0ac1f6ed5 | ||
|
|
544c3697bd | ||
|
|
33a8ce97d3 | ||
|
|
6ee9d464fb | ||
|
|
df5072bae7 | ||
|
|
ae94e3bf2a | ||
|
|
2276445ff6 | ||
|
|
e12dce1f0f | ||
|
|
d0457fc285 | ||
|
|
e04fd4077e | ||
|
|
63d32f0a39 | ||
|
|
99565dd652 | ||
|
|
7e03437ab6 | ||
|
|
5f9d19ac65 | ||
|
|
f23d4117d7 | ||
|
|
e4a56d68e0 | ||
|
|
cf5d08aaab | ||
|
|
7ad566d74f | ||
|
|
c312186d91 | ||
|
|
e3f7b08c69 | ||
|
|
6e3ef7e56a | ||
|
|
0a96fee6c3 | ||
|
|
dc7d24e2bf | ||
|
|
089ae12dd1 | ||
|
|
da0d49d306 | ||
|
|
670225a655 | ||
|
|
fa35bfc340 | ||
|
|
f4a5d28a29 | ||
|
|
c735aeba6d | ||
|
|
3c058ec107 | ||
|
|
327e82e057 | ||
|
|
012fc44f08 | ||
|
|
72fd372fe0 | ||
|
|
acdadcbb6f | ||
|
|
7a49de71ea | ||
|
|
56e4419e77 | ||
|
|
3abb4dd4bd | ||
|
|
726a284ab5 | ||
|
|
a45243390b | ||
|
|
1faed9bc3d | ||
|
|
9bd700eeb7 | ||
|
|
5cc3b9c8cf | ||
|
|
208895c7d5 | ||
|
|
46578ce97b | ||
|
|
0ff5bd5e20 | ||
|
|
f08e637e69 | ||
|
|
a600e056b8 | ||
|
|
671c80972e | ||
|
|
d07230b582 | ||
|
|
35c24407ac | ||
|
|
cf33756548 | ||
|
|
1ef98298bc | ||
|
|
b1c2a95ec4 | ||
|
|
147b2fad8d | ||
|
|
b629088406 | ||
|
|
430a067280 | ||
|
|
8a71e8f773 | ||
|
|
ff556ce1ec | ||
|
|
9ed7aed4b4 | ||
|
|
9e14297488 | ||
|
|
8e70706ed5 | ||
|
|
3e0529cf87 | ||
|
|
91af2bed92 | ||
|
|
1ecefb91dc | ||
|
|
72d9895902 | ||
|
|
41fa214137 | ||
|
|
1565f25a03 | ||
|
|
c5c2926d99 | ||
|
|
55456f9220 | ||
|
|
cf1686c348 | ||
|
|
f7833bcd9f | ||
|
|
5a621053a4 | ||
|
|
2a6451ef2a | ||
|
|
f1b440c8dd | ||
|
|
a67e54ca6e | ||
|
|
53d9e63c36 | ||
|
|
b4623d19e5 | ||
|
|
700bff6e38 | ||
|
|
d77c4e43d4 | ||
|
|
6e11d2b16a | ||
|
|
405842bc0b | ||
|
|
bf8d7f2124 | ||
|
|
ba98b37306 | ||
|
|
aa8ed65fd8 | ||
|
|
936a4410b3 | ||
|
|
58ec76f9e5 | ||
|
|
c1a77c8e48 | ||
|
|
477e8e4631 | ||
|
|
4f9d65a3a7 | ||
|
|
b1799d8ccb | ||
|
|
86833e7d6b | ||
|
|
59cf57898b | ||
|
|
fb9382e3a0 | ||
|
|
dae4697cd2 | ||
|
|
1b2e892f74 | ||
|
|
c66c640f75 | ||
|
|
30849416b6 | ||
|
|
5edcee8da5 | ||
|
|
311beed2a7 | ||
|
|
eb5fdfb635 | ||
|
|
78bcde9ef2 | ||
|
|
630e2a16ad | ||
|
|
e1fe031f25 | ||
|
|
855ba7dc9e | ||
|
|
3a72e73d5d | ||
|
|
4cb13a1419 | ||
|
|
8dd84a5255 | ||
|
|
c0e62f48b7 | ||
|
|
b992225e28 | ||
|
|
2f04562a34 | ||
|
|
d3a452cfd8 | ||
|
|
d81b8cdf38 | ||
|
|
39a417368a | ||
|
|
adfce5d2f7 | ||
|
|
977286d6b3 | ||
|
|
c33000045a | ||
|
|
b995ac378a | ||
|
|
6bea64f345 | ||
|
|
94886e255e | ||
|
|
45f66afe52 | ||
|
|
b9105c1e77 | ||
|
|
909d306942 | ||
|
|
f7273457e9 | ||
|
|
2e5ad2f65d | ||
|
|
776e9c5837 | ||
|
|
0d4979d3d9 | ||
|
|
686c7dd273 | ||
|
|
d41b308c6d | ||
|
|
84dac247d2 | ||
|
|
f8439bb40a | ||
|
|
d268d920e7 | ||
|
|
f730ef1e3a | ||
|
|
af1ce32063 | ||
|
|
678ff2d09d | ||
|
|
48f674b6ef | ||
|
|
02f0820a69 | ||
|
|
ca8605fd6e | ||
|
|
6d5e96421b | ||
|
|
bcc29007bf | ||
|
|
bdf904078d | ||
|
|
e37cfa5066 | ||
|
|
f1bff23bbc | ||
|
|
53106ddb5c | ||
|
|
3a04882fe5 | ||
|
|
19202a5e81 | ||
|
|
7b311ff673 | ||
|
|
9dba98e0ee | ||
|
|
71338670f0 | ||
|
|
7dcdfabce2 | ||
|
|
ddfe1723c9 | ||
|
|
57b5f76db7 | ||
|
|
9ac3524877 | ||
|
|
ca82a0a74b | ||
|
|
23007c3bf2 | ||
|
|
5d69d7612a | ||
|
|
ddd8930af4 | ||
|
|
757f2ec20a | ||
|
|
30caa79424 | ||
|
|
e3f83a0b98 | ||
|
|
147a3ed77b | ||
|
|
5d35d950b3 | ||
|
|
6874508d3f | ||
|
|
33f468209a | ||
|
|
e8ef2816df | ||
|
|
e38d7bbffa | ||
|
|
2f1265c47a | ||
|
|
66b6b60505 | ||
|
|
249d14320d | ||
|
|
313b90ad31 | ||
|
|
2ebc90e974 | ||
|
|
640257dd55 | ||
|
|
c1a3ce8068 | ||
|
|
0080e9c26e | ||
|
|
2ccafe622d | ||
|
|
d7a515ed9a | ||
| cd82b71b77 | |||
|
|
9d6a7dcd9c | ||
|
|
46c2affcc8 | ||
|
|
3d00a80588 | ||
|
|
a3c1fe154f | ||
|
|
07dce5a27e | ||
|
|
255cf026a6 | ||
|
|
840ea56c42 | ||
|
|
09917cc9c9 | ||
|
|
4c9fe192f2 | ||
|
|
32ec55d44e | ||
|
|
527cf89d1a | ||
|
|
ac7b57c0ae | ||
|
|
8be1a8968e | ||
|
|
999ccf64ad | ||
|
|
03352f3aa8 | ||
|
|
61a58fc661 | ||
|
|
4268fa3198 | ||
|
|
f6b62c6c7e | ||
|
|
b4cbc1c190 | ||
|
|
1871f6f656 | ||
|
|
409f9836a6 | ||
|
|
b3f40ee683 | ||
|
|
aa07b51663 | ||
|
|
19b77ed005 | ||
|
|
06503fd079 | ||
|
|
2321dacd2a | ||
|
|
a8b4e91b95 | ||
|
|
a5075bef43 | ||
|
|
f4ffbc1c86 | ||
|
|
6cafa284c7 | ||
|
|
049c0e7a0f | ||
|
|
377ffc6e10 | ||
|
|
858431e86e | ||
|
|
70fca5ca41 | ||
|
|
e972d14a9a | ||
|
|
c1187383b6 | ||
|
|
8d8605e0cd | ||
|
|
8af48936e5 | ||
|
|
e21a8dc898 | ||
|
|
3c1ee63359 | ||
|
|
bc3940016a | ||
|
|
6ab4fbea6f | ||
|
|
c73fcbd91c | ||
|
|
023e317b0d | ||
|
|
543a2b7434 | ||
|
|
4ae9051411 | ||
|
|
532546c3f5 | ||
|
|
ab0d26513c | ||
|
|
8e9498ec83 | ||
|
|
ca048f223c | ||
|
|
e9ff6493dd | ||
|
|
396fb0b124 | ||
|
|
3a854be8fe | ||
|
|
c1f34f56ac | ||
|
|
b80bae0126 | ||
|
|
6c383b58c8 | ||
|
|
06db1344c3 | ||
|
|
fac47279b5 | ||
|
|
a36a12f783 | ||
|
|
acd19ebdbd | ||
|
|
d53c4c34f0 | ||
|
|
2d9011cf6b | ||
|
|
fcf53d0995 | ||
|
|
a2d93ddafe | ||
|
|
79920542c1 | ||
|
|
6efd9cb61a | ||
|
|
4dc6699974 | ||
|
|
3bdae264e1 | ||
|
|
9e0a99d160 | ||
|
|
5ac0ca41eb | ||
|
|
a7de701d4d | ||
|
|
f0561242ca | ||
|
|
6102972373 | ||
|
|
d095531952 | ||
|
|
d49dc9ebfd | ||
|
|
43a99e9328 | ||
|
|
d333221620 | ||
|
|
481734cfe1 | ||
|
|
1fa8601675 | ||
|
|
c1aabdbe42 | ||
|
|
953a36f142 | ||
|
|
c5f62e8d76 | ||
|
|
946139facb | ||
|
|
95931b2b6e | ||
|
|
e31c85835d | ||
|
|
847bae4c77 | ||
|
|
e69f43a0c2 | ||
|
|
d96e1ad259 | ||
|
|
3829d339e7 | ||
|
|
cd4073bec3 | ||
|
|
e67126c57a | ||
|
|
2f651b5d1f | ||
|
|
525854604f | ||
|
|
d42a8701da | ||
|
|
2b680d6d20 | ||
|
|
de79760a0e | ||
|
|
a5b5269b91 | ||
|
|
8a2d0ccfa1 | ||
|
|
650b02dc30 | ||
|
|
b42d8cb370 | ||
|
|
a213be0d64 | ||
|
|
2a2b441e09 | ||
|
|
84bdb44286 | ||
|
|
06b6175a76 | ||
|
|
11b790e140 | ||
|
|
296a9ba02b | ||
|
|
1801a46396 | ||
|
|
f6644a0d97 | ||
|
|
57f575aa84 | ||
|
|
68cbbe7133 | ||
|
|
c11d814312 | ||
|
|
e1548d2c98 | ||
|
|
1ec374eb26 | ||
|
|
0955a79965 | ||
|
|
374a9bde7e | ||
|
|
639a4f0b1f | ||
|
|
d1b9d7b9ba | ||
|
|
3298203f60 | ||
|
|
8f3cce52c0 | ||
|
|
ce06a88e89 | ||
|
|
749a04972d | ||
|
|
a311f0a09b | ||
|
|
c74d311537 | ||
|
|
1492f18791 | ||
|
|
cbc81643a5 | ||
|
|
c18b557c97 | ||
|
|
b6bd9bc3d5 | ||
|
|
199607e322 | ||
|
|
ee10119d77 | ||
|
|
1b1a56e49b | ||
|
|
afdc188e17 | ||
|
|
5de7d0a73f | ||
|
|
8f73d80a42 | ||
|
|
5a85f245b0 | ||
|
|
ff600c49f6 | ||
|
|
4c7e99fdd7 | ||
|
|
a6037a9737 | ||
|
|
1d55c092b1 | ||
|
|
8bdfd7ea28 | ||
|
|
39ad75fbd3 | ||
|
|
7ef775209d | ||
|
|
a8e0f36562 | ||
|
|
be50fc9c5c | ||
|
|
375f236e32 | ||
|
|
c9eb0240d8 | ||
|
|
b67d591d0a | ||
|
|
7275a87fba | ||
|
|
c103222b65 | ||
|
|
5133d09ec2 | ||
|
|
d88cec34df | ||
|
|
eadd4709ee | ||
|
|
04cbdc6b11 | ||
|
|
233496e184 | ||
|
|
919f8ef2a5 | ||
|
|
8f8d056f45 | ||
|
|
8fcd7974e4 | ||
|
|
cb7fc418a5 | ||
|
|
e6d4a898a8 | ||
|
|
be4fc896d7 | ||
|
|
e5a5ef6f96 | ||
|
|
530662bf5d | ||
|
|
2e7514d3ca | ||
|
|
1db61a5d4e | ||
|
|
618499e777 | ||
|
|
71c0306587 | ||
|
|
a3cd8f05fb | ||
|
|
d8ca0ca5ef | ||
|
|
da08e1cc5b | ||
|
|
8e4c5d0b90 | ||
|
|
467c93f710 | ||
|
|
22ced8bdb2 | ||
|
|
2ee26a6958 | ||
|
|
c63e892544 | ||
|
|
cce3088f73 | ||
|
|
2211896768 | ||
|
|
5bb3cd814c | ||
|
|
266d816a21 | ||
|
|
90c64c029a | ||
|
|
d06e2da72e | ||
|
|
7714d506c4 | ||
|
|
0b7a198235 | ||
|
|
68362ba3e3 | ||
|
|
a9633e652f | ||
|
|
6592561bca | ||
|
|
09e0353053 | ||
|
|
c1e95fd1e9 | ||
|
|
89857e0c1b | ||
|
|
7aa37ee330 | ||
|
|
4c16888184 | ||
|
|
a61716d40d | ||
|
|
3f02cb628b | ||
|
|
22805924fb | ||
|
|
e00229e5ff | ||
|
|
939a235a87 | ||
|
|
cd49162dfc | ||
|
|
b7f2df5d1c | ||
|
|
8b24bc55b9 | ||
|
|
9f2b80718e | ||
|
|
38cb406687 | ||
|
|
c25fe63a26 | ||
|
|
b84d6bb9fc | ||
|
|
b325cde5c0 | ||
|
|
34266da44e | ||
|
|
d82d6b7b47 | ||
|
|
b1c7a068cf | ||
|
|
c155160cf7 | ||
|
|
2ae4559958 | ||
|
|
782283bba6 | ||
|
|
1b50708786 | ||
|
|
206d3755a0 | ||
|
|
6470effbda | ||
|
|
f94b1ef44a | ||
|
|
7c78eab431 | ||
|
|
814b7b0058 | ||
|
|
624f67ecca | ||
|
|
c1a9497b77 | ||
|
|
1ad2ed2d26 | ||
|
|
48f278997f | ||
|
|
9b9d6222e1 | ||
|
|
2e8a878365 | ||
|
|
bc59dc67e6 | ||
|
|
df6022b4a8 | ||
|
|
f2c67d087b | ||
|
|
7a0298a419 | ||
|
|
b40e798090 | ||
|
|
d48d5d6c95 | ||
|
|
69f3347a4d | ||
|
|
85ae7dc5ea | ||
|
|
531cd6d03d | ||
|
|
9fd8c4597a | ||
|
|
7060a3d887 | ||
|
|
c12ffa583c | ||
|
|
05aabb8c61 | ||
|
|
6b461ead7c | ||
|
|
7c54e372e5 | ||
|
|
5be95a7af6 | ||
|
|
08515541b4 | ||
|
|
3948924f61 | ||
|
|
ce1944881a | ||
|
|
f6122c0758 | ||
|
|
3d3f4c2cc6 | ||
|
|
e8e5b92a57 | ||
|
|
4ad704398d | ||
|
|
26289b7787 | ||
|
|
7ad8c1706e | ||
|
|
424a596613 | ||
|
|
6d5b9f417c | ||
|
|
7278e24dce | ||
|
|
76839ae18a | ||
|
|
c8a6aa3210 | ||
|
|
9b4bbcedc5 | ||
|
|
3b793c107c | ||
|
|
a076e6d079 | ||
|
|
fb2a7c51f9 | ||
|
|
1e2c2b5170 | ||
|
|
56833b654e | ||
|
|
f50e02e6e7 | ||
|
|
52cc24813f | ||
|
|
c8a0d4c3f7 | ||
|
|
7560f21f11 | ||
|
|
8a5f80fe47 | ||
|
|
29eb1f08b1 | ||
|
|
9981de2271 | ||
|
|
207acb3f3d | ||
|
|
873a76f48f | ||
|
|
4ca700092a | ||
|
|
ad9f8574bd | ||
|
|
75faae6d7c | ||
|
|
c88c146a5e | ||
|
|
c65cda1468 | ||
|
|
d8059341fe | ||
|
|
ad86bee5f9 | ||
|
|
f44cc44a1b | ||
|
|
ad93588796 | ||
|
|
b5f6a5d24a | ||
|
|
fa4be253f7 | ||
|
|
2db0220c98 | ||
|
|
05fd678ce2 | ||
|
|
165b28bab1 | ||
|
|
dc67cdc262 | ||
|
|
c97394a0ed | ||
|
|
6b9297d30e | ||
|
|
ace7f26b53 | ||
|
|
976f72f79a | ||
|
|
530e7fd43f | ||
|
|
b76fed7dcf | ||
|
|
60a26dd015 | ||
|
|
7bdfc257c1 | ||
|
|
e3395b47cf | ||
|
|
4c9b4de12f | ||
|
|
1cfe5e2777 | ||
|
|
0cae26a1ee | ||
|
|
ed4d556384 | ||
|
|
6d9d7362a4 | ||
|
|
5a40733f20 | ||
|
|
45ee884529 | ||
|
|
7de3f7f05d | ||
|
|
97bb4db1eb | ||
|
|
fc6dfe9894 | ||
|
|
607660124a | ||
|
|
c50b3add95 | ||
|
|
2f7f0e9e20 | ||
|
|
6875ffd113 | ||
|
|
44844bfa7f | ||
|
|
21ab066761 | ||
|
|
83bdf289fa | ||
|
|
d7aa0fc91a | ||
|
|
a6be5190ec | ||
|
|
03cd06e835 | ||
|
|
2d7fe5a73b | ||
|
|
dd5604c8b7 | ||
|
|
7bf2672981 | ||
|
|
6e616c63f0 | ||
|
|
3ded481cce | ||
|
|
1baff582d8 | ||
|
|
957868cc27 | ||
|
|
efb98ac577 | ||
|
|
ff228daae7 | ||
|
|
c93e693517 | ||
|
|
55863c1c58 | ||
|
|
8a2d6c91ba | ||
|
|
86a939f206 | ||
|
|
2b86f724b1 | ||
|
|
68fbc45b7c | ||
|
|
4629ef28ff | ||
|
|
e3a11b0ede | ||
|
|
3df9ee4f3a | ||
|
|
e64d558c27 | ||
|
|
5a2aa383fe | ||
|
|
fe9f458465 | ||
|
|
8e2e9aec67 | ||
|
|
ad48e8e2e1 | ||
|
|
6f8b1000ba | ||
|
|
f5549992c2 | ||
|
|
19771ea6dc | ||
|
|
5965737384 | ||
|
|
b3cb40fd8c | ||
|
|
0ab5141369 | ||
|
|
a23284da4c | ||
|
|
1c8cc13436 | ||
|
|
e6a439faea | ||
|
|
f8b1b1f6c3 | ||
|
|
3844e07258 | ||
|
|
1fab9b3d97 | ||
|
|
1bfacbf2e0 | ||
|
|
c01f9f3830 | ||
|
|
28f9d365fd | ||
|
|
1085fa16aa | ||
|
|
e351960229 | ||
|
|
03caa354da | ||
|
|
34754ea0b6 | ||
|
|
86e1f07f08 | ||
|
|
2add7547d6 | ||
|
|
ecb89e9f26 | ||
|
|
7a9b38dc66 | ||
|
|
979b18092d | ||
|
|
ba43a647dd | ||
|
|
3be14590c6 | ||
|
|
857f8c4313 | ||
|
|
c9c39d2d4a | ||
|
|
845084f77f | ||
|
|
becba4919e | ||
|
|
b797055df9 | ||
|
|
8101c852c8 | ||
|
|
9bbeb9fc9a | ||
|
|
19a9bd3f5c | ||
|
|
399bddc635 | ||
|
|
5a67a1a51c | ||
|
|
9a168d2ba0 | ||
|
|
e42a620aed | ||
|
|
eb902594b8 | ||
|
|
817fd97496 | ||
|
|
96aab47003 | ||
|
|
432666b1ab | ||
|
|
662583c73b | ||
|
|
f73c21e6e6 | ||
|
|
17e72f1db1 | ||
|
|
55d4a36efb | ||
|
|
d3794ba904 | ||
|
|
832f18e2ee | ||
|
|
cd2e282624 | ||
|
|
3db88f1d3a | ||
|
|
f291bb0907 | ||
|
|
69c32b2593 | ||
|
|
1a2939ab01 | ||
|
|
8bf4a2a9ce | ||
|
|
efd389f98a | ||
|
|
f1125cc042 | ||
|
|
f1a0e200dc | ||
|
|
70c025f0f5 | ||
|
|
b9f0a3923d | ||
|
|
5c942c9ef7 | ||
|
|
4294fe82c5 | ||
|
|
4e7fb90544 | ||
|
|
f050e500e9 | ||
|
|
6bc10babba | ||
|
|
4d36f9952a | ||
|
|
b03f4bb1d6 | ||
|
|
4aaedf0f77 | ||
|
|
c1ea851705 | ||
|
|
47103249ef | ||
|
|
2642f18204 | ||
|
|
e2e22eabf5 | ||
|
|
325ecc8029 | ||
|
|
dc6f4560d5 | ||
|
|
3970797d5b | ||
|
|
73776ed0f9 | ||
|
|
aca842f8c2 | ||
|
|
612fb77861 | ||
|
|
6ba695ceaf | ||
|
|
070f77d3b8 | ||
|
|
15de63212f | ||
|
|
2202540763 | ||
|
|
c674b9b3f9 | ||
|
|
43d30e7bfa | ||
|
|
cd0633d519 | ||
|
|
b8bff2a159 | ||
|
|
638f890228 | ||
|
|
4460f7201c | ||
|
|
d0bbfafedc | ||
|
|
16dc1c2e20 | ||
|
|
73ed5f5285 | ||
|
|
50cb92a95b | ||
|
|
3888fd2bca | ||
|
|
4194d8cca6 | ||
|
|
ac84a0ca0a | ||
|
|
e6faa59f32 | ||
|
|
65fab4de1b | ||
| b044f01b1d | |||
|
|
f4ed68fc44 | ||
|
|
4de98923b7 | ||
|
|
1e0e3a89cf | ||
|
|
edabd9a104 | ||
|
|
c11893566a | ||
|
|
c88bef959a | ||
|
|
ffd1b02bf9 | ||
|
|
075ad76d19 | ||
|
|
fbbd0496de | ||
|
|
00e8b7acbb | ||
|
|
3d40e0856e | ||
|
|
32d7897818 | ||
|
|
fa14f50e2d | ||
|
|
4eff5d48cd | ||
|
|
5380c4fb3f | ||
|
|
e10a82ff35 | ||
|
|
f85535672e | ||
|
|
3c1c0620d1 | ||
|
|
9531230fc0 | ||
|
|
151175fb3f | ||
|
|
9faf02a1a6 | ||
|
|
c2e95f607b | ||
|
|
3a50300bf9 | ||
|
|
188a108d87 | ||
|
|
11e788cb8f | ||
|
|
74195bc88b | ||
|
|
2a622aa1d6 | ||
|
|
d15b75e8fd | ||
|
|
4ae5f64da3 | ||
|
|
16ab366136 | ||
|
|
85abd7bca4 | ||
|
|
cd66ff927d | ||
|
|
d242a87191 | ||
|
|
e1eaba0d68 | ||
|
|
5a7c161ed2 | ||
|
|
a0a4e65d5e | ||
|
|
a6751424a5 | ||
|
|
8abaff86e5 | ||
|
|
e7442bf750 | ||
|
|
dce068fcb1 | ||
| 249d89af88 | |||
|
|
0f3a689b04 | ||
|
|
569eea08cb | ||
|
|
3cb80bbd85 | ||
|
|
e0d590724b | ||
|
|
2cfab00e8f | ||
|
|
06170ba38f | ||
|
|
7e28df210d | ||
|
|
a69e8c89f8 | ||
|
|
f5544c66bd | ||
|
|
7339f45193 | ||
|
|
739025935a | ||
|
|
eaa0e2d70c | ||
|
|
2bffdaef3a | ||
|
|
79809b56e9 | ||
|
|
e5896c8513 | ||
|
|
104041eea5 | ||
|
|
0b576ed446 | ||
|
|
c1174fc273 | ||
|
|
90e1cd022b | ||
|
|
001e5e887b | ||
|
|
8230dbf257 | ||
|
|
49fa7bdec8 | ||
|
|
bd13b70a88 | ||
|
|
9b5b43c2bf | ||
|
|
dee4733ad0 | ||
|
|
c07c1dfde3 | ||
|
|
181da5836b | ||
|
|
7a787db45d | ||
|
|
49c98697e1 | ||
|
|
7dedbb927c | ||
|
|
c2cc81fccf | ||
|
|
92b2a4fb37 | ||
|
|
b7d02ff669 | ||
|
|
b4179b4c60 | ||
|
|
d7e08a1fff | ||
|
|
d52fdc115c | ||
|
|
e86ae12801 | ||
|
|
87b2fd965c | ||
|
|
8397847e66 | ||
|
|
84b0575ab4 | ||
|
|
f19e5e48f3 | ||
|
|
073f17b61f | ||
|
|
4cdfe6097d | ||
|
|
d55a4e3da7 | ||
|
|
dd6c38c57e | ||
|
|
f705ba3a2e | ||
|
|
8721aa3a49 | ||
|
|
d2507e4706 | ||
| 0937efc6e6 | |||
| 57445cd48f | |||
| a193655353 | |||
|
|
10b150f13c | ||
|
|
c9fdd1785a | ||
|
|
a821d49eed | ||
|
|
28122bbfae | ||
|
|
3b4b085499 | ||
|
|
51b3388cdc | ||
|
|
908d9341db | ||
|
|
82a2ab158f | ||
|
|
ce893f32e0 | ||
|
|
65696dee09 | ||
|
|
625b39d901 | ||
|
|
4c20e639d8 | ||
|
|
f28dfeb9b4 | ||
|
|
a75c89c451 | ||
|
|
883816c540 | ||
|
|
24ba825365 | ||
|
|
accb02963c | ||
|
|
abe5595fa7 |
@@ -1,17 +1,17 @@
|
|||||||
# 历史路径-哈希带井号标识
|
# 历史路径-哈希带井号标识
|
||||||
VITE_HISTORY_HASH = false
|
VITE_HISTORY_HASH = true
|
||||||
|
|
||||||
# 历史路径-前缀URL如:/h5
|
# 历史路径-前缀URL如:/h5
|
||||||
VITE_HISTORY_BASE_URL = "/"
|
VITE_HISTORY_BASE_URL = "/"
|
||||||
|
|
||||||
# 应用名称
|
# 应用名称
|
||||||
VITE_APP_NAME = "Core Network EMS"
|
VITE_APP_NAME = "Core Network OMC"
|
||||||
|
|
||||||
# 应用标识
|
# 应用标识
|
||||||
VITE_APP_CODE = "CN EMS"
|
VITE_APP_CODE = "OMC"
|
||||||
|
|
||||||
# 应用版本
|
# 应用版本
|
||||||
VITE_APP_VERSION = "2.2402.5"
|
VITE_APP_VERSION = "2.250509"
|
||||||
|
|
||||||
# 接口基础URL地址-不带/后缀
|
# 接口基础URL地址-不带/后缀
|
||||||
VITE_API_BASE_URL = "/omc-api"
|
VITE_API_BASE_URL = "/omc-api"
|
||||||
|
|||||||
@@ -5,13 +5,13 @@ VITE_HISTORY_HASH = true
|
|||||||
VITE_HISTORY_BASE_URL = "/"
|
VITE_HISTORY_BASE_URL = "/"
|
||||||
|
|
||||||
# 应用名称
|
# 应用名称
|
||||||
VITE_APP_NAME = "Core Network EMS"
|
VITE_APP_NAME = "Core Network OMC"
|
||||||
|
|
||||||
# 应用标识
|
# 应用标识
|
||||||
VITE_APP_CODE = "CN EMS"
|
VITE_APP_CODE = "OMC"
|
||||||
|
|
||||||
# 应用版本
|
# 应用版本
|
||||||
VITE_APP_VERSION = "2.240205.5"
|
VITE_APP_VERSION = "2.250509"
|
||||||
|
|
||||||
# 接口基础URL地址-不带/后缀
|
# 接口基础URL地址-不带/后缀
|
||||||
VITE_API_BASE_URL = "/omc-api"
|
VITE_API_BASE_URL = "/omc-api"
|
||||||
|
|||||||
61
CHANGELOG.md
@@ -1,5 +1,52 @@
|
|||||||
# 版本发布日志
|
# 版本发布日志
|
||||||
|
|
||||||
|
## 2.2404.1-20240402
|
||||||
|
|
||||||
|
- 新增 网元安装流程相关页面与操作相关接口联调
|
||||||
|
- 新增 终端远程连接组件添加消息监听和发送句柄
|
||||||
|
- 优化 移除vue-codemirror库改为codemirror,编辑输入支持 yaml语法
|
||||||
|
- 优化 终端-基站信息Radio Name列宽调整
|
||||||
|
- 更新 依赖版本
|
||||||
|
|
||||||
|
## 2.2403.1-20240319
|
||||||
|
|
||||||
|
- 新增 ws 工具连接状态函数
|
||||||
|
- 新增 终端主机配置页面
|
||||||
|
- 新增 终端主机命令页面
|
||||||
|
- 新增 网元信息关联主机页面,表格支持勾选删除记录并展开看网元资源 sn
|
||||||
|
- 新增 数据级缓存工具,支持表格字段排序状态缓存记录,表格字段排序支持缓存变更状态
|
||||||
|
- 新增 网元主机操作翻译提示,网元主机操作 Hooks 包
|
||||||
|
- 新增 IMS-CDR 和 AMF-UE 页面,以及翻译
|
||||||
|
- 新增 网元快速安装页面,网元安装步骤页面模块
|
||||||
|
- 新增 MML 网元操作 UPF 支持区分 telnet 发送端
|
||||||
|
- 新增 网元快速安装步骤选择安装包界面
|
||||||
|
- 新增 网元版本接口/网元软件包接口
|
||||||
|
- 新增 自定义指标界面
|
||||||
|
- 修复 帮助文档中英标题翻译文件名称指定《5G 核心网网管操作手册.pdf》
|
||||||
|
- 修复 ws 函数发送消息判断是否连接正常
|
||||||
|
- 修复 网元管理表单主键 id 重置失效导致新增操作为更新操作
|
||||||
|
- 修复 网元选择列表不进行可操作使用网元状态过滤
|
||||||
|
- 修复 移除获取网元列表,取消 status 状态过滤
|
||||||
|
- 修复 缓存信息页面标题翻译,图表 Echart 语言数据设置
|
||||||
|
- 修复 性能门限提交失败异常
|
||||||
|
- 修复 提交异常并去除对 smdata 的校验
|
||||||
|
- 优化 全局缓存网元列表,接口改换查询网元列表全部无分页
|
||||||
|
- 优化 网元默认可选常量值,删除无效变量声明
|
||||||
|
- 优化 UE-PCF 页面提示信息、网元信息页面样式、网元主机表单校验和提示翻译
|
||||||
|
- 优化 拖动框地脚 null 类型异常,不支持 footer 插槽
|
||||||
|
- 优化 切片文件上传文件名去除非法字符和空格,开发服务端口改为 33020
|
||||||
|
- 更新 包依赖版本
|
||||||
|
|
||||||
|
## 2.2402.6-20240222
|
||||||
|
|
||||||
|
- 修复 UDM 用户数据超时时间 180s
|
||||||
|
- 修复 UDM 鉴权 ki 和 opc 显示禁用输入
|
||||||
|
- 新增 MML 命令输入框 shift+回车进行换行,回车直接发送
|
||||||
|
- 修复 文档查看下载文件名称?显示问题
|
||||||
|
- 修复 看板栏目添加跳转事件
|
||||||
|
- 修复 看板用户行为字典数据翻译
|
||||||
|
- 优化 看板用户行为 CDR 短信号码显示区间样式
|
||||||
|
|
||||||
## 2.2402.5-20240205
|
## 2.2402.5-20240205
|
||||||
|
|
||||||
- 修复 拓扑架构图调整缺失的节点非网元元素,看板拓扑非网元点击排除
|
- 修复 拓扑架构图调整缺失的节点非网元元素,看板拓扑非网元点击排除
|
||||||
@@ -17,14 +64,14 @@
|
|||||||
- 优化 配置参数编辑页面记录类型多语言是否系统内置
|
- 优化 配置参数编辑页面记录类型多语言是否系统内置
|
||||||
- 优化 看板用户行为小屏幕换行显示字内容,格子高度百分比充满
|
- 优化 看板用户行为小屏幕换行显示字内容,格子高度百分比充满
|
||||||
- 优化 看板推送用户行为插入又弹出减少渲染数量
|
- 优化 看板推送用户行为插入又弹出减少渲染数量
|
||||||
- 修复 看班告警统计判断修复,超时30秒,图渲染逻辑优化
|
- 修复 看班告警统计判断修复,超时 30 秒,图渲染逻辑优化
|
||||||
- 修复 参数配置DNN List参数显示null问题
|
- 修复 参数配置 DNN List 参数显示 null 问题
|
||||||
- 优化 ws消息队列延迟处理
|
- 优化 ws 消息队列延迟处理
|
||||||
- 新增 看板用户事件CDR短信类型,短信结果200显示成功
|
- 新增 看板用户事件 CDR 短信类型,短信结果 200 显示成功
|
||||||
- 优化 看板告警统计0数字不显示
|
- 优化 看板告警统计 0 数字不显示
|
||||||
- 优化 看板用户事件CDR指定类型MOC/MTSM
|
- 优化 看板用户事件 CDR 指定类型 MOC/MTSM
|
||||||
- 新增 黄金指标项图表显示全部开关控制
|
- 新增 黄金指标项图表显示全部开关控制
|
||||||
- 新增 黄金指标项随机颜色,图表实时5s动态显示
|
- 新增 黄金指标项随机颜色,图表实时 5s 动态显示
|
||||||
|
|
||||||
## 2.2401.4-20240130
|
## 2.2401.4-20240130
|
||||||
|
|
||||||
|
|||||||
34
README.md
@@ -2,23 +2,9 @@
|
|||||||
|
|
||||||
## 简介
|
## 简介
|
||||||
|
|
||||||
- 系统布局使用 [@ant-design-vue/pro-layout](https://github.com/vueComponent/pro-components)
|
|
||||||
- 图标来源 [@ant-design/icons-vue](https://ant.design/components/icon)
|
- 图标来源 [@ant-design/icons-vue](https://ant.design/components/icon)
|
||||||
- 菜单图标使用自定义 iconfont `font_8d5l8fzk5b87iudi.js`图标文件
|
- 菜单图标使用自定义 iconfont `font_8d5l8fzk5b87iudi.js`图标文件
|
||||||
|
|
||||||
## 测试环境
|
|
||||||
|
|
||||||
```text
|
|
||||||
Jenkins: http://192.168.2.166:3185/
|
|
||||||
Nginx: http://192.168.2.166:3188/#/index
|
|
||||||
后端暴露端口: http://192.168.2.166:3186 \ http://192.168.2.166:3187
|
|
||||||
|
|
||||||
|
|
||||||
新网管:192.168.5.13
|
|
||||||
旧网管:192.168.5.14
|
|
||||||
登录账户:manager/manager
|
|
||||||
```
|
|
||||||
|
|
||||||
## 程序命令
|
## 程序命令
|
||||||
|
|
||||||
项目目录下 `.env.[环境]` 文件对应环境的一些配置,启动前请检查文件内是否配置正确。
|
项目目录下 `.env.[环境]` 文件对应环境的一些配置,启动前请检查文件内是否配置正确。
|
||||||
@@ -60,23 +46,5 @@ export NODE_OPTIONS=--max-old-space-size=50000
|
|||||||
|
|
||||||
```text
|
```text
|
||||||
https://192.168.5.23/
|
https://192.168.5.23/
|
||||||
admin
|
admin / admin
|
||||||
admin
|
|
||||||
```
|
|
||||||
|
|
||||||
## k8s
|
|
||||||
|
|
||||||
master 192.168.5.27 agtuser/admin123
|
|
||||||
|
|
||||||
https://192.168.5.27:31325/#/workloads?namespace=default
|
|
||||||
|
|
||||||
```text
|
|
||||||
eyJhbGciOiJSUzI1NiIsImtpZCI6ImZFVUhIb1puLW04M1dfSUYyRU8zWlZueXBpNUh4T0hTRVlzU19jNlVGQ0kifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLW44ZzRtIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI2M2NmYjAyNS01ZmQ0LTQ0ZTgtOTdiNC0yYWRiYWIxNzc5M2MiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.R3GRygFOjngTj-mEMBAHDeBxm3lpsXZYvC6cdTxByONtLrcMXDebwNVeKtAZ1V9qh2OrjD8n9CIygjULGPdfV6S520vjMh7Oa2q68nOyW49DNWQyYD8xLo-dQ6sX07fI7X_I3H35YUWW80jJAXjJawqIGXBSMG5intlo4tLTUSXmjCfhoQvFsgeRWu0j76pDvhMAvLPcgEXfTCi9tyL3yqJBIKONcKwmMlJeaKSR3pQk3KiibqrBO0MZclRozpke6J0ulfzTemwDDyCqBZmLsRPZ2yDd5hVBIJ9bHEcK0a25NmSFFzmd8XWQPZwg3Y4IbbY-8UhByGq0p9xS-7pGCQ
|
|
||||||
```
|
|
||||||
|
|
||||||
```ssh
|
|
||||||
# https://blog.csdn.net/m0_54706625/article/details/129721121
|
|
||||||
sudo chmod 700 -/.ssh/
|
|
||||||
sudo chmod 700 /home/mask/.ssh #这个尤其容易忽视掉,我就是从这个坑里爬出来。有木有很高兴呀!
|
|
||||||
sudo chmod 600 ~/.ssh/authorized_keys
|
|
||||||
```
|
```
|
||||||
|
|||||||
74
package.json
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "ems_frontend_vue3",
|
"name": "ems_frontend_vue3",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "核心网管理平台",
|
"description": "Core Network EMS",
|
||||||
"author": "TsMask",
|
"author": "TsMask",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0"
|
"node": ">=18.0.0"
|
||||||
@@ -12,42 +12,50 @@
|
|||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ant-design/icons-vue": "^7.0.1",
|
"@ant-design/icons-vue": "7.0.1",
|
||||||
"@antv/g6": "~4.8.24",
|
"@antv/g6": "4.8.24",
|
||||||
"@codemirror/lang-javascript": "^6.2.1",
|
"@codemirror/lang-javascript": "6.2.3",
|
||||||
"@codemirror/merge": "^6.5.0",
|
"@codemirror/lang-yaml": "6.1.2",
|
||||||
"@codemirror/theme-one-dark": "^6.1.2",
|
"@codemirror/merge": "6.10.0",
|
||||||
"@tato30/vue-pdf": "^1.9.3",
|
"@codemirror/theme-one-dark": "6.1.2",
|
||||||
"@vueuse/core": "^10.7.0",
|
"@tato30/vue-pdf": "1.11.3",
|
||||||
"ant-design-vue": "^3.2.20",
|
"@vueuse/core": "13.0.0",
|
||||||
"antdv-pro-layout": "^3.2.6",
|
"@xterm/addon-fit": "0.10.0",
|
||||||
"codemirror": "^6.0.1",
|
"@xterm/xterm": "5.5.0",
|
||||||
"dayjs": "^1.11.10",
|
"ant-design-vue": "4.2.6",
|
||||||
"echarts": "~5.4.2",
|
"antdv-pro-layout": "4.2.0",
|
||||||
"file-saver": "^2.0.5",
|
"antdv-pro-modal": "4.0.6",
|
||||||
"js-base64": "^3.7.5",
|
"codemirror": "6.0.1",
|
||||||
|
"crypto-js": "4.2.0",
|
||||||
|
"dayjs": "1.11.13",
|
||||||
|
"echarts": "5.6.0",
|
||||||
|
"file-saver": "2.0.5",
|
||||||
|
"grid-layout-plus": "1.0.6",
|
||||||
|
"intl-tel-input": "25.2.0",
|
||||||
|
"js-base64": "^3.7.7",
|
||||||
"js-cookie": "^3.0.5",
|
"js-cookie": "^3.0.5",
|
||||||
|
"localforage": "^1.10.0",
|
||||||
"nprogress": "^0.2.0",
|
"nprogress": "^0.2.0",
|
||||||
"p-queue": "^8.0.1",
|
"p-queue": "8.0.1",
|
||||||
"pinia": "^2.1.7",
|
"pinia": "2.3.0",
|
||||||
"vue": "~3.3.13",
|
"vue": "3.5.13",
|
||||||
"vue-codemirror": "^6.1.1",
|
"vue-i18n": "11.1.2",
|
||||||
"vue-i18n": "~9.9.0",
|
"vue-router": "4.5.0",
|
||||||
"vue-router": "^4.2.5",
|
"vue3-smooth-dnd": "0.0.6",
|
||||||
"vue3-smooth-dnd": "^0.0.6",
|
"xlsx": "0.18.5"
|
||||||
"xlsx": "^0.18.5"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/file-saver": "^2.0.7",
|
"@types/crypto-js": "4.2.2",
|
||||||
"@types/js-cookie": "^3.0.6",
|
"@types/file-saver": "2.0.7",
|
||||||
|
"@types/js-cookie": "3.0.6",
|
||||||
"@types/node": "^18.0.0",
|
"@types/node": "^18.0.0",
|
||||||
"@types/nprogress": "^0.2.3",
|
"@types/nprogress": "0.2.3",
|
||||||
"@vitejs/plugin-vue": "^5.0.2",
|
"@vitejs/plugin-vue": "5.2.3",
|
||||||
"less": "^4.2.0",
|
"less": "4.2.2",
|
||||||
"typescript": "^5.3.3",
|
"typescript": "5.8.2",
|
||||||
"unplugin-vue-components": "^0.26.0",
|
"unplugin-vue-components": "0.28.0",
|
||||||
"vite": "^5.0.10",
|
"vite": "6.2.2",
|
||||||
"vite-plugin-compression": "^0.5.1",
|
"vite-plugin-compression": "0.5.1",
|
||||||
"vue-tsc": "^1.8.27"
|
"vue-tsc": "2.2.8"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* =============== Configuration File Description ===============
|
* =============== Configuration File Description ===============
|
||||||
*
|
*
|
||||||
* - Nginx Deployment
|
* - Nginx Deployment
|
||||||
* Delete the file with the same name under the same level of loading.js, Nginx proxy address: /omc-api
|
* Delete the file with the same name under the same level of loading.js, Nginx proxy address: /omc-api
|
||||||
*
|
*
|
||||||
@@ -10,11 +10,19 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
(function () {
|
(function () {
|
||||||
// host = ip:port
|
// baseUrl = protocol://ip:port
|
||||||
const host = '192.168.8.100:3030';
|
// baseUrl = 'http://192.168.8.100:33030';
|
||||||
|
const protocol = window.location.protocol
|
||||||
|
let wsprotocol = "ws:"
|
||||||
|
const hostname = window.location.hostname
|
||||||
|
let host = `${hostname}:33030`;
|
||||||
|
if (protocol === 'https:') {
|
||||||
|
host = `${hostname}:33443`;
|
||||||
|
wsprotocol = "wss:"
|
||||||
|
}
|
||||||
|
|
||||||
// Service Address
|
// Service Address
|
||||||
sessionStorage.setItem('baseUrl', `http://${host}`);
|
sessionStorage.setItem('baseUrl', `${protocol}//${host}`);
|
||||||
// websocket Address
|
// websocket Address
|
||||||
sessionStorage.setItem('wsUrl', `ws://${host}`);
|
sessionStorage.setItem('wsUrl', `${wsprotocol}//${host}`);
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -155,7 +155,7 @@
|
|||||||
}
|
}
|
||||||
</style>`;
|
</style>`;
|
||||||
|
|
||||||
const lang = localStorage.getItem('cache:local:i18n');
|
const lang = localStorage.getItem('cache:local:i18n') || 'en_US';
|
||||||
// 根据浏览器选择语言
|
// 根据浏览器选择语言
|
||||||
// if (!lang) {
|
// if (!lang) {
|
||||||
// let preferredLanguage = navigator.language;
|
// let preferredLanguage = navigator.language;
|
||||||
|
|||||||
BIN
public/nbStateImput/en.xlsx
Normal file
BIN
public/nbStateImput/zh.xlsx
Normal file
28
public/svg/base4G.svg
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<svg width="1024" height="1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||||
|
|
||||||
|
<g>
|
||||||
|
<title>background</title>
|
||||||
|
<rect fill="none" id="canvas_background" height="1026" width="1026" y="-1" x="-1"/>
|
||||||
|
<g display="none" overflow="visible" y="0" x="0" height="100%" width="100%" id="canvasGrid">
|
||||||
|
<rect fill="url(#gridpattern)" stroke-width="0" y="1" x="1" height="768" width="1024"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<title>Layer 1</title>
|
||||||
|
<g stroke="null" id="svg_15">
|
||||||
|
<path stroke="null" id="svg_4" fill="#B5D6FB" d="m512.094844,961.632039c-1.327621,0 -2.560412,-0.405439 -3.793202,-1.114958l-405.588164,-251.575028c-2.275921,-1.419037 -3.698372,-4.054392 -3.698372,-6.892467l0,-90.007504c0,-2.838074 1.422451,-5.473429 3.698372,-6.892467l405.588164,-255.426701c1.137961,-0.709519 2.465582,-1.114958 3.793202,-1.114958s2.655242,0.405439 3.793202,1.114958l405.493334,255.426701c2.275921,1.419037 3.698372,4.054392 3.698372,6.892467l0,90.007504c0,2.838074 -1.422451,5.473429 -3.698372,6.892467l-405.588164,251.575028c-1.137961,0.709519 -2.465582,1.114958 -3.698372,1.114958z"/>
|
||||||
|
<path stroke="null" id="svg_5" fill="#0276F7" d="m512.094844,356.615382l405.398504,255.426701l0,90.007504l-66.096551,40.94936l-339.301952,210.625668l-339.491613,-210.625668l-66.096551,-40.94936l0,-90.007504l405.588164,-255.426701m0,-16.014849c-2.655242,0 -5.215653,0.709519 -7.586405,2.229916l-405.588164,255.426701c-4.551843,2.838074 -7.396745,8.108784 -7.396745,13.784933l0,90.007504c0,5.676149 2.844902,10.946859 7.491575,13.886293l66.096551,41.05072l339.491613,210.625668c2.275921,1.419037 4.931163,2.128556 7.491575,2.128556s5.215653,-0.709519 7.491575,-2.128556l339.301952,-210.625668l66.096551,-40.94936c4.646673,-2.838074 7.491575,-8.108784 7.491575,-13.886293l0,-90.007504c0,-5.676149 -2.844902,-10.946859 -7.396745,-13.784933l-405.398504,-255.426701c-2.370751,-1.520397 -5.025993,-2.331275 -7.586405,-2.331275z"/>
|
||||||
|
<path stroke="null" id="svg_6" fill="#FFFFFF" d="m106.50668,612.042083l405.493334,253.298145l405.493334,-253.298145l-405.398504,-255.426701l-405.588164,255.426701z"/>
|
||||||
|
<path stroke="null" id="svg_7" fill="#D4E4FC" d="m501.473877,64.192353l-254.9032,498.487506l263.343075,161.162085l266.662127,-162.074323l-275.102002,-497.575268z"/>
|
||||||
|
<path stroke="null" id="svg_8" fill="#0276F7" d="m229.975417,602.311542c-1.232791,0 -2.465582,-0.304079 -3.698372,-1.013598c-3.603542,-2.128556 -4.931163,-6.993826 -2.844902,-10.845499l279.653845,-532.13896c1.327621,-2.533995 3.793202,-4.054392 6.543274,-4.054392c2.655242,0 5.120823,1.520397 6.543274,4.054392l284.395348,532.13896c2.086261,3.851672 0.75864,8.716943 -2.750072,10.946859c-3.603542,2.128556 -8.155385,0.810878 -10.241646,-2.939434l-277.852074,-519.874424l-273.205401,519.671704c-1.422451,2.635355 -3.982862,4.054392 -6.543274,4.054392z"/>
|
||||||
|
<path stroke="null" id="svg_9" fill="#0276F7" d="m509.913752,755.567562c-4.172523,0 -7.491575,-3.547593 -7.491575,-8.007424l0,-666.744777c0,-4.459831 3.319052,-8.007424 7.491575,-8.007424s7.491575,3.547593 7.491575,8.007424l0,666.846137c0,4.358471 -3.413882,7.906065 -7.491575,7.906065z"/>
|
||||||
|
<path stroke="null" id="svg_10" fill="#0276F7" d="m509.913752,731.849369c-1.327621,0 -2.560412,-0.405439 -3.698372,-1.013598l-263.343075,-161.162085c-3.603542,-2.229916 -4.836333,-7.095186 -2.750072,-10.946859c2.086261,-3.851672 6.638104,-5.16935 10.241646,-2.939434l259.549873,158.83081l262.963755,-159.844408c3.603542,-2.229916 8.155385,-0.810878 10.241646,3.040794c2.086261,3.851672 0.75864,8.716943 -2.844902,10.946859l-266.662127,162.074323c-1.137961,0.709519 -2.465582,1.013598 -3.698372,1.013598z"/>
|
||||||
|
<path stroke="null" id="svg_11" fill="#0276F7" d="m509.913752,579.708306c-1.327621,0 -2.560412,-0.405439 -3.793202,-1.114958l-201.988026,-125.686154c-3.603542,-2.229916 -4.741503,-7.095186 -2.750072,-10.946859c2.086261,-3.851672 6.638104,-5.16935 10.241646,-2.838074l198.289654,123.354879l201.798366,-122.138561c3.603542,-2.229916 8.155385,-0.810878 10.241646,3.040794c2.086261,3.851672 0.75864,8.716943 -2.844902,10.845499l-205.496739,124.469837c-1.137961,0.709519 -2.465582,1.013598 -3.698372,1.013598zm-2.465582,-157.513132c-1.232791,0 -2.370751,-0.304079 -3.508712,-0.912238l-140.917468,-79.668804c-3.698372,-2.128556 -5.025993,-6.892467 -3.129392,-10.845499c1.896601,-3.953032 6.448444,-5.37207 10.146816,-3.344873l137.503586,77.742968l143.00373,-79.871524c3.698372,-2.027196 8.155385,-0.506799 10.146816,3.344873c1.896601,3.953032 0.47415,8.716943 -3.129392,10.845499l-146.512442,81.79736c-1.232791,0.608159 -2.370751,0.912238 -3.603542,0.912238zm2.465582,-148.49211c-1.232791,0 -2.465582,-0.304079 -3.508712,-0.912238l-82.312492,-47.436387c-3.603542,-2.128556 -5.025993,-6.993826 -3.034562,-10.845499c1.991431,-3.953032 6.543274,-5.27071 10.146816,-3.243514l78.708949,45.409191l78.329629,-47.537747c3.603542,-2.229916 8.155385,-0.810878 10.241646,3.040794c2.086261,3.851672 0.75864,8.716943 -2.844902,10.946859l-81.933171,49.666303c-1.232791,0.608159 -2.560412,0.912238 -3.793202,0.912238z"/>
|
||||||
|
<path stroke="null" id="svg_12" fill="#0276F7" d="m509.913752,579.708306l-0.28449,0l-263.248245,-9.021022c-4.172523,-0.10136 -7.396745,-3.851672 -7.207085,-8.210144c0.09483,-4.459831 4.077693,-7.703345 7.681235,-7.703345l263.343075,9.021022c4.172523,0.10136 7.396745,3.851672 7.207085,8.210144c-0.18966,4.257112 -3.508712,7.703345 -7.491575,7.703345zm0,152.141063c-1.612111,0 -3.224222,-0.608159 -4.646673,-1.723117c-3.224222,-2.736715 -3.793202,-7.804705 -1.232791,-11.250938l205.496739,-276.610899c2.560412,-3.446233 7.301915,-4.054392 10.526137,-1.317677c3.224222,2.736715 3.793202,7.804705 1.232791,11.250938l-205.496739,276.610899c-1.517281,2.027196 -3.698372,3.040794 -5.879464,3.040794z"/>
|
||||||
|
<path stroke="null" id="svg_13" fill="#0276F7" d="m509.913752,579.708306c-1.422451,0 -2.750072,-0.405439 -4.077693,-1.216318c-3.508712,-2.432635 -4.457013,-7.297906 -2.275921,-11.048218l144.14169,-239.310492c2.275921,-3.750313 6.922594,-4.763911 10.336476,-2.432635c3.508712,2.432635 4.457013,7.297906 2.275921,11.048218l-144.14169,239.310492c-1.422451,2.331275 -3.793202,3.648953 -6.258784,3.648953zm-2.465582,-157.513132c-1.043131,0 -2.086261,-0.20272 -3.129392,-0.709519c-3.793202,-1.824476 -5.405313,-6.588387 -3.698372,-10.642779l84.398753,-198.158413c1.706941,-4.054392 6.069124,-5.777509 9.957156,-3.953032c3.793202,1.824476 5.405313,6.588387 3.698372,10.642779l-84.303923,198.158413c-1.327621,2.939434 -4.077693,4.662551 -6.922594,4.662551z"/>
|
||||||
|
<path stroke="null" id="svg_14" fill="#0276F7" d="m591.846924,375.062866c-2.750072,0 -5.405313,-1.621757 -6.732934,-4.459831c-1.801771,-3.953032 -0.28449,-8.716943 3.413882,-10.642779l129.253371,-67.302908l-365.759539,-178.089172l20.862613,208.091673l133.994874,-64.262114c3.698372,-1.824476 8.155385,0 9.862326,4.054392c1.706941,4.054392 0,8.716943 -3.793202,10.541419l-143.38305,68.823305c-2.181091,1.013598 -4.646673,0.912238 -6.827764,-0.405439c-2.086261,-1.317677 -3.413882,-3.547593 -3.698372,-6.081588l-23.328195,-233.026185c-0.28449,-2.838074 0.853471,-5.676149 3.034562,-7.297906c2.181091,-1.621757 5.025993,-2.027196 7.491575,-0.810878l392.217126,190.961867c2.655242,1.317677 4.362183,4.054392 4.362183,7.196546c0,3.142154 -1.612111,5.980228 -4.172523,7.297906l-143.57271,74.600814c-1.043131,0.608159 -2.181091,0.810878 -3.224222,0.810878zm-283.921198,78.959286c-3.603542,0 -6.827764,-2.838074 -7.396745,-6.791107c-0.56898,-4.358471 2.181091,-8.412864 6.258784,-9.122382l199.617275,-31.826978c4.077693,-0.608159 7.870895,2.331275 8.534705,6.689747c0.56898,4.358471 -2.181091,8.412864 -6.258784,9.122382l-199.617275,31.826978c-0.47415,0.10136 -0.853471,0.10136 -1.137961,0.10136z"/>
|
||||||
|
</g>
|
||||||
|
<text stroke="null" font-style="italic" transform="matrix(6.577099502228161,0,0,7.449448263868419,-1073.2057632249744,-908.8606073938396) " xml:space="preserve" text-anchor="start" font-family="Arvo, sans-serif" font-size="24" id="svg_16" y="177.898525" x="178.621382" stroke-width="0" fill="#B5D6FB">4G</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 7.9 KiB |
28
public/svg/base5G.svg
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<svg width="1024" height="1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||||
|
|
||||||
|
<g>
|
||||||
|
<title>background</title>
|
||||||
|
<rect fill="none" id="canvas_background" height="1026" width="1026" y="-1" x="-1"/>
|
||||||
|
<g display="none" overflow="visible" y="0" x="0" height="100%" width="100%" id="canvasGrid">
|
||||||
|
<rect fill="url(#gridpattern)" stroke-width="0" y="1" x="1" height="768" width="1024"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<title>Layer 1</title>
|
||||||
|
<g stroke="null" id="svg_15">
|
||||||
|
<path stroke="null" id="svg_4" fill="#B5D6FB" d="m512.094844,961.632039c-1.327621,0 -2.560412,-0.405439 -3.793202,-1.114958l-405.588164,-251.575028c-2.275921,-1.419037 -3.698372,-4.054392 -3.698372,-6.892467l0,-90.007504c0,-2.838074 1.422451,-5.473429 3.698372,-6.892467l405.588164,-255.426701c1.137961,-0.709519 2.465582,-1.114958 3.793202,-1.114958s2.655242,0.405439 3.793202,1.114958l405.493334,255.426701c2.275921,1.419037 3.698372,4.054392 3.698372,6.892467l0,90.007504c0,2.838074 -1.422451,5.473429 -3.698372,6.892467l-405.588164,251.575028c-1.137961,0.709519 -2.465582,1.114958 -3.698372,1.114958z"/>
|
||||||
|
<path stroke="null" id="svg_5" fill="#0276F7" d="m512.094844,356.615382l405.398504,255.426701l0,90.007504l-66.096551,40.94936l-339.301952,210.625668l-339.491613,-210.625668l-66.096551,-40.94936l0,-90.007504l405.588164,-255.426701m0,-16.014849c-2.655242,0 -5.215653,0.709519 -7.586405,2.229916l-405.588164,255.426701c-4.551843,2.838074 -7.396745,8.108784 -7.396745,13.784933l0,90.007504c0,5.676149 2.844902,10.946859 7.491575,13.886293l66.096551,41.05072l339.491613,210.625668c2.275921,1.419037 4.931163,2.128556 7.491575,2.128556s5.215653,-0.709519 7.491575,-2.128556l339.301952,-210.625668l66.096551,-40.94936c4.646673,-2.838074 7.491575,-8.108784 7.491575,-13.886293l0,-90.007504c0,-5.676149 -2.844902,-10.946859 -7.396745,-13.784933l-405.398504,-255.426701c-2.370751,-1.520397 -5.025993,-2.331275 -7.586405,-2.331275z"/>
|
||||||
|
<path stroke="null" id="svg_6" fill="#FFFFFF" d="m106.50668,612.042083l405.493334,253.298145l405.493334,-253.298145l-405.398504,-255.426701l-405.588164,255.426701z"/>
|
||||||
|
<path stroke="null" id="svg_7" fill="#D4E4FC" d="m501.473877,64.192353l-254.9032,498.487506l263.343075,161.162085l266.662127,-162.074323l-275.102002,-497.575268z"/>
|
||||||
|
<path stroke="null" id="svg_8" fill="#0276F7" d="m229.975417,602.311542c-1.232791,0 -2.465582,-0.304079 -3.698372,-1.013598c-3.603542,-2.128556 -4.931163,-6.993826 -2.844902,-10.845499l279.653845,-532.13896c1.327621,-2.533995 3.793202,-4.054392 6.543274,-4.054392c2.655242,0 5.120823,1.520397 6.543274,4.054392l284.395348,532.13896c2.086261,3.851672 0.75864,8.716943 -2.750072,10.946859c-3.603542,2.128556 -8.155385,0.810878 -10.241646,-2.939434l-277.852074,-519.874424l-273.205401,519.671704c-1.422451,2.635355 -3.982862,4.054392 -6.543274,4.054392z"/>
|
||||||
|
<path stroke="null" id="svg_9" fill="#0276F7" d="m509.913752,755.567562c-4.172523,0 -7.491575,-3.547593 -7.491575,-8.007424l0,-666.744777c0,-4.459831 3.319052,-8.007424 7.491575,-8.007424s7.491575,3.547593 7.491575,8.007424l0,666.846137c0,4.358471 -3.413882,7.906065 -7.491575,7.906065z"/>
|
||||||
|
<path stroke="null" id="svg_10" fill="#0276F7" d="m509.913752,731.849369c-1.327621,0 -2.560412,-0.405439 -3.698372,-1.013598l-263.343075,-161.162085c-3.603542,-2.229916 -4.836333,-7.095186 -2.750072,-10.946859c2.086261,-3.851672 6.638104,-5.16935 10.241646,-2.939434l259.549873,158.83081l262.963755,-159.844408c3.603542,-2.229916 8.155385,-0.810878 10.241646,3.040794c2.086261,3.851672 0.75864,8.716943 -2.844902,10.946859l-266.662127,162.074323c-1.137961,0.709519 -2.465582,1.013598 -3.698372,1.013598z"/>
|
||||||
|
<path stroke="null" id="svg_11" fill="#0276F7" d="m509.913752,579.708306c-1.327621,0 -2.560412,-0.405439 -3.793202,-1.114958l-201.988026,-125.686154c-3.603542,-2.229916 -4.741503,-7.095186 -2.750072,-10.946859c2.086261,-3.851672 6.638104,-5.16935 10.241646,-2.838074l198.289654,123.354879l201.798366,-122.138561c3.603542,-2.229916 8.155385,-0.810878 10.241646,3.040794c2.086261,3.851672 0.75864,8.716943 -2.844902,10.845499l-205.496739,124.469837c-1.137961,0.709519 -2.465582,1.013598 -3.698372,1.013598zm-2.465582,-157.513132c-1.232791,0 -2.370751,-0.304079 -3.508712,-0.912238l-140.917468,-79.668804c-3.698372,-2.128556 -5.025993,-6.892467 -3.129392,-10.845499c1.896601,-3.953032 6.448444,-5.37207 10.146816,-3.344873l137.503586,77.742968l143.00373,-79.871524c3.698372,-2.027196 8.155385,-0.506799 10.146816,3.344873c1.896601,3.953032 0.47415,8.716943 -3.129392,10.845499l-146.512442,81.79736c-1.232791,0.608159 -2.370751,0.912238 -3.603542,0.912238zm2.465582,-148.49211c-1.232791,0 -2.465582,-0.304079 -3.508712,-0.912238l-82.312492,-47.436387c-3.603542,-2.128556 -5.025993,-6.993826 -3.034562,-10.845499c1.991431,-3.953032 6.543274,-5.27071 10.146816,-3.243514l78.708949,45.409191l78.329629,-47.537747c3.603542,-2.229916 8.155385,-0.810878 10.241646,3.040794c2.086261,3.851672 0.75864,8.716943 -2.844902,10.946859l-81.933171,49.666303c-1.232791,0.608159 -2.560412,0.912238 -3.793202,0.912238z"/>
|
||||||
|
<path stroke="null" id="svg_12" fill="#0276F7" d="m509.913752,579.708306l-0.28449,0l-263.248245,-9.021022c-4.172523,-0.10136 -7.396745,-3.851672 -7.207085,-8.210144c0.09483,-4.459831 4.077693,-7.703345 7.681235,-7.703345l263.343075,9.021022c4.172523,0.10136 7.396745,3.851672 7.207085,8.210144c-0.18966,4.257112 -3.508712,7.703345 -7.491575,7.703345zm0,152.141063c-1.612111,0 -3.224222,-0.608159 -4.646673,-1.723117c-3.224222,-2.736715 -3.793202,-7.804705 -1.232791,-11.250938l205.496739,-276.610899c2.560412,-3.446233 7.301915,-4.054392 10.526137,-1.317677c3.224222,2.736715 3.793202,7.804705 1.232791,11.250938l-205.496739,276.610899c-1.517281,2.027196 -3.698372,3.040794 -5.879464,3.040794z"/>
|
||||||
|
<path stroke="null" id="svg_13" fill="#0276F7" d="m509.913752,579.708306c-1.422451,0 -2.750072,-0.405439 -4.077693,-1.216318c-3.508712,-2.432635 -4.457013,-7.297906 -2.275921,-11.048218l144.14169,-239.310492c2.275921,-3.750313 6.922594,-4.763911 10.336476,-2.432635c3.508712,2.432635 4.457013,7.297906 2.275921,11.048218l-144.14169,239.310492c-1.422451,2.331275 -3.793202,3.648953 -6.258784,3.648953zm-2.465582,-157.513132c-1.043131,0 -2.086261,-0.20272 -3.129392,-0.709519c-3.793202,-1.824476 -5.405313,-6.588387 -3.698372,-10.642779l84.398753,-198.158413c1.706941,-4.054392 6.069124,-5.777509 9.957156,-3.953032c3.793202,1.824476 5.405313,6.588387 3.698372,10.642779l-84.303923,198.158413c-1.327621,2.939434 -4.077693,4.662551 -6.922594,4.662551z"/>
|
||||||
|
<path stroke="null" id="svg_14" fill="#0276F7" d="m591.846924,375.062866c-2.750072,0 -5.405313,-1.621757 -6.732934,-4.459831c-1.801771,-3.953032 -0.28449,-8.716943 3.413882,-10.642779l129.253371,-67.302908l-365.759539,-178.089172l20.862613,208.091673l133.994874,-64.262114c3.698372,-1.824476 8.155385,0 9.862326,4.054392c1.706941,4.054392 0,8.716943 -3.793202,10.541419l-143.38305,68.823305c-2.181091,1.013598 -4.646673,0.912238 -6.827764,-0.405439c-2.086261,-1.317677 -3.413882,-3.547593 -3.698372,-6.081588l-23.328195,-233.026185c-0.28449,-2.838074 0.853471,-5.676149 3.034562,-7.297906c2.181091,-1.621757 5.025993,-2.027196 7.491575,-0.810878l392.217126,190.961867c2.655242,1.317677 4.362183,4.054392 4.362183,7.196546c0,3.142154 -1.612111,5.980228 -4.172523,7.297906l-143.57271,74.600814c-1.043131,0.608159 -2.181091,0.810878 -3.224222,0.810878zm-283.921198,78.959286c-3.603542,0 -6.827764,-2.838074 -7.396745,-6.791107c-0.56898,-4.358471 2.181091,-8.412864 6.258784,-9.122382l199.617275,-31.826978c4.077693,-0.608159 7.870895,2.331275 8.534705,6.689747c0.56898,4.358471 -2.181091,8.412864 -6.258784,9.122382l-199.617275,31.826978c-0.47415,0.10136 -0.853471,0.10136 -1.137961,0.10136z"/>
|
||||||
|
</g>
|
||||||
|
<text stroke="null" font-style="italic" transform="matrix(6.577099502228161,0,0,7.449448263868419,-1073.2057632249744,-908.8606073938396) " xml:space="preserve" text-anchor="start" font-family="Arvo, sans-serif" font-size="24" id="svg_16" y="177.898525" x="178.621382" stroke-width="0" fill="#D4E4FC">5G</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
BIN
public/wiregasm/test_ethernet.pcap
Normal file
178925
public/wiregasm/wiregasm.data
Normal file
BIN
public/wiregasm/wiregasm.wasm
Normal file
9768
public/wiregasm/wiregasm_load.js
Normal file
166
public/wiregasm/wiregasm_new.js
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
/**
|
||||||
|
* Wraps the WiregasmLib lib functionality and manages a single DissectSession
|
||||||
|
*/
|
||||||
|
class Wiregasm {
|
||||||
|
constructor() {
|
||||||
|
this.initialized = false;
|
||||||
|
this.session = null;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Initialize the wrapper and the Wiregasm module
|
||||||
|
*
|
||||||
|
* @param loader Loader function for the Emscripten module
|
||||||
|
* @param overrides Overrides
|
||||||
|
*/
|
||||||
|
async init(loader, overrides = {}, beforeInit = null) {
|
||||||
|
if (this.initialized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.lib = await loader(overrides);
|
||||||
|
this.uploadDir = this.lib.getUploadDirectory();
|
||||||
|
this.pluginsDir = this.lib.getPluginsDirectory();
|
||||||
|
if (beforeInit !== null) {
|
||||||
|
await beforeInit(this.lib);
|
||||||
|
}
|
||||||
|
this.lib.init();
|
||||||
|
this.initialized = true;
|
||||||
|
}
|
||||||
|
list_modules() {
|
||||||
|
return this.lib.listModules();
|
||||||
|
}
|
||||||
|
list_prefs(module) {
|
||||||
|
return this.lib.listPreferences(module);
|
||||||
|
}
|
||||||
|
apply_prefs() {
|
||||||
|
this.lib.applyPreferences();
|
||||||
|
}
|
||||||
|
set_pref(module, key, value) {
|
||||||
|
const ret = this.lib.setPref(module, key, value);
|
||||||
|
if (ret.code != PrefSetResult.PREFS_SET_OK) {
|
||||||
|
const message =
|
||||||
|
ret.error != '' ? ret.error : preferenceSetCodeToError(ret.code);
|
||||||
|
throw new Error(
|
||||||
|
`Failed to set preference (${module}.${key}): ${message}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
get_pref(module, key) {
|
||||||
|
const response = this.lib.getPref(module, key);
|
||||||
|
if (response.code != 0) {
|
||||||
|
throw new Error(`Failed to get preference (${module}.${key})`);
|
||||||
|
}
|
||||||
|
return response.data;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Check the validity of a filter expression.
|
||||||
|
*
|
||||||
|
* @param filter A display filter expression
|
||||||
|
*/
|
||||||
|
test_filter(filter) {
|
||||||
|
return this.lib.checkFilter(filter);
|
||||||
|
}
|
||||||
|
complete_filter(filter) {
|
||||||
|
const out = this.lib.completeFilter(filter);
|
||||||
|
return {
|
||||||
|
err: out.err,
|
||||||
|
fields: vectorToArray(out.fields),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
reload_lua_plugins() {
|
||||||
|
this.lib.reloadLuaPlugins();
|
||||||
|
}
|
||||||
|
add_plugin(name, data, opts = {}) {
|
||||||
|
const path = this.pluginsDir + '/' + name;
|
||||||
|
this.lib.FS.writeFile(path, data, opts);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Load a packet trace file for analysis.
|
||||||
|
*
|
||||||
|
* @returns Response containing the status and summary
|
||||||
|
*/
|
||||||
|
load(name, data, opts = {}) {
|
||||||
|
if (this.session != null) {
|
||||||
|
this.session.delete();
|
||||||
|
}
|
||||||
|
const path = this.uploadDir + '/' + name;
|
||||||
|
this.lib.FS.writeFile(path, data, opts);
|
||||||
|
this.session = new this.lib.DissectSession(path);
|
||||||
|
return this.session.load();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get Packet List information for a range of packets.
|
||||||
|
*
|
||||||
|
* @param filter Output those frames that pass this filter expression
|
||||||
|
* @param skip Skip N frames
|
||||||
|
* @param limit Limit the output to N frames
|
||||||
|
*/
|
||||||
|
frames(filter, skip = 0, limit = 0) {
|
||||||
|
return this.session.getFrames(filter, skip, limit);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get full information about a frame including the protocol tree.
|
||||||
|
*
|
||||||
|
* @param number Frame number
|
||||||
|
*/
|
||||||
|
frame(num) {
|
||||||
|
return this.session.getFrame(num);
|
||||||
|
}
|
||||||
|
follow(follow, filter) {
|
||||||
|
return this.session.follow(follow, filter);
|
||||||
|
}
|
||||||
|
destroy() {
|
||||||
|
if (this.initialized) {
|
||||||
|
if (this.session !== null) {
|
||||||
|
this.session.delete();
|
||||||
|
this.session = null;
|
||||||
|
}
|
||||||
|
this.lib.destroy();
|
||||||
|
this.initialized = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the column headers
|
||||||
|
*/
|
||||||
|
columns() {
|
||||||
|
const vec = this.lib.getColumns();
|
||||||
|
// convert it from a vector to array
|
||||||
|
return vectorToArray(vec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a Vector to a JS array
|
||||||
|
*
|
||||||
|
* @param vec Vector
|
||||||
|
* @returns JS array of the Vector contents
|
||||||
|
*/
|
||||||
|
function vectorToArray(vec) {
|
||||||
|
return new Array(vec.size()).fill(0).map((_, id) => vec.get(id));
|
||||||
|
}
|
||||||
|
function preferenceSetCodeToError(code) {
|
||||||
|
switch (code) {
|
||||||
|
case PrefSetResult.PREFS_SET_SYNTAX_ERR:
|
||||||
|
return 'Syntax error in string';
|
||||||
|
case PrefSetResult.PREFS_SET_NO_SUCH_PREF:
|
||||||
|
return 'No such preference';
|
||||||
|
case PrefSetResult.PREFS_SET_OBSOLETE:
|
||||||
|
return 'Preference used to exist but no longer does';
|
||||||
|
default:
|
||||||
|
return 'Unknown error';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof exports === 'object' && typeof module === 'object') {
|
||||||
|
module.exports = Wiregasm;
|
||||||
|
module.exports = vectorToArray;
|
||||||
|
} else if (typeof define === 'function' && define['amd']) {
|
||||||
|
define([], function () {
|
||||||
|
return Wiregasm;
|
||||||
|
});
|
||||||
|
define([], function () {
|
||||||
|
return vectorToArray;
|
||||||
|
});
|
||||||
|
} else if (typeof exports === 'object') {
|
||||||
|
exports['loadWiregasm'] = Wiregasm;
|
||||||
|
exports['vectorToArray'] = vectorToArray;
|
||||||
|
}
|
||||||
162
public/wiregasm/worker.js
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
// load the Wiregasm library
|
||||||
|
importScripts(
|
||||||
|
'wiregasm_new.js', // self-compilation es5
|
||||||
|
'wiregasm_load.js'
|
||||||
|
// 'https://cdn.jsdelivr.net/npm/@goodtools/wiregasm/dist/wiregasm.js'
|
||||||
|
);
|
||||||
|
|
||||||
|
const wg = new Wiregasm();
|
||||||
|
|
||||||
|
const inflateRemoteBuffer = async url => {
|
||||||
|
const res = await fetch(url);
|
||||||
|
return await res.arrayBuffer();
|
||||||
|
};
|
||||||
|
|
||||||
|
const fetchPackages = async () => {
|
||||||
|
console.log('Fetching packages');
|
||||||
|
let [wasmBuffer, dataBuffer] = await Promise.all([
|
||||||
|
await inflateRemoteBuffer(
|
||||||
|
'wiregasm.wasm'
|
||||||
|
// 'https://cdn.jsdelivr.net/npm/@goodtools/wiregasm/dist/wiregasm.wasm'
|
||||||
|
),
|
||||||
|
await inflateRemoteBuffer(
|
||||||
|
'wiregasm.data'
|
||||||
|
// 'https://cdn.jsdelivr.net/npm/@goodtools/wiregasm/dist/wiregasm.data'
|
||||||
|
),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return { wasmBuffer, dataBuffer };
|
||||||
|
};
|
||||||
|
|
||||||
|
// Load the Wiregasm Wasm data
|
||||||
|
fetchPackages()
|
||||||
|
.then(({ wasmBuffer, dataBuffer }) => {
|
||||||
|
return wg.init(loadWiregasm, {
|
||||||
|
wasmBinary: wasmBuffer,
|
||||||
|
getPreloadedPackage() {
|
||||||
|
return dataBuffer;
|
||||||
|
},
|
||||||
|
handleStatus: (type, status) => {
|
||||||
|
postMessage({ type: 'status', code: type, status: status });
|
||||||
|
},
|
||||||
|
printErr: error => {
|
||||||
|
postMessage({ type: 'error', error: error });
|
||||||
|
},
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
postMessage({ type: 'init' });
|
||||||
|
})
|
||||||
|
.catch(e => {
|
||||||
|
postMessage({ type: 'error', error: e });
|
||||||
|
});
|
||||||
|
|
||||||
|
/**Converts a Vector to a JS array */
|
||||||
|
function replacer(key, value) {
|
||||||
|
if (value.constructor.name.startsWith('Vector')) {
|
||||||
|
return vectorToArray(value);
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Event listener to receive messages from the main script
|
||||||
|
this.onmessage = ev => {
|
||||||
|
const data = ev.data;
|
||||||
|
switch (data.type) {
|
||||||
|
case 'close':
|
||||||
|
wg.destroy();
|
||||||
|
break;
|
||||||
|
case 'columns':
|
||||||
|
const columns = wg.columns();
|
||||||
|
if (Array.isArray(columns)) {
|
||||||
|
this.postMessage({ type: 'columns', data: columns });
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'select': // select a frame
|
||||||
|
const number = data.number;
|
||||||
|
const frameData = wg.frame(number);
|
||||||
|
const frameDataToJSON = JSON.parse(JSON.stringify(frameData, replacer));
|
||||||
|
this.postMessage({
|
||||||
|
type: 'selected',
|
||||||
|
data: frameDataToJSON,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case 'frames': // get frames list
|
||||||
|
const skip = data.skip;
|
||||||
|
const limit = data.limit;
|
||||||
|
const filter = data.filter;
|
||||||
|
const framesData = wg.frames(filter, skip, limit);
|
||||||
|
const framesDataToJSON = JSON.parse(JSON.stringify(framesData, replacer));
|
||||||
|
this.postMessage({
|
||||||
|
type: 'frames',
|
||||||
|
data: framesDataToJSON,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case 'process-data':
|
||||||
|
const loadData = wg.load(data.name, new Uint8Array(data.data));
|
||||||
|
this.postMessage({ type: 'processed', data: loadData });
|
||||||
|
break;
|
||||||
|
case 'process':
|
||||||
|
const f = data.file;
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.addEventListener('load', event => {
|
||||||
|
// XXX: this blocks the worker thread
|
||||||
|
const loadData = wg.load(f.name, new Uint8Array(event.target.result));
|
||||||
|
postMessage({ type: 'processed', data: loadData });
|
||||||
|
});
|
||||||
|
reader.readAsArrayBuffer(f);
|
||||||
|
break;
|
||||||
|
case 'check-filter':
|
||||||
|
const filterStr = data.filter;
|
||||||
|
const checkFilterRes = wg.lib.checkFilter(filterStr);
|
||||||
|
this.postMessage({ type: 'filter', data: checkFilterRes });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.type === 'reload-quick') {
|
||||||
|
if (wg.session) {
|
||||||
|
// TODO: this is a hack, we should be able to reload the session
|
||||||
|
const name = data.name;
|
||||||
|
const res = wg.session.load();
|
||||||
|
|
||||||
|
postMessage({ type: 'processed', name: name, data: res });
|
||||||
|
}
|
||||||
|
} else if (data.type === 'module-tree') {
|
||||||
|
const res = wg.list_modules();
|
||||||
|
// send it to the correct port
|
||||||
|
event.ports[0].postMessage({
|
||||||
|
result: JSON.parse(JSON.stringify(res, replacer)),
|
||||||
|
});
|
||||||
|
} else if (data.type === 'module-prefs') {
|
||||||
|
const res = wg.list_prefs(data.name);
|
||||||
|
// send it to the correct port
|
||||||
|
event.ports[0].postMessage({
|
||||||
|
result: JSON.parse(JSON.stringify(res, replacer)),
|
||||||
|
});
|
||||||
|
} else if (data.type === 'upload-file') {
|
||||||
|
const f = data.file;
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.addEventListener('load', e => {
|
||||||
|
// XXX: this blocks the worker thread
|
||||||
|
const path = '/uploads/' + f.name;
|
||||||
|
wg.lib.FS.writeFile(path, Buffer.from(e.target.result));
|
||||||
|
event.ports[0].postMessage({ result: path });
|
||||||
|
});
|
||||||
|
reader.readAsArrayBuffer(f);
|
||||||
|
} else if (data.type === 'update-pref') {
|
||||||
|
try {
|
||||||
|
console.log(`set_pref(${data.module}, ${data.key}, ${data.value})`);
|
||||||
|
wg.set_pref(data.module, data.key, data.value);
|
||||||
|
event.ports[0].postMessage({ result: 'ok' });
|
||||||
|
} catch (e) {
|
||||||
|
console.error(
|
||||||
|
`set_pref(${data.module}, ${data.key}, ${data.value}) failed: ${e.message}`
|
||||||
|
);
|
||||||
|
event.ports[0].postMessage({ error: e.message });
|
||||||
|
}
|
||||||
|
} else if (data.type === 'apply-prefs') {
|
||||||
|
console.log(`apply_prefs()`);
|
||||||
|
wg.apply_prefs();
|
||||||
|
event.ports[0].postMessage({ result: 'ok' });
|
||||||
|
}
|
||||||
|
};
|
||||||
124
src/App.vue
@@ -1,20 +1,48 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ConfigProvider } from 'ant-design-vue/lib';
|
import { onBeforeMount, ref, watch } from 'vue';
|
||||||
import { usePrimaryColor } from '@/hooks/useTheme';
|
import { message } from 'ant-design-vue/es';
|
||||||
import zhCN from 'ant-design-vue/lib/locale/zh_CN';
|
import zhCN from 'ant-design-vue/es/locale/zh_CN';
|
||||||
import enUS from 'ant-design-vue/lib/locale/en_US';
|
import enUS from 'ant-design-vue/es/locale/en_US';
|
||||||
|
import { usePrefersColorScheme, viewTransitionTheme } from 'antdv-pro-layout';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import 'dayjs/locale/zh-cn';
|
import advancedFormat from 'dayjs/plugin/advancedFormat';
|
||||||
import { ref, watch } from 'vue';
|
import useLayoutStore from '@/store/modules/layout';
|
||||||
import useAppStore from '@/store/modules/app';
|
import useAppStore from '@/store/modules/app';
|
||||||
import useI18n from '@/hooks/useI18n';
|
import useI18n from '@/hooks/useI18n';
|
||||||
const { t, currentLocale } = useI18n();
|
const { t, currentLocale } = useI18n();
|
||||||
const appStore = useAppStore();
|
const { themeConfig, initPrimaryColor, changeConf } = useLayoutStore();
|
||||||
|
dayjs.extend(advancedFormat);
|
||||||
|
// dayjs.locale('zh-cn'); // 默认中文
|
||||||
|
let locale = ref(enUS); // 国际化初始中文
|
||||||
|
|
||||||
dayjs.locale('zh-cn'); // 默认中文
|
// 偏好设置
|
||||||
usePrimaryColor(); // 载入用户自定义主题色
|
const colorScheme = usePrefersColorScheme();
|
||||||
|
watch(
|
||||||
|
() => colorScheme.value,
|
||||||
|
themeMode => {
|
||||||
|
viewTransitionTheme(() => {
|
||||||
|
changeConf('theme', themeMode);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
let locale = ref(zhCN); // 国际化初始中文
|
onBeforeMount(() => {
|
||||||
|
// 全局message提示
|
||||||
|
message.config({
|
||||||
|
top: '100px', // 距离顶部位置100px
|
||||||
|
duration: 3,
|
||||||
|
maxCount: 15,
|
||||||
|
});
|
||||||
|
initPrimaryColor();
|
||||||
|
|
||||||
|
// 输出应用版本号
|
||||||
|
const appStore = useAppStore();
|
||||||
|
console.info(
|
||||||
|
`%c ${t('common.desc')} %c ${appStore.appCode} - ${appStore.appVersion} `,
|
||||||
|
'color: #fadfa3; background: #030307; padding: 4px 0;',
|
||||||
|
'color: #030307; background: #fadfa3; padding: 4px 0;'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
// 国际化切换语言
|
// 国际化切换语言
|
||||||
function fnChangeLocale(v: string) {
|
function fnChangeLocale(v: string) {
|
||||||
@@ -35,22 +63,15 @@ fnChangeLocale(currentLocale.value);
|
|||||||
watch(currentLocale, val => {
|
watch(currentLocale, val => {
|
||||||
fnChangeLocale(val);
|
fnChangeLocale(val);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 输出应用版本号
|
|
||||||
console.info(
|
|
||||||
`%c ${t('common.title')} %c ${appStore.appCode} - ${appStore.appVersion} `,
|
|
||||||
'color: #fadfa3; background: #030307; padding: 4px 0;',
|
|
||||||
'color: #030307; background: #fadfa3; padding: 4px 0;'
|
|
||||||
);
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<ConfigProvider :locale="locale">
|
<a-config-provider :theme="themeConfig" :locale="locale">
|
||||||
<RouterView />
|
<RouterView />
|
||||||
</ConfigProvider>
|
</a-config-provider>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style>
|
<style lang="css">
|
||||||
#app {
|
#app {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
@@ -61,10 +82,6 @@ body .ant-pro-basicLayout {
|
|||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ant-pro-sider {
|
|
||||||
z-index: 20;
|
|
||||||
}
|
|
||||||
|
|
||||||
.slide-left-enter-active,
|
.slide-left-enter-active,
|
||||||
.slide-left-leave-active,
|
.slide-left-leave-active,
|
||||||
.slide-right-enter-active,
|
.slide-right-enter-active,
|
||||||
@@ -87,56 +104,23 @@ body .ant-pro-basicLayout {
|
|||||||
transform: translate(-2em, 0);
|
transform: translate(-2em, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**强制改表格边距 */
|
::view-transition-old(root),
|
||||||
.ant-table.ant-table-small .ant-table-tbody > tr > td,
|
::view-transition-new(root) {
|
||||||
.ant-table.ant-table-small .ant-table-thead > tr > th {
|
animation: none;
|
||||||
padding: 6px !important;
|
mix-blend-mode: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** ==== 表格头按钮区域 S === **/
|
[data-theme='dark']::view-transition-old(root) {
|
||||||
/* 默认 */
|
z-index: 1;
|
||||||
.button-container {
|
}
|
||||||
display: flex;
|
[data-theme='dark']::view-transition-new(root) {
|
||||||
flex-wrap: wrap;
|
z-index: 999;
|
||||||
justify-content: flex-start;
|
|
||||||
align-items: center;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.button-container > button,
|
::view-transition-old(root) {
|
||||||
.button-container > span {
|
z-index: 999;
|
||||||
margin-right: 12px;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
}
|
}
|
||||||
|
::view-transition-new(root) {
|
||||||
.button-container > button:last-child,
|
z-index: 1;
|
||||||
.button-container > span:last-child {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
}
|
||||||
/* 平板端 */
|
|
||||||
@media (max-width: 992px) {
|
|
||||||
.button-container {
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: flex-start;
|
|
||||||
align-items: left;
|
|
||||||
}
|
|
||||||
.button-container > button,
|
|
||||||
.button-container > span {
|
|
||||||
margin-right: 12px;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* 手机端 */
|
|
||||||
@media (max-width: 576px) {
|
|
||||||
.button-container {
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: flex-start;
|
|
||||||
align-items: left;
|
|
||||||
}
|
|
||||||
.button-container > button,
|
|
||||||
.button-container > span {
|
|
||||||
margin-right: 0px;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/** ==== 表格头按钮区域 E === **/
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
import {
|
|
||||||
RESULT_CODE_ERROR,
|
|
||||||
RESULT_CODE_SUCCESS,
|
|
||||||
RESULT_MSG_ERROR,
|
|
||||||
} from '@/constants/result-constants';
|
|
||||||
import { language, request } from '@/plugins/http-fetch';
|
|
||||||
import { parseObjLineToHump } from '@/utils/parse-utils';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询配置详细
|
|
||||||
* @param tag 配置ID
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export async function getConfigInfo(tag: string) {
|
|
||||||
// 发起请求
|
|
||||||
const result = await request({
|
|
||||||
url: `/api/rest/databaseManagement/v1/omc_db/config`,
|
|
||||||
method: 'get',
|
|
||||||
params: {
|
|
||||||
SQL: `SELECT * FROM config WHERE config_tag = '${tag}'`,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
// 解析数据
|
|
||||||
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
|
|
||||||
let data = result.data.data[0];
|
|
||||||
return Object.assign(result, {
|
|
||||||
data: parseObjLineToHump(data['config'][0]),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改配置
|
|
||||||
* @param data 配置对象
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export async function updateConfig(tag: string, data: Record<string, any>) {
|
|
||||||
const result = await request({
|
|
||||||
url: `/api/rest/databaseManagement/v1/omc_db/config?WHERE=config_tag='${tag}'`,
|
|
||||||
method: 'put',
|
|
||||||
data: { data },
|
|
||||||
});
|
|
||||||
// 解析数据
|
|
||||||
if (result.code === RESULT_CODE_SUCCESS && result.data.data) {
|
|
||||||
let rows = result.data.data.affectedRows;
|
|
||||||
if (rows) {
|
|
||||||
delete result.data;
|
|
||||||
return result;
|
|
||||||
} else {
|
|
||||||
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language] };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
@@ -2,437 +2,8 @@ import {
|
|||||||
RESULT_CODE_ERROR,
|
RESULT_CODE_ERROR,
|
||||||
RESULT_CODE_SUCCESS,
|
RESULT_CODE_SUCCESS,
|
||||||
RESULT_MSG_ERROR,
|
RESULT_MSG_ERROR,
|
||||||
RESULT_MSG_SUCCESS,
|
|
||||||
} from '@/constants/result-constants';
|
} from '@/constants/result-constants';
|
||||||
import { language, request } from '@/plugins/http-fetch';
|
import { language, request } from '@/plugins/http-fetch';
|
||||||
import { parseObjLineToHump } from '@/utils/parse-utils';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询配置参数标签栏
|
|
||||||
* @param neType 网元类型
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export async function getParamConfigTopTab(neType: string) {
|
|
||||||
// 发起请求
|
|
||||||
const result = await request({
|
|
||||||
url: `/api/rest/databaseManagement/v1/elementType/omc_db/objectType/param_config`,
|
|
||||||
method: 'get',
|
|
||||||
params: {
|
|
||||||
SQL: `SELECT top_display,top_tag,method FROM param_config WHERE ne_type = '${neType}'`,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
// 解析数据
|
|
||||||
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
|
|
||||||
let data = result.data.data[0];
|
|
||||||
data = data['param_config'];
|
|
||||||
if (Array.isArray(data)) {
|
|
||||||
return Object.assign(result, {
|
|
||||||
data: parseObjLineToHump(data),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return Object.assign(result, {
|
|
||||||
data: [],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询配置参数标签栏对应信息
|
|
||||||
* @param neType 网元类型
|
|
||||||
* @param topTag
|
|
||||||
* @param neId
|
|
||||||
* @returns object { wrRule, dataArr }
|
|
||||||
*/
|
|
||||||
async function getParamConfigInfo(
|
|
||||||
neType: string,
|
|
||||||
topTag: string,
|
|
||||||
neId: string
|
|
||||||
) {
|
|
||||||
return await Promise.allSettled([
|
|
||||||
// 获取参数规则
|
|
||||||
request({
|
|
||||||
url: `/api/rest/databaseManagement/v1/elementType/omc_db/objectType/param_config`,
|
|
||||||
method: 'get',
|
|
||||||
params: {
|
|
||||||
SQL: `SELECT param_json FROM param_config WHERE ne_type = '${neType}' AND top_tag='${topTag}'`,
|
|
||||||
},
|
|
||||||
timeout: 1_000,
|
|
||||||
}),
|
|
||||||
// 获取对应信息
|
|
||||||
request({
|
|
||||||
url: `/api/rest/systemManagement/v1/elementType/${neType.toLowerCase()}/objectType/config/${topTag}`,
|
|
||||||
method: 'get',
|
|
||||||
params: {
|
|
||||||
ne_id: neId,
|
|
||||||
},
|
|
||||||
timeout: 1_000,
|
|
||||||
}),
|
|
||||||
]).then(resArr => {
|
|
||||||
let wrRule: Record<string, any> = {};
|
|
||||||
// 规则数据
|
|
||||||
if (resArr[0].status === 'fulfilled') {
|
|
||||||
const itemV = resArr[0].value;
|
|
||||||
// 解析数据
|
|
||||||
if (
|
|
||||||
itemV.code === RESULT_CODE_SUCCESS &&
|
|
||||||
Array.isArray(itemV.data?.data)
|
|
||||||
) {
|
|
||||||
let itemData = itemV.data.data;
|
|
||||||
const data = itemData[0]['param_config'];
|
|
||||||
if (Array.isArray(data)) {
|
|
||||||
const v = data[0]['param_json'];
|
|
||||||
try {
|
|
||||||
itemData = parseObjLineToHump(JSON.parse(v));
|
|
||||||
wrRule = itemData;
|
|
||||||
} catch (error) {
|
|
||||||
console.error(error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let dataArr: Record<string, any>[] = [];
|
|
||||||
// 对应信息
|
|
||||||
if (resArr[1].status === 'fulfilled') {
|
|
||||||
const itemV = resArr[1].value;
|
|
||||||
// 解析数据
|
|
||||||
if (
|
|
||||||
itemV.code === RESULT_CODE_SUCCESS &&
|
|
||||||
Array.isArray(itemV.data?.data)
|
|
||||||
) {
|
|
||||||
let itemData = itemV.data.data;
|
|
||||||
dataArr = parseObjLineToHump(itemData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return { wrRule, dataArr };
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询配置参数标签栏对应信息-表格处理
|
|
||||||
* @param neType 网元类型
|
|
||||||
* @param topTag
|
|
||||||
* @param neId
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export async function getParamConfigInfoTable(
|
|
||||||
neType: string,
|
|
||||||
topTag: string,
|
|
||||||
neId: string
|
|
||||||
) {
|
|
||||||
const { wrRule, dataArr } = await getParamConfigInfo(neType, topTag, neId);
|
|
||||||
|
|
||||||
// UPF参数不统一
|
|
||||||
// if (neType === 'UPF') {
|
|
||||||
// if (Reflect.has(wrRule, 'list')) {
|
|
||||||
// for (const arr of wrRule['list']) {
|
|
||||||
// arr['name'] = parseFirstLower(arr['name']);
|
|
||||||
// }
|
|
||||||
// for (const item of dataArr) {
|
|
||||||
// for (const k in item) {
|
|
||||||
// item[parseFirstLower(k)] = item[k];
|
|
||||||
// Reflect.deleteProperty(item, k);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if (Reflect.has(wrRule, 'array')) {
|
|
||||||
// for (const arr of wrRule['array']) {
|
|
||||||
// if (Array.isArray(arr['array'])) {
|
|
||||||
// for (const child of arr['array']) {
|
|
||||||
// child['name'] = parseFirstLower(child['name']);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// arr['name'] = parseFirstLower(arr['name']);
|
|
||||||
// }
|
|
||||||
// for (const item of dataArr) {
|
|
||||||
// for (const k in item) {
|
|
||||||
// // 处理子列表
|
|
||||||
// if (Array.isArray(item[k])) {
|
|
||||||
// for (const child of item[k]) {
|
|
||||||
// for (const childKey in child) {
|
|
||||||
// child[parseFirstLower(childKey)] = child[childKey];
|
|
||||||
// Reflect.deleteProperty(child, childKey);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// item[parseFirstLower(k)] = item[k];
|
|
||||||
// Reflect.deleteProperty(item, k);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// 拼装数据
|
|
||||||
const result = {
|
|
||||||
code: RESULT_CODE_SUCCESS,
|
|
||||||
msg: RESULT_MSG_SUCCESS,
|
|
||||||
data: {
|
|
||||||
type: 'list' as 'list' | 'array',
|
|
||||||
data: [] as any[],
|
|
||||||
dataRule: {},
|
|
||||||
columns: [] as any[],
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
// kv单列表
|
|
||||||
if (Reflect.has(wrRule, 'list')) {
|
|
||||||
result.data.type = 'list';
|
|
||||||
const ruleArr = Object.freeze(wrRule['list']);
|
|
||||||
|
|
||||||
// 列表项数据
|
|
||||||
let dataList = [];
|
|
||||||
for (const item of dataArr) {
|
|
||||||
for (const key of Object.keys(item)) {
|
|
||||||
// 规则为准
|
|
||||||
for (const rule of ruleArr) {
|
|
||||||
if (rule['name'] === key) {
|
|
||||||
const ruleItem = Object.assign({ optional: 'true' }, rule, {
|
|
||||||
value: item[key],
|
|
||||||
});
|
|
||||||
dataList.push(ruleItem);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.data.data = dataList;
|
|
||||||
|
|
||||||
// 列表字段
|
|
||||||
result.data.columns = [
|
|
||||||
{
|
|
||||||
title: 'Key',
|
|
||||||
dataIndex: 'display',
|
|
||||||
align: 'left',
|
|
||||||
width: '30%',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Value',
|
|
||||||
dataIndex: 'value',
|
|
||||||
align: 'left',
|
|
||||||
width: '70%',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
// 多列表
|
|
||||||
if (Reflect.has(wrRule, 'array')) {
|
|
||||||
result.data.type = 'array';
|
|
||||||
const ruleArr = Object.freeze(wrRule['array']);
|
|
||||||
|
|
||||||
// 列表项数据
|
|
||||||
const dataArray = [];
|
|
||||||
for (const item of dataArr) {
|
|
||||||
let record: Record<string, any> = {};
|
|
||||||
for (const key of Object.keys(item)) {
|
|
||||||
// 规则为准
|
|
||||||
for (const rule of ruleArr) {
|
|
||||||
if (rule['name'] === key) {
|
|
||||||
const ruleItem = Object.assign({ optional: 'true' }, rule, {
|
|
||||||
value: item[key],
|
|
||||||
});
|
|
||||||
record[ruleItem.name] = ruleItem;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dataArray.push(record);
|
|
||||||
}
|
|
||||||
result.data.data = dataArray;
|
|
||||||
|
|
||||||
// 无数据时,用于新增
|
|
||||||
let dataRule: Record<string, any> = {};
|
|
||||||
for (const rule of ruleArr) {
|
|
||||||
dataRule[rule.name] = rule;
|
|
||||||
}
|
|
||||||
result.data.dataRule = dataRule;
|
|
||||||
|
|
||||||
// 列表字段
|
|
||||||
const columns: Record<string, any>[] = [];
|
|
||||||
for (const rule of ruleArr) {
|
|
||||||
columns.push({
|
|
||||||
title: rule.display,
|
|
||||||
dataIndex: rule.name,
|
|
||||||
align: 'left',
|
|
||||||
width: 5,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
result.data.columns = columns;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询配置参数标签栏对应信息-表单结构处理
|
|
||||||
* @param neType 网元类型
|
|
||||||
* @param topTag
|
|
||||||
* @param neId
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export async function getParamConfigInfoForm(
|
|
||||||
neType: string,
|
|
||||||
topTag: string,
|
|
||||||
neId: string
|
|
||||||
) {
|
|
||||||
const { wrRule, dataArr } = await getParamConfigInfo(neType, topTag, neId);
|
|
||||||
|
|
||||||
// 拼装数据
|
|
||||||
const result = {
|
|
||||||
code: RESULT_CODE_SUCCESS,
|
|
||||||
msg: RESULT_MSG_SUCCESS,
|
|
||||||
data: {
|
|
||||||
type: 'list' as 'list' | 'array',
|
|
||||||
data: [] as Record<string, any>[],
|
|
||||||
dataRule: {},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
// kv单列表
|
|
||||||
if (Reflect.has(wrRule, 'list')) {
|
|
||||||
result.data.type = 'list';
|
|
||||||
const ruleArr = Object.freeze(wrRule['list']);
|
|
||||||
|
|
||||||
// 列表项数据
|
|
||||||
const dataList = [];
|
|
||||||
for (const item of dataArr) {
|
|
||||||
for (const key in item) {
|
|
||||||
// 规则为准
|
|
||||||
for (const rule of ruleArr) {
|
|
||||||
if (rule['name'] === key) {
|
|
||||||
const ruleItem = Object.assign({ optional: 'true' }, rule, {
|
|
||||||
value: item[key],
|
|
||||||
});
|
|
||||||
dataList.push(ruleItem);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.data.data = dataList;
|
|
||||||
}
|
|
||||||
// 多列表
|
|
||||||
if (Reflect.has(wrRule, 'array')) {
|
|
||||||
result.data.type = 'array';
|
|
||||||
const ruleArr = Object.freeze(wrRule['array']);
|
|
||||||
// 列表项数据
|
|
||||||
const dataArray = [];
|
|
||||||
for (const item of dataArr) {
|
|
||||||
const index = item['index'];
|
|
||||||
let record: Record<string, any>[] = [];
|
|
||||||
for (const key in item) {
|
|
||||||
// 规则为准
|
|
||||||
for (const rule of ruleArr) {
|
|
||||||
if (rule['name'] === key) {
|
|
||||||
const ruleItem = Object.assign({ optional: 'true' }, rule, {
|
|
||||||
value: item[key],
|
|
||||||
});
|
|
||||||
record.push(ruleItem);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dataArray.push({ title: `Index-${index}`, key: index, record });
|
|
||||||
}
|
|
||||||
result.data.data = dataArray;
|
|
||||||
|
|
||||||
// 无数据时,用于新增
|
|
||||||
result.data.dataRule = { title: `Index-0`, key: 0, record: ruleArr };
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询配置参数标签栏对应信息子节点
|
|
||||||
* @param neType 网元类型
|
|
||||||
* @param topTag
|
|
||||||
* @param neId
|
|
||||||
* @param loc 子节点(index/字段) 1/dnnList
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
export async function getParamConfigInfoChild(
|
|
||||||
neType: string,
|
|
||||||
topTag: string,
|
|
||||||
neId: string,
|
|
||||||
loc: string
|
|
||||||
) {
|
|
||||||
// 发起请求
|
|
||||||
const result = await request({
|
|
||||||
url: `/api/rest/systemManagement/v1/elementType/${neType.toLowerCase()}/objectType/config/${topTag}`,
|
|
||||||
method: 'get',
|
|
||||||
params: {
|
|
||||||
ne_id: neId,
|
|
||||||
loc: loc,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
// 解析数据
|
|
||||||
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
|
|
||||||
return Object.assign(result, {
|
|
||||||
data: parseObjLineToHump(result.data.data),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改配置参数标签栏对应信息
|
|
||||||
* @param args 对象 {neType,neId,topTag,loc}
|
|
||||||
* @param data 对象 {修改的数据kv}
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function updateParamConfigInfo(
|
|
||||||
type: 'list' | 'array',
|
|
||||||
args: Record<string, any>,
|
|
||||||
data: Record<string, any>
|
|
||||||
) {
|
|
||||||
let url = `/api/rest/systemManagement/v1/elementType/${args.neType.toLowerCase()}/objectType/config/${
|
|
||||||
args.topTag
|
|
||||||
}?ne_id=${args.neId}`;
|
|
||||||
|
|
||||||
// 多列表需要loc
|
|
||||||
if (type === 'array') {
|
|
||||||
url += `&loc=${args.loc}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
return request({
|
|
||||||
url,
|
|
||||||
method: 'put',
|
|
||||||
data: data,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 新增配置参数标签栏对应信息
|
|
||||||
* @param args 对象 {neType,neId,topTag,loc}
|
|
||||||
* @param data 行记录对象
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function addParamConfigInfo(
|
|
||||||
args: Record<string, any>,
|
|
||||||
data: Record<string, any>
|
|
||||||
) {
|
|
||||||
return request({
|
|
||||||
url: `/api/rest/systemManagement/v1/elementType/${args.neType.toLowerCase()}/objectType/config/${
|
|
||||||
args.topTag
|
|
||||||
}?ne_id=${args.neId}&loc=${args.loc}`,
|
|
||||||
method: 'post',
|
|
||||||
data: data,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除配置参数标签栏对应信息
|
|
||||||
* @param args 对象 {neType,neId,topTag,loc}
|
|
||||||
* loc 多层表的定位信息{index0}/{paraName1}/{index1}
|
|
||||||
* @param data 行记录对象
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function delParamConfigInfo(args: Record<string, any>) {
|
|
||||||
return request({
|
|
||||||
url: `/api/rest/systemManagement/v1/elementType/${args.neType.toLowerCase()}/objectType/config/${
|
|
||||||
args.topTag
|
|
||||||
}?ne_id=${args.neId}&loc=${args.loc}`,
|
|
||||||
method: 'delete',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新网元配置重新载入
|
* 更新网元配置重新载入
|
||||||
@@ -462,3 +33,53 @@ export async function updateNeConfigReload(neType: string, neId: string) {
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从参数配置PCF中获取对应信息提供给PCC用户策略输入框
|
||||||
|
* @param neId
|
||||||
|
* @returns object {pccRules,sessionRules,qosTemplate,headerEnrichTemplate,serviceAreaRestriction}
|
||||||
|
*/
|
||||||
|
export async function getPCCRule(neId: any) {
|
||||||
|
const paramNameArr = [
|
||||||
|
'pccRules',
|
||||||
|
'sessionRules',
|
||||||
|
'qosTemplate',
|
||||||
|
'headerEnrichTemplate',
|
||||||
|
'serviceAreaRestriction',
|
||||||
|
];
|
||||||
|
const reqArr = [];
|
||||||
|
for (const paramName of paramNameArr) {
|
||||||
|
reqArr.push(
|
||||||
|
request({
|
||||||
|
url: `/ne/config/data`,
|
||||||
|
params: { neType: 'PCF', neId, paramName },
|
||||||
|
method: 'get',
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return await Promise.allSettled(reqArr).then(resArr => {
|
||||||
|
// 规则数据
|
||||||
|
const obj: any = {};
|
||||||
|
resArr.forEach((item, i: number) => {
|
||||||
|
if (item.status === 'fulfilled') {
|
||||||
|
const res = item.value;
|
||||||
|
if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) {
|
||||||
|
const key = paramNameArr[i];
|
||||||
|
obj[key] = res.data.map((item: any) => {
|
||||||
|
if ('qosTemplate' === key) {
|
||||||
|
return { value: item.qosId, label: item.qosId };
|
||||||
|
}
|
||||||
|
if ('headerEnrichTemplate' === key) {
|
||||||
|
return { value: item.templateName, label: item.templateName };
|
||||||
|
}
|
||||||
|
if ('serviceAreaRestriction' === key) {
|
||||||
|
return { value: item.name, label: item.name };
|
||||||
|
}
|
||||||
|
return { value: item.ruleId, label: item.ruleId };
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return obj;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,72 +0,0 @@
|
|||||||
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
|
||||||
import { request } from '@/plugins/http-fetch';
|
|
||||||
import { parseObjLineToHump } from '@/utils/parse-utils';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询软件列表
|
|
||||||
* @param query 查询参数
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export async function listLicense(query: Record<string, any>) {
|
|
||||||
let totalSQL = 'select count(id) as total from ne_license ';
|
|
||||||
let rowsSQL = ' select * from ne_license ';
|
|
||||||
|
|
||||||
// 查询
|
|
||||||
let querySQL = 'where 1=1';
|
|
||||||
if (query.neType) {
|
|
||||||
querySQL += ` and ne_type like '%${query.neType}%' `;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 分页
|
|
||||||
const pageNum = (query.pageNum - 1) * query.pageSize;
|
|
||||||
const limtSql = ` order by created_at desc limit ${pageNum},${query.pageSize} `;
|
|
||||||
|
|
||||||
// 发起请求
|
|
||||||
const result = await request({
|
|
||||||
url: `/api/rest/databaseManagement/v1/select/omc_db/ne_license`,
|
|
||||||
method: 'get',
|
|
||||||
params: {
|
|
||||||
totalSQL: totalSQL + querySQL,
|
|
||||||
rowsSQL: rowsSQL + querySQL + limtSql,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
// 解析数据
|
|
||||||
if (result.code === RESULT_CODE_SUCCESS) {
|
|
||||||
const data: DataList = {
|
|
||||||
total: 0,
|
|
||||||
rows: [],
|
|
||||||
code: result.code,
|
|
||||||
msg: result.msg,
|
|
||||||
};
|
|
||||||
result.data.data.forEach((item: any) => {
|
|
||||||
const itemData = item['ne_license'];
|
|
||||||
if (Array.isArray(itemData)) {
|
|
||||||
if (itemData.length === 1 && itemData[0]['total'] >= 0) {
|
|
||||||
data.total = itemData[0]['total'];
|
|
||||||
} else {
|
|
||||||
data.rows = itemData.map(v => parseObjLineToHump(v));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 上传文件
|
|
||||||
* @param data 表单数据对象
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function uploadLicense(data: FormData) {
|
|
||||||
return request({
|
|
||||||
url: `/api/rest/systemManagement/v1/elementType/${data.get(
|
|
||||||
'nfType'
|
|
||||||
)}/objectType/license?neId=${data.get('nfId')}`,
|
|
||||||
method: 'post',
|
|
||||||
data,
|
|
||||||
dataType: 'form-data',
|
|
||||||
timeout: 180_000,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,11 @@
|
|||||||
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
import {
|
||||||
import { request } from '@/plugins/http-fetch';
|
RESULT_CODE_ERROR,
|
||||||
|
RESULT_CODE_SUCCESS,
|
||||||
|
RESULT_MSG_ERROR,
|
||||||
|
} from '@/constants/result-constants';
|
||||||
|
import { language, request } from '@/plugins/http-fetch';
|
||||||
import { parseObjLineToHump } from '@/utils/parse-utils';
|
import { parseObjLineToHump } from '@/utils/parse-utils';
|
||||||
|
import { NE_TYPE_LIST } from '@/constants/ne-constants';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询网元列表
|
* 查询网元列表
|
||||||
@@ -8,27 +13,8 @@ import { parseObjLineToHump } from '@/utils/parse-utils';
|
|||||||
* @returns object
|
* @returns object
|
||||||
*/
|
*/
|
||||||
export async function listNeInfo(query: Record<string, any>) {
|
export async function listNeInfo(query: Record<string, any>) {
|
||||||
let totalSQL =
|
let totalSQL = 'select count(*) as total from ne_info where 1=1 ';
|
||||||
'select count(*) as total from ne_info where (status=0 or status=3)';
|
let rowsSQL = 'select * from ne_info where 1=1 ';
|
||||||
let rowsSQL = 'select * from ne_info where (status=0 or status=3) ';
|
|
||||||
|
|
||||||
// 系统特定顺序
|
|
||||||
const specificOrder = [
|
|
||||||
'OMC',
|
|
||||||
'MME',
|
|
||||||
'AMF',
|
|
||||||
'AUSF',
|
|
||||||
'UDM',
|
|
||||||
'SMF',
|
|
||||||
'PCF',
|
|
||||||
'UPF',
|
|
||||||
'NRF',
|
|
||||||
'NSSF',
|
|
||||||
'IMS',
|
|
||||||
'N3IWF',
|
|
||||||
'NEF',
|
|
||||||
'LMF',
|
|
||||||
];
|
|
||||||
|
|
||||||
// 查询
|
// 查询
|
||||||
let querySQL = '';
|
let querySQL = '';
|
||||||
@@ -67,8 +53,8 @@ export async function listNeInfo(query: Record<string, any>) {
|
|||||||
data.rows = itemData.map(v => parseObjLineToHump(v));
|
data.rows = itemData.map(v => parseObjLineToHump(v));
|
||||||
//通过sort进行冒泡排序
|
//通过sort进行冒泡排序
|
||||||
data.rows.sort((a: any, b: any) => {
|
data.rows.sort((a: any, b: any) => {
|
||||||
const typeA = specificOrder.indexOf(a.neType);
|
const typeA = NE_TYPE_LIST.indexOf(a.neType);
|
||||||
const typeB = specificOrder.indexOf(b.neType);
|
const typeB = NE_TYPE_LIST.indexOf(b.neType);
|
||||||
if (typeA === -1) return 1; // 如果不在特定顺序中,排到后面
|
if (typeA === -1) return 1; // 如果不在特定顺序中,排到后面
|
||||||
if (typeB === -1) return -1; // 如果不在特定顺序中,排到后面
|
if (typeB === -1) return -1; // 如果不在特定顺序中,排到后面
|
||||||
return typeA - typeB;
|
return typeA - typeB;
|
||||||
@@ -92,15 +78,18 @@ export async function getNeInfo(id: string | number) {
|
|||||||
url: `/api/rest/databaseManagement/v1/select/omc_db/ne_info`,
|
url: `/api/rest/databaseManagement/v1/select/omc_db/ne_info`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params: {
|
params: {
|
||||||
SQL: `select * from ne_info where (status=0 or status=3) and id = ${id}`,
|
SQL: `select * from ne_info where id = ${id}`,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
// 解析数据
|
// 解析数据
|
||||||
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
|
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
|
||||||
let data = result.data.data[0];
|
let neInfo = result.data.data[0]['ne_info'];
|
||||||
return Object.assign(result, {
|
if (neInfo) {
|
||||||
data: parseObjLineToHump(data['ne_info'][0]),
|
return Object.assign(result, {
|
||||||
});
|
data: parseObjLineToHump(neInfo[0]),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language] };
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -148,57 +137,9 @@ export async function delNeInfo(data: Record<string, any>) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取网元网元列表
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export async function getNelistAll() {
|
|
||||||
// 系统特定顺序
|
|
||||||
const specificOrder = [
|
|
||||||
'OMC',
|
|
||||||
'MME',
|
|
||||||
'AMF',
|
|
||||||
'AUSF',
|
|
||||||
'UDM',
|
|
||||||
'SMF',
|
|
||||||
'PCF',
|
|
||||||
'UPF',
|
|
||||||
'NRF',
|
|
||||||
'NSSF',
|
|
||||||
'IMS',
|
|
||||||
'N3IWF',
|
|
||||||
'NEF',
|
|
||||||
'LMF',
|
|
||||||
];
|
|
||||||
// 发起请求
|
|
||||||
const result = await request({
|
|
||||||
url: `/api/rest/databaseManagement/v1/elementType/omc_db/objectType/ne_info`,
|
|
||||||
method: 'get',
|
|
||||||
params: {
|
|
||||||
SQL: `SELECT ne_type,ne_name,ne_id,ip FROM ne_info WHERE status in ('0','3')`,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
// 解析数据
|
|
||||||
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
|
|
||||||
let data = result.data.data[0];
|
|
||||||
//通过sort进行冒泡排序
|
|
||||||
data['ne_info'].sort((a: any, b: any) => {
|
|
||||||
const typeA = specificOrder.indexOf(a.ne_type);
|
|
||||||
const typeB = specificOrder.indexOf(b.ne_type);
|
|
||||||
if (typeA === -1) return 1;
|
|
||||||
if (typeB === -1) return -1;
|
|
||||||
return typeA - typeB;
|
|
||||||
});
|
|
||||||
return Object.assign(result, {
|
|
||||||
data: parseObjLineToHump(data['ne_info']),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导出网元配置文件
|
* 导出网元配置文件
|
||||||
* @param
|
* @param data data {neType neId}
|
||||||
* @returns bolb
|
* @returns bolb
|
||||||
*/
|
*/
|
||||||
export function exportSet(data: Record<string, any>) {
|
export function exportSet(data: Record<string, any>) {
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ export async function sendNeSoftware(data: Record<string, any>) {
|
|||||||
url: `/api/rest/systemManagement/v1/${data.neType}/software/${data.version}/${data.neId}`,
|
url: `/api/rest/systemManagement/v1/${data.neType}/software/${data.version}/${data.neId}`,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
timeout: 180_000,
|
timeout: 180_000,
|
||||||
|
repeatSubmit: false,
|
||||||
});
|
});
|
||||||
// 解析数据
|
// 解析数据
|
||||||
if (result.code === RESULT_CODE_SUCCESS) {
|
if (result.code === RESULT_CODE_SUCCESS) {
|
||||||
@@ -130,6 +131,7 @@ export async function runNeSoftware(data: Record<string, any>) {
|
|||||||
url: `/api/rest/systemManagement/v1/${data.neType}/software/${data.version}/${data.neId}`,
|
url: `/api/rest/systemManagement/v1/${data.neType}/software/${data.version}/${data.neId}`,
|
||||||
method: 'put',
|
method: 'put',
|
||||||
timeout: 180_000,
|
timeout: 180_000,
|
||||||
|
repeatSubmit: false,
|
||||||
});
|
});
|
||||||
// 解析数据
|
// 解析数据
|
||||||
if (result.code === RESULT_CODE_SUCCESS) {
|
if (result.code === RESULT_CODE_SUCCESS) {
|
||||||
@@ -149,6 +151,7 @@ export async function backNeSoftware(data: Record<string, any>) {
|
|||||||
url: `/api/rest/systemManagement/v1/${data.neType}/software/${data.version}/${data.neId}`,
|
url: `/api/rest/systemManagement/v1/${data.neType}/software/${data.version}/${data.neId}`,
|
||||||
method: 'PATCH',
|
method: 'PATCH',
|
||||||
timeout: 180_000,
|
timeout: 180_000,
|
||||||
|
repeatSubmit: false,
|
||||||
});
|
});
|
||||||
// 解析数据
|
// 解析数据
|
||||||
if (result.code === RESULT_CODE_SUCCESS) {
|
if (result.code === RESULT_CODE_SUCCESS) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
||||||
import { request } from '@/plugins/http-fetch';
|
import { request } from '@/plugins/http-fetch';
|
||||||
import { parseObjLineToHump } from '@/utils/parse-utils';
|
import { parseObjLineToHump } from '@/utils/parse-utils';
|
||||||
import { parseDateToStr } from '@/utils/date-utils';
|
import { parseDateToStr, YYYY_MM_DD_HH_MM_SS } from '@/utils/date-utils';
|
||||||
import useUserStore from '@/store/modules/user';
|
import useUserStore from '@/store/modules/user';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -122,7 +122,7 @@ export function updateConfirm(data: Record<string, any>) {
|
|||||||
const userName = useUserStore().userName;
|
const userName = useUserStore().userName;
|
||||||
let finalData = {
|
let finalData = {
|
||||||
alarm: {
|
alarm: {
|
||||||
ack_time: parseDateToStr(time),
|
ack_time: parseDateToStr(time, YYYY_MM_DD_HH_MM_SS),
|
||||||
ack_user: userName,
|
ack_user: userName,
|
||||||
ack_state: '1',
|
ack_state: '1',
|
||||||
},
|
},
|
||||||
@@ -145,7 +145,7 @@ export function cancelConfirm(data: (string | number)[]) {
|
|||||||
const userName = useUserStore().userName;
|
const userName = useUserStore().userName;
|
||||||
let finalData = {
|
let finalData = {
|
||||||
alarm: {
|
alarm: {
|
||||||
ack_time: parseDateToStr(time),
|
ack_time: parseDateToStr(time, YYYY_MM_DD_HH_MM_SS),
|
||||||
ack_user: '',
|
ack_user: '',
|
||||||
ack_state: '0',
|
ack_state: '0',
|
||||||
},
|
},
|
||||||
@@ -216,7 +216,7 @@ export function clearAlarm(data: Record<string, any>) {
|
|||||||
const userName = useUserStore().userName;
|
const userName = useUserStore().userName;
|
||||||
let finalData = {
|
let finalData = {
|
||||||
data: {
|
data: {
|
||||||
clear_time: parseDateToStr(time),
|
clear_time: parseDateToStr(time, YYYY_MM_DD_HH_MM_SS),
|
||||||
clear_type: '2',
|
clear_type: '2',
|
||||||
alarm_status: '0',
|
alarm_status: '0',
|
||||||
clear_user: userName,
|
clear_user: userName,
|
||||||
@@ -241,6 +241,7 @@ export function listSync() {
|
|||||||
return request({
|
return request({
|
||||||
url: `/api/rest/faultManagement/v1/elementType/all/objectType/alarms`,
|
url: `/api/rest/faultManagement/v1/elementType/all/objectType/alarms`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
|
timeout: 180_000,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -294,7 +295,7 @@ export async function exportAll(query: Record<string, any>) {
|
|||||||
* @returns bolb
|
* @returns bolb
|
||||||
*/
|
*/
|
||||||
export async function origGet() {
|
export async function origGet() {
|
||||||
let totalSQL = `select count(*) as value,orig_severity as name from alarm group by orig_severity`;
|
let totalSQL = `select count(*) as value,orig_severity as name from alarm WHERE alarm_status='1' and orig_severity!='Event' group by orig_severity`;
|
||||||
|
|
||||||
// 发起请求
|
// 发起请求
|
||||||
const result = await request({
|
const result = await request({
|
||||||
@@ -329,10 +330,10 @@ export async function origGet() {
|
|||||||
* @returns object
|
* @returns object
|
||||||
*/
|
*/
|
||||||
export async function top3Sel(filterFlag?: string) {
|
export async function top3Sel(filterFlag?: string) {
|
||||||
let filter = ` WHERE orig_severity='${filterFlag}'`;
|
let filter = ` WHERE alarm_status='1'and orig_severity='${filterFlag}'`;
|
||||||
if (!filterFlag) filter = '';
|
if (!filterFlag) filter = "WHERE alarm_status='1'";
|
||||||
|
|
||||||
let top3SQL = `select count(*) as value,ne_type as name from alarm ${filter} group by ne_type ORDER BY value desc limit 0,3 `;
|
let top3SQL = `select count(*) as value,ne_type as name from alarm ${filter} and orig_severity!='Event' group by ne_type ORDER BY value desc limit 0,3 `;
|
||||||
|
|
||||||
// 发起请求
|
// 发起请求
|
||||||
const result = await request({
|
const result = await request({
|
||||||
|
|||||||
122
src/api/faultManage/eventAlarm.ts
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
import { parseObjLineToHump } from '@/utils/parse-utils';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export async function listAct(query: Record<string, any>) {
|
||||||
|
let totalSQL = `select count(*) as total from alarm_event where 1=1 `;
|
||||||
|
let rowsSQL = `select * from alarm_event where 1=1 `;
|
||||||
|
// 查询
|
||||||
|
let querySQL = '';
|
||||||
|
if (query.alarmCode) {
|
||||||
|
querySQL += ` and alarm_code = '${query.alarmCode}' `;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (query.alarmType) {
|
||||||
|
querySQL += ` and alarm_type = '${query.alarmType}' `;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (query.pvFlag) {
|
||||||
|
querySQL += ` and pv_flag = '${query.pvFlag}' `;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (query.neId) {
|
||||||
|
querySQL += ` and ne_id like '%${query.neId}%' `;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (query.neName) {
|
||||||
|
querySQL += ` and ne_name like '%${query.neName}%' `;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (query.neType) {
|
||||||
|
querySQL += ` and ne_type like '%${query.neType}%' `;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (query.beginTime && query.endTime) {
|
||||||
|
querySQL += ` and event_time BETWEEN '${query.beginTime}' and ' ${query.endTime}'`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 分页
|
||||||
|
const pageNum = (query.pageNum - 1) * query.pageSize;
|
||||||
|
const limtSql = ` order by event_time desc limit ${pageNum},${query.pageSize} `;
|
||||||
|
|
||||||
|
// 发起请求
|
||||||
|
const result = await request({
|
||||||
|
url: `/api/rest/databaseManagement/v1/select/omc_db/alarm_event`,
|
||||||
|
method: 'get',
|
||||||
|
params: {
|
||||||
|
SQL: totalSQL + querySQL,
|
||||||
|
rowsSQL: rowsSQL + querySQL + limtSql,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// 解析数据
|
||||||
|
if (result.code === RESULT_CODE_SUCCESS) {
|
||||||
|
const data: DataList = {
|
||||||
|
total: 0,
|
||||||
|
rows: [],
|
||||||
|
code: result.code,
|
||||||
|
msg: result.msg,
|
||||||
|
};
|
||||||
|
result.data.data.forEach((item: any) => {
|
||||||
|
const itemData = item['alarm_event'];
|
||||||
|
if (Array.isArray(itemData)) {
|
||||||
|
if (itemData.length === 1 && itemData[0]['total'] >= 0) {
|
||||||
|
data.total = itemData[0]['total'];
|
||||||
|
} else {
|
||||||
|
data.rows = itemData.map(v => parseObjLineToHump(v));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 事件告警导出
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns bolb
|
||||||
|
*/
|
||||||
|
export async function exportAll(query: Record<string, any>) {
|
||||||
|
let rowsSQL = `select * from alarm_event where 1=1`;
|
||||||
|
// 查询
|
||||||
|
let querySQL = '';
|
||||||
|
querySQL += query.alarm_code
|
||||||
|
? ` and alarm_code = '${query.alarm_code}' `
|
||||||
|
: '';
|
||||||
|
querySQL += query.alarm_type
|
||||||
|
? ` and alarm_type = '${query.alarm_type}' `
|
||||||
|
: '';
|
||||||
|
querySQL += query.pv_flag ? ` and pv_flag = '${query.pv_flag}' ` : '';
|
||||||
|
querySQL += query.orig_severity
|
||||||
|
? ` and orig_severity in('${query.orig_severity}' )`
|
||||||
|
: '';
|
||||||
|
querySQL += query.ne_id ? ` and ne_id like '%${query.ne_id}%' ` : '';
|
||||||
|
querySQL += query.ne_name ? ` and ne_name like '%${query.ne_name}%' ` : '';
|
||||||
|
querySQL += query.ne_type ? ` and ne_type like '%${query.ne_type}%' ` : '';
|
||||||
|
querySQL +=
|
||||||
|
query.beginTime && query.endTime
|
||||||
|
? ` and event_time BETWEEN '${query.beginTime}' and ' ${query.endTime}'`
|
||||||
|
: '';
|
||||||
|
|
||||||
|
// 发起请求
|
||||||
|
const result = await request({
|
||||||
|
url: `/api/rest/databaseManagement/v1/select/omc_db/alarm_event`,
|
||||||
|
method: 'get',
|
||||||
|
params: {
|
||||||
|
rowsSQL: rowsSQL + querySQL,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (result.code === RESULT_CODE_SUCCESS) {
|
||||||
|
let v = result.data.data[0];
|
||||||
|
const vArr = parseObjLineToHump(v['alarm_event']);
|
||||||
|
result.data = vArr == null ? [] : vArr;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
@@ -63,7 +63,11 @@ export async function getAlarmSet() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Object.keys(resultData).length === 0) {
|
if (Object.keys(resultData).length === 0) {
|
||||||
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language], data: {} };
|
return {
|
||||||
|
code: RESULT_CODE_ERROR,
|
||||||
|
msg: RESULT_MSG_ERROR[language],
|
||||||
|
data: {},
|
||||||
|
};
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
code: RESULT_CODE_SUCCESS,
|
code: RESULT_CODE_SUCCESS,
|
||||||
@@ -117,7 +121,11 @@ export async function updateAlarmSet(data: Record<string, any>) {
|
|||||||
}
|
}
|
||||||
// 无变更时
|
// 无变更时
|
||||||
if (resultNum === 0) {
|
if (resultNum === 0) {
|
||||||
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language], data: 0 };
|
return {
|
||||||
|
code: RESULT_CODE_ERROR,
|
||||||
|
msg: RESULT_MSG_ERROR[language],
|
||||||
|
data: 0,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
code: RESULT_CODE_SUCCESS,
|
code: RESULT_CODE_SUCCESS,
|
||||||
@@ -166,11 +174,10 @@ export async function getForwardSet() {
|
|||||||
*/
|
*/
|
||||||
export async function updateForwardSet(data: Record<string, any>) {
|
export async function updateForwardSet(data: Record<string, any>) {
|
||||||
// return false;
|
// return false;
|
||||||
console.log(data)
|
let obj: any = [
|
||||||
let obj:any=[
|
{ interface: 'Email', to_user: data.emailObj },
|
||||||
{interface:"Email",to_user:data.emailObj},
|
{ interface: 'SMS', to_user: data.smsObj },
|
||||||
{interface:"SMS",to_user:data.smsObj}
|
];
|
||||||
]
|
|
||||||
const result = await request({
|
const result = await request({
|
||||||
url: `/api/rest/databaseManagement/v1/omc_db/config?WHERE=config_tag='forwardAlarm'`,
|
url: `/api/rest/databaseManagement/v1/omc_db/config?WHERE=config_tag='forwardAlarm'`,
|
||||||
method: 'put',
|
method: 'put',
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
||||||
import { request } from '@/plugins/http-fetch';
|
import { request } from '@/plugins/http-fetch';
|
||||||
import { parseObjLineToHump } from '@/utils/parse-utils';
|
import { parseObjLineToHump } from '@/utils/parse-utils';
|
||||||
import { parseDateToStr } from '@/utils/date-utils';
|
import { parseDateToStr, YYYY_MM_DD_HH_MM_SS } from '@/utils/date-utils';
|
||||||
import useUserStore from '@/store/modules/user';
|
import useUserStore from '@/store/modules/user';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -79,7 +79,7 @@ export function updateConfirm(data: Record<string, any>) {
|
|||||||
const userName = useUserStore().userName;
|
const userName = useUserStore().userName;
|
||||||
let finalData = {
|
let finalData = {
|
||||||
alarm: {
|
alarm: {
|
||||||
ack_time: parseDateToStr(time),
|
ack_time: parseDateToStr(time, YYYY_MM_DD_HH_MM_SS),
|
||||||
ack_user: userName,
|
ack_user: userName,
|
||||||
ack_state: '1',
|
ack_state: '1',
|
||||||
},
|
},
|
||||||
@@ -101,7 +101,7 @@ export function cancelConfirm(data: (string | number)[]) {
|
|||||||
var time = new Date();
|
var time = new Date();
|
||||||
let finalData = {
|
let finalData = {
|
||||||
alarm: {
|
alarm: {
|
||||||
ack_time: parseDateToStr(time),
|
ack_time: parseDateToStr(time, YYYY_MM_DD_HH_MM_SS),
|
||||||
ack_user: '',
|
ack_user: '',
|
||||||
ack_state: '0',
|
ack_state: '0',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,29 +1,14 @@
|
|||||||
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
||||||
import { request } from '@/plugins/http-fetch';
|
import { request } from '@/plugins/http-fetch';
|
||||||
import { parseDateToStr } from '@/utils/date-utils';
|
import { parseDateToStr } from '@/utils/date-utils';
|
||||||
|
import { NE_TYPE_LIST } from '@/constants/ne-constants';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询公告列表
|
* 查询公告列表
|
||||||
* @param query 查询参数
|
* @param query 查询参数
|
||||||
* @returns object
|
* @returns object
|
||||||
*/
|
*/
|
||||||
export async function listMain() {
|
export async function listMain() {
|
||||||
// 系统特定顺序
|
|
||||||
const specificOrder = [
|
|
||||||
'OMC',
|
|
||||||
'MME',
|
|
||||||
'AMF',
|
|
||||||
'AUSF',
|
|
||||||
'UDM',
|
|
||||||
'SMF',
|
|
||||||
'PCF',
|
|
||||||
'UPF',
|
|
||||||
'NRF',
|
|
||||||
'NSSF',
|
|
||||||
'IMS',
|
|
||||||
'N3IWF',
|
|
||||||
'NEF',
|
|
||||||
'LMF',
|
|
||||||
];
|
|
||||||
const result = await request({
|
const result = await request({
|
||||||
url: '/api/rest/systemManagement/v1/elementType/all/objectType/systemState',
|
url: '/api/rest/systemManagement/v1/elementType/all/objectType/systemState',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
@@ -39,7 +24,6 @@ export async function listMain() {
|
|||||||
const serialNum = (value as any).serialNum;
|
const serialNum = (value as any).serialNum;
|
||||||
const version = (value as any).version;
|
const version = (value as any).version;
|
||||||
|
|
||||||
|
|
||||||
const errCode = systemState && systemState['errorCode'];
|
const errCode = systemState && systemState['errorCode'];
|
||||||
var time = new Date();
|
var time = new Date();
|
||||||
// console.log(key, value);
|
// console.log(key, value);
|
||||||
@@ -59,21 +43,20 @@ export async function listMain() {
|
|||||||
ipAddress,
|
ipAddress,
|
||||||
serialNum,
|
serialNum,
|
||||||
name: key.split('/').join('_'),
|
name: key.split('/').join('_'),
|
||||||
|
expiryDate: '-',
|
||||||
status: 'Abnormal',
|
status: 'Abnormal',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return mergedObj;
|
return mergedObj;
|
||||||
});
|
});
|
||||||
|
|
||||||
//通过sort进行冒泡排序
|
//通过sort进行冒泡排序
|
||||||
mergedData.sort((a: any, b: any) => {
|
mergedData.sort((a: any, b: any) => {
|
||||||
const typeA = specificOrder.indexOf(a.name.split('_')[0]);
|
const typeA = NE_TYPE_LIST.indexOf(a.name.split('_')[0]);
|
||||||
const typeB = specificOrder.indexOf(b.name.split('_')[0]);
|
const typeB = NE_TYPE_LIST.indexOf(b.name.split('_')[0]);
|
||||||
if (typeA === -1) return 1; // 如果不在特定顺序中,排到后面
|
if (typeA === -1) return 1; // 如果不在特定顺序中,排到后面
|
||||||
if (typeB === -1) return -1; // 如果不在特定顺序中,排到后面
|
if (typeB === -1) return -1; // 如果不在特定顺序中,排到后面
|
||||||
return typeA - typeB;
|
return typeA - typeB;
|
||||||
});
|
});
|
||||||
//console.log(mergedData);
|
|
||||||
|
|
||||||
return mergedData;
|
return mergedData;
|
||||||
}
|
}
|
||||||
@@ -105,5 +88,6 @@ export function getSysConf() {
|
|||||||
return request({
|
return request({
|
||||||
url: `/sys-conf`,
|
url: `/sys-conf`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
|
whithToken: false,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
95
src/api/logManage/exportFile.ts
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
import { CACHE_SESSION_CRYPTO_API } from '@/constants/cache-keys-constants';
|
||||||
|
import { sessionGet } from '@/utils/cache-session-utils';
|
||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取下拉框数据
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getBakFile() {
|
||||||
|
return request({
|
||||||
|
url: '/lm/table/list',
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取对应类型的文件列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getBakFileList(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/lm/file/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下载远端文件
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function downFile(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/lm/file/${query.fileName}`,
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除远端获取文件
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delFile(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/lm/file/${query.fileName}`,
|
||||||
|
method: 'delete',
|
||||||
|
params: query,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新FTP信息
|
||||||
|
* @param data 数据
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function updateFTPInfo(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/lm/table/ftp`,
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取FTP信息
|
||||||
|
* @param data 数据
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getFTPInfo() {
|
||||||
|
return request({
|
||||||
|
url: `/lm/table/ftp`,
|
||||||
|
method: 'get',
|
||||||
|
crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送FTP文件
|
||||||
|
* @param data 数据
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function putFTPInfo(filePath: string, fileName: string) {
|
||||||
|
return request({
|
||||||
|
url: `/lm/table/ftp`,
|
||||||
|
method: 'put',
|
||||||
|
data: { filePath, fileName },
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import { CACHE_SESSION_CRYPTO_API } from '@/constants/cache-keys-constants';
|
||||||
|
import { sessionGet } from '@/utils/cache-session-utils';
|
||||||
import { request } from '@/plugins/http-fetch';
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
// 登录方法
|
// 登录方法
|
||||||
@@ -7,6 +9,7 @@ export function login(data: Record<string, string>) {
|
|||||||
method: 'post',
|
method: 'post',
|
||||||
data: data,
|
data: data,
|
||||||
whithToken: false,
|
whithToken: false,
|
||||||
|
crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -21,6 +24,7 @@ export function register(data: Record<string, any>) {
|
|||||||
method: 'post',
|
method: 'post',
|
||||||
data: data,
|
data: data,
|
||||||
whithToken: false,
|
whithToken: false,
|
||||||
|
crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,17 +30,19 @@ export async function getMMLByNE(neType: string) {
|
|||||||
* 发送网元的mml命令
|
* 发送网元的mml命令
|
||||||
* @param neType 网元类型
|
* @param neType 网元类型
|
||||||
* @param neId 网元ID
|
* @param neId 网元ID
|
||||||
|
* @param objectType 接口类型
|
||||||
* @param cmdStr 命令串
|
* @param cmdStr 命令串
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
export async function sendMMlByNE(
|
export async function sendMMlByNE(
|
||||||
neType: string,
|
neType: string,
|
||||||
neId: string,
|
neId: string,
|
||||||
|
objectType: string,
|
||||||
cmdArr: string[]
|
cmdArr: string[]
|
||||||
) {
|
) {
|
||||||
// 发起请求
|
// 发起请求
|
||||||
const result = await request({
|
const result = await request({
|
||||||
url: `/api/rest/operationManagement/v1/elementType/${neType}/objectType/mml?ne_id=${neId}`,
|
url: `/api/rest/operationManagement/v1/elementType/${neType}/objectType/${objectType}?ne_id=${neId}`,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: { mml: cmdArr },
|
data: { mml: cmdArr },
|
||||||
timeout: 180_000,
|
timeout: 180_000,
|
||||||
|
|||||||
@@ -6,5 +6,6 @@ export function getLoad(query: Record<string, any>) {
|
|||||||
url: '/monitor/load',
|
url: '/monitor/load',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params: query,
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,93 +0,0 @@
|
|||||||
import {
|
|
||||||
RESULT_CODE_ERROR,
|
|
||||||
RESULT_CODE_SUCCESS,
|
|
||||||
RESULT_MSG_ERROR,
|
|
||||||
} from '@/constants/result-constants';
|
|
||||||
import { language, request } from '@/plugins/http-fetch';
|
|
||||||
import { parseObjLineToHump } from '@/utils/parse-utils';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询用户会话列表
|
|
||||||
* @param query 查询参数
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export async function listSession(query: Record<string, any>) {
|
|
||||||
let totalSQL = 'select count(*) as total from session where 1=1 ';
|
|
||||||
let rowsSQL = 'select * from session where 1=1 ';
|
|
||||||
|
|
||||||
// 查询
|
|
||||||
let querySQL = '';
|
|
||||||
if (query.accountId) {
|
|
||||||
querySQL += ` and account_id like '%${query.accountId}%' `;
|
|
||||||
}
|
|
||||||
if (query.ip) {
|
|
||||||
querySQL += ` and host like '%${query.ip}%' `;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 分页
|
|
||||||
const pageNum = (query.pageNum - 1) * query.pageSize;
|
|
||||||
const limtSql = ` limit ${pageNum},${query.pageSize} `;
|
|
||||||
|
|
||||||
// 排序
|
|
||||||
let sortSql = ' order by login_time ';
|
|
||||||
if (query.sortOrder === 'desc') {
|
|
||||||
sortSql += ' desc ';
|
|
||||||
} else {
|
|
||||||
sortSql += ' asc ';
|
|
||||||
}
|
|
||||||
|
|
||||||
// 发起请求
|
|
||||||
const result = await request({
|
|
||||||
url: `/api/rest/databaseManagement/v1/omc_db/session`,
|
|
||||||
method: 'get',
|
|
||||||
params: {
|
|
||||||
totalSQL: totalSQL + querySQL,
|
|
||||||
rowsSQL: rowsSQL + querySQL + sortSql + limtSql,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
// 解析数据
|
|
||||||
if (result.code === RESULT_CODE_SUCCESS) {
|
|
||||||
const data: DataList = {
|
|
||||||
total: 0,
|
|
||||||
rows: [],
|
|
||||||
code: result.code,
|
|
||||||
msg: result.msg,
|
|
||||||
};
|
|
||||||
result.data.data.forEach((item: any) => {
|
|
||||||
const itemData = item['session'];
|
|
||||||
if (Array.isArray(itemData)) {
|
|
||||||
if (itemData.length === 1 && itemData[0]['total'] >= 0) {
|
|
||||||
data.total = itemData[0]['total'];
|
|
||||||
} else {
|
|
||||||
data.rows = itemData.map(v => parseObjLineToHump(v));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 强退用户会话
|
|
||||||
* @param tokenId 授权标识
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export async function logoutSession(id: string) {
|
|
||||||
const result = await request({
|
|
||||||
url: `/api/rest/databaseManagement/v1/omc_db/session?WHERE=id='${id}'`,
|
|
||||||
method: 'delete',
|
|
||||||
});
|
|
||||||
// 解析数据
|
|
||||||
if (result.code === RESULT_CODE_SUCCESS && result.data.data) {
|
|
||||||
let rows = result.data.data.affectedRows;
|
|
||||||
if (rows) {
|
|
||||||
delete result.data;
|
|
||||||
return result;
|
|
||||||
} else {
|
|
||||||
return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR[language] };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
@@ -5,5 +5,6 @@ export function getSystemInfo() {
|
|||||||
return request({
|
return request({
|
||||||
url: '/monitor/system-info',
|
url: '/monitor/system-info',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
|
timeout: 60_000,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
import { request } from '@/plugins/http-fetch';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询网元列表
|
|
||||||
* @param query 查询参数
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function listNe(query: Record<string, any>) {
|
|
||||||
return request({
|
|
||||||
url: '/ne/list',
|
|
||||||
method: 'get',
|
|
||||||
params: query,
|
|
||||||
timeout: 60_000,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询网元状态
|
|
||||||
* @param neType 网元类型
|
|
||||||
* @param neId 网元ID
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function stateNe(neType: string, neId: string) {
|
|
||||||
return request({
|
|
||||||
url: '/ne/state',
|
|
||||||
method: 'get',
|
|
||||||
params: { neType, neId },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
66
src/api/ne/neConfig.ts
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元参数配置可用属性值列表指定网元类型全部无分页
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getAllNeConfig(neType: string) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/config/list/${neType}`,
|
||||||
|
method: 'get',
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元参数配置数据信息
|
||||||
|
* @param params 数据 {neType,neId,paramName}
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getNeConfigData(params: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/config/data`,
|
||||||
|
params,
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元参数配置数据更新
|
||||||
|
* @param data 数据 {neType,neId,paramName:"参数名",paramData:{参数},loc:"层级index仅array"}
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function editNeConfigData(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/config/data`,
|
||||||
|
method: 'put',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元参数配置数据新增(array)
|
||||||
|
* @param data 数据 {neType,neId,paramName:"参数名",paramData:{参数},loc:"层级index"}
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function addNeConfigData(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/config/data`,
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元参数配置数据删除(array)
|
||||||
|
* @param params 数据 {neType,neId,paramName:"参数名",loc:"层级index"}
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delNeConfigData(params: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/config/data`,
|
||||||
|
method: 'delete',
|
||||||
|
params,
|
||||||
|
});
|
||||||
|
}
|
||||||
83
src/api/ne/neConfigBackup.ts
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元配置文件备份记录列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listNeConfigBackup(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/config/backup/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元配置文件备份记录修改
|
||||||
|
* @param data 数据 { id, name, remark }
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function updateNeConfigBackup(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/config/backup',
|
||||||
|
method: 'put',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元配置文件备份记录下载
|
||||||
|
* @param id 记录ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export async function downNeConfigBackup(id: string) {
|
||||||
|
return await request({
|
||||||
|
url: '/ne/config/backup/download',
|
||||||
|
method: 'get',
|
||||||
|
params: { id },
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元配置文件备份记录删除
|
||||||
|
* @param id 记录ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export async function delNeConfigBackup(id: string) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/config/backup',
|
||||||
|
method: 'delete',
|
||||||
|
params: { id },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元配置文件备份导出
|
||||||
|
* @param data 数据 { neType, neId }
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function exportNeConfigBackup(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/config/backup/export',
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元配置文件备份导入
|
||||||
|
* @param data 数据 { neType, neId, type, path }
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function importNeConfigBackup(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/config/backup/import',
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
103
src/api/ne/neHost.ts
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询网元主机列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listNeHost(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/host/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询网元主机详细
|
||||||
|
* @param hostId 网元主机ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getNeHost(hostId: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/host/${hostId}`,
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增网元主机
|
||||||
|
* @param data 网元主机对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function addNeHost(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/host',
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改网元主机
|
||||||
|
* @param data 网元主机对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function updateNeHost(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/host',
|
||||||
|
method: 'put',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除网元主机
|
||||||
|
* @param hostId 网元主机ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delNeHost(hostId: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/host/${hostId}`,
|
||||||
|
method: 'delete',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 测试连接网元主机
|
||||||
|
* @param data 网元主机对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function testNeHost(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/host/test',
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元主机SSH方式检查服务器环境
|
||||||
|
* @param data 网元主机对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function neHostCheckInfo(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/host/checkBySSH',
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元主机SSH方式授权免密发送
|
||||||
|
* @param data 网元主机对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function neHostAuthorizedRSA(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/host/authorizedBySSH',
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
64
src/api/ne/neHostCmd.ts
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询网元主机命令列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listNeHostCmd(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/hostCmd/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询网元主机命令详细
|
||||||
|
* @param cmdId 网元主机命令ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getNeHostCmd(cmdId: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/hostCmd/${cmdId}`,
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增网元主机命令
|
||||||
|
* @param data 网元主机命令对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function addNeHostCmd(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/hostCmd',
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改网元主机命令
|
||||||
|
* @param data 网元主机命令对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function updateNeHostCmd(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/hostCmd',
|
||||||
|
method: 'put',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除网元主机命令
|
||||||
|
* @param cmdId 网元主机命令ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delNeHostCmd(cmdId: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/hostCmd/${cmdId}`,
|
||||||
|
method: 'delete',
|
||||||
|
});
|
||||||
|
}
|
||||||
185
src/api/ne/neInfo.ts
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
import { CACHE_SESSION_CRYPTO_API } from '@/constants/cache-keys-constants';
|
||||||
|
import { sessionGet } from '@/utils/cache-session-utils';
|
||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询网元列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listNeInfo(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/info/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询网元信息详细
|
||||||
|
* @param infoId 信息ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getNeInfo(infoId: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/info/${infoId}`,
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元信息新增
|
||||||
|
* @param data 网元对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function addNeInfo(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/info`,
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false',
|
||||||
|
timeout: 30_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元信息修改
|
||||||
|
* @param data 网元对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function updateNeInfo(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/info`,
|
||||||
|
method: 'put',
|
||||||
|
data: data,
|
||||||
|
crypto: sessionGet(CACHE_SESSION_CRYPTO_API) !== 'false',
|
||||||
|
timeout: 30_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元信息删除
|
||||||
|
* @param id 信息ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delNeInfo(infoIds: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/info/${infoIds}`,
|
||||||
|
method: 'delete',
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询网元列表全部无分页
|
||||||
|
* @param query 查询参数 neType neId bandStatus bandHost
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listAllNeInfo(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/info/listAll',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询网元状态
|
||||||
|
* @param neType 网元类型
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function stateNeInfo(neType: string, neId: string) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/info/state',
|
||||||
|
method: 'get',
|
||||||
|
params: { neType, neId },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询网元信息
|
||||||
|
* @param neType 网元类型
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getNeInfoByTypeAndID(neType: string, neId: string) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/info/byTypeAndID',
|
||||||
|
method: 'get',
|
||||||
|
params: { neType, neId },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元端OAM配置文件读取
|
||||||
|
* @param neType 网元类型
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getOAMFile(neType: string, neId: string) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/info/oamFile',
|
||||||
|
method: 'get',
|
||||||
|
params: { neType, neId },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元端配置文件写入
|
||||||
|
* @param neType 网元类型
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @param content 用json对象
|
||||||
|
* @param sync 同步到网元
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function saveOAMFile(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/info/oamFile`,
|
||||||
|
method: 'put',
|
||||||
|
data: data,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元端公共配置文件读取
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getPara5GFilee() {
|
||||||
|
return request({
|
||||||
|
url: '/ne/info/para5GFile',
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元端公共配置文件写入
|
||||||
|
* @param content txt内容为字符串 其他文件格式都用json对象
|
||||||
|
* @param syncNe 同步到网元端 NeType@ NeId
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function savePara5GFile(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/info/para5GFile`,
|
||||||
|
method: 'put',
|
||||||
|
data: data,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元服务操作
|
||||||
|
* @param data 对象 {neType,neId,action}
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function serviceNeAction(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/action/service`,
|
||||||
|
method: 'put',
|
||||||
|
data: data,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
83
src/api/ne/neLicense.ts
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询网元授权列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listNeLicense(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/license/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询网元授权详细
|
||||||
|
* @param licenseId 信息ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getNeLicense(licenseId: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/license/${licenseId}`,
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元neType和neID查询
|
||||||
|
* @param neType 网元类型
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getNeLicenseByTypeAndID(neType: string, neId: string) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/license/byTypeAndID`,
|
||||||
|
method: 'get',
|
||||||
|
params: { neType, neId },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元授权激活授权申请码
|
||||||
|
* @param neType 网元类型
|
||||||
|
* @param neId 网元id
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function codeNeLicense(neType: string, neId: string) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/license/code`,
|
||||||
|
method: 'get',
|
||||||
|
params: { neType, neId },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元授权激活授权文件替换
|
||||||
|
* @param data 网元对象 {"neType": "", "neId": "", "licensePath": "", "reload": true}
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function changeNeLicense(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/license/change`,
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元授权激活状态
|
||||||
|
* @param neType 网元类型
|
||||||
|
* @param neId 网元id
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function stateNeLicense(neType: string, neId: string) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/license/state`,
|
||||||
|
method: 'get',
|
||||||
|
params: { neType, neId },
|
||||||
|
});
|
||||||
|
}
|
||||||
80
src/api/ne/neSoftware.ts
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询网元版本列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listNeSoftware(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/software/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询网元软件包详细
|
||||||
|
* @param softwareId 信息ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getNeSoftware(softwareId: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/software/${softwareId}`,
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元软件包新增
|
||||||
|
* @param data 网元对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function addNeSoftware(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/software`,
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
repeatSubmit: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元软件包修改
|
||||||
|
* @param data 网元对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function updateNeSoftware(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/software`,
|
||||||
|
method: 'put',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元软件包删除
|
||||||
|
* @param id 信息ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delNeSoftware(softwareIds: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/software/${softwareIds}`,
|
||||||
|
method: 'delete',
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元软件包设为网元新版本
|
||||||
|
* @param data data { "version": "2.2404.18", "neType": "SMF", "name": "smf-r2.2404.18-ub22.deb"}
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function newNeVersion(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/software/newNeVersion`,
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
41
src/api/ne/neVersion.ts
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询网元版本列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listNeVersion(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/version/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询网元版本详细
|
||||||
|
* @param versionId 信息ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getNeVersion(versionId: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/version/${versionId}`,
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网元版本操作
|
||||||
|
* @param data {neType,neId,preinput:{参数},action:"upgrade"}
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function operateNeVersion(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/version/operate`,
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
130
src/api/neData/amf.ts
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询AMF-UE会话事件列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listAMFDataUE(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/amf/ue/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AMF-UE会话删除
|
||||||
|
* @param id 信息ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delAMFDataUE(ueIds: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/amf/ue/${ueIds}`,
|
||||||
|
method: 'delete',
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AMF-UE会话列表导出
|
||||||
|
* @param data 查询列表条件
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function exportAMFDataUE(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/amf/ue/export',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AMF-接入基站信息列表
|
||||||
|
* @param query 查询参数 neId=001&id=1
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listAMFNblist(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/amf/nb/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AMF-接入基站状态信息列表
|
||||||
|
* @param query 查询参数 neId=001&state=1
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listAMFNbStatelist(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/amf/nb/list-cfg',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AMF-接入基站状态信息新增
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @param data 数据 { "index": 1, "name": "Gnb", "address": "192.168.8.1", "position": "Area-B" }
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function addAMFNbState(neId: string, data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/config/data`,
|
||||||
|
method: 'post',
|
||||||
|
data: {
|
||||||
|
neType: 'AMF',
|
||||||
|
neId: neId,
|
||||||
|
paramName: 'gnbList',
|
||||||
|
paramData: data,
|
||||||
|
loc: `${data.index}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AMF-接入基站状态信息修改
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @param data 数据 { "index": 1, "name": "Gnb", "address": "192.168.8.1", "position": "Area-B" }
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function editAMFNbState(neId: string, data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/config/data`,
|
||||||
|
method: 'put',
|
||||||
|
data: {
|
||||||
|
neType: 'AMF',
|
||||||
|
neId: neId,
|
||||||
|
paramName: 'gnbList',
|
||||||
|
paramData: data,
|
||||||
|
loc: `${data.index}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AMF-接入基站状态信息删除
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @param index 数据index
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delAMFNbState(neId: string, index: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/config/data`,
|
||||||
|
method: 'delete',
|
||||||
|
params: {
|
||||||
|
neType: 'AMF',
|
||||||
|
neId: neId,
|
||||||
|
paramName: 'gnbList',
|
||||||
|
loc: `${index}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
43
src/api/neData/ims.ts
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询IMS-CDR会话事件
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listIMSDataCDR(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/ims/cdr/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IMS-CDR会话删除
|
||||||
|
* @param id 信息ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delIMSDataCDR(cdrIds: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/ims/cdr/${cdrIds}`,
|
||||||
|
method: 'delete',
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IMS-CDR会话列表导出
|
||||||
|
* @param data 查询列表条件
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function exportIMSDataCDR(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/ims/cdr/export',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
130
src/api/neData/mme.ts
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询MME-UE会话事件列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listMMEDataUE(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/mme/ue/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MME-UE会话删除
|
||||||
|
* @param id 信息ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delMMEDataUE(ueIds: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/mme/ue/${ueIds}`,
|
||||||
|
method: 'delete',
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MME-UE会话列表导出
|
||||||
|
* @param data 查询列表条件
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function exportMMEDataUE(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/mme/ue/export',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MME-接入基站信息列表
|
||||||
|
* @param query 查询参数 neId=001&id=1
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listMMENblist(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/mme/nb/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MME-接入基站状态信息列表
|
||||||
|
* @param query 查询参数 neId=001&state=1
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listMMENbStatelist(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/mme/nb/list-cfg',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MME-接入基站状态信息新增
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @param data 数据 { "index": 1, "name": "Enb", "address": "192.168.8.1", "position": "Area-B" }
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function addMMENbState(neId: string, data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/config/data`,
|
||||||
|
method: 'post',
|
||||||
|
data: {
|
||||||
|
neType: 'MME',
|
||||||
|
neId: neId,
|
||||||
|
paramName: 'enbList',
|
||||||
|
paramData: data,
|
||||||
|
loc: `${data.index}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MME-接入基站状态信息修改
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @param data 数据 { "index": 1, "name": "Enb", "address": "192.168.8.1", "position": "Area-B" }
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function editMMENbState(neId: string, data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/config/data`,
|
||||||
|
method: 'put',
|
||||||
|
data: {
|
||||||
|
neType: 'MME',
|
||||||
|
neId: neId,
|
||||||
|
paramName: 'enbList',
|
||||||
|
paramData: data,
|
||||||
|
loc: `${data.index}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MME-接入基站状态信息删除
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @param index 数据index
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delMMENbState(neId: string, index: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/ne/config/data`,
|
||||||
|
method: 'delete',
|
||||||
|
params: {
|
||||||
|
neType: 'MME',
|
||||||
|
neId: neId,
|
||||||
|
paramName: 'enbList',
|
||||||
|
loc: `${index}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
30
src/api/neData/nb-state.ts
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 历史记录列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listNBState(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/nb-state/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 历史记录列表导出
|
||||||
|
* @param data 查询列表条件
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function exportNBState(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/nb-state/export',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
43
src/api/neData/sgwc.ts
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询SGWC-CDR会话事件
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listSGWCDataCDR(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/sgwc/cdr/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SGWC-CDR会话删除
|
||||||
|
* @param id 信息ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delSGWCDataCDR(cdrIds: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/sgwc/cdr/${cdrIds}`,
|
||||||
|
method: 'delete',
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SGWC-CDR会话列表导出
|
||||||
|
* @param data 查询列表条件
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function exportSGWCDataCDR(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/sgwc/cdr/export',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
69
src/api/neData/smf.ts
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询SMF-CDR会话事件
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listSMFDataCDR(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/smf/cdr/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SMF-CDR会话删除
|
||||||
|
* @param id 信息ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delSMFDataCDR(cdrIds: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/smf/cdr/${cdrIds}`,
|
||||||
|
method: 'delete',
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SMF-CDR会话列表导出
|
||||||
|
* @param data 查询列表条件
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function exportSMFDataCDR(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/smf/cdr/export',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SMF-在线订阅用户数量
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listSMFSubNum(neId: string) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/smf/sub/num',
|
||||||
|
method: 'get',
|
||||||
|
params: { neId },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SMF-在线订阅用户列表信息
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listSMFSubList(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/smf/sub/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
});
|
||||||
|
}
|
||||||
43
src/api/neData/smsc.ts
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询SMSC-CDR会话事件
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listSMSCDataCDR(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/smsc/cdr/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SMSC-CDR会话删除
|
||||||
|
* @param id 信息ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delSMSCDataCDR(cdrIds: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/smsc/cdr/${cdrIds}`,
|
||||||
|
method: 'delete',
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SMSC-CDR会话列表导出
|
||||||
|
* @param data 查询列表条件
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function exportSMSCDataCDR(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/smsc/cdr/export',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
142
src/api/neData/udm_auth.ts
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM鉴权用户重载数据
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function resetUDMAuth(neId: string) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/udm/auth/resetData/${neId}`,
|
||||||
|
method: 'put',
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM鉴权用户列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listUDMAuth(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/udm/auth/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 30_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM鉴权用户信息
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @param imsi IMSI
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getUDMAuth(neId: string, imsi: string) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/udm/auth/${neId}/${imsi}`,
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM鉴权用户新增
|
||||||
|
* @param data 鉴权对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function addUDMAuth(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/udm/auth/${data.neId}`,
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM鉴权用户批量新增
|
||||||
|
* @param data 鉴权对象
|
||||||
|
* @param num 数量
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function batchAddUDMAuth(data: Record<string, any>, num: number) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/udm/auth/${data.neId}/${num}`,
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM鉴权用户修改
|
||||||
|
* @param data 鉴权对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function updateUDMAuth(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/udm/auth/${data.neId}`,
|
||||||
|
method: 'put',
|
||||||
|
data: data,
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM鉴权用户删除
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @param imsi IMSI
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delUDMAuth(neId: string, imsi: string) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/udm/auth/${neId}/${imsi}`,
|
||||||
|
method: 'delete',
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM鉴权用户批量删除
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @param imsi IMSI
|
||||||
|
* @param num 数量
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function batchDelUDMAuth(neId: string, imsi: string, num: number) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/udm/auth/${neId}/${imsi}/${num}`,
|
||||||
|
method: 'delete',
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM鉴权用户导入
|
||||||
|
* @param data 表单数据对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function importUDMAuth(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/udm/auth/import`,
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM鉴权用户导出
|
||||||
|
* @param data 数据参数
|
||||||
|
* @returns bolb
|
||||||
|
*/
|
||||||
|
export function exportUDMAuth(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/udm/auth/export',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
141
src/api/neData/udm_sub.ts
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM签约用户重载数据
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function resetUDMSub(neId: string) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/udm/sub/resetData/${neId}`,
|
||||||
|
method: 'put',
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM签约用户列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listUDMSub(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/udm/sub/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 30_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM签约用户信息
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @param imsi IMSI
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getUDMSub(neId: string, imsi: string) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/udm/sub/${neId}/${imsi}`,
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM签约用户新增
|
||||||
|
* @param data 签约对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function addUDMSub(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/udm/sub/${data.neId}`,
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM签约用户批量新增
|
||||||
|
* @param data 签约对象
|
||||||
|
* @param num 数量
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function batchAddUDMSub(data: Record<string, any>, num: number) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/udm/sub/${data.neId}/${num}`,
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM签约用户修改
|
||||||
|
* @param data 签约对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function updateUDMSub(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/udm/sub/${data.neId}`,
|
||||||
|
method: 'put',
|
||||||
|
data: data,
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM签约用户删除
|
||||||
|
* @param data 签约对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delUDMSub(neId: string, imsi: string) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/udm/sub/${neId}/${imsi}`,
|
||||||
|
method: 'delete',
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM签约用户批量删除
|
||||||
|
* @param neId 网元ID
|
||||||
|
* @param imsi IMSI
|
||||||
|
* @param num 数量
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function batchDelUDMSub(neId: string, imsi: string, num: number) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/udm/sub/${neId}/${imsi}/${num}`,
|
||||||
|
method: 'delete',
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM签约用户导出
|
||||||
|
* @param data 数据参数
|
||||||
|
* @returns bolb
|
||||||
|
*/
|
||||||
|
export function exportUDMSub(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/neData/udm/sub/export',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UDM签约用户导入
|
||||||
|
* @param data 表单数据对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function importUDMSub(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/neData/udm/sub/import`,
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -1,133 +0,0 @@
|
|||||||
import { request } from '@/plugins/http-fetch';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 签约鉴权导出
|
|
||||||
* @param query 查询参数
|
|
||||||
* @returns bolb
|
|
||||||
*/
|
|
||||||
export function exportAuth(query: Record<string, any>) {
|
|
||||||
return request({
|
|
||||||
url: '/ne/udm/auth/export',
|
|
||||||
method: 'post',
|
|
||||||
data: query,
|
|
||||||
responseType: 'blob',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 导入鉴权数据
|
|
||||||
* @param neId 网元ID
|
|
||||||
* @param data 表单数据对象
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function importAuthData(data: FormData) {
|
|
||||||
return request({
|
|
||||||
url: `/ne/udm/auth/import`,
|
|
||||||
method: 'post',
|
|
||||||
data,
|
|
||||||
dataType: 'form-data',
|
|
||||||
timeout: 180_000,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询鉴权列表
|
|
||||||
* @param query 查询参数
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function listAuth(query: Record<string, any>) {
|
|
||||||
return request({
|
|
||||||
url: '/ne/udm/auth/list',
|
|
||||||
method: 'get',
|
|
||||||
params: query,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询重新更新加载全部
|
|
||||||
* @param neId 网元ID
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function loadAuth(neId: string) {
|
|
||||||
return request({
|
|
||||||
url: `/ne/udm/auth/resetData/${neId}`,
|
|
||||||
method: 'put',
|
|
||||||
timeout: 180_000,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询鉴权详细
|
|
||||||
* @param neId 网元ID
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function getAuth(neId: string, imsi: string) {
|
|
||||||
return request({
|
|
||||||
url: `/ne/udm/auth/${neId}/${imsi}`,
|
|
||||||
method: 'get',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改鉴权
|
|
||||||
* @param data 鉴权对象
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function updateAuth(data: Record<string, any>) {
|
|
||||||
return request({
|
|
||||||
url: `/ne/udm/auth/${data.neId}`,
|
|
||||||
method: 'put',
|
|
||||||
data: data,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 新增鉴权
|
|
||||||
* @param data 鉴权对象
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function addAuth(data: Record<string, any>) {
|
|
||||||
return request({
|
|
||||||
url: `/ne/udm/auth/${data.neId}`,
|
|
||||||
method: 'post',
|
|
||||||
data: data,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 批量新增鉴权
|
|
||||||
* @param data 鉴权对象
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function batchAuth(data: Record<string, any>) {
|
|
||||||
return request({
|
|
||||||
url: `/ne/udm/auth/${data.neID}/${data.num}`,
|
|
||||||
method: 'post',
|
|
||||||
data: data,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除鉴权
|
|
||||||
* @param data 鉴权对象
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function delAuth(neId: string, imsi: string) {
|
|
||||||
return request({
|
|
||||||
url: `/ne/udm/auth/${neId}/${imsi}`,
|
|
||||||
method: 'delete',
|
|
||||||
timeout: 180_000,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 批量删除鉴权
|
|
||||||
* @param data 鉴权对象
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function batchDelAuth(data: Record<string, any>) {
|
|
||||||
return request({
|
|
||||||
url: `/ne/udm/auth/${data.neID}/${data.imsi}/${data.num}`,
|
|
||||||
method: 'delete',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
@@ -25,8 +25,10 @@ export async function listBase5G(query: Record<string, any>) {
|
|||||||
data.total = rows.length;
|
data.total = rows.length;
|
||||||
data.rows = rows;
|
data.rows = rows;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 模拟数据
|
// 模拟数据
|
||||||
// data.rows =[{"address":"192.168.1.137:38412","id":"217","name":"","ueNum":0}]
|
// data.rows = [{"address":"192.168.1.137:38412","id":"217","name":"attach-enb-100000-20","ueNum":0}]
|
||||||
|
// data.rows = [{address: "192.168.8.223", id: 257, name: "SmallCell", ueNum: 0}]
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|||||||
51
src/api/neUser/exportFile.ts
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
import { CACHE_SESSION_CRYPTO_API } from '@/constants/cache-keys-constants';
|
||||||
|
import { sessionGet } from '@/utils/cache-session-utils';
|
||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
/**
|
||||||
|
* 获取下拉框数据
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getBakFile() {
|
||||||
|
return request({
|
||||||
|
url: '/ue/table/list',
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取对应类型的文件列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function getBakFileList(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ue/file/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 下载远端文件
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function downFile(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ue/file/${query.fileName}`,
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 删除远端获取文件
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delFile(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/ue/file/${query.fileName}`,
|
||||||
|
method: 'delete',
|
||||||
|
params: query,
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -52,9 +52,11 @@ export async function listUENumByIMS(neId: String) {
|
|||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
if (result.code === RESULT_CODE_SUCCESS) {
|
if (result.code === RESULT_CODE_SUCCESS) {
|
||||||
return Object.assign(result, {
|
let num = result.data['ueNum'] || 0;
|
||||||
data: result.data['ueNum'],
|
if (num === 0) {
|
||||||
});
|
num = result.data.data['ueNum'] || 0;
|
||||||
|
}
|
||||||
|
return Object.assign(result, { data: num });
|
||||||
}
|
}
|
||||||
|
|
||||||
// 模拟数据
|
// 模拟数据
|
||||||
|
|||||||
@@ -136,14 +136,21 @@ export async function batchUpdateRule(data: Record<string, any>) {
|
|||||||
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/${data.num}?neId=${data.neId}`,
|
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/${data.num}?neId=${data.neId}`,
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data: data,
|
data: data,
|
||||||
|
timeout: 60_000,
|
||||||
});
|
});
|
||||||
// 解析数据
|
// 解析数据
|
||||||
if (result.code === RESULT_CODE_SUCCESS && result.data?.status) {
|
if (result.code === RESULT_CODE_SUCCESS) {
|
||||||
return {
|
if (result.data?.status) {
|
||||||
code: RESULT_CODE_ERROR,
|
return {
|
||||||
msg: result.data?.cause,
|
code: RESULT_CODE_ERROR,
|
||||||
data: result.data,
|
msg: result.data?.cause,
|
||||||
};
|
data: result.data,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (result.data?.data) {
|
||||||
|
result.data = result.data.data;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -158,6 +165,7 @@ export async function addRule(data: Record<string, any>) {
|
|||||||
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo?neId=${data.neId}`,
|
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo?neId=${data.neId}`,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: data,
|
data: data,
|
||||||
|
timeout: 60_000,
|
||||||
});
|
});
|
||||||
// 解析数据
|
// 解析数据
|
||||||
if (result.code === RESULT_CODE_SUCCESS && result.data?.status) {
|
if (result.code === RESULT_CODE_SUCCESS && result.data?.status) {
|
||||||
@@ -180,14 +188,21 @@ export async function batchAddRule(data: Record<string, any>) {
|
|||||||
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/${data.num}?neId=${data.neId}`,
|
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/${data.num}?neId=${data.neId}`,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: data,
|
data: data,
|
||||||
|
timeout: 60_000,
|
||||||
});
|
});
|
||||||
// 解析数据
|
// 解析数据
|
||||||
if (result.code === RESULT_CODE_SUCCESS && result.data?.status) {
|
if (result.code === RESULT_CODE_SUCCESS) {
|
||||||
return {
|
if (result.data?.status) {
|
||||||
code: RESULT_CODE_ERROR,
|
return {
|
||||||
msg: result.data?.cause,
|
code: RESULT_CODE_ERROR,
|
||||||
data: result.data,
|
msg: result.data?.cause,
|
||||||
};
|
data: result.data,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (result.data?.data) {
|
||||||
|
result.data = result.data.data;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -197,10 +212,11 @@ export async function batchAddRule(data: Record<string, any>) {
|
|||||||
* @param data 规则对象
|
* @param data 规则对象
|
||||||
* @returns object
|
* @returns object
|
||||||
*/
|
*/
|
||||||
export function delRule(neId: string, data: Record<string, any>) {
|
export function delRule(neId: string, imsi: string) {
|
||||||
return request({
|
return request({
|
||||||
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo?neId=${neId}&imsi=${data.imsi}`,
|
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo?neId=${neId}&imsi=${imsi}`,
|
||||||
method: 'delete',
|
method: 'delete',
|
||||||
|
timeout: 60_000,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,5 +229,6 @@ export async function batchDelRule(data: Record<string, any>) {
|
|||||||
return request({
|
return request({
|
||||||
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/${data.num}?neId=${data.neId}&imsi=${data.imsi}`,
|
url: `/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/${data.num}?neId=${data.neId}&imsi=${data.imsi}`,
|
||||||
method: 'delete',
|
method: 'delete',
|
||||||
|
timeout: 60_000,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
||||||
import { request } from '@/plugins/http-fetch';
|
import { request } from '@/plugins/http-fetch';
|
||||||
import { parseObjLineToHump } from '@/utils/parse-utils';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询列表
|
* 查询列表
|
||||||
@@ -21,39 +20,66 @@ export async function listUEInfoBySMF(query: Record<string, any>) {
|
|||||||
msg: result.msg,
|
msg: result.msg,
|
||||||
};
|
};
|
||||||
// 解析数据
|
// 解析数据
|
||||||
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
|
if (result.code === RESULT_CODE_SUCCESS && result.data) {
|
||||||
const rows = parseObjLineToHump(result.data.data);
|
if (Array.isArray(result.data.data)) {
|
||||||
data.total = rows.length;
|
const rows = result.data.data;
|
||||||
data.rows = rows;
|
data.total = rows.length;
|
||||||
|
data.rows = rows;
|
||||||
|
} else {
|
||||||
|
Object.assign(data, result.data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 模拟数据
|
// 模拟数据
|
||||||
|
// data.code = RESULT_CODE_SUCCESS;
|
||||||
|
// data.total = 2;
|
||||||
// data.rows = [
|
// data.rows = [
|
||||||
// {
|
// {
|
||||||
// imsi: 'imsi-460029004200044',
|
// imsi: 'imsi-460000100000090',
|
||||||
// msisdn: 'msisdn-12346002044',
|
// msisdn: 'msisdn-12307550090',
|
||||||
// pduSessionInfo: [
|
// pduSessionInfo: [
|
||||||
// {
|
// {
|
||||||
// activeTime: '2023-11-29 18:39:06',
|
// activeTime: '2024-06-19 14:35:26',
|
||||||
// dnn: 'ims',
|
// dnn: 'ims',
|
||||||
// ipv4: '10.10.48.97',
|
// ipv4: '10.10.48.8',
|
||||||
// ipv6: '',
|
// ipv6: '',
|
||||||
// pduSessionID: 6,
|
// pduSessionID: 6,
|
||||||
// ranN3IP: '192.168.8.223',
|
// ranN3IP: '192.168.1.137',
|
||||||
// sstSD: '1-000001',
|
// sstSD: '1-000001',
|
||||||
// tai: '46000-0001',
|
// tai: '46000-001124',
|
||||||
|
// upState: 'Active',
|
||||||
// upfN3IP: '192.168.1.161',
|
// upfN3IP: '192.168.1.161',
|
||||||
// },
|
// },
|
||||||
// {
|
// {
|
||||||
// activeTime: '2023-11-29 18:39:05',
|
// activeTime: '2024-06-19 14:35:26',
|
||||||
// dnn: 'cmnet',
|
// dnn: 'cmnet',
|
||||||
// ipv4: '10.10.48.62',
|
// ipv4: '10.10.48.9',
|
||||||
|
// ipv6: '2001:4860:4860::/64',
|
||||||
|
// pduSessionID: 7,
|
||||||
|
// ranN3IP: '192.168.1.137',
|
||||||
|
// sstSD: '1-000001',
|
||||||
|
// tai: '46000-001124',
|
||||||
|
// upState: 'Active',
|
||||||
|
// upfN3IP: '192.168.1.161',
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
// ratType: 'NR',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// imsi: 'imsi-460602072701180',
|
||||||
|
// msisdn: 'msisdn-123460600080',
|
||||||
|
// pduSessionInfo: [
|
||||||
|
// {
|
||||||
|
// activeTime: '2024-06-19 14:31:09',
|
||||||
|
// dnn: 'cmnet',
|
||||||
|
// ipv4: '10.10.48.4',
|
||||||
// ipv6: '',
|
// ipv6: '',
|
||||||
// pduSessionID: 5,
|
// pduSessionID: 5,
|
||||||
// ranN3IP: '192.168.8.223',
|
// ranN3IP: '192.168.8.223',
|
||||||
// sstSD: '1-000001',
|
// sstSD: '1-000001',
|
||||||
// tai: '46000-0001',
|
// tai: '46060-0001',
|
||||||
// upfN3IP: '192.168.1.163',
|
// upState: 'Active',
|
||||||
|
// upfN3IP: '192.168.1.161',
|
||||||
// },
|
// },
|
||||||
// ],
|
// ],
|
||||||
// ratType: 'EUTRAN',
|
// ratType: 'EUTRAN',
|
||||||
|
|||||||
@@ -1,135 +0,0 @@
|
|||||||
import { request } from '@/plugins/http-fetch';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 签约列表导出
|
|
||||||
* @param query 查询参数
|
|
||||||
* @returns bolb
|
|
||||||
*/
|
|
||||||
export function exportSub(query: Record<string, any>) {
|
|
||||||
return request({
|
|
||||||
url: '/ne/udm/sub/export',
|
|
||||||
method: 'post',
|
|
||||||
data: query,
|
|
||||||
responseType: 'blob',
|
|
||||||
timeout: 180_000,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 导入签约数据
|
|
||||||
* @param neId 网元ID
|
|
||||||
* @param data 表单数据对象
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function importSubData(data: FormData) {
|
|
||||||
return request({
|
|
||||||
url: `/ne/udm/sub/import`,
|
|
||||||
method: 'post',
|
|
||||||
data,
|
|
||||||
dataType: 'form-data',
|
|
||||||
timeout: 180_000,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询重新更新加载全部
|
|
||||||
* @param neId 网元ID
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function loadSub(neId: string) {
|
|
||||||
return request({
|
|
||||||
url: `/ne/udm/sub/resetData/${neId}`,
|
|
||||||
method: 'put',
|
|
||||||
timeout: 180_000,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询签约列表
|
|
||||||
* @param query 查询参数
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function listSub(query: Record<string, any>) {
|
|
||||||
return request({
|
|
||||||
url: '/ne/udm/sub/list',
|
|
||||||
method: 'get',
|
|
||||||
params: query,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询签约详细
|
|
||||||
* @param neId 网元ID
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function getSub(neId: string, imsi: string) {
|
|
||||||
return request({
|
|
||||||
url: `/ne/udm/sub/${neId}/${imsi}`,
|
|
||||||
method: 'get',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改签约
|
|
||||||
* @param data 签约对象
|
|
||||||
* @param neId 网元ID
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function updateSub(neId: string, data: Record<string, any>) {
|
|
||||||
return request({
|
|
||||||
url: `/ne/udm/sub/${neId}`,
|
|
||||||
method: 'put',
|
|
||||||
data: data,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 新增签约
|
|
||||||
* @param data 签约对象
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function addSub(neID: string, data: Record<string, any>) {
|
|
||||||
return request({
|
|
||||||
url: `/ne/udm/sub/${neID}`,
|
|
||||||
method: 'post',
|
|
||||||
data: data,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 批量新增新增签约
|
|
||||||
* @param data 签约对象
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function batchAddSub(data: Record<string, any>) {
|
|
||||||
return request({
|
|
||||||
url: `/ne/udm/sub/${data.neID}/${data.num}`,
|
|
||||||
method: 'post',
|
|
||||||
data: data,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除签约
|
|
||||||
* @param data 签约对象
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function delSub(neId: string, imsi: string) {
|
|
||||||
return request({
|
|
||||||
url: `/ne/udm/sub/${neId}/${imsi}`,
|
|
||||||
method: 'delete',
|
|
||||||
timeout: 180_000,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 批量删除签约
|
|
||||||
* @param data 签约对象
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function batchDelSub(data: Record<string, any>) {
|
|
||||||
return request({
|
|
||||||
url: `/ne/udm/sub/${data.neID}/${data.imsi}/${data.num}`,
|
|
||||||
method: 'delete',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
17
src/api/perfManage/customData.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新 查询自定义指标数据
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export async function listCustomData(query: Record<string, any>) {
|
||||||
|
// 发起请求
|
||||||
|
const result = await request({
|
||||||
|
url: `/pm/kpiC/report`,
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
124
src/api/perfManage/customTarget.ts
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询自定义指标
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
// export async function listCustom(query: Record<string, any>) {
|
||||||
|
// let totalSQL = 'select count(*) as total from pm_custom_title where 1=1 ';
|
||||||
|
// let rowsSQL = 'select * from pm_custom_title where 1=1 ';
|
||||||
|
|
||||||
|
// // 查询
|
||||||
|
// let querySQL = '';
|
||||||
|
// if (query.neType) {
|
||||||
|
// querySQL += ` and ne_type like '%${query.neType}%' `;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // 排序
|
||||||
|
// let sortSql = ' order by update_time ';
|
||||||
|
// if (query.sortOrder === 'asc') {
|
||||||
|
// sortSql += ' asc ';
|
||||||
|
// } else {
|
||||||
|
// sortSql += ' desc ';
|
||||||
|
// }
|
||||||
|
// // 分页
|
||||||
|
// const pageNum = (query.pageNum - 1) * query.pageSize;
|
||||||
|
// const limtSql = ` limit ${pageNum},${query.pageSize} `;
|
||||||
|
|
||||||
|
// // 发起请求
|
||||||
|
// const result = await request({
|
||||||
|
// url: `/api/rest/databaseManagement/v1/select/omc_db/pm_custom_title`,
|
||||||
|
// method: 'get',
|
||||||
|
// params: {
|
||||||
|
// totalSQL: totalSQL + querySQL,
|
||||||
|
// rowsSQL: rowsSQL + querySQL + sortSql + limtSql,
|
||||||
|
// },
|
||||||
|
// });
|
||||||
|
|
||||||
|
// // 解析数据
|
||||||
|
// if (result.code === RESULT_CODE_SUCCESS) {
|
||||||
|
// const data: DataList = {
|
||||||
|
// total: 0,
|
||||||
|
// rows: [],
|
||||||
|
// code: result.code,
|
||||||
|
// msg: result.msg,
|
||||||
|
// };
|
||||||
|
// result.data.data.forEach((item: any) => {
|
||||||
|
// const itemData = item['pm_custom_title'];
|
||||||
|
// if (Array.isArray(itemData)) {
|
||||||
|
// if (itemData.length === 1 && itemData[0]['total'] >= 0) {
|
||||||
|
// data.total = itemData[0]['total'];
|
||||||
|
// } else {
|
||||||
|
// data.rows = itemData.map(v => parseObjLineToHump(v));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// return data;
|
||||||
|
// }
|
||||||
|
// return result;
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新 查询自定义指标
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export async function listCustom(query?: Record<string, any>) {
|
||||||
|
// 发起请求
|
||||||
|
const result = await request({
|
||||||
|
url: `/pm/kpiC/title/totalList`,
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询自定义指标详细
|
||||||
|
* @param id 网元ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export async function getCustom(id: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/pm/kpiC/title/${id}`,
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增自定义指标
|
||||||
|
* @param data 网元对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function addCustom(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/pm/kpiC/title`,
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改自定义指标
|
||||||
|
* @param data 网元对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function updateCustom(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/pm/kpiC/title/${data.id}`,
|
||||||
|
method: 'put',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除自定义指标
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export async function delCustom(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/pm/kpiC/title/${data.id}`,
|
||||||
|
method: 'delete',
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
||||||
import { request } from '@/plugins/http-fetch';
|
import { request } from '@/plugins/http-fetch';
|
||||||
import { parseDateToStr } from '@/utils/date-utils';
|
|
||||||
import { parseObjLineToHump } from '@/utils/parse-utils';
|
import { parseObjLineToHump } from '@/utils/parse-utils';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Todo 废弃
|
||||||
* 查询黄金指标数据
|
* 查询黄金指标数据
|
||||||
* @param query 查询参数
|
* @param query 查询参数
|
||||||
* @returns object
|
* @returns object
|
||||||
@@ -110,6 +110,7 @@ export async function getKPITitle(neType: string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Todo 废弃
|
||||||
* 查询UPF上下行速率数据
|
* 查询UPF上下行速率数据
|
||||||
* @param query 查询参数
|
* @param query 查询参数
|
||||||
* @returns object
|
* @returns object
|
||||||
@@ -126,9 +127,7 @@ export async function listUPFData(timeArr: any) {
|
|||||||
url: `/api/rest/databaseManagement/v1/select/omc_db/gold_kpi`,
|
url: `/api/rest/databaseManagement/v1/select/omc_db/gold_kpi`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params: {
|
params: {
|
||||||
SQL: `SELECT gold_kpi.*,kpi_title.en_title FROM gold_kpi LEFT JOIN kpi_title on gold_kpi.kpi_id=kpi_title.kpi_id where 1=1 and gold_kpi.kpi_id ='UPF.03' and timestamp BETWEEN '${parseDateToStr(
|
SQL: `SELECT gold_kpi.*,kpi_title.en_title FROM gold_kpi LEFT JOIN kpi_title on gold_kpi.kpi_id=kpi_title.kpi_id where 1=1 and gold_kpi.kpi_id ='UPF.03' AND timestamp BETWEEN DATE_SUB(NOW(), INTERVAL 10 MINUTE) AND NOW()`,
|
||||||
twentyFourHoursAgo
|
|
||||||
)}' AND '${parseDateToStr(initTime)}' `,
|
|
||||||
},
|
},
|
||||||
timeout: 60_000,
|
timeout: 60_000,
|
||||||
}),
|
}),
|
||||||
@@ -137,9 +136,7 @@ export async function listUPFData(timeArr: any) {
|
|||||||
url: `/api/rest/databaseManagement/v1/select/omc_db/gold_kpi`,
|
url: `/api/rest/databaseManagement/v1/select/omc_db/gold_kpi`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params: {
|
params: {
|
||||||
SQL: `SELECT gold_kpi.*,kpi_title.en_title FROM gold_kpi LEFT JOIN kpi_title on gold_kpi.kpi_id=kpi_title.kpi_id where 1=1 and gold_kpi.kpi_id ='UPF.06' and timestamp BETWEEN '${parseDateToStr(
|
SQL: `SELECT gold_kpi.*,kpi_title.en_title FROM gold_kpi LEFT JOIN kpi_title on gold_kpi.kpi_id=kpi_title.kpi_id where 1=1 and gold_kpi.kpi_id ='UPF.06' AND timestamp BETWEEN DATE_SUB(NOW(), INTERVAL 10 MINUTE) AND NOW()`,
|
||||||
twentyFourHoursAgo
|
|
||||||
)}' AND '${parseDateToStr(initTime)}' `,
|
|
||||||
},
|
},
|
||||||
timeout: 60_000,
|
timeout: 60_000,
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
||||||
import { request } from '@/plugins/http-fetch';
|
import { request } from '@/plugins/http-fetch';
|
||||||
import { parseObjLineToHump } from '@/utils/parse-utils';
|
import { parseObjLineToHump } from '@/utils/parse-utils';
|
||||||
import { parseDateToStr } from '@/utils/date-utils';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询任务列表
|
* 查询任务列表
|
||||||
@@ -103,7 +102,7 @@ export function addPerfThre(data: Record<string, any>) {
|
|||||||
return request({
|
return request({
|
||||||
url: `/api/rest/databaseManagement/v1/omc_db/measure_threshold`,
|
url: `/api/rest/databaseManagement/v1/omc_db/measure_threshold`,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: { measure_task: [obj] },
|
data: { measure_threshold: [obj] },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,15 +114,15 @@ export function addPerfThre(data: Record<string, any>) {
|
|||||||
export function updatePerfThre(data: Record<string, any>) {
|
export function updatePerfThre(data: Record<string, any>) {
|
||||||
let obj: any = {
|
let obj: any = {
|
||||||
ne_type: data.neType,
|
ne_type: data.neType,
|
||||||
kpi_set: data.performanceArr,
|
kpi_set: data.kpiSet,
|
||||||
status: 'Inactive',
|
status: 'Inactive',
|
||||||
orig_severity: data.origSeverity,
|
orig_severity: data.origSeverity,
|
||||||
threshold: data.threshold,
|
threshold: ''+data.threshold,
|
||||||
};
|
};
|
||||||
return request({
|
return request({
|
||||||
url: `/api/rest/databaseManagement/v1/omc_db/measure_task?WHERE=id=${data.id}`,
|
url: `/api/rest/databaseManagement/v1/omc_db/measure_threshold?WHERE=id=${data.id}`,
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data: { data: obj },
|
data: { measure_threshold: obj },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
52
src/api/system/quick-start/bootloader.ts
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 首次引导开始
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function bootloaderStart() {
|
||||||
|
return request({
|
||||||
|
url: `/bootloader`,
|
||||||
|
method: 'post',
|
||||||
|
whithToken: false,
|
||||||
|
repeatSubmit: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 首次引导完成
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function bootloaderDone() {
|
||||||
|
return request({
|
||||||
|
url: `/bootloader`,
|
||||||
|
method: 'put',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 引导系统数据重置
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function bootloaderReset() {
|
||||||
|
return request({
|
||||||
|
url: `/bootloader`,
|
||||||
|
method: 'delete',
|
||||||
|
timeout: 180_000
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 管理员账号变更
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function bootloaderAccount(username: string, password: string) {
|
||||||
|
return request({
|
||||||
|
url: `/bootloader/account`,
|
||||||
|
method: 'put',
|
||||||
|
data: {
|
||||||
|
username,
|
||||||
|
password,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -18,6 +18,7 @@ export async function downloadFile(filePath: string, range?: string) {
|
|||||||
method: 'get',
|
method: 'get',
|
||||||
headers: range ? { range } : {},
|
headers: range ? { range } : {},
|
||||||
responseType: 'blob',
|
responseType: 'blob',
|
||||||
|
timeout: 60_000,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,6 +80,7 @@ export function uploadFile(data: FormData) {
|
|||||||
method: 'post',
|
method: 'post',
|
||||||
data,
|
data,
|
||||||
dataType: 'form-data',
|
dataType: 'form-data',
|
||||||
|
timeout: 180_000,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,7 +96,12 @@ export async function uploadFileChunk(
|
|||||||
chunkSize: number = 1,
|
chunkSize: number = 1,
|
||||||
subPath: string = 'default'
|
subPath: string = 'default'
|
||||||
) {
|
) {
|
||||||
const { name, size } = fileData;
|
let { name, size } = fileData;
|
||||||
|
// 去除非法字符
|
||||||
|
const cleanedFilename = name.replace(/[\\/:*?"<>|]/g, '');
|
||||||
|
// 去除空格
|
||||||
|
name = cleanedFilename.replace(/\s/g, '_');
|
||||||
|
// 数据块大小
|
||||||
const chunkSizeInBytes = chunkSize * 1024 * 1024;
|
const chunkSizeInBytes = chunkSize * 1024 * 1024;
|
||||||
// 文件标识使用唯一编码 MD5(文件名+文件大小)
|
// 文件标识使用唯一编码 MD5(文件名+文件大小)
|
||||||
const fileIdentifier = `${name}-${size}`;
|
const fileIdentifier = `${name}-${size}`;
|
||||||
@@ -125,6 +132,7 @@ export async function uploadFileChunk(
|
|||||||
const chunksIndex = `${index}`;
|
const chunksIndex = `${index}`;
|
||||||
// 跳过已上传块
|
// 跳过已上传块
|
||||||
if (resCheck.data.includes(chunksIndex)) {
|
if (resCheck.data.includes(chunksIndex)) {
|
||||||
|
uploadedSize += chunk.size;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,6 +171,7 @@ export function chunkCheck(identifier: string, fileName: string) {
|
|||||||
url: '/file/chunkCheck',
|
url: '/file/chunkCheck',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: { identifier, fileName },
|
data: { identifier, fileName },
|
||||||
|
timeout: 60_000,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,6 +191,7 @@ export function chunkMerge(
|
|||||||
url: '/file/chunkMerge',
|
url: '/file/chunkMerge',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: { identifier, fileName, subPath },
|
data: { identifier, fileName, subPath },
|
||||||
|
timeout: 60_000,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,6 +206,7 @@ export function chunkUpload(data: FormData) {
|
|||||||
method: 'post',
|
method: 'post',
|
||||||
data,
|
data,
|
||||||
dataType: 'form-data',
|
dataType: 'form-data',
|
||||||
|
timeout: 60_000,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -208,6 +219,7 @@ export function transferStaticFile(data: Record<string, any>) {
|
|||||||
url: `/file/transferStaticFile`,
|
url: `/file/transferStaticFile`,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data,
|
data,
|
||||||
|
timeout: 60_000,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -235,6 +247,7 @@ export async function uploadFileToNE(
|
|||||||
neType,
|
neType,
|
||||||
neId,
|
neId,
|
||||||
},
|
},
|
||||||
|
timeout: 60_000,
|
||||||
});
|
});
|
||||||
return transferToNeFileRes;
|
return transferToNeFileRes;
|
||||||
}
|
}
|
||||||
|
|||||||
20
src/api/tool/iperf.ts
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
// iperf 版本信息
|
||||||
|
export function iperfV(data: Record<string, string>) {
|
||||||
|
return request({
|
||||||
|
url: '/tool/iperf/v',
|
||||||
|
method: 'get',
|
||||||
|
params: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// iperf 软件安装
|
||||||
|
export function iperfI(data: Record<string, string>) {
|
||||||
|
return request({
|
||||||
|
url: '/tool/iperf/i',
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import { request } from '@/plugins/http-fetch';
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询文件列表列表
|
* 查询网元端文件列表
|
||||||
* @param query 查询参数
|
* @param query 查询参数
|
||||||
* @returns object
|
* @returns object
|
||||||
*/
|
*/
|
||||||
@@ -14,7 +14,7 @@ export function listNeFiles(query: Record<string, any>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 从网元端获取文件
|
* 从网元到本地获取文件
|
||||||
* @param query 查询参数
|
* @param query 查询参数
|
||||||
* @returns object
|
* @returns object
|
||||||
*/
|
*/
|
||||||
@@ -24,6 +24,27 @@ export function getNeFile(query: Record<string, any>) {
|
|||||||
method: 'get',
|
method: 'get',
|
||||||
params: query,
|
params: query,
|
||||||
responseType: 'blob',
|
responseType: 'blob',
|
||||||
timeout: 180_000,
|
timeout: 600_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从网元到本地获取目录压缩为ZIP
|
||||||
|
export function getNeDirZip(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/action/pullDirZip',
|
||||||
|
method: 'get',
|
||||||
|
params: data,
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 600_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查看网元端文件内容
|
||||||
|
export function getNeViewFile(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/ne/action/viewFile',
|
||||||
|
method: 'get',
|
||||||
|
params: data,
|
||||||
|
timeout: 60_000,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
10
src/api/tool/ping.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
// ping 网元端版本信息
|
||||||
|
export function pingV(data: Record<string, string>) {
|
||||||
|
return request({
|
||||||
|
url: '/tool/ping/v',
|
||||||
|
method: 'get',
|
||||||
|
params: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
79
src/api/trace/packet.ts
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 信令跟踪网卡设备列表
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function packetDevices() {
|
||||||
|
return request({
|
||||||
|
url: '/trace/packet/devices',
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 信令跟踪开始
|
||||||
|
* @param data 对象
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function packetStart(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/trace/packet/start',
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 信令跟踪结束
|
||||||
|
* @param data 对象
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function packetStop(taskNo: string) {
|
||||||
|
return request({
|
||||||
|
url: '/trace/packet/stop',
|
||||||
|
method: 'post',
|
||||||
|
data: { taskNo },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 信令跟踪过滤
|
||||||
|
* @param data 对象
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function packetFilter(taskNo: string, expr: string) {
|
||||||
|
return request({
|
||||||
|
url: '/trace/packet/filter',
|
||||||
|
method: 'put',
|
||||||
|
data: { taskNo, expr },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 信令跟踪续期保活
|
||||||
|
* @param data 对象
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function packetKeep(taskNo: string, duration: number = 120) {
|
||||||
|
return request({
|
||||||
|
url: '/trace/packet/keep-alive',
|
||||||
|
method: 'put',
|
||||||
|
data: { taskNo, duration },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 信令跟踪文件
|
||||||
|
* @param taskNo 对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function packetPCAPFile(taskNo: string) {
|
||||||
|
return request({
|
||||||
|
url: '/trace/packet/filePull',
|
||||||
|
method: 'get',
|
||||||
|
params: { taskNo },
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 680_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -3,26 +3,29 @@ import { request } from '@/plugins/http-fetch';
|
|||||||
// 网元抓包PACP 开始
|
// 网元抓包PACP 开始
|
||||||
export function dumpStart(data: Record<string, string>) {
|
export function dumpStart(data: Record<string, string>) {
|
||||||
return request({
|
return request({
|
||||||
url: '/tcpdump/start',
|
url: '/trace/tcpdump/start',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: data,
|
data: data,
|
||||||
|
timeout: 60_000,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元抓包PACP 结束
|
// 网元抓包PACP 结束
|
||||||
export function dumpStop(data: Record<string, string>) {
|
export function dumpStop(data: Record<string, string>) {
|
||||||
return request({
|
return request({
|
||||||
url: '/tcpdump/stop',
|
url: '/trace/tcpdump/stop',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: data,
|
data: data,
|
||||||
|
timeout: 60_000,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// UPF标准版内部抓包
|
// UPF标准版内部抓包
|
||||||
export function traceUPF(data: Record<string, string>) {
|
export function traceUPF(data: Record<string, string>) {
|
||||||
return request({
|
return request({
|
||||||
url: '/tcpdump/traceUPF',
|
url: '/trace/tcpdump/upf',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: data,
|
data: data,
|
||||||
|
timeout: 60_000,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
104
src/api/trace/task.ts
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询跟踪任务列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export async function listTraceTask(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/trace/task/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询跟踪任务信息
|
||||||
|
* @param id 网元ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export async function getTraceTask(id: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/trace/task/${id}`,
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增任务
|
||||||
|
* @param data 网元对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function addTraceTask(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/trace/task`,
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改任务
|
||||||
|
* @param data 网元对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function updateTraceTask(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: `/trace/task`,
|
||||||
|
method: 'put',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 跟踪任务删除
|
||||||
|
* @param ids ID多个逗号分隔
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export async function delTraceTask(ids: string) {
|
||||||
|
return request({
|
||||||
|
url: `/trace/task/${ids}`,
|
||||||
|
method: 'delete',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 跟踪任务文件
|
||||||
|
* @param query 对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function filePullTask(traceId: string) {
|
||||||
|
return request({
|
||||||
|
url: '/trace/task/filePull',
|
||||||
|
method: 'get',
|
||||||
|
params: { traceId },
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 600_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 跟踪任务数据列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export async function listTraceData(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/trace/data/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询跟踪任务数据信息
|
||||||
|
* @param id ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export async function getTraceData(id: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/trace/data/${id}`,
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
}
|
||||||
83
src/api/trace/taskHLR.ts
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
import { request } from '@/plugins/http-fetch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询跟踪任务列表
|
||||||
|
* @param query 查询参数
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function listTaskHLR(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/trace/task/hlr/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 跟踪任务删除
|
||||||
|
* @param ids 任务ID
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function delTaskHLR(ids: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/trace/task/hlr/${ids}`,
|
||||||
|
method: 'delete',
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 跟踪任务创建
|
||||||
|
* @param data 对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function startTaskHLR(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/trace/task/hlr/start',
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 跟踪任务停止
|
||||||
|
* @param data 对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function stopTaskHLR(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/trace/task/hlr/stop',
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
timeout: 60_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 跟踪任务文件
|
||||||
|
* @param data 对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function fileTaskHLR(data: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/trace/task/hlr/file',
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 跟踪任务文件从网元到本地
|
||||||
|
* @param query 对象
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function filePullTaskHLR(query: Record<string, any>) {
|
||||||
|
return request({
|
||||||
|
url: '/trace/task/hlr/filePull',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 600_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
|
||||||
import { request } from '@/plugins/http-fetch';
|
|
||||||
import { parseObjLineToHump } from '@/utils/parse-utils';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询信令列表
|
|
||||||
* @param query 查询参数
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export async function listTraceData(query: Record<string, any>) {
|
|
||||||
let totalSQL = 'select count(*) as total from trace_data where 1=1 ';
|
|
||||||
let rowsSQL = 'select * from trace_data where 1=1 ';
|
|
||||||
|
|
||||||
// 查询
|
|
||||||
let querySQL = '';
|
|
||||||
if (query.imsi) {
|
|
||||||
querySQL += ` and imsi like '%${query.imsi}%' `;
|
|
||||||
}
|
|
||||||
if (query.msisdn) {
|
|
||||||
querySQL += ` and msisdn like '%${query.msisdn}%' `;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 分页
|
|
||||||
const pageNum = (query.pageNum - 1) * query.pageSize;
|
|
||||||
const limtSql = ` limit ${pageNum},${query.pageSize} `;
|
|
||||||
|
|
||||||
// 发起请求
|
|
||||||
const result = await request({
|
|
||||||
url: `/api/rest/databaseManagement/v1/omc_db/trace_data`,
|
|
||||||
method: 'get',
|
|
||||||
params: {
|
|
||||||
totalSQL: totalSQL + querySQL,
|
|
||||||
rowsSQL: rowsSQL + querySQL + limtSql,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
// 解析数据
|
|
||||||
if (result.code === RESULT_CODE_SUCCESS) {
|
|
||||||
const data: DataList = {
|
|
||||||
total: 0,
|
|
||||||
rows: [],
|
|
||||||
code: result.code,
|
|
||||||
msg: result.msg,
|
|
||||||
};
|
|
||||||
result.data.data.forEach((item: any) => {
|
|
||||||
const itemData = item['trace_data'];
|
|
||||||
if (Array.isArray(itemData)) {
|
|
||||||
if (itemData.length === 1 && itemData[0]['total'] >= 0) {
|
|
||||||
data.total = itemData[0]['total'];
|
|
||||||
} else {
|
|
||||||
data.rows = itemData.map(v => parseObjLineToHump(v));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 信令数据解析HTML
|
|
||||||
* @param id 任务ID
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
export function getTraceRawInfo(id: Record<string, string>) {
|
|
||||||
return request({
|
|
||||||
url: `/api/rest/traceManagement/v1/decMessage/${id}`,
|
|
||||||
method: 'get',
|
|
||||||
responseType: 'text',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
@@ -1,154 +0,0 @@
|
|||||||
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
|
||||||
import { request } from '@/plugins/http-fetch';
|
|
||||||
import { parseObjLineToHump } from '@/utils/parse-utils';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询任务列表
|
|
||||||
* @param query 查询参数
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export async function listTraceTask(query: Record<string, any>) {
|
|
||||||
let totalSQL = 'select count(*) as total from trace_task where 1=1 ';
|
|
||||||
let rowsSQL = 'select * from trace_task where 1=1 ';
|
|
||||||
|
|
||||||
// 查询
|
|
||||||
let querySQL = '';
|
|
||||||
if (query.imsi) {
|
|
||||||
querySQL += ` and imsi like '%${query.imsi}%' `;
|
|
||||||
}
|
|
||||||
if (query.beginTime) {
|
|
||||||
querySQL += ` and start_time >= '${query.beginTime}' `;
|
|
||||||
}
|
|
||||||
if (query.endTime) {
|
|
||||||
querySQL += ` and end_time <= '${query.endTime}' `;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 分页
|
|
||||||
const pageNum = (query.pageNum - 1) * query.pageSize;
|
|
||||||
const limtSql = ` limit ${pageNum},${query.pageSize} `;
|
|
||||||
|
|
||||||
// 排序
|
|
||||||
let sortSql = ' order by start_time ';
|
|
||||||
if (query.sortOrder === 'asc') {
|
|
||||||
sortSql += ' asc ';
|
|
||||||
} else {
|
|
||||||
sortSql += ' desc ';
|
|
||||||
}
|
|
||||||
|
|
||||||
// 发起请求
|
|
||||||
const result = await request({
|
|
||||||
url: `/api/rest/databaseManagement/v1/select/omc_db/trace_task`,
|
|
||||||
method: 'get',
|
|
||||||
params: {
|
|
||||||
totalSQL: totalSQL + querySQL,
|
|
||||||
rowsSQL: rowsSQL + querySQL + sortSql + limtSql,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
// 解析数据
|
|
||||||
if (result.code === RESULT_CODE_SUCCESS) {
|
|
||||||
const data: DataList = {
|
|
||||||
total: 0,
|
|
||||||
rows: [],
|
|
||||||
code: result.code,
|
|
||||||
msg: result.msg,
|
|
||||||
};
|
|
||||||
result.data.data.forEach((item: any) => {
|
|
||||||
const itemData = item['trace_task'];
|
|
||||||
if (Array.isArray(itemData)) {
|
|
||||||
if (itemData.length === 1 && itemData[0]['total'] >= 0) {
|
|
||||||
data.total = itemData[0]['total'];
|
|
||||||
} else {
|
|
||||||
data.rows = itemData.map(v => parseObjLineToHump(v));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询任务详细
|
|
||||||
* @param id 网元ID
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export async function getTraceTask(id: string | number) {
|
|
||||||
// 发起请求
|
|
||||||
const result = await request({
|
|
||||||
url: `/api/rest/databaseManagement/v1/select/omc_db/trace_task`,
|
|
||||||
method: 'get',
|
|
||||||
params: {
|
|
||||||
SQL: `select * from trace_task where id = ${id}`,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
// 解析数据
|
|
||||||
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
|
|
||||||
let data = result.data.data[0];
|
|
||||||
return Object.assign(result, {
|
|
||||||
data: parseObjLineToHump(data['trace_task'][0]),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 新增任务
|
|
||||||
* @param data 网元对象
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function addTraceTask(data: Record<string, any>) {
|
|
||||||
return request({
|
|
||||||
url: `/api/rest/traceManagement/v1/subscriptions`,
|
|
||||||
method: 'post',
|
|
||||||
data: data,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改任务
|
|
||||||
* @param data 网元对象
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export function updateTraceTask(data: Record<string, any>) {
|
|
||||||
return request({
|
|
||||||
url: `/api/rest/traceManagement/v1/subscriptions`,
|
|
||||||
method: 'put',
|
|
||||||
data: data,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除任务
|
|
||||||
* @param noticeId 网元ID
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export async function delTraceTask(id: string) {
|
|
||||||
return request({
|
|
||||||
url: `/api/rest/traceManagement/v1/subscriptions?id=${id}`,
|
|
||||||
method: 'delete',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取网元跟踪接口列表
|
|
||||||
* @returns object
|
|
||||||
*/
|
|
||||||
export async function getNeTraceInterfaceAll() {
|
|
||||||
// 发起请求
|
|
||||||
const result = await request({
|
|
||||||
url: `/api/rest/databaseManagement/v1/elementType/omc_db/objectType/ne_info`,
|
|
||||||
method: 'get',
|
|
||||||
params: {
|
|
||||||
SQL: `SELECT ne_type,interface FROM trace_info GROUP BY ne_type,interface`,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
// 解析数据
|
|
||||||
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
|
|
||||||
let data = result.data.data[0];
|
|
||||||
return Object.assign(result, {
|
|
||||||
data: parseObjLineToHump(data['trace_info']),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
BIN
src/assets/background_dark.jpg
Normal file
|
After Width: | Height: | Size: 226 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
11
src/assets/js/wiregasm_worker.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
/**
|
||||||
|
* worker文件-静态资源文件路径
|
||||||
|
*/
|
||||||
|
const baseUrl = import.meta.env.VITE_HISTORY_BASE_URL;
|
||||||
|
export const scriptUrl = `${
|
||||||
|
baseUrl.length === 1 && baseUrl.indexOf('/') === 0
|
||||||
|
? ''
|
||||||
|
: baseUrl.indexOf('/') === -1
|
||||||
|
? '/' + baseUrl
|
||||||
|
: baseUrl
|
||||||
|
}/wiregasm/worker.js`;
|
||||||
1
src/assets/svg/dark.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg width="1em" height="1em" class="icon-dark" viewBox="0 0 17 17" xmlns="http://www.w3.org/2000/svg" style="vertical-align: -0.125em;color: rgba(255, 255, 255, 0.65);"><g id="Dark-\u9875\u9762-1" stroke="none" stroke-width="1px" fill="none" fill-rule="evenodd"><g id="Dark-\u9ED8\u8BA4" transform="translate(-9.000000, -49.500000)" fill="currentColor" fill-rule="nonzero"><g id="Dark-\u7F16\u7EC4-17" transform="translate(0.000000, 42.500000)"><g id="Dark-moon" transform="translate(9.268811, 7.500000)"><rect id="Dark-\u77E9\u5F62" opacity="0" x="0" y="0" width="16" height="16"></rect><path d="M8,1.33333333 C8.14933333,1.33333333 8.29688889,1.33844444 8.44266667,1.34866666 C8.14755556,1.98422221 8,2.64577777 8,3.33333333 C8,3.96533333 8.12333333,4.56955555 8.37,5.146 C8.61666667,5.72244445 8.94822222,6.21888889 9.36466667,6.63533333 C9.78111112,7.05177777 10.2775556,7.38333332 10.854,7.63 C11.4304444,7.87666668 12.0346667,8.00000001 12.6666667,8 C13.3542222,8 14.0157778,7.85244444 14.6513333,7.55733333 C14.6615556,7.70311111 14.6666667,7.85066667 14.6666667,8 C14.6666667,8.604 14.5868889,9.19422222 14.4273333,9.77066667 C14.2677778,10.3471111 14.0446667,10.8793333 13.758,11.3673333 C13.4713333,11.8553333 13.1233333,12.3042222 12.714,12.714 C12.3046667,13.1237778 11.8557778,13.4717778 11.3673333,13.758 C10.8788889,14.0442222 10.3466667,14.2673333 9.77066667,14.4273333 C9.19466667,14.5873333 8.60444445,14.6671111 8,14.6666685 C7.39555555,14.6662222 6.80533333,14.5864444 6.22933333,14.4273333 C5.65333333,14.2682222 5.1211111,14.0451111 4.63266666,13.758 C4.14422221,13.4708889 3.69533332,13.1228889 3.28599998,12.714 C2.87666665,12.3051111 2.52866665,11.8562222 2.24199998,11.3673333 C1.95533332,10.8784444 1.73222221,10.3462222 1.57266666,9.77066667 C1.4131111,9.19511112 1.33333333,8.6048889 1.33333333,8 C1.33333333,7.3951111 1.4131111,6.80488888 1.57266666,6.22933333 C1.73222221,5.65377778 1.95533332,5.12155555 2.24199998,4.63266666 C2.52866665,4.14377776 2.87666665,3.69488887 3.28599998,3.28599998 C3.69533332,2.8771111 4.14422221,2.5291111 4.63266666,2.24199998 C5.1211111,1.95488887 5.65333333,1.73177776 6.22933333,1.57266666 C6.80533333,1.41355555 7.39555555,1.33377778 8,1.33333333 Z M6.68733333,2.828 C6.11444444,2.97377778 5.58066667,3.20977778 5.086,3.536 C4.59133333,3.86222222 4.166,4.24933333 3.81,4.69733333 C3.454,5.14533333 3.17444444,5.65488889 2.97133333,6.226 C2.76822221,6.79711111 2.66666666,7.38822222 2.66666666,7.99933333 C2.66666666,8.72155555 2.80733332,9.41155555 3.08866666,10.0693333 C3.36999999,10.7271111 3.74933332,11.2948889 4.22666666,11.7726667 C4.70399999,12.2504444 5.27177777,12.6297778 5.92999998,12.9106667 C6.5882222,13.1915556 7.2782222,13.3322222 7.99999998,13.3326667 C8.6111111,13.3326667 9.20222221,13.2311111 9.77333331,13.028 C10.3444444,12.8248889 10.854,12.5453333 11.302,12.1893333 C11.75,11.8333333 12.1371111,11.408 12.4633333,10.9133333 C12.7895555,10.4186666 13.0255555,9.88488887 13.1713333,9.31199998 C13.022,9.32577777 12.8535555,9.33266666 12.666,9.33266666 C11.8535555,9.33266666 11.0775555,9.17377777 10.338,8.85599998 C9.59844443,8.5382222 8.96044443,8.11111109 8.42399998,7.57466666 C7.88755554,7.03822222 7.46044443,6.40022222 7.14266666,5.66066666 C6.82488889,4.92111109 6.66599999,4.14511109 6.66599998,3.33266666 C6.66599998,3.1451111 6.67288888,2.97666666 6.68666666,2.82733333 L6.68733333,2.828 Z" id="Dark-\u5F62\u72B6"></path></g></g></g></g></svg>
|
||||||
|
After Width: | Height: | Size: 3.4 KiB |
1
src/assets/svg/light.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg width="1em" height="1em" class="icon-light" viewBox="0 0 13 13" xmlns="http://www.w3.org/2000/svg" style="vertical-align: -0.125em;color: rgba(0, 0, 0, 0.88);"><g id="Light-\u9875\u9762-1" stroke="none" stroke-width="1px" fill="none" fill-rule="evenodd"><g id="Light-\u4E3B\u9898\u5305" transform="translate(-2943.000000, -292.000000)" fill="currentColor" fill-rule="nonzero"><g id="Light-\u7F16\u7EC4-12" transform="translate(2415.000000, 222.000000)"><g id="Light-\u89C6\u56FE\u5207\u6362-\u7F16\u8F91\u6001" transform="translate(518.000000, 60.000000)"><g id="Light-eye" transform="translate(8.000000, 8.000000)"><g id="Light-sun" transform="translate(2.000000, 2.000000)"><rect id="Light-\u77E9\u5F62" opacity="0" x="0" y="0" width="13" height="13"></rect><path d="M6.5,9.75 C4.7051875,9.75 3.25,8.2948125 3.25,6.5 C3.25,4.7051875 4.7051875,3.25 6.5,3.25 C8.2948125,3.25 9.75,4.7051875 9.75,6.5 C9.75,8.2948125 8.2948125,9.75 6.5,9.75 Z M6.5,8.66666667 C7.69661696,8.66666667 8.66666667,7.69661696 8.66666667,6.5 C8.66666667,5.30338304 7.69661696,4.33333333 6.5,4.33333333 C5.30338305,4.33333333 4.33333336,5.30338305 4.33333336,6.5 C4.33333336,7.69661695 5.30338305,8.66666667 6.5,8.66666667 Z M5.95833333,1.08333333 C5.95833333,0.784179087 6.20084576,0.541666658 6.5,0.541666658 C6.79915424,0.541666658 7.04166667,0.784179087 7.04166667,1.08333333 L7.04166667,2.16666667 C7.04166667,2.46582091 6.79915424,2.70833334 6.5,2.70833334 C6.20084576,2.70833334 5.95833333,2.46582091 5.95833333,2.16666667 L5.95833333,1.08333333 L5.95833333,1.08333333 Z M5.95833333,10.8333333 C5.95833333,10.5341791 6.20084576,10.2916667 6.5,10.2916667 C6.79915424,10.2916667 7.04166667,10.5341791 7.04166667,10.8333333 L7.04166667,11.9166667 C7.04166667,12.2158209 6.79915424,12.4583333 6.5,12.4583333 C6.20084576,12.4583333 5.95833333,12.2158209 5.95833333,11.9166667 L5.95833333,10.8333333 L5.95833333,10.8333333 Z M1.08333333,7.04166667 C0.784179087,7.04166667 0.541666658,6.79915424 0.541666658,6.5 C0.541666658,6.20084576 0.784179087,5.95833333 1.08333333,5.95833333 L2.16666667,5.95833333 C2.46582091,5.95833333 2.70833334,6.20084576 2.70833334,6.5 C2.70833334,6.79915424 2.46582091,7.04166667 2.16666667,7.04166667 L1.08333333,7.04166667 L1.08333333,7.04166667 Z M10.8333333,7.04166667 C10.5341791,7.04166667 10.2916667,6.79915424 10.2916667,6.5 C10.2916667,6.20084576 10.5341791,5.95833333 10.8333333,5.95833333 L11.9166667,5.95833333 C12.2158209,5.95833333 12.4583333,6.20084576 12.4583333,6.5 C12.4583333,6.79915424 12.2158209,7.04166667 11.9166667,7.04166667 L10.8333333,7.04166667 L10.8333333,7.04166667 Z M2.05454167,2.82045833 C1.84926545,2.60791971 1.85220137,2.27007933 2.06114035,2.06114035 C2.27007933,1.85220137 2.60791971,1.84926545 2.82045833,2.05454167 L3.63295833,2.86704167 C3.83823455,3.07958029 3.83529863,3.41742067 3.62635965,3.62635965 C3.41742067,3.83529863 3.07958029,3.83823455 2.86704167,3.63295833 L2.05454167,2.82045833 L2.05454167,2.82045833 Z M9.36704167,10.1329583 C9.16176545,9.92041971 9.16470137,9.58257933 9.37364035,9.37364035 C9.58257933,9.16470137 9.92041971,9.16176545 10.1329583,9.36704167 L10.9454583,10.1795417 C11.1507346,10.3920803 11.1477986,10.7299207 10.9388596,10.9388596 C10.7299207,11.1477986 10.3920803,11.1507346 10.1795417,10.9454583 L9.36704167,10.1329583 L9.36704167,10.1329583 Z M2.82045833,10.9454583 C2.60791971,11.1507346 2.27007933,11.1477986 2.06114035,10.9388596 C1.85220137,10.7299207 1.84926545,10.3920803 2.05454167,10.1795417 L2.86704167,9.36704167 C3.07958029,9.16176545 3.41742067,9.16470137 3.62635965,9.37364035 C3.83529863,9.58257933 3.83823455,9.92041971 3.63295833,10.1329583 L2.82045833,10.9454583 L2.82045833,10.9454583 Z M10.1329583,3.63295833 C9.92041971,3.83823455 9.58257933,3.83529863 9.37364035,3.62635965 C9.16470137,3.41742067 9.16176545,3.07958029 9.36704167,2.86704167 L10.1795417,2.05454167 C10.3920803,1.84926545 10.7299207,1.85220137 10.9388596,2.06114035 C11.1477986,2.27007933 11.1507346,2.60791971 10.9454583,2.82045833 L10.1329583,3.63295833 L10.1329583,3.63295833 Z" id="Light-\u5F62\u72B6"></path></g></g></g></g></g></g></svg>
|
||||||
|
After Width: | Height: | Size: 4.0 KiB |
@@ -1,70 +1,117 @@
|
|||||||
<template>
|
|
||||||
<codemirror
|
|
||||||
:model-value="modelValue"
|
|
||||||
:placeholder="props.placeholder"
|
|
||||||
:style="props.editorStyle"
|
|
||||||
:disabled="props.disabled"
|
|
||||||
:autofocus="false"
|
|
||||||
:indent-with-tab="true"
|
|
||||||
:tab-size="props.tabSize"
|
|
||||||
:extensions="[javascript(), oneDark]"
|
|
||||||
@ready="fnReady"
|
|
||||||
@change="fnChange"
|
|
||||||
/>
|
|
||||||
</template>
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { Codemirror } from 'vue-codemirror';
|
|
||||||
import { javascript } from '@codemirror/lang-javascript';
|
import { javascript } from '@codemirror/lang-javascript';
|
||||||
|
import { yaml } from '@codemirror/lang-yaml';
|
||||||
import { oneDark } from '@codemirror/theme-one-dark';
|
import { oneDark } from '@codemirror/theme-one-dark';
|
||||||
import { ref, watch } from 'vue';
|
import { basicSetup, EditorView } from 'codemirror';
|
||||||
|
import { indentWithTab } from '@codemirror/commands';
|
||||||
const emit = defineEmits(['update:value']);
|
import { keymap } from '@codemirror/view';
|
||||||
|
import { EditorState } from '@codemirror/state';
|
||||||
|
import { ref, watch, onMounted, onBeforeUnmount } from 'vue';
|
||||||
|
const emit = defineEmits(['update:value', 'change']);
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
/**禁用输入使用v-model:value时不生效 */
|
||||||
value: {
|
value: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
placeholder: {
|
/**编辑框高度 */
|
||||||
|
height: {
|
||||||
type: String,
|
type: String,
|
||||||
default: 'input context here...',
|
default: '400px',
|
||||||
},
|
|
||||||
/**是否禁止输入 */
|
|
||||||
disabled: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
editorStyle: {
|
|
||||||
type: Object,
|
|
||||||
default: () => ({ height: '400px !important' }),
|
|
||||||
},
|
},
|
||||||
/**缩进2空格 */
|
/**缩进2空格 */
|
||||||
tabSize: {
|
tabSize: {
|
||||||
type: Number,
|
type: Number,
|
||||||
default: 2,
|
default: 2,
|
||||||
},
|
},
|
||||||
|
/**是否禁止输入 */
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true,
|
||||||
|
},
|
||||||
|
/**高亮语言 支持javascript、yaml */
|
||||||
|
lang: {
|
||||||
|
type: String,
|
||||||
|
default: 'javascript',
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
// 绑定值
|
/**视图容器 */
|
||||||
const modelValue = ref<string>('');
|
const viewContainerDom = ref<HTMLElement | undefined>(undefined);
|
||||||
|
let viewContainer: EditorView | null = null;
|
||||||
|
|
||||||
/**变更时更新绑定值 */
|
/**高亮语言拓展 */
|
||||||
function fnChange(value: string, viewUpdate: any) {
|
function fnLangExtension() {
|
||||||
if (props.disabled) return;
|
if (props.lang === 'yaml') {
|
||||||
emit('update:value', value);
|
return yaml();
|
||||||
|
}
|
||||||
|
return javascript();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**组件渲染后 */
|
/**初始化渲染视图 */
|
||||||
function fnReady(payload: any) {
|
function handleRanderView(container: HTMLElement | undefined) {
|
||||||
modelValue.value = props.value;
|
if (!container) return;
|
||||||
|
viewContainer = new EditorView({
|
||||||
|
doc: props.value,
|
||||||
|
extensions: [
|
||||||
|
oneDark,
|
||||||
|
basicSetup,
|
||||||
|
keymap.of([indentWithTab]),
|
||||||
|
fnLangExtension(),
|
||||||
|
EditorView.editable.of(!props.disabled),
|
||||||
|
EditorState.readOnly.of(props.disabled),
|
||||||
|
EditorState.tabSize.of(props.tabSize),
|
||||||
|
EditorView.updateListener.of(v => {
|
||||||
|
if (v.docChanged) {
|
||||||
|
const docStr = v.state.doc.toString();
|
||||||
|
emit('change', docStr, v.state.doc);
|
||||||
|
// 禁用时不双向绑定,防止监听重复变化数值
|
||||||
|
if (!props.disabled) {
|
||||||
|
emit('update:value', docStr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
parent: container,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**监听是否value改变 */
|
/**监听是否value改变 */
|
||||||
watch(
|
watch(
|
||||||
() => props.value,
|
() => props.value,
|
||||||
val => {
|
val => {
|
||||||
modelValue.value = val;
|
// 禁用时无输入靠外部值变化改变数值
|
||||||
|
if (props.disabled && viewContainer) {
|
||||||
|
const docLine = viewContainer.state.doc.length;
|
||||||
|
viewContainer.dispatch({
|
||||||
|
changes: { from: 0, to: docLine, insert: val },
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
handleRanderView(viewContainerDom.value);
|
||||||
|
});
|
||||||
|
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
viewContainer?.destroy();
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<template>
|
||||||
|
<div
|
||||||
|
ref="viewContainerDom"
|
||||||
|
class="container"
|
||||||
|
:style="{ '--editor-height': height }"
|
||||||
|
></div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.container {
|
||||||
|
--editor-height: 400px;
|
||||||
|
}
|
||||||
|
.container :deep(.cm-editor) {
|
||||||
|
height: var(--editor-height);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -1,116 +1,131 @@
|
|||||||
<template>
|
|
||||||
<a-modal
|
|
||||||
:title="props.title"
|
|
||||||
width="80%"
|
|
||||||
:visible="props.visible"
|
|
||||||
:body-style="{ padding: '0 24px' }"
|
|
||||||
:destroy-on-close="true"
|
|
||||||
@cancel="fnCronModal(false)"
|
|
||||||
@ok="fnCronModal(true)"
|
|
||||||
>
|
|
||||||
<div ref="mergeViewContainer" class="mergeViewContainer"></div>
|
|
||||||
</a-modal>
|
|
||||||
</template>
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { javascript } from '@codemirror/lang-javascript';
|
import { javascript } from '@codemirror/lang-javascript';
|
||||||
|
import { yaml } from '@codemirror/lang-yaml';
|
||||||
import { oneDark } from '@codemirror/theme-one-dark';
|
import { oneDark } from '@codemirror/theme-one-dark';
|
||||||
import { MergeView } from '@codemirror/merge';
|
import { MergeView } from '@codemirror/merge';
|
||||||
import { EditorView, basicSetup } from 'codemirror';
|
import { EditorView, basicSetup } from 'codemirror';
|
||||||
import { EditorState } from '@codemirror/state';
|
import { EditorState } from '@codemirror/state';
|
||||||
|
import { ref, onMounted, onBeforeUnmount, watch } from 'vue';
|
||||||
import { watch, ref } from 'vue';
|
const emit = defineEmits(['update:newArea', 'change']);
|
||||||
import { nextTick } from 'vue';
|
|
||||||
|
|
||||||
const emit = defineEmits(['cancel', 'ok', 'update:visible']);
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
visible: {
|
|
||||||
type: Boolean,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
title: {
|
|
||||||
type: String,
|
|
||||||
default: '内容比较',
|
|
||||||
},
|
|
||||||
newArea: {
|
|
||||||
type: String,
|
|
||||||
default: '当前内容',
|
|
||||||
},
|
|
||||||
oldArea: {
|
oldArea: {
|
||||||
type: String,
|
type: String,
|
||||||
default: '原始内容',
|
default: '原始内容',
|
||||||
},
|
},
|
||||||
|
/**当前变更内容 */
|
||||||
|
newArea: {
|
||||||
|
type: String,
|
||||||
|
default: '当前内容',
|
||||||
|
},
|
||||||
|
/**编辑框高度 */
|
||||||
height: {
|
height: {
|
||||||
type: String,
|
type: String,
|
||||||
default: '400px !important',
|
default: '400px',
|
||||||
|
},
|
||||||
|
/**缩进2空格 */
|
||||||
|
tabSize: {
|
||||||
|
type: Number,
|
||||||
|
default: 2,
|
||||||
},
|
},
|
||||||
/**是否禁止输入 */
|
/**是否禁止输入 */
|
||||||
disabled: {
|
disabled: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true,
|
default: true,
|
||||||
},
|
},
|
||||||
|
/**高亮语言 */
|
||||||
|
lang: {
|
||||||
|
type: String,
|
||||||
|
default: 'javascript',
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const mergeViewContainer = ref();
|
/**视图容器 */
|
||||||
|
const viewContainerDom = ref<HTMLElement | undefined>(undefined);
|
||||||
|
let viewContainer: MergeView | null = null;
|
||||||
|
|
||||||
/**监听是否显示,初始cron属性 */
|
/**高亮语言拓展 */
|
||||||
|
function fnLangExtension() {
|
||||||
|
if (props.lang === 'yaml') {
|
||||||
|
return yaml();
|
||||||
|
}
|
||||||
|
return javascript();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**初始化渲染视图 */
|
||||||
|
function handleRanderView(container: HTMLElement | undefined) {
|
||||||
|
if (!container) return;
|
||||||
|
viewContainer = new MergeView({
|
||||||
|
a: {
|
||||||
|
doc: props.oldArea,
|
||||||
|
extensions: [
|
||||||
|
fnLangExtension(),
|
||||||
|
oneDark,
|
||||||
|
basicSetup,
|
||||||
|
EditorView.editable.of(false),
|
||||||
|
EditorState.readOnly.of(true),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
b: {
|
||||||
|
doc: props.newArea,
|
||||||
|
extensions: [
|
||||||
|
fnLangExtension(),
|
||||||
|
oneDark,
|
||||||
|
basicSetup,
|
||||||
|
EditorView.editable.of(!props.disabled),
|
||||||
|
EditorState.readOnly.of(props.disabled),
|
||||||
|
EditorState.tabSize.of(props.tabSize),
|
||||||
|
EditorView.updateListener.of(v => {
|
||||||
|
if (v.docChanged) {
|
||||||
|
const docStr = v.state.doc.toString();
|
||||||
|
emit('change', docStr, v.state.doc);
|
||||||
|
// 禁用时不双向绑定,防止监听重复变化数值
|
||||||
|
if (!props.disabled) {
|
||||||
|
emit('update:newArea', docStr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
parent: container,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**监听是否value改变 */
|
||||||
watch(
|
watch(
|
||||||
() => props.visible,
|
() => props.newArea,
|
||||||
val => {
|
val => {
|
||||||
if (val) {
|
// 禁用时无输入靠外部值变化改变数值
|
||||||
// 开启时等待dom完成
|
if (props.disabled && viewContainer) {
|
||||||
|
const docLine = viewContainer.b.state.doc.length;
|
||||||
nextTick(() => {
|
viewContainer.b.dispatch({
|
||||||
// 设置高度
|
changes: { from: 0, to: docLine, insert: val },
|
||||||
mergeViewContainer.value.style.height = props.height;
|
|
||||||
// 实例到dom
|
|
||||||
new MergeView({
|
|
||||||
a: {
|
|
||||||
doc: props.oldArea,
|
|
||||||
extensions: [
|
|
||||||
javascript(),
|
|
||||||
oneDark,
|
|
||||||
basicSetup,
|
|
||||||
EditorView.editable.of(false),
|
|
||||||
EditorState.readOnly.of(true),
|
|
||||||
],
|
|
||||||
},
|
|
||||||
b: {
|
|
||||||
doc: props.newArea,
|
|
||||||
extensions: [
|
|
||||||
javascript(),
|
|
||||||
oneDark,
|
|
||||||
basicSetup,
|
|
||||||
EditorView.editable.of(!props.disabled),
|
|
||||||
EditorState.readOnly.of(props.disabled),
|
|
||||||
],
|
|
||||||
},
|
|
||||||
parent: mergeViewContainer.value,
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
onMounted(() => {
|
||||||
* 窗口事件
|
handleRanderView(viewContainerDom.value);
|
||||||
* @param val modal触发事件
|
});
|
||||||
*/
|
|
||||||
function fnCronModal(val: boolean) {
|
onBeforeUnmount(() => {
|
||||||
emit('update:visible', false);
|
viewContainer?.destroy();
|
||||||
if (val) {
|
});
|
||||||
emit('ok', true);
|
|
||||||
} else {
|
|
||||||
emit('cancel');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
ref="viewContainerDom"
|
||||||
|
class="container"
|
||||||
|
:style="{ '--editor-height': height }"
|
||||||
|
></div>
|
||||||
|
</template>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
.mergeViewContainer {
|
.container {
|
||||||
height: 400px;
|
--editor-height: 400px;
|
||||||
overflow-y: scroll;
|
}
|
||||||
overflow-x: hidden;
|
.container :deep(.cm-editor) {
|
||||||
color: #abb2bf;
|
height: var(--editor-height);
|
||||||
background-color: #282c34;
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<a-modal
|
<ProModal
|
||||||
|
:drag="true"
|
||||||
|
:destroyOnClose="true"
|
||||||
:title="t('components.CronModal.title')"
|
:title="t('components.CronModal.title')"
|
||||||
:visible="props.visible"
|
:open="props.open"
|
||||||
:body-style="{ padding: '0 24px' }"
|
:body-style="{ padding: '0 24px' }"
|
||||||
:destroy-on-close="true"
|
|
||||||
@cancel="fnCronModal(false)"
|
@cancel="fnCronModal(false)"
|
||||||
@ok="fnCronModal(true)"
|
@ok="fnCronModal(true)"
|
||||||
>
|
>
|
||||||
@@ -31,9 +32,10 @@
|
|||||||
v-model:value="cronStr"
|
v-model:value="cronStr"
|
||||||
disabled
|
disabled
|
||||||
/>
|
/>
|
||||||
</a-modal>
|
</ProModal>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
|
import { ProModal } from 'antdv-pro-modal';
|
||||||
import CronSecond from './components/Second.vue';
|
import CronSecond from './components/Second.vue';
|
||||||
import CronMinute from './components/Minute.vue';
|
import CronMinute from './components/Minute.vue';
|
||||||
import CronHour from './components/Hour.vue';
|
import CronHour from './components/Hour.vue';
|
||||||
@@ -43,9 +45,9 @@ import { reactive, computed, watch } from 'vue';
|
|||||||
import useI18n from '@/hooks/useI18n';
|
import useI18n from '@/hooks/useI18n';
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
const emit = defineEmits(['cancel', 'ok', 'update:visible']);
|
const emit = defineEmits(['cancel', 'ok', 'update:open']);
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
visible: {
|
open: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
@@ -74,7 +76,7 @@ const cronStr = computed(() => {
|
|||||||
|
|
||||||
/**监听是否显示,初始cron属性 */
|
/**监听是否显示,初始cron属性 */
|
||||||
watch(
|
watch(
|
||||||
() => props.visible,
|
() => props.open,
|
||||||
val => {
|
val => {
|
||||||
if (!val) return;
|
if (!val) return;
|
||||||
const arr = props.cron.split(' ');
|
const arr = props.cron.split(' ');
|
||||||
@@ -97,7 +99,7 @@ watch(
|
|||||||
* @param val modal触发事件
|
* @param val modal触发事件
|
||||||
*/
|
*/
|
||||||
function fnCronModal(val: boolean) {
|
function fnCronModal(val: boolean) {
|
||||||
emit('update:visible', false);
|
emit('update:open', false);
|
||||||
if (val) {
|
if (val) {
|
||||||
emit('ok', cronStr.value);
|
emit('ok', cronStr.value);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed } from 'vue';
|
import { computed, PropType } from 'vue';
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
/**数据 */
|
/**数据 */
|
||||||
options: {
|
options: {
|
||||||
type: Array,
|
type: Array as PropType<DictType[]>,
|
||||||
},
|
},
|
||||||
/**当前的值对应数据中的项字段 */
|
/**当前的值对应数据中的项字段 */
|
||||||
valueField: {
|
valueField: {
|
||||||
type: String,
|
type: String as PropType<keyof DictType>,
|
||||||
default: 'value',
|
default: 'value',
|
||||||
},
|
},
|
||||||
/**当前的值 */
|
/**当前的值 */
|
||||||
@@ -15,14 +15,24 @@ const props = defineProps({
|
|||||||
type: [Number, String],
|
type: [Number, String],
|
||||||
default: '',
|
default: '',
|
||||||
},
|
},
|
||||||
|
/**数据默认值,当前值不存在时 */
|
||||||
|
valueDefault: {
|
||||||
|
type: [Number, String],
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
/**遍历找到对应值数据项 */
|
/**遍历找到对应值数据项 */
|
||||||
const item = computed(() => {
|
const item = computed(() => {
|
||||||
if (Array.isArray(props.options) && props.options.length > 0) {
|
if (Array.isArray(props.options) && props.options.length > 0) {
|
||||||
const option = (props.options as any[]).find(
|
let option = props.options.find(
|
||||||
item => `${item[props.valueField]}` === `${props.value}`
|
item => `${item[props.valueField]}` === `${props.value}`
|
||||||
);
|
);
|
||||||
|
// 数据默认值
|
||||||
|
if (!option && props.valueDefault != undefined) {
|
||||||
|
option = props.options.find(
|
||||||
|
item => `${item[props.valueField]}` === `${props.valueDefault}`
|
||||||
|
);
|
||||||
|
}
|
||||||
return option;
|
return option;
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
@@ -31,14 +41,10 @@ const item = computed(() => {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<template v-if="item">
|
<template v-if="item">
|
||||||
<a-tag
|
<a-tag v-if="item.tagType" :class="item.tagClass" :color="item.tagType">
|
||||||
v-if="item.elTagType"
|
|
||||||
:class="item.elTagClass"
|
|
||||||
:color="item.elTagType"
|
|
||||||
>
|
|
||||||
{{ item.label }}
|
{{ item.label }}
|
||||||
</a-tag>
|
</a-tag>
|
||||||
<span v-else :class="item.elTagClass">
|
<span v-else :class="item.tagClass">
|
||||||
{{ item.label }}
|
{{ item.label }}
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,168 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import { ref, watch, watchEffect, CSSProperties, computed } from 'vue';
|
|
||||||
import { useDraggable } from '@vueuse/core';
|
|
||||||
const emit = defineEmits(['update:visible', 'ok', 'cancel']);
|
|
||||||
/**于a-modal保持一致 */
|
|
||||||
const props = defineProps({
|
|
||||||
/**是否弹出显示,必传 */
|
|
||||||
visible: {
|
|
||||||
type: Boolean,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
/**窗口标题 */
|
|
||||||
title: {
|
|
||||||
type: String,
|
|
||||||
default: '',
|
|
||||||
},
|
|
||||||
/**窗口宽度 */
|
|
||||||
width: {
|
|
||||||
type: [String, Number],
|
|
||||||
default: '520px',
|
|
||||||
},
|
|
||||||
bodyStyle: {
|
|
||||||
type: Object,
|
|
||||||
default: {},
|
|
||||||
},
|
|
||||||
keyboard: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true,
|
|
||||||
},
|
|
||||||
mask: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true,
|
|
||||||
},
|
|
||||||
maskClosable: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true,
|
|
||||||
},
|
|
||||||
maskStyle: {
|
|
||||||
type: Object,
|
|
||||||
default: {},
|
|
||||||
},
|
|
||||||
destroyOnClose: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
confirmLoading: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
footer: {
|
|
||||||
type: Object,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
// 对标题进行监听
|
|
||||||
const modalTitleRef = ref<HTMLElement | null>(null);
|
|
||||||
const { x, y, isDragging } = useDraggable(modalTitleRef);
|
|
||||||
|
|
||||||
const startX = ref<number>(0);
|
|
||||||
const startY = ref<number>(0);
|
|
||||||
const startedDrag = ref(false);
|
|
||||||
const transformX = ref(0);
|
|
||||||
const transformY = ref(0);
|
|
||||||
const preTransformX = ref(0);
|
|
||||||
const preTransformY = ref(0);
|
|
||||||
const dragRect = ref({ left: 0, right: 0, top: 0, bottom: 0 });
|
|
||||||
|
|
||||||
watch([x, y], () => {
|
|
||||||
if (!startedDrag.value) {
|
|
||||||
startX.value = x.value;
|
|
||||||
startY.value = y.value;
|
|
||||||
const bodyRect = document.body.getBoundingClientRect();
|
|
||||||
const titleRectEl = modalTitleRef.value;
|
|
||||||
if (titleRectEl) {
|
|
||||||
const titleRect = titleRectEl.getBoundingClientRect();
|
|
||||||
dragRect.value.right = bodyRect.width - (titleRect.width + 24);
|
|
||||||
dragRect.value.bottom = bodyRect.height - (titleRect.height + 16);
|
|
||||||
}
|
|
||||||
preTransformX.value = transformX.value;
|
|
||||||
preTransformY.value = transformY.value;
|
|
||||||
}
|
|
||||||
startedDrag.value = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
watchEffect(() => {
|
|
||||||
if (!isDragging.value) {
|
|
||||||
startedDrag.value = false;
|
|
||||||
}
|
|
||||||
if (startedDrag.value) {
|
|
||||||
const dragRectX = Math.min(
|
|
||||||
Math.max(dragRect.value.left + 24, x.value),
|
|
||||||
dragRect.value.right
|
|
||||||
);
|
|
||||||
transformX.value = preTransformX.value + dragRectX - startX.value;
|
|
||||||
|
|
||||||
const dragRectY = Math.min(
|
|
||||||
Math.max(dragRect.value.top + 16, y.value),
|
|
||||||
dragRect.value.bottom
|
|
||||||
);
|
|
||||||
transformY.value = preTransformY.value + dragRectY - startY.value;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 位移
|
|
||||||
const transformStyle = computed<CSSProperties>(() => {
|
|
||||||
return {
|
|
||||||
transform: `translate(${transformX.value}px, ${transformY.value}px)`,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
/**监听是否显示,位置还原 */
|
|
||||||
watch(
|
|
||||||
() => props.visible,
|
|
||||||
val => {
|
|
||||||
if (val) {
|
|
||||||
transformX.value = 0;
|
|
||||||
transformY.value = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<a-modal
|
|
||||||
wrapClassName="draggable-modal"
|
|
||||||
:width="props.width"
|
|
||||||
:keyboard="props.keyboard"
|
|
||||||
:mask="props.mask"
|
|
||||||
:mask-closable="props.maskClosable"
|
|
||||||
:visible="props.visible"
|
|
||||||
:confirm-loading="props.confirmLoading"
|
|
||||||
:body-style="props.bodyStyle"
|
|
||||||
:mask-style="props.maskStyle"
|
|
||||||
:destroy-on-close="props.destroyOnClose"
|
|
||||||
:footer="props.footer"
|
|
||||||
@ok="(e:any) => emit('ok', e)"
|
|
||||||
@cancel="(e:any) => emit('cancel', e)"
|
|
||||||
>
|
|
||||||
<template #title>
|
|
||||||
<div
|
|
||||||
ref="modalTitleRef"
|
|
||||||
class="draggable-modal-title"
|
|
||||||
v-text="title"
|
|
||||||
></div>
|
|
||||||
</template>
|
|
||||||
<template #modalRender="{ originVNode }">
|
|
||||||
<div :style="transformStyle">
|
|
||||||
<component :is="originVNode" />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<slot></slot>
|
|
||||||
</a-modal>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="less">
|
|
||||||
.draggable-modal {
|
|
||||||
// 穿透选择文字
|
|
||||||
// 给a-modal设置 get-container=".ant-pro-page-container"
|
|
||||||
// 防止跳转显示
|
|
||||||
// &.ant-modal-wrap {
|
|
||||||
// pointer-events: none;
|
|
||||||
// }
|
|
||||||
&-title {
|
|
||||||
width: 100%;
|
|
||||||
cursor: move;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
141
src/components/GlobalMask/index.vue
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { onMounted, onUnmounted, computed } from 'vue';
|
||||||
|
import useI18n from '@/hooks/useI18n';
|
||||||
|
import useMaskStore from '@/store/modules/mask';
|
||||||
|
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
||||||
|
import { useRoute, useRouter } from 'vue-router';
|
||||||
|
import { useThrottleFn } from '@vueuse/core';
|
||||||
|
import { getConfigKey } from '@/api/system/config';
|
||||||
|
const maskStore = useMaskStore();
|
||||||
|
const route = useRoute();
|
||||||
|
const router = useRouter();
|
||||||
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
/**显示遮罩 */
|
||||||
|
const isOpen = computed(() => !['none', 'lock'].includes(maskStore.type));
|
||||||
|
|
||||||
|
// 用户无操作一段时间后进行锁屏
|
||||||
|
function idleTimeout(time: number, callback: Function) {
|
||||||
|
if (time === 0) return;
|
||||||
|
let timeoutId: any;
|
||||||
|
let idleTime = 0;
|
||||||
|
function resetIdleTime() {
|
||||||
|
idleTime = 0;
|
||||||
|
}
|
||||||
|
// 监听用户活动事件
|
||||||
|
document.addEventListener('mousemove', useThrottleFn(resetIdleTime, 1000));
|
||||||
|
document.addEventListener('keydown', useThrottleFn(resetIdleTime, 1000));
|
||||||
|
document.addEventListener('click', useThrottleFn(resetIdleTime, 1000));
|
||||||
|
// 定时检查用户是否长时间无操作
|
||||||
|
timeoutId = setInterval(() => {
|
||||||
|
idleTime += 1000;
|
||||||
|
if (idleTime >= time) {
|
||||||
|
clearTimeout(timeoutId);
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**组件实例挂载之后调用 */
|
||||||
|
onMounted(() => {
|
||||||
|
// 本地锁定类型设置;
|
||||||
|
maskStore.handleMaskType(maskStore.type);
|
||||||
|
getConfigKey('sys.lockTime')
|
||||||
|
.then(res => {
|
||||||
|
if (res.code === RESULT_CODE_SUCCESS && res.data) {
|
||||||
|
maskStore.lockTimeout = +res.data;
|
||||||
|
}
|
||||||
|
maskStore.handleMaskType(maskStore.type);
|
||||||
|
// 是锁屏的调整到页面
|
||||||
|
if (maskStore.type === 'lock') {
|
||||||
|
maskStore.handleMaskType('lock');
|
||||||
|
router.push({ name: 'LockScreen', query: { redirect: route.path } });
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
// 无操作x秒后跳转锁屏
|
||||||
|
idleTimeout(maskStore.lockTimeout * 1000, () => {
|
||||||
|
if (route.name === 'LockScreen') return;
|
||||||
|
maskStore.handleMaskType('lock');
|
||||||
|
router.push({ name: 'LockScreen', query: { redirect: route.path } });
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
/**组件实例被卸载之后调用 */
|
||||||
|
onUnmounted(() => {});
|
||||||
|
</script>
|
||||||
|
<template>
|
||||||
|
<a-modal
|
||||||
|
v-model:open="isOpen"
|
||||||
|
get-container="#app"
|
||||||
|
:footer="null"
|
||||||
|
:zIndex="1008"
|
||||||
|
:closable="false"
|
||||||
|
:keyboard="false"
|
||||||
|
:centered="true"
|
||||||
|
:maskClosable="false"
|
||||||
|
:maskStyle="{
|
||||||
|
backdropFilter: 'blur(10px)',
|
||||||
|
WebkitBackdropFilter: 'blur(10px)',
|
||||||
|
}"
|
||||||
|
wrapClassName="lock-screen"
|
||||||
|
:wrap-style="{
|
||||||
|
background: 'rgba(0, 0, 0, 0.85)',
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<!-- 锁屏-OMC重启升级 -->
|
||||||
|
<div class="lock-screen_reload" v-if="maskStore.type === 'reload'">
|
||||||
|
<LoadingOutlined style="font-size: 56px" />
|
||||||
|
<div class="text">
|
||||||
|
{{ t('components.LockScreen.backReload') }}
|
||||||
|
</div>
|
||||||
|
<div class="desc">
|
||||||
|
{{ t('components.LockScreen.backReload2') }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 锁屏-OMC系统重置 -->
|
||||||
|
<div class="lock-screen_reload" v-if="maskStore.type === 'reset'">
|
||||||
|
<LoadingOutlined style="font-size: 56px" />
|
||||||
|
<div class="text">
|
||||||
|
{{ t('components.LockScreen.systemReset') }}
|
||||||
|
</div>
|
||||||
|
<div class="desc">
|
||||||
|
{{ t('components.LockScreen.systemReset2') }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-modal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.lock-screen_reload {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
background-color: transparent;
|
||||||
|
|
||||||
|
color: #fff;
|
||||||
|
|
||||||
|
& .text {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
letter-spacing: 4px;
|
||||||
|
margin-top: 24px;
|
||||||
|
}
|
||||||
|
& .desc {
|
||||||
|
margin-top: 8px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style lang="less">
|
||||||
|
.lock-screen {
|
||||||
|
.ant-modal-content {
|
||||||
|
background-color: transparent;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
252
src/components/IntlTelInput/i18n/en/countries.ts
Normal file
@@ -0,0 +1,252 @@
|
|||||||
|
//* THIS FILE IS AUTO-GENERATED. DO NOT EDIT.
|
||||||
|
export default {
|
||||||
|
af: "Afghanistan",
|
||||||
|
ax: "Åland Islands",
|
||||||
|
al: "Albania",
|
||||||
|
dz: "Algeria",
|
||||||
|
as: "American Samoa",
|
||||||
|
ad: "Andorra",
|
||||||
|
ao: "Angola",
|
||||||
|
ai: "Anguilla",
|
||||||
|
aq: "Antarctica",
|
||||||
|
ag: "Antigua & Barbuda",
|
||||||
|
ar: "Argentina",
|
||||||
|
am: "Armenia",
|
||||||
|
aw: "Aruba",
|
||||||
|
au: "Australia",
|
||||||
|
at: "Austria",
|
||||||
|
az: "Azerbaijan",
|
||||||
|
bs: "Bahamas",
|
||||||
|
bh: "Bahrain",
|
||||||
|
bd: "Bangladesh",
|
||||||
|
bb: "Barbados",
|
||||||
|
by: "Belarus",
|
||||||
|
be: "Belgium",
|
||||||
|
bz: "Belize",
|
||||||
|
bj: "Benin",
|
||||||
|
bm: "Bermuda",
|
||||||
|
bt: "Bhutan",
|
||||||
|
bo: "Bolivia",
|
||||||
|
ba: "Bosnia & Herzegovina",
|
||||||
|
bw: "Botswana",
|
||||||
|
bv: "Bouvet Island",
|
||||||
|
br: "Brazil",
|
||||||
|
io: "British Indian Ocean Territory",
|
||||||
|
vg: "British Virgin Islands",
|
||||||
|
bn: "Brunei",
|
||||||
|
bg: "Bulgaria",
|
||||||
|
bf: "Burkina Faso",
|
||||||
|
bi: "Burundi",
|
||||||
|
kh: "Cambodia",
|
||||||
|
cm: "Cameroon",
|
||||||
|
ca: "Canada",
|
||||||
|
cv: "Cape Verde",
|
||||||
|
bq: "Caribbean Netherlands",
|
||||||
|
ky: "Cayman Islands",
|
||||||
|
cf: "Central African Republic",
|
||||||
|
td: "Chad",
|
||||||
|
cl: "Chile",
|
||||||
|
cn: "China",
|
||||||
|
cx: "Christmas Island",
|
||||||
|
cc: "Cocos (Keeling) Islands",
|
||||||
|
co: "Colombia",
|
||||||
|
km: "Comoros",
|
||||||
|
cg: "Congo - Brazzaville",
|
||||||
|
cd: "Congo - Kinshasa",
|
||||||
|
ck: "Cook Islands",
|
||||||
|
cr: "Costa Rica",
|
||||||
|
ci: "Côte d’Ivoire",
|
||||||
|
hr: "Croatia",
|
||||||
|
cu: "Cuba",
|
||||||
|
cw: "Curaçao",
|
||||||
|
cy: "Cyprus",
|
||||||
|
cz: "Czechia",
|
||||||
|
dk: "Denmark",
|
||||||
|
dj: "Djibouti",
|
||||||
|
dm: "Dominica",
|
||||||
|
do: "Dominican Republic",
|
||||||
|
ec: "Ecuador",
|
||||||
|
eg: "Egypt",
|
||||||
|
sv: "El Salvador",
|
||||||
|
gq: "Equatorial Guinea",
|
||||||
|
er: "Eritrea",
|
||||||
|
ee: "Estonia",
|
||||||
|
sz: "Eswatini",
|
||||||
|
et: "Ethiopia",
|
||||||
|
fk: "Falkland Islands",
|
||||||
|
fo: "Faroe Islands",
|
||||||
|
fj: "Fiji",
|
||||||
|
fi: "Finland",
|
||||||
|
fr: "France",
|
||||||
|
gf: "French Guiana",
|
||||||
|
pf: "French Polynesia",
|
||||||
|
tf: "French Southern Territories",
|
||||||
|
ga: "Gabon",
|
||||||
|
gm: "Gambia",
|
||||||
|
ge: "Georgia",
|
||||||
|
de: "Germany",
|
||||||
|
gh: "Ghana",
|
||||||
|
gi: "Gibraltar",
|
||||||
|
gr: "Greece",
|
||||||
|
gl: "Greenland",
|
||||||
|
gd: "Grenada",
|
||||||
|
gp: "Guadeloupe",
|
||||||
|
gu: "Guam",
|
||||||
|
gt: "Guatemala",
|
||||||
|
gg: "Guernsey",
|
||||||
|
gn: "Guinea",
|
||||||
|
gw: "Guinea-Bissau",
|
||||||
|
gy: "Guyana",
|
||||||
|
ht: "Haiti",
|
||||||
|
hm: "Heard & McDonald Islands",
|
||||||
|
hn: "Honduras",
|
||||||
|
hk: "Hong Kong SAR China",
|
||||||
|
hu: "Hungary",
|
||||||
|
is: "Iceland",
|
||||||
|
in: "India",
|
||||||
|
id: "Indonesia",
|
||||||
|
ir: "Iran",
|
||||||
|
iq: "Iraq",
|
||||||
|
ie: "Ireland",
|
||||||
|
im: "Isle of Man",
|
||||||
|
il: "Israel",
|
||||||
|
it: "Italy",
|
||||||
|
jm: "Jamaica",
|
||||||
|
jp: "Japan",
|
||||||
|
je: "Jersey",
|
||||||
|
jo: "Jordan",
|
||||||
|
kz: "Kazakhstan",
|
||||||
|
ke: "Kenya",
|
||||||
|
ki: "Kiribati",
|
||||||
|
kw: "Kuwait",
|
||||||
|
kg: "Kyrgyzstan",
|
||||||
|
la: "Laos",
|
||||||
|
lv: "Latvia",
|
||||||
|
lb: "Lebanon",
|
||||||
|
ls: "Lesotho",
|
||||||
|
lr: "Liberia",
|
||||||
|
ly: "Libya",
|
||||||
|
li: "Liechtenstein",
|
||||||
|
lt: "Lithuania",
|
||||||
|
lu: "Luxembourg",
|
||||||
|
mo: "Macao SAR China",
|
||||||
|
mg: "Madagascar",
|
||||||
|
mw: "Malawi",
|
||||||
|
my: "Malaysia",
|
||||||
|
mv: "Maldives",
|
||||||
|
ml: "Mali",
|
||||||
|
mt: "Malta",
|
||||||
|
mh: "Marshall Islands",
|
||||||
|
mq: "Martinique",
|
||||||
|
mr: "Mauritania",
|
||||||
|
mu: "Mauritius",
|
||||||
|
yt: "Mayotte",
|
||||||
|
mx: "Mexico",
|
||||||
|
fm: "Micronesia",
|
||||||
|
md: "Moldova",
|
||||||
|
mc: "Monaco",
|
||||||
|
mn: "Mongolia",
|
||||||
|
me: "Montenegro",
|
||||||
|
ms: "Montserrat",
|
||||||
|
ma: "Morocco",
|
||||||
|
mz: "Mozambique",
|
||||||
|
mm: "Myanmar (Burma)",
|
||||||
|
na: "Namibia",
|
||||||
|
nr: "Nauru",
|
||||||
|
np: "Nepal",
|
||||||
|
nl: "Netherlands",
|
||||||
|
nc: "New Caledonia",
|
||||||
|
nz: "New Zealand",
|
||||||
|
ni: "Nicaragua",
|
||||||
|
ne: "Niger",
|
||||||
|
ng: "Nigeria",
|
||||||
|
nu: "Niue",
|
||||||
|
nf: "Norfolk Island",
|
||||||
|
kp: "North Korea",
|
||||||
|
mk: "North Macedonia",
|
||||||
|
mp: "Northern Mariana Islands",
|
||||||
|
no: "Norway",
|
||||||
|
om: "Oman",
|
||||||
|
pk: "Pakistan",
|
||||||
|
pw: "Palau",
|
||||||
|
ps: "Palestinian Territories",
|
||||||
|
pa: "Panama",
|
||||||
|
pg: "Papua New Guinea",
|
||||||
|
py: "Paraguay",
|
||||||
|
pe: "Peru",
|
||||||
|
ph: "Philippines",
|
||||||
|
pn: "Pitcairn Islands",
|
||||||
|
pl: "Poland",
|
||||||
|
pt: "Portugal",
|
||||||
|
pr: "Puerto Rico",
|
||||||
|
qa: "Qatar",
|
||||||
|
re: "Réunion",
|
||||||
|
ro: "Romania",
|
||||||
|
ru: "Russia",
|
||||||
|
rw: "Rwanda",
|
||||||
|
ws: "Samoa",
|
||||||
|
sm: "San Marino",
|
||||||
|
st: "São Tomé & Príncipe",
|
||||||
|
sa: "Saudi Arabia",
|
||||||
|
sn: "Senegal",
|
||||||
|
rs: "Serbia",
|
||||||
|
sc: "Seychelles",
|
||||||
|
sl: "Sierra Leone",
|
||||||
|
sg: "Singapore",
|
||||||
|
sx: "Sint Maarten",
|
||||||
|
sk: "Slovakia",
|
||||||
|
si: "Slovenia",
|
||||||
|
sb: "Solomon Islands",
|
||||||
|
so: "Somalia",
|
||||||
|
za: "South Africa",
|
||||||
|
gs: "South Georgia & South Sandwich Islands",
|
||||||
|
kr: "South Korea",
|
||||||
|
ss: "South Sudan",
|
||||||
|
es: "Spain",
|
||||||
|
lk: "Sri Lanka",
|
||||||
|
bl: "St. Barthélemy",
|
||||||
|
sh: "St. Helena",
|
||||||
|
kn: "St. Kitts & Nevis",
|
||||||
|
lc: "St. Lucia",
|
||||||
|
mf: "St. Martin",
|
||||||
|
pm: "St. Pierre & Miquelon",
|
||||||
|
vc: "St. Vincent & Grenadines",
|
||||||
|
sd: "Sudan",
|
||||||
|
sr: "Suriname",
|
||||||
|
sj: "Svalbard & Jan Mayen",
|
||||||
|
se: "Sweden",
|
||||||
|
ch: "Switzerland",
|
||||||
|
sy: "Syria",
|
||||||
|
tw: "Taiwan",
|
||||||
|
tj: "Tajikistan",
|
||||||
|
tz: "Tanzania",
|
||||||
|
th: "Thailand",
|
||||||
|
tl: "Timor-Leste",
|
||||||
|
tg: "Togo",
|
||||||
|
tk: "Tokelau",
|
||||||
|
to: "Tonga",
|
||||||
|
tt: "Trinidad & Tobago",
|
||||||
|
tn: "Tunisia",
|
||||||
|
tr: "Turkey",
|
||||||
|
tm: "Turkmenistan",
|
||||||
|
tc: "Turks & Caicos Islands",
|
||||||
|
tv: "Tuvalu",
|
||||||
|
um: "U.S. Outlying Islands",
|
||||||
|
vi: "U.S. Virgin Islands",
|
||||||
|
ug: "Uganda",
|
||||||
|
ua: "Ukraine",
|
||||||
|
ae: "United Arab Emirates",
|
||||||
|
gb: "United Kingdom",
|
||||||
|
us: "United States",
|
||||||
|
uy: "Uruguay",
|
||||||
|
uz: "Uzbekistan",
|
||||||
|
vu: "Vanuatu",
|
||||||
|
va: "Vatican City",
|
||||||
|
ve: "Venezuela",
|
||||||
|
vn: "Vietnam",
|
||||||
|
wf: "Wallis & Futuna",
|
||||||
|
eh: "Western Sahara",
|
||||||
|
ye: "Yemen",
|
||||||
|
zm: "Zambia",
|
||||||
|
zw: "Zimbabwe",
|
||||||
|
};
|
||||||
4
src/components/IntlTelInput/i18n/en/index.ts
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
import countryTranslations from './countries';
|
||||||
|
import interfaceTranslations from './interface';
|
||||||
|
|
||||||
|
export default { ...countryTranslations, ...interfaceTranslations };
|
||||||
14
src/components/IntlTelInput/i18n/en/interface.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
//* English. Translated by: Jack O'Connor (jackocnr).
|
||||||
|
export default {
|
||||||
|
selectedCountryAriaLabel: "Selected country",
|
||||||
|
noCountrySelected: "No country selected",
|
||||||
|
countryListAriaLabel: "List of countries",
|
||||||
|
searchPlaceholder: "Search",
|
||||||
|
zeroSearchResults: "No results found",
|
||||||
|
oneSearchResult: "1 result found",
|
||||||
|
multipleSearchResults: "${count} results found",
|
||||||
|
|
||||||
|
// additional countries (not supported by country-list library)
|
||||||
|
ac: "Ascension Island",
|
||||||
|
xk: "Kosovo",
|
||||||
|
};
|
||||||
252
src/components/IntlTelInput/i18n/zh/countries.ts
Normal file
@@ -0,0 +1,252 @@
|
|||||||
|
//* THIS FILE IS AUTO-GENERATED. DO NOT EDIT.
|
||||||
|
export default {
|
||||||
|
al: "阿尔巴尼亚",
|
||||||
|
dz: "阿尔及利亚",
|
||||||
|
af: "阿富汗",
|
||||||
|
ar: "阿根廷",
|
||||||
|
ae: "阿拉伯联合酋长国",
|
||||||
|
aw: "阿鲁巴",
|
||||||
|
om: "阿曼",
|
||||||
|
az: "阿塞拜疆",
|
||||||
|
eg: "埃及",
|
||||||
|
et: "埃塞俄比亚",
|
||||||
|
ie: "爱尔兰",
|
||||||
|
ee: "爱沙尼亚",
|
||||||
|
ad: "安道尔",
|
||||||
|
ao: "安哥拉",
|
||||||
|
ai: "安圭拉",
|
||||||
|
ag: "安提瓜和巴布达",
|
||||||
|
at: "奥地利",
|
||||||
|
ax: "奥兰群岛",
|
||||||
|
au: "澳大利亚",
|
||||||
|
bb: "巴巴多斯",
|
||||||
|
pg: "巴布亚新几内亚",
|
||||||
|
bs: "巴哈马",
|
||||||
|
pk: "巴基斯坦",
|
||||||
|
py: "巴拉圭",
|
||||||
|
ps: "巴勒斯坦领土",
|
||||||
|
bh: "巴林",
|
||||||
|
pa: "巴拿马",
|
||||||
|
br: "巴西",
|
||||||
|
by: "白俄罗斯",
|
||||||
|
bm: "百慕大",
|
||||||
|
bg: "保加利亚",
|
||||||
|
mp: "北马里亚纳群岛",
|
||||||
|
mk: "北马其顿",
|
||||||
|
bj: "贝宁",
|
||||||
|
be: "比利时",
|
||||||
|
is: "冰岛",
|
||||||
|
pr: "波多黎各",
|
||||||
|
pl: "波兰",
|
||||||
|
ba: "波斯尼亚和黑塞哥维那",
|
||||||
|
bo: "玻利维亚",
|
||||||
|
bz: "伯利兹",
|
||||||
|
bw: "博茨瓦纳",
|
||||||
|
bt: "不丹",
|
||||||
|
bf: "布基纳法索",
|
||||||
|
bi: "布隆迪",
|
||||||
|
bv: "布韦岛",
|
||||||
|
kp: "朝鲜",
|
||||||
|
gq: "赤道几内亚",
|
||||||
|
dk: "丹麦",
|
||||||
|
de: "德国",
|
||||||
|
tl: "东帝汶",
|
||||||
|
tg: "多哥",
|
||||||
|
do: "多米尼加共和国",
|
||||||
|
dm: "多米尼克",
|
||||||
|
ru: "俄罗斯",
|
||||||
|
ec: "厄瓜多尔",
|
||||||
|
er: "厄立特里亚",
|
||||||
|
fr: "法国",
|
||||||
|
fo: "法罗群岛",
|
||||||
|
pf: "法属波利尼西亚",
|
||||||
|
gf: "法属圭亚那",
|
||||||
|
tf: "法属南部领地",
|
||||||
|
mf: "法属圣马丁",
|
||||||
|
va: "梵蒂冈",
|
||||||
|
ph: "菲律宾",
|
||||||
|
fj: "斐济",
|
||||||
|
fi: "芬兰",
|
||||||
|
cv: "佛得角",
|
||||||
|
fk: "福克兰群岛",
|
||||||
|
gm: "冈比亚",
|
||||||
|
cg: "刚果(布)",
|
||||||
|
cd: "刚果(金)",
|
||||||
|
co: "哥伦比亚",
|
||||||
|
cr: "哥斯达黎加",
|
||||||
|
gd: "格林纳达",
|
||||||
|
gl: "格陵兰",
|
||||||
|
ge: "格鲁吉亚",
|
||||||
|
gg: "根西岛",
|
||||||
|
cu: "古巴",
|
||||||
|
gp: "瓜德罗普",
|
||||||
|
gu: "关岛",
|
||||||
|
gy: "圭亚那",
|
||||||
|
kz: "哈萨克斯坦",
|
||||||
|
ht: "海地",
|
||||||
|
kr: "韩国",
|
||||||
|
nl: "荷兰",
|
||||||
|
bq: "荷属加勒比区",
|
||||||
|
sx: "荷属圣马丁",
|
||||||
|
hm: "赫德岛和麦克唐纳群岛",
|
||||||
|
me: "黑山",
|
||||||
|
hn: "洪都拉斯",
|
||||||
|
ki: "基里巴斯",
|
||||||
|
dj: "吉布提",
|
||||||
|
kg: "吉尔吉斯斯坦",
|
||||||
|
gn: "几内亚",
|
||||||
|
gw: "几内亚比绍",
|
||||||
|
ca: "加拿大",
|
||||||
|
gh: "加纳",
|
||||||
|
ga: "加蓬",
|
||||||
|
kh: "柬埔寨",
|
||||||
|
cz: "捷克",
|
||||||
|
zw: "津巴布韦",
|
||||||
|
cm: "喀麦隆",
|
||||||
|
qa: "卡塔尔",
|
||||||
|
ky: "开曼群岛",
|
||||||
|
cc: "科科斯(基林)群岛",
|
||||||
|
km: "科摩罗",
|
||||||
|
ci: "科特迪瓦",
|
||||||
|
kw: "科威特",
|
||||||
|
hr: "克罗地亚",
|
||||||
|
ke: "肯尼亚",
|
||||||
|
ck: "库克群岛",
|
||||||
|
cw: "库拉索",
|
||||||
|
lv: "拉脱维亚",
|
||||||
|
ls: "莱索托",
|
||||||
|
la: "老挝",
|
||||||
|
lb: "黎巴嫩",
|
||||||
|
lt: "立陶宛",
|
||||||
|
lr: "利比里亚",
|
||||||
|
ly: "利比亚",
|
||||||
|
li: "列支敦士登",
|
||||||
|
re: "留尼汪",
|
||||||
|
lu: "卢森堡",
|
||||||
|
rw: "卢旺达",
|
||||||
|
ro: "罗马尼亚",
|
||||||
|
mg: "马达加斯加",
|
||||||
|
im: "马恩岛",
|
||||||
|
mv: "马尔代夫",
|
||||||
|
mt: "马耳他",
|
||||||
|
mw: "马拉维",
|
||||||
|
my: "马来西亚",
|
||||||
|
ml: "马里",
|
||||||
|
mh: "马绍尔群岛",
|
||||||
|
mq: "马提尼克",
|
||||||
|
yt: "马约特",
|
||||||
|
mu: "毛里求斯",
|
||||||
|
mr: "毛里塔尼亚",
|
||||||
|
us: "美国",
|
||||||
|
um: "美国本土外小岛屿",
|
||||||
|
as: "美属萨摩亚",
|
||||||
|
vi: "美属维尔京群岛",
|
||||||
|
mn: "蒙古",
|
||||||
|
ms: "蒙特塞拉特",
|
||||||
|
bd: "孟加拉国",
|
||||||
|
pe: "秘鲁",
|
||||||
|
fm: "密克罗尼西亚",
|
||||||
|
mm: "缅甸",
|
||||||
|
md: "摩尔多瓦",
|
||||||
|
ma: "摩洛哥",
|
||||||
|
mc: "摩纳哥",
|
||||||
|
mz: "莫桑比克",
|
||||||
|
mx: "墨西哥",
|
||||||
|
na: "纳米比亚",
|
||||||
|
za: "南非",
|
||||||
|
aq: "南极洲",
|
||||||
|
gs: "南乔治亚和南桑威奇群岛",
|
||||||
|
ss: "南苏丹",
|
||||||
|
nr: "瑙鲁",
|
||||||
|
ni: "尼加拉瓜",
|
||||||
|
np: "尼泊尔",
|
||||||
|
ne: "尼日尔",
|
||||||
|
ng: "尼日利亚",
|
||||||
|
nu: "纽埃",
|
||||||
|
no: "挪威",
|
||||||
|
nf: "诺福克岛",
|
||||||
|
pw: "帕劳",
|
||||||
|
pn: "皮特凯恩群岛",
|
||||||
|
pt: "葡萄牙",
|
||||||
|
jp: "日本",
|
||||||
|
se: "瑞典",
|
||||||
|
ch: "瑞士",
|
||||||
|
sv: "萨尔瓦多",
|
||||||
|
ws: "萨摩亚",
|
||||||
|
rs: "塞尔维亚",
|
||||||
|
sl: "塞拉利昂",
|
||||||
|
sn: "塞内加尔",
|
||||||
|
cy: "塞浦路斯",
|
||||||
|
sc: "塞舌尔",
|
||||||
|
sa: "沙特阿拉伯",
|
||||||
|
bl: "圣巴泰勒米",
|
||||||
|
cx: "圣诞岛",
|
||||||
|
st: "圣多美和普林西比",
|
||||||
|
sh: "圣赫勒拿",
|
||||||
|
kn: "圣基茨和尼维斯",
|
||||||
|
lc: "圣卢西亚",
|
||||||
|
sm: "圣马力诺",
|
||||||
|
pm: "圣皮埃尔和密克隆群岛",
|
||||||
|
vc: "圣文森特和格林纳丁斯",
|
||||||
|
lk: "斯里兰卡",
|
||||||
|
sk: "斯洛伐克",
|
||||||
|
si: "斯洛文尼亚",
|
||||||
|
sj: "斯瓦尔巴和扬马延",
|
||||||
|
sz: "斯威士兰",
|
||||||
|
sd: "苏丹",
|
||||||
|
sr: "苏里南",
|
||||||
|
sb: "所罗门群岛",
|
||||||
|
so: "索马里",
|
||||||
|
tj: "塔吉克斯坦",
|
||||||
|
tw: "台湾",
|
||||||
|
th: "泰国",
|
||||||
|
tz: "坦桑尼亚",
|
||||||
|
to: "汤加",
|
||||||
|
tc: "特克斯和凯科斯群岛",
|
||||||
|
tt: "特立尼达和多巴哥",
|
||||||
|
tn: "突尼斯",
|
||||||
|
tv: "图瓦卢",
|
||||||
|
tr: "土耳其",
|
||||||
|
tm: "土库曼斯坦",
|
||||||
|
tk: "托克劳",
|
||||||
|
wf: "瓦利斯和富图纳",
|
||||||
|
vu: "瓦努阿图",
|
||||||
|
gt: "危地马拉",
|
||||||
|
ve: "委内瑞拉",
|
||||||
|
bn: "文莱",
|
||||||
|
ug: "乌干达",
|
||||||
|
ua: "乌克兰",
|
||||||
|
uy: "乌拉圭",
|
||||||
|
uz: "乌兹别克斯坦",
|
||||||
|
es: "西班牙",
|
||||||
|
eh: "西撒哈拉",
|
||||||
|
gr: "希腊",
|
||||||
|
sg: "新加坡",
|
||||||
|
nc: "新喀里多尼亚",
|
||||||
|
nz: "新西兰",
|
||||||
|
hu: "匈牙利",
|
||||||
|
sy: "叙利亚",
|
||||||
|
jm: "牙买加",
|
||||||
|
am: "亚美尼亚",
|
||||||
|
ye: "也门",
|
||||||
|
iq: "伊拉克",
|
||||||
|
ir: "伊朗",
|
||||||
|
il: "以色列",
|
||||||
|
it: "意大利",
|
||||||
|
in: "印度",
|
||||||
|
id: "印度尼西亚",
|
||||||
|
gb: "英国",
|
||||||
|
vg: "英属维尔京群岛",
|
||||||
|
io: "英属印度洋领地",
|
||||||
|
jo: "约旦",
|
||||||
|
vn: "越南",
|
||||||
|
zm: "赞比亚",
|
||||||
|
je: "泽西岛",
|
||||||
|
td: "乍得",
|
||||||
|
gi: "直布罗陀",
|
||||||
|
cl: "智利",
|
||||||
|
cf: "中非共和国",
|
||||||
|
cn: "中国",
|
||||||
|
mo: "中国澳门特别行政区",
|
||||||
|
hk: "中国香港特别行政区",
|
||||||
|
};
|
||||||
4
src/components/IntlTelInput/i18n/zh/index.ts
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
import countryTranslations from './countries';
|
||||||
|
import interfaceTranslations from './interface';
|
||||||
|
|
||||||
|
export default { ...countryTranslations, ...interfaceTranslations };
|
||||||
15
src/components/IntlTelInput/i18n/zh/interface.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
//* Chinese (Simplified). Translated by: Google Translate.
|
||||||
|
export default {
|
||||||
|
selectedCountryAriaLabel: "所选国家",
|
||||||
|
noCountrySelected: "未选择国家/地区",
|
||||||
|
countryListAriaLabel: "国家名单",
|
||||||
|
searchPlaceholder: "搜索",
|
||||||
|
zeroSearchResults: "未找到结果",
|
||||||
|
oneSearchResult: "找到 1 个结果",
|
||||||
|
multipleSearchResults: "找到 ${count} 个结果",
|
||||||
|
|
||||||
|
// additional countries (not supported by country-list library)
|
||||||
|
ac: "阿森松岛",
|
||||||
|
xk: "科索沃",
|
||||||
|
};
|
||||||
|
|
||||||
168
src/components/IntlTelInput/index.vue
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
<!-- https://github.com/jackocnr/intl-tel-input/blob/master/react/src/intl-tel-input/react.tsx -->
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { Iti } from 'intl-tel-input';
|
||||||
|
import intlTelInput from 'intl-tel-input/intlTelInputWithUtils';
|
||||||
|
import 'intl-tel-input/build/css/intlTelInput.min.css';
|
||||||
|
import { ref, onMounted, onBeforeUnmount, nextTick } from 'vue';
|
||||||
|
import useI18n from '@/hooks/useI18n';
|
||||||
|
const { currentLocale } = useI18n();
|
||||||
|
const emit = defineEmits(['update:value', 'update:change']);
|
||||||
|
const props = defineProps({
|
||||||
|
/**有效检验 */
|
||||||
|
preciseValidation: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
/**手机号 */
|
||||||
|
value: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
/**禁用输入 */
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
/**手机号输入提示 */
|
||||||
|
placeholder: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
/**手机号输入最大字符串长度 */
|
||||||
|
maxlength: {
|
||||||
|
type: Number,
|
||||||
|
default: 255,
|
||||||
|
},
|
||||||
|
/**允许清空手机号输入框 */
|
||||||
|
allowClear: {
|
||||||
|
type: Boolean,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const inputRef = ref<HTMLInputElement | null>(null);
|
||||||
|
const itiRef = ref<Iti | null>(null);
|
||||||
|
|
||||||
|
function fnChange() {
|
||||||
|
if (!itiRef.value) return;
|
||||||
|
|
||||||
|
const number = itiRef.value?.getNumber() || '';
|
||||||
|
const countryIso = itiRef.value?.getSelectedCountryData().iso2 || '';
|
||||||
|
// note: this number will be in standard E164 format, but any container component can use
|
||||||
|
// intlTelInputUtils.formatNumber() to convert this to another format
|
||||||
|
// as well as intlTelInputUtils.getNumberType() etc. if need be
|
||||||
|
let data = {
|
||||||
|
number,
|
||||||
|
countryIso,
|
||||||
|
validity: false,
|
||||||
|
errorCode: -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
const isValid = props.preciseValidation
|
||||||
|
? itiRef.value.isValidNumberPrecise()
|
||||||
|
: itiRef.value.isValidNumber();
|
||||||
|
if (isValid) {
|
||||||
|
data.validity = true;
|
||||||
|
data.errorCode = 0;
|
||||||
|
} else {
|
||||||
|
const errorCode = itiRef.value.getValidationError();
|
||||||
|
data.validity = false;
|
||||||
|
data.errorCode = errorCode;
|
||||||
|
}
|
||||||
|
// console.log(data);
|
||||||
|
|
||||||
|
emit('update:value', number);
|
||||||
|
emit('update:change', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
nextTick(async () => {
|
||||||
|
if (inputRef.value) {
|
||||||
|
let i18n = undefined;
|
||||||
|
let initialCountry = 'us';
|
||||||
|
// 语言文件导入问题只能复制到项目内处理
|
||||||
|
// import fr from "intl-tel-input/i18n/fr";
|
||||||
|
if (currentLocale.value.startsWith('zh')) {
|
||||||
|
const { default: zh } = await import('./i18n/zh');
|
||||||
|
i18n = zh;
|
||||||
|
initialCountry = 'cn';
|
||||||
|
} else {
|
||||||
|
const { default: en } = await import('./i18n/en');
|
||||||
|
i18n = en;
|
||||||
|
initialCountry = 'us';
|
||||||
|
}
|
||||||
|
|
||||||
|
itiRef.value = intlTelInput(inputRef.value, {
|
||||||
|
initialCountry: initialCountry,
|
||||||
|
formatOnDisplay: true,
|
||||||
|
autoPlaceholder: 'polite',
|
||||||
|
i18n: i18n,
|
||||||
|
});
|
||||||
|
if (props.value) {
|
||||||
|
itiRef.value.setNumber(props.value);
|
||||||
|
}
|
||||||
|
if (props.disabled) {
|
||||||
|
itiRef.value.setDisabled(props.disabled);
|
||||||
|
}
|
||||||
|
inputRef.value.addEventListener('countrychange', fnChange);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
if (inputRef.value) {
|
||||||
|
inputRef.value.removeEventListener('countrychange', fnChange);
|
||||||
|
}
|
||||||
|
itiRef.value?.destroy();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<input
|
||||||
|
type="tel"
|
||||||
|
class="ant-input"
|
||||||
|
ref="inputRef"
|
||||||
|
:disabled="disabled"
|
||||||
|
:placeholder="placeholder"
|
||||||
|
:maxlength="maxlength"
|
||||||
|
:allow-clear="allowClear"
|
||||||
|
@input="fnChange"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="css">
|
||||||
|
.iti {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.iti .iti__country-container .iti__search-input {
|
||||||
|
padding: 4px 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.iti .ant-input {
|
||||||
|
box-sizing: border-box;
|
||||||
|
margin: 0;
|
||||||
|
font-variant: tabular-nums;
|
||||||
|
list-style: none;
|
||||||
|
font-feature-settings: 'tnum';
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
width: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
padding: 4px 11px;
|
||||||
|
color: #000000d9;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.5715;
|
||||||
|
background-color: transparent;
|
||||||
|
background-image: none;
|
||||||
|
border: 1px solid #424242;
|
||||||
|
border-radius: 6px;
|
||||||
|
transition: all 0.3s;
|
||||||
|
}
|
||||||
|
.iti .ant-input:focus,
|
||||||
|
.iti .ant-input-focused {
|
||||||
|
border-color: var(--ant-primary-color-hover);
|
||||||
|
box-shadow: 0 0 0 2px var(--ant-primary-color-outline);
|
||||||
|
border-right-width: 1px !important;
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,217 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import { ref, toRaw, onMounted, onUnmounted } from 'vue';
|
|
||||||
import useI18n from '@/hooks/useI18n';
|
|
||||||
import { message } from 'ant-design-vue/lib';
|
|
||||||
import useUserStore from '@/store/modules/user';
|
|
||||||
import useLockedStore from '@/store/modules/locked';
|
|
||||||
import { getConfigKey } from '@/api/system/config';
|
|
||||||
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
|
||||||
import { useRouter } from 'vue-router';
|
|
||||||
import { computed } from 'vue';
|
|
||||||
const lockedStore = useLockedStore();
|
|
||||||
const userStore = useUserStore();
|
|
||||||
const router = useRouter();
|
|
||||||
const { t } = useI18n();
|
|
||||||
|
|
||||||
const password = ref('');
|
|
||||||
/**设置定时器ID */
|
|
||||||
let timeoutDuration = 10 * 60 * 1000; // 设置超时时间为10分钟,单位为毫秒
|
|
||||||
let timeoutId: any = null;
|
|
||||||
|
|
||||||
// 超时锁屏
|
|
||||||
function resetTimeout() {
|
|
||||||
if (timeoutId) {
|
|
||||||
clearTimeout(timeoutId);
|
|
||||||
}
|
|
||||||
timeoutId = setTimeout(() => {
|
|
||||||
lockedStore.fnLock('lock');
|
|
||||||
}, timeoutDuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**解锁 */
|
|
||||||
function handleUnlock() {
|
|
||||||
let lockFrom: any = {};
|
|
||||||
lockFrom.username = userStore.userName;
|
|
||||||
lockFrom.password = password.value;
|
|
||||||
userStore.fnLogin(toRaw(lockFrom)).then(res => {
|
|
||||||
if (res.code === RESULT_CODE_SUCCESS) {
|
|
||||||
message.success(t('components.LockScreen.validSucc'), 3);
|
|
||||||
password.value = '';
|
|
||||||
lockedStore.fnLock('none');
|
|
||||||
} else {
|
|
||||||
message.error(t('components.LockScreen.validError'), 3);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**返回登录界面 */
|
|
||||||
function backLogin() {
|
|
||||||
lockedStore.fnLock('none');
|
|
||||||
userStore.fnLogOut().finally(() => router.push({ name: 'Login' }));
|
|
||||||
}
|
|
||||||
|
|
||||||
const isLocked = computed(() => lockedStore.type !== 'none');
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
getConfigKey('sys.lockTime')
|
|
||||||
.then(res => {
|
|
||||||
if (res.code === RESULT_CODE_SUCCESS && res.data) {
|
|
||||||
lockedStore.lockTimeout = res.data;
|
|
||||||
timeoutDuration = res.data * 1000;
|
|
||||||
}
|
|
||||||
// 本地锁定类型设置
|
|
||||||
lockedStore.fnLock(lockedStore.type);
|
|
||||||
})
|
|
||||||
.finally(() => {
|
|
||||||
if (timeoutDuration !== 0) {
|
|
||||||
resetTimeout();
|
|
||||||
// 监听用户的操作,重置超时时间
|
|
||||||
window.addEventListener('mousemove', resetTimeout);
|
|
||||||
window.addEventListener('keydown', resetTimeout);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
/**组件实例被卸载之后调用 */
|
|
||||||
onUnmounted(() => {
|
|
||||||
if (timeoutId) {
|
|
||||||
clearTimeout(timeoutId);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<a-modal
|
|
||||||
v-model:visible="isLocked"
|
|
||||||
get-container="#app"
|
|
||||||
:footer="null"
|
|
||||||
:zIndex="1008"
|
|
||||||
:closable="false"
|
|
||||||
:keyboard="false"
|
|
||||||
:centered="true"
|
|
||||||
:maskClosable="false"
|
|
||||||
:maskStyle="{
|
|
||||||
backdropFilter: 'blur(10px)',
|
|
||||||
WebkitBackdropFilter: 'blur(10px)',
|
|
||||||
}"
|
|
||||||
wrapClassName="lock-screen"
|
|
||||||
:wrap-style="{
|
|
||||||
background: 'rgba(0, 0, 0, 0.85)',
|
|
||||||
}"
|
|
||||||
>
|
|
||||||
<!-- 锁屏-登录 -->
|
|
||||||
<div class="lock-screen_login" v-if="lockedStore.type === 'lock'">
|
|
||||||
<div class="lock-screen_login-user">
|
|
||||||
<a-avatar
|
|
||||||
shape="circle"
|
|
||||||
:size="100"
|
|
||||||
:src="userStore.getAvatar"
|
|
||||||
:alt="userStore.userName"
|
|
||||||
></a-avatar>
|
|
||||||
<span class="nick">
|
|
||||||
{{ userStore.nickName }}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="lock-screen_login-from">
|
|
||||||
<a-input-group compact>
|
|
||||||
<a-input
|
|
||||||
type="password"
|
|
||||||
v-model:value="password"
|
|
||||||
:placeholder="t('components.LockScreen.inputPlacePwd')"
|
|
||||||
:maxlength="32"
|
|
||||||
style="width: calc(100% - 50px)"
|
|
||||||
@keyup.enter="handleUnlock"
|
|
||||||
/>
|
|
||||||
<a-button type="primary" @click="handleUnlock">
|
|
||||||
<LoginOutlined />
|
|
||||||
</a-button>
|
|
||||||
</a-input-group>
|
|
||||||
<a-button type="text" class="logout" @click="backLogin">
|
|
||||||
{{ t('components.LockScreen.backLogin') }}
|
|
||||||
</a-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- 锁屏-OMC重启升级 -->
|
|
||||||
<div class="lock-screen_reload" v-if="lockedStore.type === 'reload'">
|
|
||||||
<LoadingOutlined style="font-size: 56px" />
|
|
||||||
<div class="text">
|
|
||||||
{{ t('components.LockScreen.backReload') }}
|
|
||||||
</div>
|
|
||||||
<div class="desc">
|
|
||||||
{{ t('components.LockScreen.backReload2') }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a-modal>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="less" scoped>
|
|
||||||
.lock-screen_login {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
background-color: transparent;
|
|
||||||
|
|
||||||
&-user {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
.nick {
|
|
||||||
font-size: 28px;
|
|
||||||
max-width: 164px;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-align: start;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
overflow: hidden;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&-from {
|
|
||||||
display: flex;
|
|
||||||
flex-flow: column;
|
|
||||||
width: 256px;
|
|
||||||
margin-top: 30px;
|
|
||||||
|
|
||||||
.logout {
|
|
||||||
margin-top: 8px;
|
|
||||||
color: rgba(255, 255, 255, 0.85);
|
|
||||||
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);
|
|
||||||
&:hover {
|
|
||||||
color: var(--ant-primary-color);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.lock-screen_reload {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
background-color: transparent;
|
|
||||||
|
|
||||||
color: #fff;
|
|
||||||
|
|
||||||
& .text {
|
|
||||||
font-size: 24px;
|
|
||||||
font-weight: bold;
|
|
||||||
letter-spacing: 4px;
|
|
||||||
margin-top: 24px;
|
|
||||||
}
|
|
||||||
& .desc {
|
|
||||||
margin-top: 8px;
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style lang="less">
|
|
||||||
.lock-screen {
|
|
||||||
.ant-modal-content {
|
|
||||||
background-color: transparent;
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { reactive, watch, onMounted, PropType } from 'vue';
|
import { reactive, watch, onMounted, PropType, nextTick } from 'vue';
|
||||||
import { Container, Draggable } from 'vue3-smooth-dnd';
|
import { Container, Draggable } from 'vue3-smooth-dnd';
|
||||||
import useI18n from '@/hooks/useI18n';
|
import useI18n from '@/hooks/useI18n';
|
||||||
import { type ColumnsType } from 'ant-design-vue/lib/table';
|
import { dbGetJSON, dbSetJSON } from '@/utils/cache-db-utils';
|
||||||
const { t } = useI18n();
|
import { CACHE_DB_TABLE_DND } from '@/constants/cache-keys-constants';
|
||||||
|
const { t, currentLocale } = useI18n();
|
||||||
|
|
||||||
const emit = defineEmits(['update:columns-dnd']);
|
const emit = defineEmits(['update:columns-dnd']);
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@@ -16,7 +17,8 @@ const props = defineProps({
|
|||||||
type: Array<any>,
|
type: Array<any>,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
/**按钮类型
|
/**
|
||||||
|
* 按钮类型
|
||||||
* text 图标
|
* text 图标
|
||||||
* ghost 图标按钮带文字
|
* ghost 图标按钮带文字
|
||||||
*/
|
*/
|
||||||
@@ -24,34 +26,50 @@ const props = defineProps({
|
|||||||
type: String as PropType<'text' | 'ghost'>,
|
type: String as PropType<'text' | 'ghost'>,
|
||||||
default: 'text',
|
default: 'text',
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
* 缓存列变更数据标识,不传则不缓存
|
||||||
|
*/
|
||||||
|
cacheId: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
/**表格字段列 */
|
/**表格字段列 */
|
||||||
const tableColumns = reactive<ColumnsType>(props.columns);
|
const tableColumns = reactive(props.columns);
|
||||||
|
|
||||||
/**表格字段列勾选状态 */
|
/**表格字段列勾选状态 */
|
||||||
const state = reactive({
|
const state = reactive<{
|
||||||
|
indeterminate: boolean;
|
||||||
|
/**是否全选 */
|
||||||
|
checkAll: boolean;
|
||||||
|
/**字段标题列表 */
|
||||||
|
columnsTitleList: string[];
|
||||||
|
}>({
|
||||||
indeterminate: false,
|
indeterminate: false,
|
||||||
checkAll: true,
|
checkAll: true,
|
||||||
columnsTitleList: tableColumns.map(s => `${s.title}`),
|
columnsTitleList: [],
|
||||||
});
|
});
|
||||||
|
|
||||||
/**表格字段列全选操作 */
|
/**表格字段列全选操作 */
|
||||||
function fnTableColumnsCheckAllChange(e: any) {
|
function fnTableColumnsCheckAllChange(e: any) {
|
||||||
const checked = e.target.checked;
|
const checked = e.target.checked;
|
||||||
state.indeterminate = false;
|
state.indeterminate = false;
|
||||||
state.columnsTitleList = checked ? tableColumns.map(s => `${s.title}`) : [];
|
state.columnsTitleList = checked
|
||||||
|
? tableColumns.map(s => `${s.title as string}`)
|
||||||
|
: [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**表格字段列拖拽操作 */
|
/**表格字段列拖拽操作 */
|
||||||
function fnTableColumnsDrop(dropResult: any) {
|
function fnTableColumnsDrop(dropResult: any) {
|
||||||
const { removedIndex, addedIndex, payload } = dropResult;
|
const { removedIndex, addedIndex, payload } = dropResult;
|
||||||
if (removedIndex !== null && addedIndex !== null) {
|
if (removedIndex === null || addedIndex === null) {
|
||||||
let itemToAdd = payload;
|
return;
|
||||||
itemToAdd = tableColumns.splice(removedIndex, 1)[0];
|
|
||||||
tableColumns.splice(addedIndex, 0, itemToAdd);
|
|
||||||
fnUpdateColumns();
|
|
||||||
}
|
}
|
||||||
|
let itemToAdd = payload;
|
||||||
|
itemToAdd = tableColumns.splice(removedIndex, 1)[0];
|
||||||
|
tableColumns.splice(addedIndex, 0, itemToAdd);
|
||||||
|
fnUpdateColumns();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**表格字段列固定操作 */
|
/**表格字段列固定操作 */
|
||||||
@@ -66,6 +84,7 @@ function fnTableColumnsFixed(row: Record<string, any>) {
|
|||||||
} else {
|
} else {
|
||||||
row.fixed = !row.fixed;
|
row.fixed = !row.fixed;
|
||||||
}
|
}
|
||||||
|
fnUpdateColumns();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**表格字段列勾选字段变化 */
|
/**表格字段列勾选字段变化 */
|
||||||
@@ -77,7 +96,18 @@ function fnUpdateColumns() {
|
|||||||
if (list.length === 0) {
|
if (list.length === 0) {
|
||||||
list = [tableColumns[0]];
|
list = [tableColumns[0]];
|
||||||
}
|
}
|
||||||
emit('update:columns-dnd', list);
|
|
||||||
|
if (props.cacheId) {
|
||||||
|
// 存入数据
|
||||||
|
dbSetJSON(
|
||||||
|
CACHE_DB_TABLE_DND,
|
||||||
|
`${props.cacheId}#${currentLocale.value}`,
|
||||||
|
list
|
||||||
|
);
|
||||||
|
}
|
||||||
|
nextTick(() => {
|
||||||
|
emit('update:columns-dnd', list);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**表格字段列勾选监听 */
|
/**表格字段列勾选监听 */
|
||||||
@@ -92,7 +122,34 @@ watch(
|
|||||||
);
|
);
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
fnUpdateColumns();
|
if (props.cacheId) {
|
||||||
|
// 读取数据后响应
|
||||||
|
dbGetJSON(CACHE_DB_TABLE_DND, `${props.cacheId}#${currentLocale.value}`)
|
||||||
|
.then(data => {
|
||||||
|
if (data) {
|
||||||
|
const titleList: string[] = [];
|
||||||
|
for (const item of data) {
|
||||||
|
titleList.push(`${item.title}`);
|
||||||
|
// 固定标记还原
|
||||||
|
if (item.fixed !== undefined) {
|
||||||
|
const fixedItem = tableColumns.find(s => s.title === item.title);
|
||||||
|
if (fixedItem) {
|
||||||
|
fixedItem.fixed = item.fixed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
state.columnsTitleList = titleList;
|
||||||
|
} else {
|
||||||
|
state.columnsTitleList = tableColumns.map(s => `${s.title}`);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
fnUpdateColumns();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
state.columnsTitleList = tableColumns.map(s => `${s.title}`);
|
||||||
|
fnUpdateColumns();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -128,6 +185,7 @@ onMounted(() => {
|
|||||||
<a-button
|
<a-button
|
||||||
v-if="c.fixed !== undefined"
|
v-if="c.fixed !== undefined"
|
||||||
size="small"
|
size="small"
|
||||||
|
:title="c.fixed ? `Fixed ${c.fixed} side` : ''"
|
||||||
:type="c.fixed ? 'primary' : 'dashed'"
|
:type="c.fixed ? 'primary' : 'dashed'"
|
||||||
@click="fnTableColumnsFixed(c)"
|
@click="fnTableColumnsFixed(c)"
|
||||||
>
|
>
|
||||||
|
|||||||
289
src/components/TerminalRedis/index.vue
Normal file
@@ -0,0 +1,289 @@
|
|||||||
|
<script lang="ts" setup>
|
||||||
|
import { message } from 'ant-design-vue/es';
|
||||||
|
import { ref, reactive, onMounted, onBeforeUnmount, nextTick } from 'vue';
|
||||||
|
import { FitAddon } from '@xterm/addon-fit';
|
||||||
|
import { Terminal } from '@xterm/xterm';
|
||||||
|
import '@xterm/xterm/css/xterm.css';
|
||||||
|
import { RESULT_CODE_ERROR } from '@/constants/result-constants';
|
||||||
|
import { OptionsType, WS } from '@/plugins/ws-websocket';
|
||||||
|
const ws = new WS();
|
||||||
|
const emit = defineEmits(['connect', 'close', 'message']);
|
||||||
|
const props = defineProps({
|
||||||
|
/**终端ID,必传 */
|
||||||
|
id: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
/**连接主机ID,必传 */
|
||||||
|
hostId: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
/**初始发送命令 */
|
||||||
|
initCmd: {
|
||||||
|
type: [String, Boolean],
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
/**终端输入DOM节点实例对象 */
|
||||||
|
const terminalDom = ref<HTMLElement | undefined>(undefined);
|
||||||
|
|
||||||
|
/**终端输入实例对象 */
|
||||||
|
const terminal = ref<any>(null);
|
||||||
|
|
||||||
|
/**终端输入文字状态 */
|
||||||
|
const terminalState = reactive<{
|
||||||
|
/**输入值 */
|
||||||
|
text: string;
|
||||||
|
/**历史 */
|
||||||
|
history: {
|
||||||
|
label?: string;
|
||||||
|
value: string;
|
||||||
|
}[];
|
||||||
|
}>({
|
||||||
|
text: '',
|
||||||
|
history: [
|
||||||
|
{
|
||||||
|
value: 'info server',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'info replication',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'keys ausf:*',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'quit',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
/**自动完成根据输入项进行筛选 */
|
||||||
|
function fnAutoCompleteFilter(input: string, option: any) {
|
||||||
|
return option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**自动完成按键触发 */
|
||||||
|
function fnAutoCompleteKeydown(evt: KeyboardEvent) {
|
||||||
|
if (evt.key === 'Enter') {
|
||||||
|
// 阻止默认的换行行为
|
||||||
|
evt.preventDefault();
|
||||||
|
// 按下 Shift + Enter 键时换行
|
||||||
|
if (evt.shiftKey && evt.target) {
|
||||||
|
// 插入换行符
|
||||||
|
const textarea = evt.target as HTMLInputElement;
|
||||||
|
const start = textarea.selectionStart || 0;
|
||||||
|
const end = textarea.selectionEnd || 0;
|
||||||
|
const text = textarea.value;
|
||||||
|
textarea.value = text.substring(0, start) + '\n' + text.substring(end);
|
||||||
|
terminalState.text = textarea.value;
|
||||||
|
// 更新光标位置
|
||||||
|
textarea.selectionStart = textarea.selectionEnd = start + 1;
|
||||||
|
} else {
|
||||||
|
// ws未连接
|
||||||
|
if (ws.state() !== WebSocket.OPEN) {
|
||||||
|
message.error('disconnected');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 输入历史
|
||||||
|
const cmdStr = terminalState.text.trim().replace(/\n/g, '\r\n');
|
||||||
|
const hisIndex = terminalState.history.findIndex(
|
||||||
|
item => item.value === cmdStr
|
||||||
|
);
|
||||||
|
if (hisIndex === -1) {
|
||||||
|
terminalState.history.push({
|
||||||
|
value: cmdStr,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送文本
|
||||||
|
terminal.value.scrollToBottom();
|
||||||
|
terminal.value.writeln('\r\n> ' + cmdStr);
|
||||||
|
ws.send({
|
||||||
|
requestId: `redis_${props.hostId}`,
|
||||||
|
type: 'redis',
|
||||||
|
data: `${cmdStr}\r\n`,
|
||||||
|
});
|
||||||
|
terminalState.text = '';
|
||||||
|
|
||||||
|
// 退出登录
|
||||||
|
if (['q', 'quit', 'exit'].includes(cmdStr)) {
|
||||||
|
setTimeout(() => {
|
||||||
|
ws.close();
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**终端输入渲染 */
|
||||||
|
function handleRanderXterm(container: HTMLElement | undefined) {
|
||||||
|
if (!container) return;
|
||||||
|
const xterm = new Terminal({
|
||||||
|
lineHeight: 1.2,
|
||||||
|
fontSize: 12,
|
||||||
|
fontFamily: "Monaco, Menlo, Consolas, 'Courier New', monospace",
|
||||||
|
theme: {
|
||||||
|
background: '#000000',
|
||||||
|
},
|
||||||
|
cursorBlink: true, // 光标闪烁
|
||||||
|
cursorStyle: 'block',
|
||||||
|
scrollback: 1000,
|
||||||
|
scrollSensitivity: 15,
|
||||||
|
tabStopWidth: 4,
|
||||||
|
disableStdin: true, // 禁止输入
|
||||||
|
});
|
||||||
|
// 挂载
|
||||||
|
xterm.open(container);
|
||||||
|
// 自适应尺寸
|
||||||
|
const fitAddon = new FitAddon();
|
||||||
|
xterm.loadAddon(fitAddon);
|
||||||
|
// 创建 ResizeObserver 实例
|
||||||
|
var observer = new ResizeObserver(entries => {
|
||||||
|
fitAddon.fit();
|
||||||
|
});
|
||||||
|
// 监听元素大小变化
|
||||||
|
observer.observe(container);
|
||||||
|
|
||||||
|
terminal.value = xterm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**连接打开后回调 */
|
||||||
|
function wsOpen(ev: any) {
|
||||||
|
// console.info('wsOpen', ev);
|
||||||
|
nextTick(() => {
|
||||||
|
handleRanderXterm(terminalDom.value);
|
||||||
|
|
||||||
|
// 连接事件
|
||||||
|
emit('connect', {
|
||||||
|
timeStamp: ev.timeStamp,
|
||||||
|
cols: terminal.value.cols,
|
||||||
|
rows: terminal.value.rows,
|
||||||
|
hostId: props.hostId,
|
||||||
|
id: props.id,
|
||||||
|
});
|
||||||
|
// 初始发送命令
|
||||||
|
if (typeof props.initCmd === 'string') {
|
||||||
|
ws.send({
|
||||||
|
requestId: `redis_${props.hostId}`,
|
||||||
|
type: 'redis',
|
||||||
|
data: `${props.initCmd}\r\n`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**连接错误后回调 */
|
||||||
|
function wsError(ev: any) {
|
||||||
|
console.error('wsError', ev);
|
||||||
|
if (terminal.value != null) {
|
||||||
|
let message = 'disconnected';
|
||||||
|
terminal.value.write(`\x1b[31m${message}\x1b[m\r\n`);
|
||||||
|
} else if (terminalDom.value) {
|
||||||
|
terminalDom.value.style.background = '#000';
|
||||||
|
terminalDom.value.style.color = '#ff4d4f';
|
||||||
|
terminalDom.value.style.height = '60%';
|
||||||
|
terminalDom.value.innerText = 'disconnected';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**连接关闭后回调 */
|
||||||
|
function wsClose(code: number) {
|
||||||
|
// console.warn('wsClose', code);
|
||||||
|
if (terminal.value != null) {
|
||||||
|
let message = 'disconnected';
|
||||||
|
terminal.value.write(`\x1b[31m${message}\x1b[m\r\n`);
|
||||||
|
}
|
||||||
|
// 关闭事件
|
||||||
|
emit('close', {
|
||||||
|
code: code,
|
||||||
|
hostId: props.hostId,
|
||||||
|
id: props.id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**接收消息后回调 */
|
||||||
|
function wsMessage(res: Record<string, any>) {
|
||||||
|
emit('message', res);
|
||||||
|
// console.log('wsMessage', res);
|
||||||
|
const { code, requestId, data } = res;
|
||||||
|
if (code === RESULT_CODE_ERROR) {
|
||||||
|
console.warn(res.msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!requestId) return;
|
||||||
|
if (data.indexOf('is empty') > 0) return;
|
||||||
|
if (terminal.value != null) {
|
||||||
|
// terminal.value.write(data.trim().replace(/\n/g, "\r\n"));
|
||||||
|
// 是否n结尾
|
||||||
|
if (/[\r\n]$/.test(data)) {
|
||||||
|
terminal.value.writeln(data.trim().replace(/\n/g, '\r\n'));
|
||||||
|
} else {
|
||||||
|
terminal.value.write(data.replace(/\n/g, '\r\n'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
if (props.hostId) {
|
||||||
|
// 建立链接
|
||||||
|
const options: OptionsType = {
|
||||||
|
url: '/ws/redis',
|
||||||
|
params: {
|
||||||
|
hostId: props.hostId,
|
||||||
|
},
|
||||||
|
onmessage: wsMessage,
|
||||||
|
onerror: wsError,
|
||||||
|
onopen: wsOpen,
|
||||||
|
onclose: wsClose,
|
||||||
|
};
|
||||||
|
ws.connect(options);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
ws.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 给组件设置属性 ref="xxxTerminal"
|
||||||
|
// setup内使用 const xxxTerminal = ref();
|
||||||
|
defineExpose({
|
||||||
|
/**发送方法 */
|
||||||
|
send: (data: string) => {
|
||||||
|
ws.send({
|
||||||
|
requestId: `redis_${props.hostId}`,
|
||||||
|
type: 'redis',
|
||||||
|
data: `${data}\r\n`,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="terminal">
|
||||||
|
<div ref="terminalDom" style="height: calc(100% - 36px)" :id="id"></div>
|
||||||
|
<a-auto-complete
|
||||||
|
v-model:value="terminalState.text"
|
||||||
|
:dropdown-match-select-width="500"
|
||||||
|
style="width: 100%"
|
||||||
|
:options="terminalState.history"
|
||||||
|
:filter-option="fnAutoCompleteFilter"
|
||||||
|
:defaultActiveFirstOption="false"
|
||||||
|
>
|
||||||
|
<a-textarea
|
||||||
|
:auto-size="{ minRows: 1, maxRows: 6 }"
|
||||||
|
placeholder="Execute command. Shift+Enter to line feed, Enter to send"
|
||||||
|
@keypress="fnAutoCompleteKeydown"
|
||||||
|
/>
|
||||||
|
</a-auto-complete>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="css" scoped>
|
||||||
|
.terminal {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
258
src/components/TerminalSSH/index.vue
Normal file
@@ -0,0 +1,258 @@
|
|||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, onMounted, onBeforeUnmount, nextTick } from 'vue';
|
||||||
|
import { FitAddon } from '@xterm/addon-fit';
|
||||||
|
import { Terminal } from '@xterm/xterm';
|
||||||
|
import '@xterm/xterm/css/xterm.css';
|
||||||
|
import { RESULT_CODE_ERROR } from '@/constants/result-constants';
|
||||||
|
import { OptionsType, WS } from '@/plugins/ws-websocket';
|
||||||
|
const ws = new WS();
|
||||||
|
const emit = defineEmits(['connect', 'close', 'message']);
|
||||||
|
const props = defineProps({
|
||||||
|
/**终端ID,必传 */
|
||||||
|
id: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
/**连接主机ID,必传 */
|
||||||
|
hostId: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
/**窗口单行字符数 */
|
||||||
|
cols: {
|
||||||
|
type: Number,
|
||||||
|
default: 80,
|
||||||
|
},
|
||||||
|
/**窗口行数 */
|
||||||
|
rows: {
|
||||||
|
type: Number,
|
||||||
|
default: 40,
|
||||||
|
},
|
||||||
|
/**禁止输入 */
|
||||||
|
disable: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
/**初始发送命令 */
|
||||||
|
initCmd: {
|
||||||
|
type: [String, Boolean],
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
/**终端输入DOM节点实例对象 */
|
||||||
|
const terminalDom = ref<HTMLElement | undefined>(undefined);
|
||||||
|
|
||||||
|
/**终端输入实例对象 */
|
||||||
|
const terminal = ref<any>(null);
|
||||||
|
|
||||||
|
/**终端输入渲染 */
|
||||||
|
function handleRanderXterm(container: HTMLElement | undefined) {
|
||||||
|
if (!container) return;
|
||||||
|
const xterm = new Terminal({
|
||||||
|
cols: props.cols,
|
||||||
|
rows: props.rows,
|
||||||
|
lineHeight: 1.2,
|
||||||
|
fontSize: 12,
|
||||||
|
fontFamily: "Monaco, Menlo, Consolas, 'Courier New', monospace",
|
||||||
|
theme: {
|
||||||
|
background: '#000000',
|
||||||
|
},
|
||||||
|
cursorBlink: true, // 光标闪烁
|
||||||
|
cursorStyle: 'block',
|
||||||
|
scrollback: 1000,
|
||||||
|
scrollSensitivity: 15,
|
||||||
|
tabStopWidth: 4,
|
||||||
|
disableStdin: props.disable, // 禁止输入
|
||||||
|
});
|
||||||
|
// 挂载
|
||||||
|
xterm.open(container);
|
||||||
|
// 自适应尺寸
|
||||||
|
const fitAddon = new FitAddon();
|
||||||
|
xterm.loadAddon(fitAddon);
|
||||||
|
// 终端输入字符按键监听
|
||||||
|
xterm.onData(char => {
|
||||||
|
ws.send({
|
||||||
|
requestId: `ssh_${props.hostId}`,
|
||||||
|
type: 'ssh',
|
||||||
|
data: char,
|
||||||
|
});
|
||||||
|
// const printable = char.match(/[\x20-\x7E]/); // 匹配可打印字符的正则表达式
|
||||||
|
// if (char === '\r' || char === '\x0D') {
|
||||||
|
// // 处理回车键,添加换行
|
||||||
|
// xterm.writeln('');
|
||||||
|
// } else if (char === '\x08' || char === '\x7F') {
|
||||||
|
// // 处理退格键,删除最后一个字符
|
||||||
|
// xterm.write('\b \b');
|
||||||
|
// } else if (printable) {
|
||||||
|
// // 处理可打印字符
|
||||||
|
// xterm.write(char);
|
||||||
|
// }
|
||||||
|
});
|
||||||
|
// 终端输入按键监听
|
||||||
|
// xterm.onKey(({ key, domEvent }) => {
|
||||||
|
// // console.log(key, domEvent);
|
||||||
|
// // 单键输入
|
||||||
|
// // switch (domEvent.key) {
|
||||||
|
// // case 'ArrowUp':
|
||||||
|
// // // 按“↑”方向键时要做的事。
|
||||||
|
// // break;
|
||||||
|
// // case 'ArrowDown':
|
||||||
|
// // // 按“↓”方向键时要做的事。
|
||||||
|
// // break;
|
||||||
|
// // case 'ArrowLeft':
|
||||||
|
// // // 按“←”方向键时要做的事。
|
||||||
|
// // break;
|
||||||
|
// // case 'ArrowRight':
|
||||||
|
// // // 按“→”方向键时要做的事。
|
||||||
|
// // break;
|
||||||
|
// // case 'Enter':
|
||||||
|
// // // 处理回车键,添加换行
|
||||||
|
// // term.writeln('');
|
||||||
|
// // break;
|
||||||
|
// // case 'Backspace':
|
||||||
|
// // // 处理退格键,删除最后一个字符
|
||||||
|
// // term.write('\b \b');
|
||||||
|
// // break;
|
||||||
|
// // case 'Escape':
|
||||||
|
// // // 按“ESC”键时要做的事。
|
||||||
|
// // break;
|
||||||
|
// // default:
|
||||||
|
// // return; // 什么都没按就退出吧。
|
||||||
|
// // }
|
||||||
|
// });
|
||||||
|
// 终端尺寸变化触发
|
||||||
|
xterm.onResize(({ cols, rows }) => {
|
||||||
|
// console.log('尺寸', cols, rows);
|
||||||
|
ws.send({
|
||||||
|
requestId: `ssh_resize_${props.hostId}`,
|
||||||
|
type: 'resize',
|
||||||
|
data: { cols, rows },
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 创建 ResizeObserver 实例
|
||||||
|
var observer = new ResizeObserver(entries => {
|
||||||
|
fitAddon.fit();
|
||||||
|
});
|
||||||
|
// 监听元素大小变化
|
||||||
|
observer.observe(container);
|
||||||
|
|
||||||
|
terminal.value = xterm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**连接打开后回调 */
|
||||||
|
function wsOpen(ev: any) {
|
||||||
|
// console.info('wsOpen', ev);
|
||||||
|
nextTick(() => {
|
||||||
|
handleRanderXterm(terminalDom.value);
|
||||||
|
// 连接事件
|
||||||
|
emit('connect', {
|
||||||
|
timeStamp: ev.timeStamp,
|
||||||
|
cols: terminal.value.cols,
|
||||||
|
rows: terminal.value.rows,
|
||||||
|
hostId: props.hostId,
|
||||||
|
id: props.id,
|
||||||
|
});
|
||||||
|
// 初始发送命令
|
||||||
|
if (typeof props.initCmd === 'string') {
|
||||||
|
ws.send({
|
||||||
|
requestId: `ssh_${props.hostId}`,
|
||||||
|
type: 'ssh',
|
||||||
|
data: `${props.initCmd}\n`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**连接错误后回调 */
|
||||||
|
function wsError(ev: any) {
|
||||||
|
// console.error('wsError', ev);
|
||||||
|
if (terminal.value != null) {
|
||||||
|
let message = 'disconnected';
|
||||||
|
terminal.value.write(`\x1b[31m${message}\x1b[m\r\n`);
|
||||||
|
} else if (terminalDom.value) {
|
||||||
|
terminalDom.value.style.background = '#000';
|
||||||
|
terminalDom.value.style.color = '#ff4d4f';
|
||||||
|
terminalDom.value.style.height = '60%';
|
||||||
|
terminalDom.value.innerText = 'disconnected';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**连接关闭后回调 */
|
||||||
|
function wsClose(code: number) {
|
||||||
|
// console.warn('wsClose', code);
|
||||||
|
if (terminal.value != null) {
|
||||||
|
let message = 'disconnected';
|
||||||
|
terminal.value.write(`\x1b[31m${message}\x1b[m\r\n`);
|
||||||
|
}
|
||||||
|
// 关闭事件
|
||||||
|
emit('close', {
|
||||||
|
code: code,
|
||||||
|
hostId: props.hostId,
|
||||||
|
id: props.id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**接收消息后回调 */
|
||||||
|
function wsMessage(res: Record<string, any>) {
|
||||||
|
emit('message', res);
|
||||||
|
// console.log('wsMessage', res);
|
||||||
|
const { code, requestId, data } = res;
|
||||||
|
if (code === RESULT_CODE_ERROR) {
|
||||||
|
console.warn(res.msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!requestId) return;
|
||||||
|
if (terminal.value != null) {
|
||||||
|
terminal.value.write(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
if (props.hostId) {
|
||||||
|
// 建立链接
|
||||||
|
const options: OptionsType = {
|
||||||
|
url: '/ws/ssh',
|
||||||
|
params: {
|
||||||
|
hostId: props.hostId,
|
||||||
|
cols: props.cols,
|
||||||
|
rows: props.rows,
|
||||||
|
},
|
||||||
|
onmessage: wsMessage,
|
||||||
|
onerror: wsError,
|
||||||
|
onopen: wsOpen,
|
||||||
|
onclose: wsClose,
|
||||||
|
};
|
||||||
|
ws.connect(options);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
ws.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 给组件设置属性 ref="xxxTerminal"
|
||||||
|
// setup内使用 const xxxTerminal = ref();
|
||||||
|
defineExpose({
|
||||||
|
/**发送方法 */
|
||||||
|
send: (data: string) => {
|
||||||
|
ws.send({
|
||||||
|
requestId: `ssh_${props.hostId}`,
|
||||||
|
type: 'ssh',
|
||||||
|
data: `${data}\n`,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div ref="terminalDom" :id="id" class="terminal"></div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="css" scoped>
|
||||||
|
.terminal {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
264
src/components/TerminalSSHView/index.vue
Normal file
@@ -0,0 +1,264 @@
|
|||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, onMounted, onBeforeUnmount, nextTick } from 'vue';
|
||||||
|
import { FitAddon } from '@xterm/addon-fit';
|
||||||
|
import { Terminal } from '@xterm/xterm';
|
||||||
|
import '@xterm/xterm/css/xterm.css';
|
||||||
|
import { RESULT_CODE_ERROR } from '@/constants/result-constants';
|
||||||
|
import { OptionsType, WS } from '@/plugins/ws-websocket';
|
||||||
|
const ws = new WS();
|
||||||
|
const emit = defineEmits(['connect', 'close', 'message']);
|
||||||
|
const props = defineProps({
|
||||||
|
/**终端ID,必传 */
|
||||||
|
id: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
/**ws连接地址,必传 如/ws/view */
|
||||||
|
url: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
/**网元类型,必传 */
|
||||||
|
neType: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
/**网元ID,必传 */
|
||||||
|
neId: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
/**窗口单行字符数 */
|
||||||
|
cols: {
|
||||||
|
type: Number,
|
||||||
|
default: 80,
|
||||||
|
},
|
||||||
|
/**窗口行数 */
|
||||||
|
rows: {
|
||||||
|
type: Number,
|
||||||
|
default: 40,
|
||||||
|
},
|
||||||
|
/**ws发送requestId前缀 如ssh_id */
|
||||||
|
prefix: {
|
||||||
|
type: String,
|
||||||
|
default: 'ssh',
|
||||||
|
},
|
||||||
|
/**消息处理函数 */
|
||||||
|
processMessages: {
|
||||||
|
type: Function,
|
||||||
|
default: undefined,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
/**终端输入DOM节点实例对象 */
|
||||||
|
const terminalDom = ref<HTMLElement | undefined>(undefined);
|
||||||
|
|
||||||
|
/**终端输入实例对象 */
|
||||||
|
const terminal = ref<any>(null);
|
||||||
|
|
||||||
|
/**终端输入渲染 */
|
||||||
|
function handleRanderXterm(container: HTMLElement | undefined) {
|
||||||
|
if (!container) return;
|
||||||
|
const xterm = new Terminal({
|
||||||
|
cols: props.cols,
|
||||||
|
rows: props.rows,
|
||||||
|
lineHeight: 1.2,
|
||||||
|
fontSize: 12,
|
||||||
|
fontFamily: "Monaco, Menlo, Consolas, 'Courier New', monospace",
|
||||||
|
theme: {
|
||||||
|
background: '#000000',
|
||||||
|
},
|
||||||
|
cursorBlink: true, // 光标闪烁
|
||||||
|
cursorStyle: 'block',
|
||||||
|
scrollback: 1000, // 设置历史缓冲区大小为 1000 行
|
||||||
|
scrollSensitivity: 15,
|
||||||
|
tabStopWidth: 4,
|
||||||
|
disableStdin: true, // 禁止输入
|
||||||
|
});
|
||||||
|
// 挂载
|
||||||
|
xterm.open(container);
|
||||||
|
// 自适应尺寸
|
||||||
|
const fitAddon = new FitAddon();
|
||||||
|
xterm.loadAddon(fitAddon);
|
||||||
|
// 终端尺寸变化触发
|
||||||
|
xterm.onResize(({ cols, rows }) => {
|
||||||
|
// console.log('尺寸', cols, rows);
|
||||||
|
ws.send({
|
||||||
|
requestId: `resize_${props.id}`,
|
||||||
|
type: 'resize',
|
||||||
|
data: { cols, rows },
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 创建 ResizeObserver 实例
|
||||||
|
var observer = new ResizeObserver(entries => {
|
||||||
|
fitAddon.fit();
|
||||||
|
});
|
||||||
|
// 监听元素大小变化
|
||||||
|
observer.observe(container);
|
||||||
|
|
||||||
|
terminal.value = xterm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**连接打开后回调 */
|
||||||
|
function wsOpen(ev: any) {
|
||||||
|
// console.info('wsOpen', ev);
|
||||||
|
nextTick(() => {
|
||||||
|
handleRanderXterm(terminalDom.value);
|
||||||
|
// 连接事件
|
||||||
|
emit('connect', {
|
||||||
|
timeStamp: ev.timeStamp,
|
||||||
|
cols: terminal.value.cols,
|
||||||
|
rows: terminal.value.rows,
|
||||||
|
neType: props.neType,
|
||||||
|
neId: props.neId,
|
||||||
|
id: props.id,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**连接错误后回调 */
|
||||||
|
function wsError(ev: any) {
|
||||||
|
console.error('wsError', ev);
|
||||||
|
if (terminal.value != null) {
|
||||||
|
let message = 'disconnected';
|
||||||
|
terminal.value.write(`\x1b[31m${message}\x1b[m\r\n`);
|
||||||
|
} else if (terminalDom.value) {
|
||||||
|
terminalDom.value.style.background = '#000';
|
||||||
|
terminalDom.value.style.color = '#ff4d4f';
|
||||||
|
terminalDom.value.style.height = '60%';
|
||||||
|
terminalDom.value.innerText = 'disconnected';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**连接关闭后回调 */
|
||||||
|
function wsClose(code: number) {
|
||||||
|
// console.warn('wsClose', code);
|
||||||
|
if (terminal.value != null) {
|
||||||
|
let message = 'disconnected ' + code;
|
||||||
|
terminal.value.write(`\x1b[31m${message}\x1b[m\r\n`);
|
||||||
|
}
|
||||||
|
// 关闭事件
|
||||||
|
emit('close', {
|
||||||
|
code: code,
|
||||||
|
neType: props.neType,
|
||||||
|
neId: props.neId,
|
||||||
|
id: props.id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**接收消息后回调 */
|
||||||
|
function wsMessage(res: Record<string, any>) {
|
||||||
|
emit('message', res);
|
||||||
|
// console.log('wsMessage', res);
|
||||||
|
const { code, requestId, data } = res;
|
||||||
|
if (code === RESULT_CODE_ERROR) {
|
||||||
|
console.warn(res.msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!requestId) return;
|
||||||
|
if (terminal.value != null) {
|
||||||
|
let text = '';
|
||||||
|
// 处理消息
|
||||||
|
if (props.processMessages) {
|
||||||
|
text = props.processMessages(data);
|
||||||
|
}else{
|
||||||
|
text = processMessage(data);
|
||||||
|
}
|
||||||
|
// 无消息是则不输出
|
||||||
|
if (text === '') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
terminal.value.write(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**终端消息处理*/
|
||||||
|
function processMessage(data: string): string {
|
||||||
|
// 查找的开始输出标记
|
||||||
|
const parts: string[] = data.split('\u001b[?2004l\r');
|
||||||
|
if (parts.length > 0) {
|
||||||
|
if (parts[0].startsWith('^C') || parts[0].startsWith('\r')) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
let text = parts[parts.length - 1];
|
||||||
|
// 找到最后输出标记
|
||||||
|
let lestIndex = text.lastIndexOf('\u001b[?2004h\u001b]0;');
|
||||||
|
if (lestIndex !== -1) {
|
||||||
|
text = text.substring(0, lestIndex);
|
||||||
|
}
|
||||||
|
if (text === '' || text === '\r\n' || text.startsWith('^C\r\n')) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
// 是否还有最后输出标记
|
||||||
|
lestIndex = text.lastIndexOf('\u001b[?2004h');
|
||||||
|
if (lestIndex !== -1) {
|
||||||
|
text = text.substring(0, lestIndex);
|
||||||
|
}
|
||||||
|
// console.log({ parts, text });
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
if (props.neType && props.neId) {
|
||||||
|
// 建立链接
|
||||||
|
const options: OptionsType = {
|
||||||
|
url: props.url,
|
||||||
|
params: {
|
||||||
|
neType: props.neType,
|
||||||
|
neId: props.neId,
|
||||||
|
cols: props.cols,
|
||||||
|
rows: props.rows,
|
||||||
|
},
|
||||||
|
onmessage: wsMessage,
|
||||||
|
onerror: wsError,
|
||||||
|
onopen: wsOpen,
|
||||||
|
onclose: wsClose,
|
||||||
|
};
|
||||||
|
ws.connect(options);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
if (ws.state() === WebSocket.OPEN) ws.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 给组件设置属性 ref="xxxTerminal"
|
||||||
|
// setup内使用 const xxxTerminal = ref();
|
||||||
|
defineExpose({
|
||||||
|
/**清除 */
|
||||||
|
clear: () => {
|
||||||
|
if (terminal.value != null) {
|
||||||
|
terminal.value.clear();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/**发送命令 */
|
||||||
|
send: (type: string, data: Record<string, any>) => {
|
||||||
|
ws.send({
|
||||||
|
requestId: `${props.prefix}_${props.id}`,
|
||||||
|
type,
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/**模拟按下 Ctrl+C */
|
||||||
|
ctrlC: () => {
|
||||||
|
ws.send({
|
||||||
|
requestId: `${props.prefix}_${props.id}`,
|
||||||
|
type: 'ctrl-c',
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div ref="terminalDom" :id="id" class="terminal"></div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="css" scoped>
|
||||||
|
.terminal {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
315
src/components/TerminalTelnet/index.vue
Normal file
@@ -0,0 +1,315 @@
|
|||||||
|
<script lang="ts" setup>
|
||||||
|
import { message } from 'ant-design-vue/es';
|
||||||
|
import { ref, reactive, onMounted, onBeforeUnmount, nextTick } from 'vue';
|
||||||
|
import { FitAddon } from '@xterm/addon-fit';
|
||||||
|
import { Terminal } from '@xterm/xterm';
|
||||||
|
import '@xterm/xterm/css/xterm.css';
|
||||||
|
import { RESULT_CODE_ERROR } from '@/constants/result-constants';
|
||||||
|
import { OptionsType, WS } from '@/plugins/ws-websocket';
|
||||||
|
const ws = new WS();
|
||||||
|
const emit = defineEmits(['connect', 'close', 'message']);
|
||||||
|
const props = defineProps({
|
||||||
|
/**终端ID,必传 */
|
||||||
|
id: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
/**连接主机ID,必传 */
|
||||||
|
hostId: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
/**窗口单行字符数 */
|
||||||
|
cols: {
|
||||||
|
type: Number,
|
||||||
|
default: 120,
|
||||||
|
},
|
||||||
|
/**窗口行数 */
|
||||||
|
rows: {
|
||||||
|
type: Number,
|
||||||
|
default: 128,
|
||||||
|
},
|
||||||
|
/**禁止输入 */
|
||||||
|
disable: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
/**初始发送命令 */
|
||||||
|
initCmd: {
|
||||||
|
type: [String, Boolean],
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
/**终端输入DOM节点实例对象 */
|
||||||
|
const terminalDom = ref<HTMLElement | undefined>(undefined);
|
||||||
|
|
||||||
|
/**终端输入实例对象 */
|
||||||
|
const terminal = ref<any>(null);
|
||||||
|
|
||||||
|
/**终端输入文字状态 */
|
||||||
|
const terminalState = reactive<{
|
||||||
|
/**输入值 */
|
||||||
|
text: string;
|
||||||
|
/**历史 */
|
||||||
|
history: {
|
||||||
|
label?: string;
|
||||||
|
value: string;
|
||||||
|
}[];
|
||||||
|
}>({
|
||||||
|
text: '',
|
||||||
|
history: [
|
||||||
|
{
|
||||||
|
value: 'help',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'quit',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'list ver',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'list lic',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
/**自动完成根据输入项进行筛选 */
|
||||||
|
function fnAutoCompleteFilter(input: string, option: any) {
|
||||||
|
return option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**自动完成按键触发 */
|
||||||
|
function fnAutoCompleteKeydown(evt: KeyboardEvent) {
|
||||||
|
if (evt.key === 'Enter') {
|
||||||
|
// 阻止默认的换行行为
|
||||||
|
evt.preventDefault();
|
||||||
|
// 按下 Shift + Enter 键时换行
|
||||||
|
if (evt.shiftKey && evt.target) {
|
||||||
|
// 插入换行符
|
||||||
|
const textarea = evt.target as HTMLInputElement;
|
||||||
|
const start = textarea.selectionStart || 0;
|
||||||
|
const end = textarea.selectionEnd || 0;
|
||||||
|
const text = textarea.value;
|
||||||
|
textarea.value = text.substring(0, start) + '\n' + text.substring(end);
|
||||||
|
terminalState.text = textarea.value;
|
||||||
|
// 更新光标位置
|
||||||
|
textarea.selectionStart = textarea.selectionEnd = start + 1;
|
||||||
|
} else {
|
||||||
|
// ws未连接
|
||||||
|
if (ws.state() !== WebSocket.OPEN) {
|
||||||
|
message.error('disconnected');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 输入历史
|
||||||
|
const cmdStr = terminalState.text.trim().replace(/\n/g, '\r\n');
|
||||||
|
const hisIndex = terminalState.history.findIndex(
|
||||||
|
item => item.value === cmdStr
|
||||||
|
);
|
||||||
|
if (hisIndex === -1) {
|
||||||
|
terminalState.history.push({
|
||||||
|
value: cmdStr,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送文本
|
||||||
|
terminal.value.scrollToBottom();
|
||||||
|
terminal.value.writeln(cmdStr);
|
||||||
|
ws.send({
|
||||||
|
requestId: `telnet_${props.hostId}`,
|
||||||
|
type: 'telnet',
|
||||||
|
data: `${cmdStr}\r\n`,
|
||||||
|
});
|
||||||
|
terminalState.text = '';
|
||||||
|
|
||||||
|
// 退出登录
|
||||||
|
if (['q', 'quit', 'exit'].includes(cmdStr)) {
|
||||||
|
setTimeout(() => {
|
||||||
|
ws.close();
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**终端输入渲染 */
|
||||||
|
function handleRanderXterm(container: HTMLElement | undefined) {
|
||||||
|
if (!container) return;
|
||||||
|
const xterm = new Terminal({
|
||||||
|
lineHeight: 1.2,
|
||||||
|
fontSize: 12,
|
||||||
|
fontFamily: "Monaco, Menlo, Consolas, 'Courier New', monospace",
|
||||||
|
theme: {
|
||||||
|
background: '#000000',
|
||||||
|
},
|
||||||
|
cursorBlink: true, // 光标闪烁
|
||||||
|
cursorStyle: 'block',
|
||||||
|
scrollback: 1000,
|
||||||
|
scrollSensitivity: 15,
|
||||||
|
tabStopWidth: 4,
|
||||||
|
disableStdin: props.disable, // 禁止输入
|
||||||
|
});
|
||||||
|
// 挂载
|
||||||
|
xterm.open(container);
|
||||||
|
// 自适应尺寸
|
||||||
|
const fitAddon = new FitAddon();
|
||||||
|
xterm.loadAddon(fitAddon);
|
||||||
|
// 终端尺寸变化触发
|
||||||
|
xterm.onResize(({ cols, rows }) => {
|
||||||
|
// console.log('尺寸', cols, rows);
|
||||||
|
ws.send({
|
||||||
|
requestId: `telnet_resize_${props.hostId}`,
|
||||||
|
type: 'resize',
|
||||||
|
data: { cols, rows },
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 创建 ResizeObserver 实例
|
||||||
|
var observer = new ResizeObserver(entries => {
|
||||||
|
fitAddon.fit();
|
||||||
|
});
|
||||||
|
// 监听元素大小变化
|
||||||
|
observer.observe(container);
|
||||||
|
|
||||||
|
terminal.value = xterm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**连接打开后回调 */
|
||||||
|
function wsOpen(ev: any) {
|
||||||
|
// console.info('wsOpen', ev);
|
||||||
|
nextTick(() => {
|
||||||
|
handleRanderXterm(terminalDom.value);
|
||||||
|
|
||||||
|
// 连接事件
|
||||||
|
emit('connect', {
|
||||||
|
timeStamp: ev.timeStamp,
|
||||||
|
cols: terminal.value.cols,
|
||||||
|
rows: terminal.value.rows,
|
||||||
|
hostId: props.hostId,
|
||||||
|
id: props.id,
|
||||||
|
});
|
||||||
|
// 初始发送命令
|
||||||
|
if (typeof props.initCmd === 'string') {
|
||||||
|
ws.send({
|
||||||
|
requestId: `telnet_${props.hostId}`,
|
||||||
|
type: 'telnet',
|
||||||
|
data: `${props.initCmd}\r\n`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**连接错误后回调 */
|
||||||
|
function wsError(ev: any) {
|
||||||
|
console.error('wsError', ev);
|
||||||
|
if (terminal.value != null) {
|
||||||
|
let message = 'disconnected';
|
||||||
|
terminal.value.write(`\x1b[31m${message}\x1b[m\r\n`);
|
||||||
|
} else if (terminalDom.value) {
|
||||||
|
terminalDom.value.style.background = '#000';
|
||||||
|
terminalDom.value.style.color = '#ff4d4f';
|
||||||
|
terminalDom.value.style.height = '60%';
|
||||||
|
terminalDom.value.innerText = 'disconnected';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**连接关闭后回调 */
|
||||||
|
function wsClose(code: number) {
|
||||||
|
// console.warn('wsClose', code);
|
||||||
|
if (terminal.value != null) {
|
||||||
|
let message = 'disconnected';
|
||||||
|
terminal.value.write(`\x1b[31m${message}\x1b[m\r\n`);
|
||||||
|
}
|
||||||
|
// 关闭事件
|
||||||
|
emit('close', {
|
||||||
|
code: code,
|
||||||
|
hostId: props.hostId,
|
||||||
|
id: props.id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**接收消息后回调 */
|
||||||
|
function wsMessage(res: Record<string, any>) {
|
||||||
|
emit('message', res);
|
||||||
|
// console.log('wsMessage', res);
|
||||||
|
const { code, requestId, data } = res;
|
||||||
|
if (code === RESULT_CODE_ERROR) {
|
||||||
|
console.warn(res.msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!requestId) return;
|
||||||
|
if (terminal.value != null) {
|
||||||
|
// terminal.value.write(data.trim().replace(/\n/g, "\r\n"));
|
||||||
|
// 是否n结尾
|
||||||
|
if (/[\r\n]$/.test(data)) {
|
||||||
|
terminal.value.writeln(data.trim().replace(/\n/g, '\r\n'));
|
||||||
|
} else {
|
||||||
|
terminal.value.write(data.replace(/\n/g, '\r\n'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
if (props.hostId) {
|
||||||
|
// 建立链接
|
||||||
|
const options: OptionsType = {
|
||||||
|
url: '/ws/telnet',
|
||||||
|
params: {
|
||||||
|
hostId: props.hostId,
|
||||||
|
cols: props.cols,
|
||||||
|
rows: props.rows,
|
||||||
|
},
|
||||||
|
onmessage: wsMessage,
|
||||||
|
onerror: wsError,
|
||||||
|
onopen: wsOpen,
|
||||||
|
onclose: wsClose,
|
||||||
|
};
|
||||||
|
ws.connect(options);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
ws.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 给组件设置属性 ref="xxxTerminal"
|
||||||
|
// setup内使用 const xxxTerminal = ref();
|
||||||
|
defineExpose({
|
||||||
|
/**发送方法 */
|
||||||
|
send: (data: string) => {
|
||||||
|
ws.send({
|
||||||
|
requestId: `telnet_${props.hostId}`,
|
||||||
|
type: 'telnet',
|
||||||
|
data: `${data}\r\n`,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="terminal">
|
||||||
|
<div ref="terminalDom" style="height: calc(100% - 36px)" :id="id"></div>
|
||||||
|
<a-auto-complete
|
||||||
|
v-model:value="terminalState.text"
|
||||||
|
:dropdown-match-select-width="500"
|
||||||
|
style="width: 100%"
|
||||||
|
:options="terminalState.history"
|
||||||
|
:filter-option="fnAutoCompleteFilter"
|
||||||
|
:defaultActiveFirstOption="false"
|
||||||
|
>
|
||||||
|
<a-textarea
|
||||||
|
:auto-size="{ minRows: 1, maxRows: 6 }"
|
||||||
|
placeholder="Execute command. Shift+Enter to line feed, Enter to send"
|
||||||
|
@keypress="fnAutoCompleteKeydown"
|
||||||
|
/>
|
||||||
|
</a-auto-complete>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="css" scoped>
|
||||||
|
.terminal {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { message } from 'ant-design-vue/lib';
|
import { message } from 'ant-design-vue/es';
|
||||||
import { FileType } from 'ant-design-vue/lib/upload/interface';
|
import { FileType } from 'ant-design-vue/es/upload/interface';
|
||||||
import { UploadRequestOption } from 'ant-design-vue/lib/vc-upload/interface';
|
import { UploadRequestOption } from 'ant-design-vue/es/vc-upload/interface';
|
||||||
|
import { ProModal } from 'antdv-pro-modal';
|
||||||
import useI18n from '@/hooks/useI18n';
|
import useI18n from '@/hooks/useI18n';
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const emit = defineEmits(['upload', 'close', 'update:visible']);
|
const emit = defineEmits(['upload', 'close', 'update:open']);
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
/**窗口标题 */
|
/**窗口标题 */
|
||||||
title: {
|
title: {
|
||||||
@@ -17,7 +18,7 @@ const props = defineProps({
|
|||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
/**是否弹出显示,必传 */
|
/**是否弹出显示,必传 */
|
||||||
visible: {
|
open: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
@@ -35,19 +36,22 @@ const props = defineProps({
|
|||||||
|
|
||||||
/**弹框关闭事件 */
|
/**弹框关闭事件 */
|
||||||
function fnModalClose() {
|
function fnModalClose() {
|
||||||
if(props.loading) return
|
if (props.loading) return;
|
||||||
emit('close');
|
emit('close');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**上传前检查或转换压缩 */
|
/**上传前检查或转换压缩 */
|
||||||
function fnBeforeUpload(file: FileType) {
|
function fnBeforeUpload(file: FileType) {
|
||||||
if (props.loading) return false;
|
if (props.loading) return false;
|
||||||
// 检查文件大小
|
// 检查文件大小
|
||||||
if (props.size > 0) {
|
if (props.size > 0) {
|
||||||
const fileSize = file.size;
|
const fileSize = file.size;
|
||||||
const isLtM = fileSize / 1024 / 1024 < props.size;
|
const isLtM = fileSize / 1024 / 1024 < props.size;
|
||||||
if (!isLtM) {
|
if (!isLtM) {
|
||||||
message.error(`${t('components.UploadModal.allowFilter')} ${props.size}MB`, 3);
|
message.error(
|
||||||
|
`${t('components.UploadModal.allowFilter')} ${props.size}MB`,
|
||||||
|
3
|
||||||
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -56,7 +60,10 @@ function fnBeforeUpload(file: FileType) {
|
|||||||
const fileName = file.name;
|
const fileName = file.name;
|
||||||
const isAllowType = props.ext.some(v => fileName.endsWith(v));
|
const isAllowType = props.ext.some(v => fileName.endsWith(v));
|
||||||
if (!isAllowType) {
|
if (!isAllowType) {
|
||||||
message.error(`${t('components.UploadModal.onlyAllow')} ${props.ext.join('、')}`, 3);
|
message.error(
|
||||||
|
`${t('components.UploadModal.onlyAllow')} ${props.ext.join('、')}`,
|
||||||
|
3
|
||||||
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -65,19 +72,20 @@ function fnBeforeUpload(file: FileType) {
|
|||||||
|
|
||||||
/**上传请求发出 */
|
/**上传请求发出 */
|
||||||
function fnUpload(up: UploadRequestOption) {
|
function fnUpload(up: UploadRequestOption) {
|
||||||
emit('upload', up.file)
|
emit('upload', up.file);
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<a-modal
|
<ProModal
|
||||||
width="500px"
|
:drag="true"
|
||||||
|
:destroyOnClose="true"
|
||||||
:title="props.title"
|
:title="props.title"
|
||||||
:visible="props.visible"
|
:open="props.open"
|
||||||
:keyboard="false"
|
:keyboard="false"
|
||||||
:mask-closable="false"
|
:mask-closable="false"
|
||||||
:confirm-loading="props.loading"
|
:confirm-loading="props.loading"
|
||||||
:footer="null"
|
:footer="false"
|
||||||
@cancel="fnModalClose"
|
@cancel="fnModalClose"
|
||||||
>
|
>
|
||||||
<a-space :size="8" direction="vertical" style="width: 100%">
|
<a-space :size="8" direction="vertical" style="width: 100%">
|
||||||
@@ -93,20 +101,26 @@ function fnUpload(up: UploadRequestOption) {
|
|||||||
<p class="ant-upload-drag-icon">
|
<p class="ant-upload-drag-icon">
|
||||||
<inbox-outlined></inbox-outlined>
|
<inbox-outlined></inbox-outlined>
|
||||||
</p>
|
</p>
|
||||||
<p class="ant-upload-text">{{t('components.UploadModal.uploadTip')}}</p>
|
<p class="ant-upload-text">
|
||||||
|
{{ t('components.UploadModal.uploadTip') }}
|
||||||
|
</p>
|
||||||
<p class="ant-upload-hint">
|
<p class="ant-upload-hint">
|
||||||
<div v-if="props.size > 0">
|
<template v-if="props.size > 0">
|
||||||
{{t('components.UploadModal.allowSize')}} {{ props.size }} MB
|
<div>
|
||||||
</div>
|
{{ t('components.UploadModal.allowSize') }} {{ props.size }} MB
|
||||||
<div v-if="props.ext.length > 0">
|
</div>
|
||||||
{{t('components.UploadModal.allowFormat')}} {{ props.ext.join('、') }}
|
</template>
|
||||||
|
<template v-if="props.ext.length > 0">
|
||||||
</div>
|
<div>
|
||||||
|
{{ t('components.UploadModal.allowFormat') }}
|
||||||
|
{{ props.ext.join('、') }}
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
</p>
|
</p>
|
||||||
</a-upload-dragger>
|
</a-upload-dragger>
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</a-space>
|
</a-space>
|
||||||
</a-modal>
|
</ProModal>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<style lang="less" scoped></style>
|
||||||
|
|||||||