This commit is contained in:
2026-06-18 17:03:47 +08:00
parent fb76900a6d
commit bd0e0c51a4
11 changed files with 333 additions and 108 deletions

View File

@ -29,6 +29,7 @@
"element-plus": "2.14.0", "element-plus": "2.14.0",
"face-api.js": "^0.22.2", "face-api.js": "^0.22.2",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"mammoth": "^1.12.0",
"mqtt": "^5.15.1", "mqtt": "^5.15.1",
"pinia": "^3.0.4", "pinia": "^3.0.4",
"qrcode": "^1.5.4", "qrcode": "^1.5.4",

View File

@ -47,6 +47,9 @@ importers:
file-saver: file-saver:
specifier: ^2.0.5 specifier: ^2.0.5
version: 2.0.5 version: 2.0.5
mammoth:
specifier: ^1.12.0
version: 1.12.0
mqtt: mqtt:
specifier: ^5.15.1 specifier: ^5.15.1
version: 5.15.1 version: 5.15.1
@ -1323,6 +1326,10 @@ packages:
slate: ^0.72.0 slate: ^0.72.0
snabbdom: ^3.1.0 snabbdom: ^3.1.0
'@xmldom/xmldom@0.8.13':
resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==}
engines: {node: '>=10.0.0'}
abort-controller@3.0.0: abort-controller@3.0.0:
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
engines: {node: '>=6.5'} engines: {node: '>=6.5'}
@ -1363,6 +1370,9 @@ packages:
resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==}
engines: {node: '>=14'} engines: {node: '>=14'}
argparse@1.0.10:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
ast-kit@2.2.0: ast-kit@2.2.0:
resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==} resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==}
engines: {node: '>=20.19.0'} engines: {node: '>=20.19.0'}
@ -1398,6 +1408,9 @@ packages:
bl@6.1.6: bl@6.1.6:
resolution: {integrity: sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==} resolution: {integrity: sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==}
bluebird@3.4.7:
resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==}
boolbase@1.0.0: boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
@ -1491,6 +1504,9 @@ packages:
resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==}
engines: {node: '>=18'} engines: {node: '>=18'}
core-util-is@1.0.3:
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
crc-32@1.2.2: crc-32@1.2.2:
resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
@ -1557,9 +1573,15 @@ packages:
dijkstrajs@1.0.3: dijkstrajs@1.0.3:
resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==}
dingbat-to-unicode@1.0.1:
resolution: {integrity: sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==}
dom7@3.0.0: dom7@3.0.0:
resolution: {integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==} resolution: {integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==}
duck@0.1.12:
resolution: {integrity: sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==}
dunder-proto@1.0.1: dunder-proto@1.0.1:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@ -1864,6 +1886,9 @@ packages:
resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
engines: {node: '>= 4'} engines: {node: '>= 4'}
immediate@3.0.6:
resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
immer@9.0.21: immer@9.0.21:
resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==}
@ -1925,6 +1950,9 @@ packages:
resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==}
engines: {node: '>=16'} engines: {node: '>=16'}
isarray@1.0.0:
resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
isexe@2.0.0: isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
@ -1971,6 +1999,9 @@ packages:
jsonc-parser@3.3.1: jsonc-parser@3.3.1:
resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
jszip@3.10.1:
resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==}
keyv@4.5.4: keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
@ -1981,6 +2012,9 @@ packages:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
lie@3.3.0:
resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
local-pkg@1.1.2: local-pkg@1.1.2:
resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==}
engines: {node: '>=14'} engines: {node: '>=14'}
@ -2028,6 +2062,9 @@ packages:
lodash@4.18.1: lodash@4.18.1:
resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==}
lop@0.4.2:
resolution: {integrity: sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw==}
lru-cache@10.4.3: lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
@ -2041,6 +2078,11 @@ packages:
magic-string@0.30.21: magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
mammoth@1.12.0:
resolution: {integrity: sha512-cwnK1RIcRdDMi2HRx2EXGYlxqIEh0Oo3bLhorgnsVJi2UkbX1+jKxuBNR9PC5+JaX7EkmJxFPmo6mjLpqShI2w==}
engines: {node: '>=12.0.0'}
hasBin: true
math-intrinsics@1.1.0: math-intrinsics@1.1.0:
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@ -2159,6 +2201,9 @@ packages:
resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==}
engines: {node: '>=18'} engines: {node: '>=18'}
option@0.2.4:
resolution: {integrity: sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==}
optionator@0.9.4: optionator@0.9.4:
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
@ -2193,6 +2238,9 @@ packages:
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
engines: {node: '>=6'} engines: {node: '>=6'}
pako@1.0.11:
resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
path-browserify@1.0.1: path-browserify@1.0.1:
resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
@ -2200,6 +2248,10 @@ packages:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'} engines: {node: '>=8'}
path-is-absolute@1.0.1:
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
engines: {node: '>=0.10.0'}
path-key@3.1.1: path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -2301,6 +2353,9 @@ packages:
resolution: {integrity: sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==} resolution: {integrity: sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==}
engines: {node: ^18.17.0 || >=20.5.0} engines: {node: ^18.17.0 || >=20.5.0}
readable-stream@2.3.8:
resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
readable-stream@3.6.2: readable-stream@3.6.2:
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
engines: {node: '>= 6'} engines: {node: '>= 6'}
@ -2343,6 +2398,9 @@ packages:
run-parallel@1.2.0: run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
safe-buffer@5.1.2:
resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
safe-buffer@5.2.1: safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
@ -2372,6 +2430,9 @@ packages:
set-blocking@2.0.0: set-blocking@2.0.0:
resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
setimmediate@1.0.5:
resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
shebang-command@2.0.0: shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -2423,6 +2484,9 @@ packages:
resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
engines: {node: '>= 10.x'} engines: {node: '>= 10.x'}
sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
ssf@0.11.2: ssf@0.11.2:
resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==}
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
@ -2434,6 +2498,9 @@ packages:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'} engines: {node: '>=8'}
string_decoder@1.1.1:
resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
string_decoder@1.3.0: string_decoder@1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
@ -2500,6 +2567,9 @@ packages:
ufo@1.6.3: ufo@1.6.3:
resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==}
underscore@1.13.8:
resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==}
undici-types@7.16.0: undici-types@7.16.0:
resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
@ -2748,6 +2818,10 @@ packages:
resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
engines: {node: '>=12'} engines: {node: '>=12'}
xmlbuilder@10.1.1:
resolution: {integrity: sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==}
engines: {node: '>=4.0'}
y18n@4.0.3: y18n@4.0.3:
resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
@ -3889,6 +3963,8 @@ snapshots:
slate: 0.72.8 slate: 0.72.8
snabbdom: 3.6.3 snabbdom: 3.6.3
'@xmldom/xmldom@0.8.13': {}
abort-controller@3.0.0: abort-controller@3.0.0:
dependencies: dependencies:
event-target-shim: 5.0.1 event-target-shim: 5.0.1
@ -3920,6 +3996,10 @@ snapshots:
ansis@4.2.0: {} ansis@4.2.0: {}
argparse@1.0.10:
dependencies:
sprintf-js: 1.0.3
ast-kit@2.2.0: ast-kit@2.2.0:
dependencies: dependencies:
'@babel/parser': 7.29.0 '@babel/parser': 7.29.0
@ -3957,6 +4037,8 @@ snapshots:
inherits: 2.0.4 inherits: 2.0.4
readable-stream: 4.7.0 readable-stream: 4.7.0
bluebird@3.4.7: {}
boolbase@1.0.0: {} boolbase@1.0.0: {}
brace-expansion@5.0.3: brace-expansion@5.0.3:
@ -4054,6 +4136,8 @@ snapshots:
dependencies: dependencies:
is-what: 5.5.0 is-what: 5.5.0
core-util-is@1.0.3: {}
crc-32@1.2.2: {} crc-32@1.2.2: {}
cross-spawn@7.0.6: cross-spawn@7.0.6:
@ -4099,10 +4183,16 @@ snapshots:
dijkstrajs@1.0.3: {} dijkstrajs@1.0.3: {}
dingbat-to-unicode@1.0.1: {}
dom7@3.0.0: dom7@3.0.0:
dependencies: dependencies:
ssr-window: 3.0.0 ssr-window: 3.0.0
duck@0.1.12:
dependencies:
underscore: 1.13.8
dunder-proto@1.0.1: dunder-proto@1.0.1:
dependencies: dependencies:
call-bind-apply-helpers: 1.0.2 call-bind-apply-helpers: 1.0.2
@ -4453,6 +4543,8 @@ snapshots:
ignore@7.0.5: {} ignore@7.0.5: {}
immediate@3.0.6: {}
immer@9.0.21: {} immer@9.0.21: {}
immutable@5.1.4: {} immutable@5.1.4: {}
@ -4491,6 +4583,8 @@ snapshots:
dependencies: dependencies:
is-inside-container: 1.0.0 is-inside-container: 1.0.0
isarray@1.0.0: {}
isexe@2.0.0: {} isexe@2.0.0: {}
isexe@3.1.5: {} isexe@3.1.5: {}
@ -4517,6 +4611,13 @@ snapshots:
jsonc-parser@3.3.1: {} jsonc-parser@3.3.1: {}
jszip@3.10.1:
dependencies:
lie: 3.3.0
pako: 1.0.11
readable-stream: 2.3.8
setimmediate: 1.0.5
keyv@4.5.4: keyv@4.5.4:
dependencies: dependencies:
json-buffer: 3.0.1 json-buffer: 3.0.1
@ -4528,6 +4629,10 @@ snapshots:
prelude-ls: 1.2.1 prelude-ls: 1.2.1
type-check: 0.4.0 type-check: 0.4.0
lie@3.3.0:
dependencies:
immediate: 3.0.6
local-pkg@1.1.2: local-pkg@1.1.2:
dependencies: dependencies:
mlly: 1.8.0 mlly: 1.8.0
@ -4566,6 +4671,12 @@ snapshots:
lodash@4.18.1: {} lodash@4.18.1: {}
lop@0.4.2:
dependencies:
duck: 0.1.12
option: 0.2.4
underscore: 1.13.8
lru-cache@10.4.3: {} lru-cache@10.4.3: {}
lru-cache@5.1.1: lru-cache@5.1.1:
@ -4580,6 +4691,19 @@ snapshots:
dependencies: dependencies:
'@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/sourcemap-codec': 1.5.5
mammoth@1.12.0:
dependencies:
'@xmldom/xmldom': 0.8.13
argparse: 1.0.10
base64-js: 1.5.1
bluebird: 3.4.7
dingbat-to-unicode: 1.0.1
jszip: 3.10.1
lop: 0.4.2
path-is-absolute: 1.0.1
underscore: 1.13.8
xmlbuilder: 10.1.1
math-intrinsics@1.1.0: {} math-intrinsics@1.1.0: {}
memoize-one@6.0.0: {} memoize-one@6.0.0: {}
@ -4709,6 +4833,8 @@ snapshots:
is-inside-container: 1.0.0 is-inside-container: 1.0.0
wsl-utils: 0.1.0 wsl-utils: 0.1.0
option@0.2.4: {}
optionator@0.9.4: optionator@0.9.4:
dependencies: dependencies:
deep-is: 0.1.4 deep-is: 0.1.4
@ -4758,10 +4884,14 @@ snapshots:
p-try@2.2.0: {} p-try@2.2.0: {}
pako@1.0.11: {}
path-browserify@1.0.1: {} path-browserify@1.0.1: {}
path-exists@4.0.0: {} path-exists@4.0.0: {}
path-is-absolute@1.0.1: {}
path-key@3.1.1: {} path-key@3.1.1: {}
pathe@2.0.3: {} pathe@2.0.3: {}
@ -4841,6 +4971,16 @@ snapshots:
json-parse-even-better-errors: 4.0.0 json-parse-even-better-errors: 4.0.0
npm-normalize-package-bin: 4.0.0 npm-normalize-package-bin: 4.0.0
readable-stream@2.3.8:
dependencies:
core-util-is: 1.0.3
inherits: 2.0.4
isarray: 1.0.0
process-nextick-args: 2.0.1
safe-buffer: 5.1.2
string_decoder: 1.1.1
util-deprecate: 1.0.2
readable-stream@3.6.2: readable-stream@3.6.2:
dependencies: dependencies:
inherits: 2.0.4 inherits: 2.0.4
@ -4904,6 +5044,8 @@ snapshots:
dependencies: dependencies:
queue-microtask: 1.2.3 queue-microtask: 1.2.3
safe-buffer@5.1.2: {}
safe-buffer@5.2.1: {} safe-buffer@5.2.1: {}
sass@1.97.3: sass@1.97.3:
@ -4928,6 +5070,8 @@ snapshots:
set-blocking@2.0.0: {} set-blocking@2.0.0: {}
setimmediate@1.0.5: {}
shebang-command@2.0.0: shebang-command@2.0.0:
dependencies: dependencies:
shebang-regex: 3.0.0 shebang-regex: 3.0.0
@ -4970,6 +5114,8 @@ snapshots:
split2@4.2.0: {} split2@4.2.0: {}
sprintf-js@1.0.3: {}
ssf@0.11.2: ssf@0.11.2:
dependencies: dependencies:
frac: 1.1.2 frac: 1.1.2
@ -4982,6 +5128,10 @@ snapshots:
is-fullwidth-code-point: 3.0.0 is-fullwidth-code-point: 3.0.0
strip-ansi: 6.0.1 strip-ansi: 6.0.1
string_decoder@1.1.1:
dependencies:
safe-buffer: 5.1.2
string_decoder@1.3.0: string_decoder@1.3.0:
dependencies: dependencies:
safe-buffer: 5.2.1 safe-buffer: 5.2.1
@ -5042,6 +5192,8 @@ snapshots:
ufo@1.6.3: {} ufo@1.6.3: {}
underscore@1.13.8: {}
undici-types@7.16.0: {} undici-types@7.16.0: {}
unimport@5.7.0: unimport@5.7.0:
@ -5324,6 +5476,8 @@ snapshots:
xml-name-validator@4.0.0: {} xml-name-validator@4.0.0: {}
xmlbuilder@10.1.1: {}
y18n@4.0.3: {} y18n@4.0.3: {}
yallist@3.1.1: {} yallist@3.1.1: {}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -452,6 +452,7 @@ const handleSubmit = async () => {
<style scoped lang="scss"> <style scoped lang="scss">
.transfer { .transfer {
overflow-y: scroll;
.title { .title {
margin-bottom: 10px; margin-bottom: 10px;
font-size: 38px; font-size: 38px;

View File

@ -21,7 +21,7 @@
:columns="tableColumns" :columns="tableColumns"
row-key="id" row-key="id"
:loading="loading" :loading="loading"
:show-selection="true" :show-selection="false"
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
<!-- 操作列驳回/通过按钮 --> <!-- 操作列驳回/通过按钮 -->

View File

@ -4,8 +4,8 @@ export const search = [
prop: 'accountName', prop: 'accountName',
label: '账号名称', label: '账号名称',
type: 'input' as const, type: 'input' as const,
placeholder: '请输入账号名称', placeholder: '请输入账号',
width: '220px', width: '240px',
}, },
// 开始时间 // 开始时间
{ {

View File

@ -1,4 +1,5 @@
<template> <template>
<div class="login-wrapper">
<div class="user-card"> <div class="user-card">
<UserHeader /> <UserHeader />
<UserText :user-text="userText" @back="handleBack" /> <UserText :user-text="userText" @back="handleBack" />
@ -44,6 +45,7 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
</div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
@ -255,4 +257,14 @@ onUnmounted(() => {
} }
} }
} }
.login-wrapper {
min-height: 100vh;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
background: radial-gradient(ellipse at center, #f0f7ff 0%, #e8f4fd 40%, #f5f9ff 100%);
}
</style> </style>

View File

@ -205,13 +205,13 @@ function handleForgotPassword() {
transform: translateX(-50%); transform: translateX(-50%);
width: 0; width: 0;
height: 3px; height: 3px;
background: #1e40af; background: var(--el-color-primary);
border-radius: 3px; border-radius: 3px;
transition: width 0.25s ease; transition: width 0.25s ease;
} }
&.active { &.active {
color: #1e40af; color: var(--el-color-primary);
font-weight: 600; font-weight: 600;
&::after { &::after {
@ -243,7 +243,7 @@ function handleForgotPassword() {
} }
&.is-focus { &.is-focus {
border-color: #1e40af; border-color: var(--el-color-primary);
background: #ffffff; background: #ffffff;
box-shadow: 0 0 0 3px rgba(30, 64, 175, 0.08); box-shadow: 0 0 0 3px rgba(30, 64, 175, 0.08);
} }
@ -283,7 +283,7 @@ function handleForgotPassword() {
} }
:deep(.el-select.is-focus .el-input__wrapper) { :deep(.el-select.is-focus .el-input__wrapper) {
border-color: #1e40af !important; border-color: var(--el-color-primary) !important;
background: #ffffff; background: #ffffff;
box-shadow: 0 0 0 3px rgba(30, 64, 175, 0.08) !important; box-shadow: 0 0 0 3px rgba(30, 64, 175, 0.08) !important;
} }
@ -297,13 +297,13 @@ function handleForgotPassword() {
letter-spacing: 3px; letter-spacing: 3px;
border-radius: 10px; border-radius: 10px;
margin-top: 16px; margin-top: 16px;
background: linear-gradient(135deg, #1e40af 0%, #2563eb 100%); background: linear-gradient(135deg, var(--el-color-primary) 0%, #2563eb 100%);
border: none; border: none;
box-shadow: 0 4px 14px rgba(30, 64, 175, 0.25); box-shadow: 0 4px 14px rgba(30, 64, 175, 0.25);
transition: all 0.25s ease; transition: all 0.25s ease;
&:hover { &:hover {
background: linear-gradient(135deg, #1e3a8a 0%, #1e40af 100%); background: linear-gradient(135deg, #1e3a8a 0%, var(--el-color-primary) 100%);
transform: scale(1.01); transform: scale(1.01);
box-shadow: 0 6px 18px rgba(30, 64, 175, 0.32); box-shadow: 0 6px 18px rgba(30, 64, 175, 0.32);
} }
@ -321,7 +321,7 @@ function handleForgotPassword() {
.link { .link {
font-size: 14px; font-size: 14px;
color: #1e40af; color: var(--el-color-primary);
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: all 0.2s ease;

View File

@ -1,108 +1,80 @@
<template> <template>
<div class="user-card"> <div class="login-wrapper">
<UserHeader /> <div class="user-card ">
<UserText :user-text="userText" /> <UserHeader />
<UserTabs v-model="activeTab" :tab-list="tabList" /> <UserText :user-text="userText" />
<UserTabs v-model="activeTab" :tab-list="tabList" />
<el-form class="user-form" ref="registerFormRef" :model="registerForm" :rules="registerRules"> <el-form class="user-form" ref="registerFormRef" :model="registerForm" :rules="registerRules">
<Transition name="form-switch" mode="out-in"> <Transition name="form-switch" mode="out-in">
<el-form-item <el-form-item class="captcha-item" v-if="activeTab === 'email'" key="form-email-item" prop="email">
class="captcha-item" <el-input v-model="registerForm.email" placeholder="请输入邮箱" clearable size="large" />
v-if="activeTab === 'email'" <el-button type="primary" class="captcha-btn" @click="handleSendCode" :disabled="emailIsCounting">{{
key="form-email-item" emailIsCounting ? `${emailCountdown}s后重新获取` : '发送验证码' }}</el-button>
prop="email" </el-form-item>
>
<el-input v-model="registerForm.email" placeholder="请输入邮箱" clearable size="large" /> <el-form-item class="phone-item captcha-item" prop="phone" v-else-if="activeTab === 'phone'"
<el-button key="form-phone-item">
type="primary" <el-select v-model="registerForm.countryCode" :teleported="false" value-key="code" placeholder="国家"
class="captcha-btn" size="large">
@click="handleSendCode" <el-option v-for="item in countryOptions" :key="item.code" :label="item.code" :value="item.code">
:disabled="emailIsCounting" <div class="country-option">
>{{ emailIsCounting ? `${emailCountdown}s后重新获取` : '发送验证码' }}</el-button <span class="country-name">{{ item.name }}</span>
> <span class="country-code">{{ item.code }}</span>
</div>
</el-option>
</el-select>
<el-input v-model="registerForm.phone" placeholder="请输入手机号" clearable size="large" />
<el-button type="primary" class="captcha-btn" @click="handleSendCode" :disabled="phoneIsCounting">{{
phoneIsCounting ? `${phoneCountdown}s后重新获取` : '发送验证码' }}</el-button>
</el-form-item>
</Transition>
<UserCaptcha v-model="registerForm.code" />
<el-form-item label="设置密码(6-12位密码)" label-position="top" prop="password">
<el-input placeholder="请输入密码" clearable show-password size="large" type="password"
v-model="registerForm.password" />
</el-form-item> </el-form-item>
<el-form-item label="邀请链接/邀请码(选填)" label-position="top" prop="inviteCode">
<el-form-item <el-input placeholder="请输入邀请链接/邀请码" clearable size="large" type="text" v-model="registerForm.inviteCode" />
class="phone-item captcha-item"
prop="phone"
v-else-if="activeTab === 'phone'"
key="form-phone-item"
>
<el-select
v-model="registerForm.countryCode"
:teleported="false"
value-key="code"
placeholder="国家"
size="large"
>
<el-option
v-for="item in countryOptions"
:key="item.code"
:label="item.code"
:value="item.code"
>
<div class="country-option">
<span class="country-name">{{ item.name }}</span>
<span class="country-code">{{ item.code }}</span>
</div>
</el-option>
</el-select>
<el-input
v-model="registerForm.phone"
placeholder="请输入手机号"
clearable
size="large"
/>
<el-button
type="primary"
class="captcha-btn"
@click="handleSendCode"
:disabled="phoneIsCounting"
>{{ phoneIsCounting ? `${phoneCountdown}s后重新获取` : '发送验证码' }}</el-button
>
</el-form-item> </el-form-item>
</Transition> <el-form-item prop="agreeAgreement">
<div style="display: flex;align-items: center; justify-content: flex-start;">
<el-checkbox v-model="registerForm.agreeAgreement"></el-checkbox>
<div style="font-size: 13px;display: flex;flex-wrap: wrap;margin-left: 8px;line-height: 17px;">
我已阅读并同意
<span class="doc-link" @click="openDoc('服务条款.docx', '服务条款')">服务条款</span>
<span class="doc-link" @click="openDoc('隐私协议.docx', '隐私协议')">隐私协议</span>
<span class="doc-link" @click="openDoc('风险提示.docx', '风险提示')">风险提示</span>
</div>
</div>
</el-form-item>
<el-form-item class="form-submit">
<el-button type="primary" class="form-btn" @click="handleRegister" :loading="buttonLoading">注册</el-button>
</el-form-item>
<router-link to="/user/login" class="to-login">已有账号立即登录</router-link>
</el-form>
</div>
<UserCaptcha v-model="registerForm.code" /> <!-- 协议预览弹窗 -->
<el-form-item <el-dialog v-model="dialogVisible" :title="dialogTitle" width="70%" top="3vh">
label="设置密码(6-12位密码)" <div class="doc-preview" v-html="docHtml"></div>
label-position="top" <template #footer>
prop="password" <div class="dialog-footer">
> <el-button @click="dialogVisible = false">关闭</el-button>
<el-input <el-button type="primary" @click="downloadCurrentDoc">下载文档</el-button>
placeholder="请输入密码" </div>
clearable </template>
show-password </el-dialog>
size="large"
type="password"
v-model="registerForm.password"
/>
</el-form-item>
<el-form-item label="邀请链接/邀请码(选填)" label-position="top" prop="inviteCode">
<el-input
placeholder="请输入邀请链接/邀请码"
clearable
size="large"
type="text"
v-model="registerForm.inviteCode"
/>
</el-form-item>
<el-form-item prop="agreeAgreement">
<el-checkbox v-model="registerForm.agreeAgreement"
>我已阅读并同意 隐私条例 退款政策 AMLCTF政策<br />
执行政策 网站条款和条件</el-checkbox
>
</el-form-item>
<el-form-item class="form-submit">
<el-button type="primary" class="form-btn" @click="handleRegister" :loading="buttonLoading">注册</el-button>
</el-form-item>
<router-link to="/user/login" class="to-login">已有账号立即登录</router-link>
</el-form>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import mammoth from 'mammoth'
import { ref, onUnmounted, onMounted } from 'vue'
import termFile from '@/assets/file/服务条款.docx?url'
import privacyFile from '@/assets/file/隐私协议.docx?url'
import riskFile from '@/assets/file/风险提示.docx?url'
defineOptions({ defineOptions({
name: 'Register' name: 'Register'
}) })
@ -130,6 +102,12 @@ import { useRoute } from 'vue-router'
const userStore = useUserStore() const userStore = useUserStore()
const route = useRoute() const route = useRoute()
//
const dialogVisible = ref(false)
const dialogTitle = ref('')
const docHtml = ref('')
let currentDocName = ref('')
// loading // loading
const { buttonLoading, startButtonLoading, stopButtonLoading } = useButtonLoading() const { buttonLoading, startButtonLoading, stopButtonLoading } = useButtonLoading()
@ -185,6 +163,39 @@ const { isCounting: emailIsCounting, countdown: emailCountdown } = emailCaptchaS
// //
const { isCounting: phoneIsCounting, countdown: phoneCountdown } = phoneCaptchaState const { isCounting: phoneIsCounting, countdown: phoneCountdown } = phoneCaptchaState
const fileMap: Record<string, string> = {
'服务条款.docx': termFile,
'隐私协议.docx': privacyFile,
'风险提示.docx': riskFile,
}
// docx
async function openDoc(fileName: string, title: string) {
dialogTitle.value = title
dialogVisible.value = true
docHtml.value = '加载中...'
const url = fileMap[fileName]
try {
const res = await fetch(url)
const buf = await res.arrayBuffer()
const ret = await mammoth.convertToHtml({ arrayBuffer: buf })
docHtml.value = ret.value
} catch {
docHtml.value = '加载失败,请下载查看'
}
}
//
function downloadCurrentDoc() {
const url = fileMap[currentDocName.value]
const a = document.createElement('a')
a.href = url
a.download = currentDocName.value
a.click()
}
// //
// //
@ -229,13 +240,13 @@ const handleSendCode = async () => {
// //
const handleRegister = async () => { const handleRegister = async () => {
if (!registerFormRef.value) return if (!registerFormRef.value) return
// //
if (!registerForm.value.agreeAgreement) { if (!registerForm.value.agreeAgreement) {
ElMessage.error('请勾选同意注册协议') ElMessage.error('请勾选同意注册协议')
return return
} }
try { try {
// //
await registerFormRef.value.validate() await registerFormRef.value.validate()
@ -275,6 +286,27 @@ onMounted(() => {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.login-wrapper {
min-height: 100vh;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
background: radial-gradient(ellipse at center, #f0f7ff 0%, #e8f4fd 40%, #f5f9ff 100%);
}
a {
text-decoration: none;
color: var(--el-color-primary);
margin: 0 4px;
}
.doc-link {
color: var(--el-color-primary);
cursor: pointer;
margin: 0 4px;
}
.user-form { .user-form {
.phone-item, .phone-item,
.captcha-item { .captcha-item {
@ -300,3 +332,28 @@ onMounted(() => {
} }
} }
</style> </style>
<style lang="scss">
/* 弹窗预览全局样式不要scoped */
.doc-preview {
max-height: 65vh;
overflow-y: auto;
line-height: 1.8;
font-size: 15px;
padding: 10px;
h1, h2, h3, h4 {
margin: 16px 0 8px;
}
p {
margin: 8px 0;
}
table {
border-collapse: collapse;
width: 100%;
margin: 12px 0;
td, th {
border: 1px solid #ccc;
padding: 6px 10px;
}
}
}
</style>