与牧同行-兽医端小程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

672 lines
12 KiB

  1. /* pages/login/login.wxss */
  2. .login-container {
  3. height: 100vh;
  4. width: 100%;
  5. position: relative;
  6. overflow: hidden;
  7. background: linear-gradient(180deg, #f0f9ff 0%, #e6f3fe 100%);
  8. }
  9. /* 波浪背景 */
  10. .wave-background {
  11. position: absolute;
  12. top: 0;
  13. left: 0;
  14. width: 100%;
  15. height: 450rpx;
  16. overflow: hidden;
  17. }
  18. .wave {
  19. position: absolute;
  20. bottom: 0;
  21. width: 200%;
  22. height: 100%;
  23. background: linear-gradient(135deg, #4A90E2 0%, #67B26F 100%);
  24. border-radius: 0 0 50% 50%;
  25. animation: waveMove 15s ease-in-out infinite;
  26. }
  27. .wave-1 {
  28. opacity: 0.8;
  29. animation-delay: 0s;
  30. }
  31. .wave-2 {
  32. opacity: 0.5;
  33. animation-delay: 5s;
  34. background: linear-gradient(135deg, #5A9FE2 0%, #77C27F 100%);
  35. }
  36. .wave-3 {
  37. opacity: 0.3;
  38. animation-delay: 10s;
  39. background: linear-gradient(135deg, #6AAFE2 0%, #87D28F 100%);
  40. }
  41. @keyframes waveMove {
  42. 0% {
  43. transform: translateX(0) rotate(0deg);
  44. }
  45. 25% {
  46. transform: translateX(-15%) rotate(1deg);
  47. }
  48. 50% {
  49. transform: translateX(-25%) rotate(0deg);
  50. }
  51. 75% {
  52. transform: translateX(-15%) rotate(-1deg);
  53. }
  54. 100% {
  55. transform: translateX(0) rotate(0deg);
  56. }
  57. }
  58. /* 装饰元素 */
  59. .decorations {
  60. position: absolute;
  61. width: 100%;
  62. height: 100%;
  63. pointer-events: none;
  64. }
  65. .cloud {
  66. position: absolute;
  67. background: rgba(255, 255, 255, 0.9);
  68. border-radius: 100rpx;
  69. filter: blur(2rpx);
  70. }
  71. .cloud-1 {
  72. width: 140rpx;
  73. height: 45rpx;
  74. top: 120rpx;
  75. left: 8%;
  76. box-shadow:
  77. 25rpx 0 0 0 rgba(255, 255, 255, 0.9),
  78. 50rpx 0 0 0 rgba(255, 255, 255, 0.9);
  79. animation: floatCloud 20s infinite;
  80. }
  81. .cloud-2 {
  82. width: 100rpx;
  83. height: 35rpx;
  84. top: 80rpx;
  85. right: 12%;
  86. box-shadow:
  87. 18rpx 0 0 0 rgba(255, 255, 255, 0.9),
  88. 36rpx 0 0 0 rgba(255, 255, 255, 0.9);
  89. animation: floatCloud 25s infinite reverse;
  90. }
  91. .cloud-3 {
  92. width: 80rpx;
  93. height: 28rpx;
  94. top: 180rpx;
  95. left: 65%;
  96. box-shadow:
  97. 14rpx 0 0 0 rgba(255, 255, 255, 0.9),
  98. 28rpx 0 0 0 rgba(255, 255, 255, 0.9);
  99. animation: floatCloud 18s infinite;
  100. }
  101. @keyframes floatCloud {
  102. 0%, 100% {
  103. transform: translateX(0);
  104. }
  105. 50% {
  106. transform: translateX(30rpx);
  107. }
  108. }
  109. .medical-icon {
  110. position: absolute;
  111. font-size: 60rpx;
  112. opacity: 0.2;
  113. animation: floatIcon 6s ease-in-out infinite;
  114. }
  115. .icon-1 {
  116. top: 200rpx;
  117. left: 15%;
  118. animation-delay: 0s;
  119. }
  120. .icon-2 {
  121. bottom: 200rpx;
  122. right: 15%;
  123. animation-delay: 1s;
  124. }
  125. .icon-3 {
  126. bottom: 300rpx;
  127. left: 20%;
  128. animation-delay: 2s;
  129. }
  130. @keyframes floatIcon {
  131. 0%, 100% {
  132. transform: translateY(0) rotate(0deg);
  133. }
  134. 50% {
  135. transform: translateY(-20rpx) rotate(5deg);
  136. }
  137. }
  138. /* 主要内容区域 */
  139. .main-content {
  140. position: relative;
  141. z-index: 10;
  142. height: 100%;
  143. display: flex;
  144. flex-direction: column;
  145. padding: 0 60rpx;
  146. padding-top: 100rpx;
  147. box-sizing: border-box;
  148. }
  149. /* Logo区域 */
  150. .logo-section {
  151. display: flex;
  152. flex-direction: column;
  153. align-items: center;
  154. margin-bottom: 60rpx;
  155. animation: logoAppear 1s ease-out;
  156. }
  157. @keyframes logoAppear {
  158. 0% {
  159. opacity: 0;
  160. transform: scale(0.8);
  161. }
  162. 100% {
  163. opacity: 1;
  164. transform: scale(1);
  165. }
  166. }
  167. .logo-circle {
  168. width: 160rpx;
  169. height: 160rpx;
  170. border-radius: 50%;
  171. background: linear-gradient(135deg, #4A90E2, #67B26F);
  172. display: flex;
  173. align-items: center;
  174. justify-content: center;
  175. box-shadow:
  176. 0 20rpx 40rpx rgba(74, 144, 226, 0.3),
  177. inset 0 -4rpx 8rpx rgba(0, 0, 0, 0.1),
  178. inset 0 4rpx 8rpx rgba(255, 255, 255, 0.8);
  179. position: relative;
  180. }
  181. .logo-circle:before {
  182. content: '';
  183. position: absolute;
  184. width: 140rpx;
  185. height: 140rpx;
  186. border-radius: 50%;
  187. border: 2rpx solid rgba(255, 255, 255, 0.5);
  188. }
  189. .logo-inner {
  190. width: 120rpx;
  191. height: 120rpx;
  192. border-radius: 50%;
  193. background: white;
  194. display: flex;
  195. align-items: center;
  196. justify-content: center;
  197. box-shadow: inset 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
  198. }
  199. .logo-text {
  200. font-size: 70rpx;
  201. font-weight: bold;
  202. line-height: 1;
  203. }
  204. .app-title {
  205. font-size: 48rpx;
  206. font-weight: 700;
  207. color: #2c3e50;
  208. margin-bottom: 8rpx;
  209. letter-spacing: 2rpx;
  210. text-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.1);
  211. }
  212. .app-subtitle {
  213. font-size: 24rpx;
  214. color: #7f8c8d;
  215. letter-spacing: 4rpx;
  216. text-transform: uppercase;
  217. }
  218. /* 登录区域 */
  219. .login-section {
  220. display: flex;
  221. flex-direction: column;
  222. align-items: center;
  223. flex: 1;
  224. }
  225. .welcome-text {
  226. text-align: center;
  227. margin-bottom: 60rpx;
  228. animation: slideUp 0.8s ease-out;
  229. }
  230. @keyframes slideUp {
  231. 0% {
  232. opacity: 0;
  233. transform: translateY(30rpx);
  234. }
  235. 100% {
  236. opacity: 1;
  237. transform: translateY(0);
  238. }
  239. }
  240. .welcome-main {
  241. display: block;
  242. font-size: 40rpx;
  243. font-weight: 600;
  244. color: #2c3e50;
  245. margin-bottom: 12rpx;
  246. }
  247. .welcome-desc {
  248. display: block;
  249. font-size: 26rpx;
  250. color: #95a5a6;
  251. }
  252. /* 输入框组 */
  253. .input-group {
  254. width: 100%;
  255. margin-bottom: 40rpx;
  256. animation: slideUp 0.8s ease-out 0.1s both;
  257. }
  258. .input-wrapper {
  259. display: flex;
  260. align-items: center;
  261. background: white;
  262. border-radius: 60rpx;
  263. padding: 0 30rpx;
  264. margin-bottom: 30rpx;
  265. transition: all 0.3s ease;
  266. }
  267. .input-wrapper.input-focused {
  268. border-color: #4A90E2;
  269. box-shadow: 0 8rpx 20rpx rgba(74, 144, 226, 0.15);
  270. transform: translateY(-2rpx);
  271. }
  272. .input-icon {
  273. margin-right: 20rpx;
  274. opacity: 0.7;
  275. width: 40rpx;
  276. height: 40rpx;
  277. }
  278. .input-wrapper input {
  279. flex: 1;
  280. height: 90rpx;
  281. font-size: 28rpx;
  282. color: #2c3e50;
  283. }
  284. .input-placeholder {
  285. color: #bdc3c7;
  286. font-size: 28rpx;
  287. }
  288. .password-toggle {
  289. padding: 20rpx;
  290. font-size: 36rpx;
  291. opacity: 0.6;
  292. transition: opacity 0.3s ease;
  293. /* 提高点击区域 */
  294. min-width: 80rpx;
  295. display: flex;
  296. align-items: center;
  297. justify-content: center;
  298. /* 防止事件冒泡 */
  299. z-index: 10;
  300. }
  301. .password-toggle:active {
  302. opacity: 1;
  303. transform: scale(1.1);
  304. }
  305. /* 登录按钮 */
  306. .login-btn {
  307. width: 100%;
  308. height: 100rpx;
  309. border-radius: 50rpx;
  310. background: linear-gradient(135deg, #4A90E2, #67B26F);
  311. box-shadow: 0 12rpx 30rpx rgba(74, 144, 226, 0.3);
  312. margin-bottom: 40rpx;
  313. transition: all 0.3s ease;
  314. animation: slideUp 0.8s ease-out 0.2s both;
  315. border: none;
  316. padding: 0;
  317. line-height: 100rpx;
  318. }
  319. .login-btn::after{
  320. border: none;
  321. }
  322. .login-btn.btn-disabled {
  323. opacity: 0.5;
  324. background: #bdc3c7;
  325. box-shadow: none;
  326. pointer-events: none;
  327. }
  328. .btn-hover {
  329. transform: translateY(-4rpx) scale(1.02);
  330. box-shadow: 0 16rpx 40rpx rgba(74, 144, 226, 0.4);
  331. }
  332. .btn-inner {
  333. display: flex;
  334. align-items: center;
  335. justify-content: center;
  336. height: 100%;
  337. width: 100%;
  338. }
  339. .btn-text {
  340. color: white;
  341. font-size: 34rpx;
  342. font-weight: 600;
  343. letter-spacing: 4rpx;
  344. }
  345. /* 其他选项 */
  346. .options-section {
  347. width: 100%;
  348. display: flex;
  349. justify-content: center;
  350. margin-bottom: 30rpx;
  351. animation: slideUp 0.8s ease-out 0.3s both;
  352. }
  353. .option-item {
  354. padding: 0 25rpx;
  355. position: relative;
  356. }
  357. .option-item:not(:last-child):after {
  358. content: '|';
  359. position: absolute;
  360. right: 0;
  361. top: 50%;
  362. transform: translateY(-50%);
  363. color: #e0e0e0;
  364. }
  365. .option-text {
  366. font-size: 26rpx;
  367. color: #7f8c8d;
  368. transition: color 0.3s ease;
  369. }
  370. .option-item:active .option-text {
  371. color: #4A90E2;
  372. }
  373. /* 协议确认 */
  374. .agreement-section {
  375. display: flex;
  376. align-items: center;
  377. justify-content: center;
  378. animation: slideUp 0.8s ease-out 0.4s both;
  379. }
  380. .agreement-checkbox {
  381. width: 32rpx;
  382. height: 32rpx;
  383. border: 2rpx solid #bdc3c7;
  384. border-radius: 8rpx;
  385. margin-right: 16rpx;
  386. display: flex;
  387. align-items: center;
  388. justify-content: center;
  389. transition: all 0.2s ease;
  390. }
  391. .agreement-checkbox.checked {
  392. background: linear-gradient(135deg, #4A90E2, #67B26F);
  393. border-color: transparent;
  394. }
  395. .checkmark {
  396. color: white;
  397. font-size: 24rpx;
  398. font-weight: bold;
  399. }
  400. .agreement-text {
  401. font-size: 24rpx;
  402. color: #7f8c8d;
  403. }
  404. .link {
  405. color: #4A90E2;
  406. display: inline;
  407. padding: 0 4rpx;
  408. }
  409. .link:active {
  410. opacity: 0.7;
  411. }
  412. /* 底部装饰 */
  413. .bottom-decor {
  414. position: absolute;
  415. bottom: 0;
  416. left: 0;
  417. width: 100%;
  418. height: 60rpx;
  419. overflow: hidden;
  420. }
  421. .bottom-wave {
  422. position: absolute;
  423. top: 0;
  424. left: 0;
  425. width: 200%;
  426. height: 200%;
  427. background: linear-gradient(90deg, #4A90E2, #67B26F);
  428. border-radius: 50% 50% 0 0;
  429. animation: bottomWave 20s linear infinite;
  430. opacity: 0.2;
  431. }
  432. @keyframes bottomWave {
  433. 0% {
  434. transform: translateX(0) rotate(0deg);
  435. }
  436. 50% {
  437. transform: translateX(-25%) rotate(0.5deg);
  438. }
  439. 100% {
  440. transform: translateX(-50%) rotate(0deg);
  441. }
  442. }
  443. /* 协议弹窗 */
  444. .agreement-modal {
  445. position: fixed;
  446. top: 0;
  447. left: 0;
  448. width: 100%;
  449. height: 100%;
  450. z-index: 1000;
  451. display: flex;
  452. align-items: center;
  453. justify-content: center;
  454. }
  455. .modal-mask {
  456. position: absolute;
  457. top: 0;
  458. left: 0;
  459. width: 100%;
  460. height: 100%;
  461. background-color: rgba(0, 0, 0, 0.5);
  462. }
  463. .modal-content {
  464. position: relative;
  465. width: 85%;
  466. max-height: 80%;
  467. background-color: white;
  468. border-radius: 24rpx;
  469. overflow: hidden;
  470. box-shadow: 0 20rpx 60rpx rgba(0, 0, 0, 0.15);
  471. }
  472. .modal-header {
  473. padding: 40rpx;
  474. border-bottom: 1rpx solid #f0f0f0;
  475. display: flex;
  476. align-items: center;
  477. justify-content: space-between;
  478. }
  479. .modal-title {
  480. font-size: 36rpx;
  481. font-weight: 600;
  482. color: #333;
  483. }
  484. .modal-close {
  485. font-size: 48rpx;
  486. color: #999;
  487. line-height: 1;
  488. padding: 0 20rpx;
  489. }
  490. .modal-close:active {
  491. color: #666;
  492. }
  493. .modal-body {
  494. max-height: 600rpx;
  495. padding: 20rpx;
  496. box-sizing: border-box;
  497. }
  498. .modal-text {
  499. font-size: 28rpx;
  500. color: #666;
  501. line-height: 1.8;
  502. padding: 20rpx 0;
  503. white-space: pre-line;
  504. }
  505. /* 忘记密码弹窗内容 */
  506. .forgot-tip {
  507. font-size: 32rpx;
  508. color: #333;
  509. font-weight: 500;
  510. margin-bottom: 40rpx;
  511. text-align: center;
  512. }
  513. .contact-info {
  514. background: #f8f9fa;
  515. border-radius: 16rpx;
  516. padding: 30rpx;
  517. margin-bottom: 40rpx;
  518. }
  519. .contact-item {
  520. display: flex;
  521. justify-content: center;
  522. margin-bottom: 20rpx;
  523. font-size: 28rpx;
  524. }
  525. .contact-item:last-child {
  526. margin-bottom: 0;
  527. }
  528. .contact-label {
  529. color: #999;
  530. margin-right: 20rpx;
  531. }
  532. .contact-value {
  533. color: #333;
  534. font-weight: 500;
  535. }
  536. .contact-btn {
  537. width: 80%;
  538. height: 80rpx;
  539. border-radius: 40rpx;
  540. background: linear-gradient(135deg, #4A90E2, #67B26F);
  541. color: white;
  542. font-size: 32rpx;
  543. font-weight: 500;
  544. margin: 0 auto;
  545. display: flex;
  546. align-items: center;
  547. justify-content: center;
  548. border: none;
  549. }
  550. .contact-btn:active {
  551. opacity: 0.8;
  552. }
  553. /* 加载提示 */
  554. .loading-mask {
  555. position: fixed;
  556. top: 0;
  557. left: 0;
  558. width: 100%;
  559. height: 100%;
  560. background-color: rgba(0, 0, 0, 0.5);
  561. z-index: 1001;
  562. display: flex;
  563. align-items: center;
  564. justify-content: center;
  565. }
  566. .loading-content {
  567. display: flex;
  568. flex-direction: column;
  569. align-items: center;
  570. }
  571. .loading-spinner {
  572. width: 80rpx;
  573. height: 80rpx;
  574. border: 6rpx solid rgba(74, 144, 226, 0.2);
  575. border-top-color: #4A90E2;
  576. border-radius: 50%;
  577. animation: loadingSpin 1s linear infinite;
  578. margin-bottom: 30rpx;
  579. }
  580. @keyframes loadingSpin {
  581. 0% {
  582. transform: rotate(0deg);
  583. }
  584. 100% {
  585. transform: rotate(360deg);
  586. }
  587. }
  588. .loading-text {
  589. font-size: 28rpx;
  590. color: #fff;
  591. }