front/src/views/login/index.vue
2026-01-24 11:55:01 +08:00

1006 lines
35 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="login-container">
<!-- 几何图形装饰 -->
<div class="geometric-shape hexagon-1"></div>
<div class="geometric-shape hexagon-2"></div>
<div class="geometric-shape circle-1"></div>
<div class="geometric-shape circle-2"></div>
<!-- 小行星 -->
<div class="asteroid asteroid-1"></div>
<div class="asteroid asteroid-2"></div>
<div class="asteroid asteroid-3"></div>
<div class="asteroid asteroid-4"></div>
<div class="asteroid asteroid-5"></div>
<!-- 月亮 -->
<div class="moon">
<svg viewBox="0 0 1024 1024" width="120" height="120">
<circle cx="512" cy="512" r="400" fill="#FFF394" opacity="0.9"/>
<circle cx="400" cy="400" r="80" fill="#002770" opacity="0.3"/>
<circle cx="550" cy="450" r="60" fill="#002770" opacity="0.2"/>
<circle cx="480" cy="580" r="50" fill="#002770" opacity="0.25"/>
</svg>
</div>
<!-- 流星 -->
<div class="meteor meteor-1"></div>
<div class="meteor meteor-2"></div>
<div class="meteor meteor-3"></div>
<!-- 连接线 -->
<svg class="connection-lines" width="100%" height="100%">
<defs>
<linearGradient id="lineGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#FFF394;stop-opacity:0.6" />
<stop offset="100%" style="stop-color:#FFF394;stop-opacity:0.2" />
</linearGradient>
</defs>
<line x1="10%" y1="20%" x2="30%" y2="40%" class="connection-line" />
<line x1="70%" y1="15%" x2="85%" y2="35%" class="connection-line" />
<line x1="20%" y1="60%" x2="40%" y2="80%" class="connection-line" />
<line x1="60%" y1="70%" x2="80%" y2="85%" class="connection-line" />
</svg>
<!-- 光点粒子 -->
<div class="particle particle-1"></div>
<div class="particle particle-2"></div>
<div class="particle particle-3"></div>
<div class="particle particle-4"></div>
<div class="particle particle-5"></div>
<!-- 地球轨道 -->
<div class="earth-orbit orbit-1"></div>
<div class="earth-orbit orbit-2"></div>
<!-- 地球 -->
<div class="earth">
<svg viewBox="0 0 1040 1024" width="300" height="300">
<path d="M518.24 427.728c3.904-5.84 10-9.648 14.864-14.832-0.64 0.656-1.296 1.312-1.952 2.016 4.864-4.96 17.76-10.672 19.952-17.568 1.28-3.68-4.384-8.576-1.376-13.776 2.256-4.064 7.696-2.464 9.888-5.056 3.072-3.776 3.488-10.08 6.72-14.032 3.328-4.096 9.744-4.64 13.136-7.712 7.792-7.264 9.904-15.376 19.056-19.776 8.688-5.856 17.76-15.952 28.704-11.392-3.968 4.592-13.936 7.376-16.864 11.648-1.936 2.944 14.928 1.28 17.12 0.448 9.568-3.52 17.104-10.72 25.12-16.032 13.792-9.2 29.76-9.696 46.464-6.32 5.12 1.056-9.232-19.856-10.784-21.584-5.76-6.72-7.2-12.72-16.608-3.984-2.688 2.56-5.52 11.12-7.472 14.656-5.92 10.832-4.528 9.472-17.44 16.112 0.656-0.24 1.312-0.688 2.032-1.024-9.472 1.856-18.48 6-22.288-5.776-1.216-3.936 4.208-9.76 1.216-13.712-6.72-8.64-29.024 9.76-36.8 12.688 4.032-32.416 41.92-15.36 62.096-21.824 5.52-1.76 26.112-9.76 27.328-15.056 1.696-7.792-16.384-20.48-20.512-24.08-8.928-7.68-13.632-12.032-18.656-23.968-5.28-12.672-8.752-25.392-22.048-16.032-4.96 3.52-1.376 11.072-9.984 12.256-5.344 0.736-10.864-6.144-13.936-9.44-4.64-4.832-9.568-16.768-18-17.872-7.296-0.912-27.744-11.776-37.312-4.72-7.296 5.376 0.976 25.808 3.248 33.184 4.704 15.712 7.712 16.32-5.44 26.128-6.48 4.896-10.368-0.32-8.096 12.768 1.28 6.72 8.512 8.08 3.328 13.952-3.168 3.52-10.72 3.2-14.352 1.504-11.52-5.44-1.216-12.752-6.816-20.464-4.048-5.824-26.192-10.496-33.728-14.032-16.704-7.68-60.736-15.712-47.12-41.92 3.648-7.136 17.44-17.568 23.6-21.712 6.48-4.176 14.512-5.28 19.872-11.072 2.992-3.28 3.232-12.272 5.92-14.432 3.808-3.2 14.912-1.76 20.912-1.52h-0.16 1.376-1.216c25.632-5.216 2.272-42.96 36.08-36.16 9.328 1.936 18.72 11.536 26.352 16.832 8.768 6.032 11.52 5.28 8.848 14.448-0.64 2.16-10.304 11.68-12.736 13.6-4.544 3.536-11.84 5.136-17.12 7.312 17.68 0 25.072-0.864 39.424 8.816 12.4 8.336 20.112 13.872 35.264 13.216-0.96-7.424-13.952-4.544-13.376-11.936 0.4-6.24 8.192 2.016 9.168 2.016 4.288 0.24 15.232 5.28 12.8-6.656-2.096-10.496-24.72-5.44-17.44-22.592 10.144-1.072 7.392 10.16 14.128 12.592 7.2 2.624 16.544-6.192 18.08-12.224-10.064-5.264-40.704-13.632-37.376-28.272 20.512 13.216 41.024 26.384 61.536 39.68-16.624 15.008 12.16 6.56 13.872 6.96 4.944 1.28 17.264 12.112 9.152 14.112-8.512 2.096-12.8-10.24-21.408-0.976 7.136 1.888 32.272 3.312 25.552 17.024-2.688 5.44-18.816 4.544-23.68 15.296 3.488-0.64 7.216 0.32 10.704-0.48-7.712 12.048 3.728 20.128 10.048 29.904 7.056 10.992 17.04 27.968 31.216 31.424 30.176 7.456 26.528-42.016 49.472-49.92 6.24-2.192 13.12-0.592 19.536-2.352 7.136-2.016 10.88-7.216 16.544-11.2 13.952-9.728 26.032-9.728 43.376-10.208h1.296c-62.272-66.304-144.08-113.52-236.032-131.936-10.08 3.44-19.712 8.16-28.64 14.032 4.72 0.768 9.344 1.44 13.952 2.176-6.64 20.512-41.664 6.72-56.112 6.8 11.44-4.512 28.32-10.4 37.872-17.552 5.024-3.68-0.08-6.112 6.816-9.808a434.368 434.368 0 0 0-153.408 5.616h1.616c-6.656 3.856-19.536 16.544-12 24.544 7.376 7.632 16.048-4.192 23.52-8 17.104-8.656 39.888-9.568 58.864-13.264-3.328 8.992-30.4 5.792-39.904 9.232-11.904 4.4-6.64 7.472-14.912 20.928 3.568-0.416 7.376 1.68 11.04 1.6v2.416c-8.208-0.64-16.064-4.592-17.76 5.216-10.464-15.888-17.28-14.608-28.48-0.576 11.04 6.24 21.904 13.952 13.152 24.608-10.624 12.96-16.96-2.944-6.08-9.68-9.904-4.592-17.6-12.432-25.392-2.416 3.328-0.32 6.896 1.44 10.224 1.344-1.792 2.8-3.728 11.696-5.52 12.688-4.288 2.416-19.952-2.832-24.56-3.456-11.68-1.504-23.2-1.104-35.2-0.48 2.192 14.688-14.192 0.56-20.032-3.04 10.784-10.992 23.76-6.816 36.256-5.12 10.464 1.44 25.856 1.344 27.072-12.032-11.36-2.336-16.864-1.68-22.784-10.416a26.896 26.896 0 0 1-4.288-10.672 448.96 448.96 0 0 0-179.6 135.952 392.144 392.144 0 0 1 25.936 19.904c7.552 6.48 11.2 14.272 15.904 22.272 0.24 0.416 4.448 6.976 6.08 9.568 5.024 5.248 9.232 11.04 10.288 18.08 1.376 8.416-1.696 15.472-2.512 24.288-2.352 26.96 1.456 52.272 22.304 71.264 5.664 5.168 13.28 7.952 18.976 13.488 6 5.712 5.264 9.68 8.912 15.712 9.568 15.968 22.224 31.024 33.248 46.112 9.568 13.216 13.616 10.72 4.208-2.992-6.4-9.232-14.432-18.416-19.776-28.304-0.48-1.12-5.92-14.16-4.144-13.696 14.848 3.2 17.92 13.408 27.568 25.504 9.488 11.856 17.6 18.512 23.12 32.784 6.48 16.656 16.368 24.784 32.592 32.08 7.952 3.616 21.008 13.216 29.52 14.32 9.968 1.312 15.408-5.216 24.8-0.608 6.4 3.04 11.28 12.88 19.056 15.2 7.552 2.192 12.576-0.688 19.632 4.112 8.352 5.824 11.36 15.712 19.2 21.792 5.696 4.336 13.792 9.792 21.008 10.992 5.2 0.816 10.88-3.12 16.064-1.36 9.248 3.04 11.264 14.48 8.512 23.552-3.168 10.128-12.576 16.528-16.304 26.624-3.392 9.152-1.28 16.976-2.432 25.728-1.216 8.976-8.352-0.128-1.216 15.168 3.408 7.136 8.272 13.616 12.48 20.192 8.528 12.912 14.528 24.288 25.952 34.784 7.952 7.392 25.552 16.048 29.52 26.96 3.488 9.84 0.576 31.248-1.216 41.6-3.728 21.488-3.168 47.456-9.088 67.44-5.664 19.44-12.32 25.216-7.456 46.48 2.112 9.136 3.728 4.704 0 16.368-1.056 3.36 0 4.72-1.28 8.16-2.688 7.216-9.088 11.52-11.84 18.992 10.128 0.48 9.392 4.016 6.24 8.048a423.6 423.6 0 0 0 50.272-6.976c-2.928-2.992-6-6.192-6-8.288 0-2.384 9.152-14.192 10.368-17.152 1.872-4.72 3.328-14.88 6.16-18.496 4.8-6.192 15.248-3.952 13.312-15.472 23.264-0.24 33.312-3.84 37.12-27.888-4.128-2.096-3.312-0.832-3.968-4.512 0.8 4.336 17.52-1.76 19.136 1.28 1.136 2.32 22.304-26.928 24.64-29.344 6.016-6.4 11.2-11.248 15.008-18.992 1.552-3.04 3.088-12.272 6.336-16.704-0.24 0.736-0.48 1.472-0.8 2.256 7.52-12.016 17.088-10.576 27.952-15.472 10.88-4.88 3.088-3.52 10.96-11.152 9.488-9.12 11.584-3.904 14.272-18.752 2.016-10.912-0.576-20.912 2.912-30.848 4.384-12.512 15.008-16.528 22.048-27.2 5.44-8.08 10.464-21.248 3.168-29.408-6.08-6.816-24.08-12.352-32.272-14.368-9.648-2.288-20.672-2.544-29.76-6.24-10.624-4.336-19.376-15.696-24.8 1.936-1.712-1.232-9.008-5.376-9.008-7.376 0 3.936 10.208-3.456 11.68-5.12-4.304 0.32-18.976 3.632-21.52 2.24v-0.08h-0.128c1.216-4.352 8.592-14.192 8.752-16.128 0.8-10.912-14.832-23.424-23.36-25.888-11.584-3.36-18.24-1.84-28.208-9.216-12-8.992-23.84-18.912-39.168-20.592-3.248-0.32-6.72 1.44-10.128 0.944-8.272-1.28-11.04-6.656-17.92-8.416-8.608-2.176-11.84 5.2-16.88 5.2-7.456 0-9.312-7.952-20.272-1.28-16.288 9.952-7.36 16.064-25.856 11.376-9.808-2.544-20.752 3.52-30.16-3.04-8.432-5.856-10.4-22.272-2.192-29.168-4.144 3.456-3.968-7.632-7.056-9.632-4.8-3.2-12.64 0.48-18.24-0.736-7.472-1.888-11.84-2.624-10.144-10.016 1.872-8 22.784-29.744 1.296-29.168-11.6 0.32-15.328 17.808-27.728 20.352-13.872 2.912-25.872-1.92-33.088-14.4-15.072-25.84 8.768-57.76 33.088-60.064 18.976-1.76 46.784-15.952 60.736 5.28 4.048 6.24 14.032 30.08 19.136 14.656 1.6-4.672-3.872-24.848-5.712-33.552 0.16-0.08 0.288-0.16 0.288-0.24a67.52 67.52 0 0 0-0.112-0.352zM519.888 1024c-282.768 0-512-229.232-512-512 0-282.768 229.232-512 512-512 282.768 0 512 229.232 512 512 0 282.768-229.232 512-512 512z m410.768-640.688c-1.776 3.952 0.24 10.144 0.08 14.528-0.16 5.12-1.936 9.84 0.896 14.352 2.592 4.224 6.976 8.576 10.72 11.936 3.712 3.2 7.52 6.656 12.64 6.496 1.44-0.08 8.512-1.2 9.568-2.064 0.16-0.16 0.24-0.4 0.32-0.48a447.728 447.728 0 0 0-17.6-64.96 7.936 7.936 0 0 1-2.016 2.64c-2.432 2.256-5.44 2.912-7.712 5.872-2.112 2.624-1.616 4.704-3.328 7.792-0.8 1.52-2.752 2.128-3.568 3.888z m5.76 233.472c6.656 5.872 13.552 11.936 21.808 14.112 9.824-37.04 15.008-75.936 15.008-116.096 0-23.216-1.696-45.952-5.024-68.224-6.24 4.432-12.8 13.008-15.568 18.128-3.808 7.056-3.648 11.36-9.568 16.832-5.76 5.2-12.64 6.88-17.76 13.488-4.864 6.24-4.064 11.12-7.952 18.336-1.776 3.36-6.32 4.72-8.192 8.912-4.208 9.056 0.576 23.456 0.256 33.6-0.48 12-4.544 22.768 1.936 33.28 6.16 9.824 16.384 20 25.056 27.632z" fill="#437ACF"/>
</svg>
</div>
<!-- 飞机 -->
<div class="airplane airplane-large">
<svg viewBox="0 0 1934 1024" width="240" height="120">
<path d="M1934.185688 174.551156c0 323.805439-1612.997088 681.516016-1735.078338 681.516016-68.492928 0-146.201683-15.473486-146.201683-76.457222 0-20.479613 24.347985-50.061277 67.127621-85.673049L6.712762 499.494352a49.264847 49.264847 0 0 1 25.827068-70.995993l19.341857-7.509191c35.384221-13.653075 75.091915-11.71889 108.769501 5.46123l205.478785 105.356232c80.098043-45.965354 170.663443-93.978669 266.462522-141.536882L232.102283 138.711833a49.151072 49.151072 0 0 1 0.568878-84.193965l32.653605-20.024511A239.497698 239.497698 0 0 1 448.275977 7.414758l666.383857 170.20834C1322.414132 97.866383 1510.371471 43.367856 1621.302709 43.367856c29.581663 0 59.504654 0.682654 88.176112 2.61684l-201.155312 87.948561-4.892352 65.534762 310.607467-138.237389C1889.016763 78.296974 1934.185688 110.381702 1934.185688 174.551156zM1123.534333 733.644596l248.485973 273.402835c15.132159 16.611242 39.82147 21.617369 60.64241 12.173993l33.33626-14.904608c60.528634-27.306151 96.481733-89.313869 88.74499-153.597098l-31.174522-257.701799a25.827068 25.827068 0 0 0-34.132689-20.593389L1134.343018 693.481799a24.803087 24.803087 0 0 0-10.92246 40.162797z" fill="#FFF394"/>
</svg>
</div>
<div class="airplane airplane-small">
<svg viewBox="0 0 1934 1024" width="120" height="60">
<path d="M1934.185688 174.551156c0 323.805439-1612.997088 681.516016-1735.078338 681.516016-68.492928 0-146.201683-15.473486-146.201683-76.457222 0-20.479613 24.347985-50.061277 67.127621-85.673049L6.712762 499.494352a49.264847 49.264847 0 0 1 25.827068-70.995993l19.341857-7.509191c35.384221-13.653075 75.091915-11.71889 108.769501 5.46123l205.478785 105.356232c80.098043-45.965354 170.663443-93.978669 266.462522-141.536882L232.102283 138.711833a49.151072 49.151072 0 0 1 0.568878-84.193965l32.653605-20.024511A239.497698 239.497698 0 0 1 448.275977 7.414758l666.383857 170.20834C1322.414132 97.866383 1510.371471 43.367856 1621.302709 43.367856c29.581663 0 59.504654 0.682654 88.176112 2.61684l-201.155312 87.948561-4.892352 65.534762 310.607467-138.237389C1889.016763 78.296974 1934.185688 110.381702 1934.185688 174.551156zM1123.534333 733.644596l248.485973 273.402835c15.132159 16.611242 39.82147 21.617369 60.64241 12.173993l33.33626-14.904608c60.528634-27.306151 96.481733-89.313869 88.74499-153.597098l-31.174522-257.701799a25.827068 25.827068 0 0 0-34.132689-20.593389L1134.343018 693.481799a24.803087 24.803087 0 0 0-10.92246 40.162797z" fill="#FFF394"/>
</svg>
</div>
<!-- 白云 -->
<div class="cloud cloud-1">
<svg viewBox="0 0 1509 1024" width="200" height="140">
<path d="M1291.101636 489.364492C1415.382834 513.940479 1509.051837 623.131158 1509.051837 754.0953 1509.051837 903.168064 1387.680954 1024 1237.961454 1024H271.090384C121.316989 1024 0 903.168064 0 754.0953c0-94.639108 48.882501-177.852538 122.879935-226.034407a410.300416 410.300416 0 0 1-16.707359-116.250887C106.172576 184.374337 291.354794 0.000539 519.760569 0.000539a413.749677 413.749677 0 0 1 381.197273 251.688289c37.726296-19.186516 79.494695-29.103143 121.802041-29.103143 148.048764 0 268.126175 119.430674 268.341753 266.778807z" fill="rgba(255, 255, 255, 0.6)"/>
</svg>
</div>
<div class="cloud cloud-2">
<svg viewBox="0 0 1509 1024" width="180" height="120">
<path d="M1291.101636 489.364492C1415.382834 513.940479 1509.051837 623.131158 1509.051837 754.0953 1509.051837 903.168064 1387.680954 1024 1237.961454 1024H271.090384C121.316989 1024 0 903.168064 0 754.0953c0-94.639108 48.882501-177.852538 122.879935-226.034407a410.300416 410.300416 0 0 1-16.707359-116.250887C106.172576 184.374337 291.354794 0.000539 519.760569 0.000539a413.749677 413.749677 0 0 1 381.197273 251.688289c37.726296-19.186516 79.494695-29.103143 121.802041-29.103143 148.048764 0 268.126175 119.430674 268.341753 266.778807z" fill="rgba(255, 255, 255, 0.5)"/>
</svg>
</div>
<div class="cloud cloud-3">
<svg viewBox="0 0 1509 1024" width="190" height="130">
<path d="M1291.101636 489.364492C1415.382834 513.940479 1509.051837 623.131158 1509.051837 754.0953 1509.051837 903.168064 1387.680954 1024 1237.961454 1024H271.090384C121.316989 1024 0 903.168064 0 754.0953c0-94.639108 48.882501-177.852538 122.879935-226.034407a410.300416 410.300416 0 0 1-16.707359-116.250887C106.172576 184.374337 291.354794 0.000539 519.760569 0.000539a413.749677 413.749677 0 0 1 381.197273 251.688289c37.726296-19.186516 79.494695-29.103143 121.802041-29.103143 148.048764 0 268.126175 119.430674 268.341753 266.778807z" fill="rgba(255, 255, 255, 0.55)"/>
</svg>
</div>
<div class="cloud cloud-4">
<svg viewBox="0 0 1509 1024" width="170" height="115">
<path d="M1291.101636 489.364492C1415.382834 513.940479 1509.051837 623.131158 1509.051837 754.0953 1509.051837 903.168064 1387.680954 1024 1237.961454 1024H271.090384C121.316989 1024 0 903.168064 0 754.0953c0-94.639108 48.882501-177.852538 122.879935-226.034407a410.300416 410.300416 0 0 1-16.707359-116.250887C106.172576 184.374337 291.354794 0.000539 519.760569 0.000539a413.749677 413.749677 0 0 1 381.197273 251.688289c37.726296-19.186516 79.494695-29.103143 121.802041-29.103143 148.048764 0 268.126175 119.430674 268.341753 266.778807z" fill="rgba(255, 255, 255, 0.5)"/>
</svg>
</div>
<div class="login-form">
<div class="login-logo">
<img class="login-icon" :src="localLogo" alt="logo" />
<h2 class="logo-text">{{ sysName }}</h2>
<div class="language-switcher">
<SelectLang />
</div>
</div>
<a-tabs v-model:active-key="activeKey" class="login-tabs">
<a-tab-pane key="pwd" :title="$t('login.tabs.account')">
<LoginForm />
</a-tab-pane>
<a-tab-pane key="wechat" :title="$t('login.tabs.wechat')">
<WechatLogin />
</a-tab-pane>
</a-tabs>
<div class="fixed-corner">
<span class="version-text">{{ sysVersion }}</span>
</div>
</div>
<Footer />
</div>
</template>
<script lang="ts" setup>
import { ref, computed, onMounted } from 'vue';
import { useI18n } from 'vue-i18n';
import Footer from '@/components/footer/index.vue';
import LoginForm from './components/pwd-login/index.vue';
import WechatLogin from './components/wechat-login.vue';
import SelectLang from '@/components/top-nav/SelectLang.vue';
// RBAC 系统暂不使用系统配置接口
import localLogoSrc from '@/assets/logo.png';
defineOptions({
name: 'Login',
});
const { t } = useI18n();
const activeKey = ref('pwd');
// 登录参数
const sysName = computed(() => t('login.systemName'));
const sysVersion = ref('');
const sysLogo = ref('');
const localLogo = localLogoSrc;
// RBAC 系统暂不使用系统配置接口,使用默认值
onMounted(() => {
// 使用默认系统名称和版本
sysVersion.value = 'v1.0.0';
// 优化:页面加载完成后再启动动画,减少初始加载压力
// 使用 requestAnimationFrame 确保在下一帧启动动画
requestAnimationFrame(() => {
const container = document.querySelector('.login-container');
if (container) {
// 启动所有动画
const animatedElements = container.querySelectorAll('[style*="animation"], .geometric-shape, .earth, .moon, .asteroid, .meteor, .particle, .airplane, .cloud');
animatedElements.forEach((el) => {
(el as HTMLElement).style.animationPlayState = 'running';
});
}
});
});
</script>
<style lang="less" scoped>
.login-container {
height: 100vh;
min-height: 550px;
display: flex;
align-items: center;
justify-content: flex-end;
padding: 0 60px;
position: relative;
overflow: hidden;
/* 深蓝色科技背景 */
background: #0D1D3D;
/* 优化:减少动画对性能的影响 */
/* 在页面加载完成前暂停所有动画 */
animation-play-state: paused;
/* 支持用户的动画偏好设置 */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
/* 几何图形 */
.geometric-shape {
position: absolute;
z-index: 1;
opacity: 0.6;
/* 优化:只在动画时使用 will-change,减少内存占用 */
transform: translateZ(0); /* 启用硬件加速 */
&.hexagon-1 {
top: 25%;
right: 15%;
width: 120px;
height: 120px;
background: #FFF394;
clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
filter: drop-shadow(0 0 25px rgba(255, 243, 148, 0.9));
/* 优化:延迟启动动画,减少初始加载压力 */
animation: hexagonPulse 4s ease-in-out infinite;
animation-delay: 1s;
animation-play-state: paused;
}
&.hexagon-2 {
bottom: 30%;
right: 8%;
width: 80px;
height: 80px;
background: #FFF394;
clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
filter: drop-shadow(0 0 20px rgba(255, 243, 148, 0.7));
animation: hexagonPulse 5s ease-in-out infinite reverse;
animation-delay: 1.5s;
animation-play-state: paused;
opacity: 0.5;
}
&.circle-1 {
top: 50%;
left: 5%;
width: 100px;
height: 100px;
border: 3px solid #FFF394;
border-radius: 50%;
box-shadow:
0 0 30px rgba(255, 243, 148, 0.8),
inset 0 0 20px rgba(255, 243, 148, 0.3);
animation: circlePulse 3s ease-in-out infinite;
}
&.circle-2 {
bottom: 15%;
left: 25%;
width: 60px;
height: 60px;
border: 2px solid #FFF394;
border-radius: 50%;
box-shadow: 0 0 20px rgba(255, 243, 148, 0.6);
animation: circlePulse 4s ease-in-out infinite reverse;
opacity: 0.6;
}
}
/* 连接线 */
.connection-lines {
position: absolute;
top: 0;
left: 0;
z-index: 1;
pointer-events: none;
.connection-line {
stroke: url(#lineGradient);
stroke-width: 2;
stroke-dasharray: 5, 5;
animation: lineFlow 3s linear infinite;
animation-play-state: paused;
filter: drop-shadow(0 0 3px rgba(255, 243, 148, 0.8));
}
}
/* 光点粒子 - 五角星 */
.particle {
position: absolute;
width: 12px;
height: 12px;
background: #FFF394;
clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
box-shadow: 0 0 10px rgba(255, 243, 148, 1);
z-index: 2;
transform: translateZ(0);
animation-play-state: paused;
&.particle-1 {
top: 20%;
left: 20%;
animation: particleFloat 8s ease-in-out infinite;
}
&.particle-2 {
top: 40%;
right: 25%;
animation: particleFloat 10s ease-in-out infinite 2s;
}
&.particle-3 {
bottom: 30%;
left: 30%;
animation: particleFloat 12s ease-in-out infinite 4s;
}
&.particle-4 {
top: 60%;
right: 15%;
animation: particleFloat 9s ease-in-out infinite 1s;
}
&.particle-5 {
bottom: 20%;
right: 30%;
animation: particleFloat 11s ease-in-out infinite 3s;
}
}
/* 地球轨道 - 3D立体效果 */
.earth-orbit {
position: absolute;
top: 50%;
left: 40%;
transform: translate(-50%, -50%) perspective(800px) rotateX(65deg);
z-index: 1;
&::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border: 2px solid rgba(255, 243, 148, 0.5);
border-radius: 50%;
box-shadow:
0 0 25px rgba(255, 243, 148, 0.4),
inset 0 0 40px rgba(255, 243, 148, 0.15),
0 10px 30px rgba(0, 0, 0, 0.3);
}
&::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border: 1px solid rgba(255, 243, 148, 0.2);
border-radius: 50%;
filter: blur(4px);
opacity: 0.6;
}
&.orbit-1 {
width: 400px;
height: 250px;
&::before {
width: 400px;
height: 250px;
box-shadow:
0 0 20px rgba(255, 243, 148, 0.4),
inset 0 0 35px rgba(255, 243, 148, 0.15),
0 8px 25px rgba(0, 0, 0, 0.3);
}
&::after {
width: 410px;
height: 260px;
}
}
&.orbit-2 {
width: 500px;
height: 300px;
&::before {
width: 500px;
height: 300px;
box-shadow:
0 0 30px rgba(255, 243, 148, 0.4),
inset 0 0 45px rgba(255, 243, 148, 0.15),
0 12px 35px rgba(0, 0, 0, 0.3);
}
&::after {
width: 510px;
height: 310px;
}
}
}
/* 地球 */
.earth {
position: absolute;
top: 50%;
left: 40%;
transform: translate(-50%, -50%) translateZ(0);
z-index: 2;
filter: drop-shadow(0 0 30px rgba(67, 122, 207, 0.6));
/* 优化:延迟启动地球旋转动画 */
animation: earthRotate 30s linear infinite;
animation-delay: 0.5s;
animation-play-state: paused;
svg {
display: block;
}
}
/* 月亮 */
.moon {
position: absolute;
top: 15%;
right: 10%;
z-index: 3;
filter: drop-shadow(0 0 25px rgba(255, 243, 148, 0.8));
animation: moonFloat 20s ease-in-out infinite;
animation-delay: 0.8s;
animation-play-state: paused;
transform: translateZ(0);
svg {
display: block;
}
}
/* 小行星 - 五角星 */
.asteroid {
position: absolute;
z-index: 2;
width: 24px;
height: 24px;
background: #FFF394;
clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
filter: drop-shadow(0 0 8px rgba(255, 243, 148, 0.6));
opacity: 0.6;
animation: asteroidGlow 3s ease-in-out infinite;
animation-play-state: paused;
transform: translateZ(0);
&.asteroid-1 {
top: 20%;
left: 15%;
animation-delay: 0s;
}
&.asteroid-2 {
top: 35%;
right: 20%;
animation-delay: 0.6s;
}
&.asteroid-3 {
bottom: 30%;
left: 25%;
animation-delay: 1.2s;
}
&.asteroid-4 {
top: 60%;
right: 15%;
animation-delay: 1.8s;
}
&.asteroid-5 {
bottom: 20%;
right: 30%;
animation-delay: 2.4s;
}
}
/* 流星 */
.meteor {
position: absolute;
z-index: 3;
width: 3px;
height: 100px;
background: linear-gradient(to bottom, rgba(255, 255, 255, 1) 0%, rgba(255, 243, 148, 0.8) 50%, transparent 100%);
border-radius: 50%;
filter: blur(2px);
box-shadow: 0 0 10px rgba(255, 243, 148, 0.8);
animation-play-state: paused;
&.meteor-1 {
top: 10%;
left: 20%;
transform: rotate(-45deg);
animation: meteorFall1 4s linear infinite;
}
&.meteor-2 {
top: 5%;
left: 60%;
transform: rotate(-60deg);
animation: meteorFall2 5s linear infinite 1.5s;
}
&.meteor-3 {
top: 15%;
left: 80%;
transform: rotate(-50deg);
animation: meteorFall3 4.5s linear infinite 3s;
}
}
/* 飞机 */
.airplane {
position: absolute;
z-index: 4;
filter: drop-shadow(0 0 15px rgba(255, 243, 148, 1));
transform: translateZ(0);
animation-play-state: paused;
svg {
display: block;
}
&.airplane-large {
bottom: 15%;
left: -240px;
animation: airplaneFlyUp1 25s linear infinite;
}
&.airplane-small {
bottom: 25%;
left: -120px;
animation: airplaneFlyUp2 30s linear infinite 5s;
}
}
/* 白云 */
.cloud {
position: absolute;
z-index: 3;
filter: drop-shadow(0 0 8px rgba(255, 255, 255, 0.3));
opacity: 0.6;
transform: translateZ(0);
animation-play-state: paused;
svg {
display: block;
}
&.cloud-1 {
top: 10%;
left: -200px;
animation: cloudMove1 40s linear infinite;
}
&.cloud-2 {
top: 20%;
right: -180px;
animation: cloudMove2 45s linear infinite;
}
&.cloud-3 {
bottom: 20%;
left: -190px;
animation: cloudMove3 42s linear infinite;
}
&.cloud-4 {
bottom: 30%;
right: -170px;
animation: cloudMove4 48s linear infinite;
}
}
.login-form {
position: relative;
z-index: 10;
width: 525px;
min-height: 650px;
padding: 63px 50px 56px;
margin-right: calc(100vw / 11);
background: rgba(255, 255, 255, 0.9);
backdrop-filter: blur(20px) saturate(180%);
border-radius: 30px;
border: 2px solid rgba(255, 255, 255, 0.5);
box-shadow:
0 25px 75px rgba(0, 0, 0, 0.15),
0 0 50px rgba(255, 255, 255, 0.3),
inset 0 0 38px rgba(255, 255, 255, 0.2);
display: flex;
flex-direction: column;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
&::before {
content: '';
position: absolute;
top: -2px;
left: -2px;
right: -2px;
bottom: -2px;
background: linear-gradient(45deg, rgba(255, 243, 148, 0.5), transparent, rgba(255, 243, 148, 0.5), transparent);
border-radius: 24px;
z-index: -1;
opacity: 0;
transition: opacity 0.4s;
}
&:hover {
border-color: rgba(255, 255, 255, 0.8);
box-shadow:
0 30px 100px rgba(0, 0, 0, 0.2),
0 0 75px rgba(255, 255, 255, 0.4),
inset 0 0 50px rgba(255, 255, 255, 0.3);
transform: translateY(-5px) scale(1.01);
background: rgba(255, 255, 255, 0.95);
&::before {
opacity: 0.3;
animation: borderGlow 2s linear infinite;
}
}
.login-logo {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 38px;
padding-bottom: 25px;
border-bottom: 1px solid #f0f0f0;
position: relative;
.login-icon {
width: 68px;
height: 68px;
}
.logo-text {
padding: 0 0 0 31px;
margin: 0;
font-size: 40px;
font-weight: 600;
color: #002770;
letter-spacing: 2.5px;
text-shadow: none;
flex: 1;
}
.language-switcher {
position: absolute;
top: 0;
right: 0;
z-index: 10;
:deep(.dropDown) {
color: #8c8c8c;
font-size: 14px;
transition: color 0.3s;
&:hover {
color: #2D8C8C;
}
}
}
}
.login-tabs {
flex: 1;
min-height: 400px;
display: flex;
flex-direction: column;
:deep(.arco-tabs-nav) {
&::before {
border-bottom-color: #e8e8e8;
}
}
:deep(.arco-tabs-tab) {
color: #8c8c8c;
transition: none;
font-size: 25px;
font-weight: 800;
&:hover {
color: #8c8c8c; /* 去除悬停变色 */
}
&.arco-tabs-tab-active {
color: #8c8c8c; /* 去除选中变色 */
}
}
:deep(.arco-tabs-content) {
flex: 1;
padding: 40px 0;
min-height: 350px;
}
:deep(.arco-tabs-content-item) {
height: 100%;
display: flex;
flex-direction: column;
}
:deep(.arco-tabs-nav-ink) {
background-color: transparent; /* 隐藏底部指示条 */
}
}
/* 兜底:无论使用哪个登录子组件,统一按钮尺寸与圆角 */
:deep(.login-btn .arco-btn),
:deep(.login-form .arco-btn[long]),
:deep(.login-form .arco-btn-primary),
:deep(.login-form .arco-btn) {
width: 100% !important;
height: 60px !important;
line-height: 58px !important;
border-radius: 15px !important;
font-weight: 600 !important;
}
/* 覆盖尺寸类(small/medium/large)防止回退 */
:deep(.arco-btn-size-small),
:deep(.arco-btn-size-medium),
:deep(.arco-btn-size-large) {
height: 60px !important;
line-height: 58px !important;
border-radius: 15px !important;
}
/* 例外:手机号登录-获取验证码按钮保持32px */
:deep(.valid-code-container .arco-btn) {
height: 40px !important;
line-height: 38px !important;
border-radius: 10px !important;
width: auto !important;
}
}
}
@media screen and (max-width: 1250px) {
.login-container {
justify-content: center;
padding: 0 16px;
}
}
@media screen and (max-width: 600px) {
.login-form {
width: 97% !important;
}
}
/* 三角形旋转浮动 */
@keyframes rotateFloat {
0%, 100% {
transform: translate(0, 0) rotate(0deg);
}
25% {
transform: translate(20px, -20px) rotate(90deg);
}
50% {
transform: translate(-15px, -30px) rotate(180deg);
}
75% {
transform: translate(-20px, 10px) rotate(270deg);
}
}
/* 六边形脉冲 */
@keyframes hexagonPulse {
0%, 100% {
transform: scale(1);
opacity: 0.6;
}
50% {
transform: scale(1.2);
opacity: 1;
}
}
/* 圆形脉冲 */
@keyframes circlePulse {
0%, 100% {
transform: scale(1);
box-shadow:
0 0 30px rgba(255, 243, 148, 0.8),
inset 0 0 20px rgba(255, 243, 148, 0.3);
}
50% {
transform: scale(1.15);
box-shadow:
0 0 50px rgba(255, 243, 148, 1),
inset 0 0 30px rgba(255, 243, 148, 0.5);
}
}
/* 线条流动 */
@keyframes lineFlow {
0% {
stroke-dashoffset: 0;
opacity: 0.6;
}
50% {
opacity: 1;
}
100% {
stroke-dashoffset: -20;
opacity: 0.6;
}
}
/* 粒子浮动 */
@keyframes particleFloat {
0%, 100% {
transform: translate(0, 0) scale(1);
opacity: 0.8;
}
25% {
transform: translate(30px, -40px) scale(1.2);
opacity: 1;
}
50% {
transform: translate(-20px, -60px) scale(0.8);
opacity: 0.6;
}
75% {
transform: translate(-30px, -20px) scale(1.1);
opacity: 0.9;
}
}
/* 边框发光 */
@keyframes borderGlow {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
/* 地球旋转动画 */
@keyframes earthRotate {
0% {
transform: translate(-50%, -50%) rotate(0deg);
}
100% {
transform: translate(-50%, -50%) rotate(360deg);
}
}
/* 月亮浮动 */
@keyframes moonFloat {
0%, 100% {
transform: translate(0, 0);
opacity: 0.9;
}
50% {
transform: translate(20px, -20px);
opacity: 1;
}
}
/* 小行星随机高亮 */
@keyframes asteroidGlow {
0%, 70%, 100% {
opacity: 0.6;
box-shadow: 0 0 8px rgba(255, 243, 148, 0.6);
transform: scale(1);
}
35% {
opacity: 1;
box-shadow: 0 0 20px rgba(255, 243, 148, 1), 0 0 30px rgba(255, 243, 148, 0.8);
transform: scale(1.3);
}
}
/* 流星划过 */
@keyframes meteorFall1 {
0% {
transform: translate(0, 0) rotate(-45deg);
opacity: 0;
}
10% {
opacity: 1;
}
100% {
transform: translate(800px, 800px) rotate(-45deg);
opacity: 0;
}
}
@keyframes meteorFall2 {
0% {
transform: translate(0, 0) rotate(-60deg);
opacity: 0;
}
10% {
opacity: 1;
}
100% {
transform: translate(1000px, 1000px) rotate(-60deg);
opacity: 0;
}
}
@keyframes meteorFall3 {
0% {
transform: translate(0, 0) rotate(-50deg);
opacity: 0;
}
10% {
opacity: 1;
}
100% {
transform: translate(900px, 900px) rotate(-50deg);
opacity: 0;
}
}
/* 飞机横向飞行 */
@keyframes airplaneFlyUp1 {
0% {
transform: translateX(0) translateY(0);
opacity: 0.8;
}
50% {
transform: translateX(calc(100vw + 240px)) translateY(-20px);
opacity: 1;
}
100% {
transform: translateX(calc(200vw + 240px)) translateY(0);
opacity: 0.8;
}
}
@keyframes airplaneFlyUp2 {
0% {
transform: translateX(0) translateY(0);
opacity: 0.7;
}
50% {
transform: translateX(calc(100vw + 120px)) translateY(15px);
opacity: 0.9;
}
100% {
transform: translateX(calc(200vw + 120px)) translateY(0);
opacity: 0.7;
}
}
/* 白云移动动画 */
@keyframes cloudMove1 {
0% {
transform: translateX(0) translateY(0);
opacity: 0.6;
}
50% {
transform: translateX(calc(100vw + 200px)) translateY(-15px);
opacity: 0.7;
}
100% {
transform: translateX(calc(200vw + 200px)) translateY(0);
opacity: 0.6;
}
}
@keyframes cloudMove2 {
0% {
transform: translateX(0) translateY(0);
opacity: 0.5;
}
50% {
transform: translateX(calc(-100vw - 180px)) translateY(12px);
opacity: 0.6;
}
100% {
transform: translateX(calc(-200vw - 180px)) translateY(0);
opacity: 0.5;
}
}
@keyframes cloudMove3 {
0% {
transform: translateX(0) translateY(0);
opacity: 0.55;
}
50% {
transform: translateX(calc(100vw + 190px)) translateY(8px);
opacity: 0.65;
}
100% {
transform: translateX(calc(200vw + 190px)) translateY(0);
opacity: 0.55;
}
}
@keyframes cloudMove4 {
0% {
transform: translateX(0) translateY(0);
opacity: 0.5;
}
50% {
transform: translateX(calc(-100vw - 170px)) translateY(-10px);
opacity: 0.6;
}
100% {
transform: translateX(calc(-200vw - 170px)) translateY(0);
opacity: 0.5;
}
}
</style>