与牧同行-小程序用户端
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.

761 lines
12 KiB

1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
  1. .expert-page {
  2. min-height: 100vh;
  3. background: linear-gradient(180deg, #f5f7fa 0%, #ffffff 100%);
  4. }
  5. /* 顶部区域样式 */
  6. .header-section {
  7. background: linear-gradient(135deg, #2c8c34 0%, #4caf50 100%);
  8. padding: 40rpx 40rpx 50rpx;
  9. position: relative;
  10. overflow: hidden;
  11. }
  12. .header-bg {
  13. position: absolute;
  14. top: 0;
  15. left: 0;
  16. right: 0;
  17. bottom: 0;
  18. }
  19. .bg-circle {
  20. position: absolute;
  21. border-radius: 50%;
  22. background: rgba(255, 255, 255, 0.1);
  23. }
  24. .bg-circle-1 {
  25. width: 300rpx;
  26. height: 300rpx;
  27. top: -150rpx;
  28. right: -100rpx;
  29. }
  30. .bg-circle-2 {
  31. width: 200rpx;
  32. height: 200rpx;
  33. bottom: -80rpx;
  34. left: -80rpx;
  35. }
  36. .bg-circle-3 {
  37. width: 150rpx;
  38. height: 150rpx;
  39. top: 50%;
  40. right: 20%;
  41. }
  42. .header-content {
  43. position: relative;
  44. z-index: 2;
  45. }
  46. .title-row {
  47. display: flex;
  48. align-items: center;
  49. margin-bottom: 20rpx;
  50. }
  51. .main-title {
  52. font-size: 52rpx;
  53. font-weight: bold;
  54. color: white;
  55. margin-right: 20rpx;
  56. }
  57. .expert-badge {
  58. background: rgba(255, 255, 255, 0.2);
  59. border: 2rpx solid rgba(255, 255, 255, 0.3);
  60. border-radius: 30rpx;
  61. padding: 6rpx 20rpx;
  62. backdrop-filter: blur(10rpx);
  63. }
  64. .badge-text {
  65. font-size: 24rpx;
  66. color: white;
  67. font-weight: 500;
  68. }
  69. .sub-title {
  70. font-size: 28rpx;
  71. color: rgba(255, 255, 255, 0.9);
  72. margin-bottom: 40rpx;
  73. display: block;
  74. }
  75. .stats-row {
  76. display: flex;
  77. align-items: center;
  78. background: rgba(255, 255, 255, 0.15);
  79. border-radius: 24rpx;
  80. padding: 20rpx;
  81. backdrop-filter: blur(10rpx);
  82. }
  83. .stat-item {
  84. flex: 1;
  85. display: flex;
  86. flex-direction: column;
  87. align-items: center;
  88. }
  89. .stat-number {
  90. font-size: 36rpx;
  91. font-weight: bold;
  92. color: white;
  93. margin-bottom: 8rpx;
  94. }
  95. .stat-label {
  96. font-size: 24rpx;
  97. color: rgba(255, 255, 255, 0.85);
  98. }
  99. .stat-divider {
  100. width: 2rpx;
  101. height: 40rpx;
  102. background: rgba(255, 255, 255, 0.3);
  103. }
  104. /* 搜索和筛选区域 */
  105. .search-filter-section {
  106. background: white;
  107. border-radius: 40rpx 40rpx 0 0;
  108. margin-top: -30rpx;
  109. position: relative;
  110. z-index: 10;
  111. padding: 30rpx 40rpx 0;
  112. box-shadow: 0 -10rpx 30rpx rgba(44, 140, 52, 0.1);
  113. }
  114. .search-wrapper {
  115. margin-bottom: 30rpx;
  116. }
  117. .search-box {
  118. display: flex;
  119. align-items: center;
  120. background: #f8faf9;
  121. border-radius: 50rpx;
  122. padding: 20rpx 30rpx;
  123. border: 2rpx solid #e8f5e9;
  124. transition: all 0.3s;
  125. }
  126. .search-box:active {
  127. background: #f0f9f1;
  128. border-color: #2c8c34;
  129. }
  130. .search-icon {
  131. width: 36rpx;
  132. height: 36rpx;
  133. margin-right: 20rpx;
  134. opacity: 0.5;
  135. }
  136. .search-box input {
  137. flex: 1;
  138. font-size: 30rpx;
  139. color: #333;
  140. height: 40rpx;
  141. line-height: 40rpx;
  142. }
  143. .placeholder {
  144. color: #999;
  145. font-size: 28rpx;
  146. }
  147. .clear-btn {
  148. width: 40rpx;
  149. height: 40rpx;
  150. display: flex;
  151. align-items: center;
  152. justify-content: center;
  153. background: #EAEBED;
  154. border-radius: 50%;
  155. margin-left: 10rpx;
  156. }
  157. .clear-icon {
  158. width: 28rpx;
  159. height: 28rpx;
  160. }
  161. /* 筛选标签 */
  162. .filter-scroll {
  163. white-space: nowrap;
  164. }
  165. .filter-tags {
  166. width: 100%;
  167. display:grid;
  168. grid-template-columns: 1fr 1fr 1fr;
  169. column-gap: 20rpx;
  170. padding-bottom: 20rpx;
  171. }
  172. .filter-tag {
  173. padding: 16rpx 24rpx;
  174. background: #f8faf9;
  175. border-radius: 20rpx;
  176. border: 2rpx solid #e8f5e9;
  177. color: #666;
  178. font-size: 28rpx;
  179. font-weight: 500;
  180. transition: all 0.3s;
  181. text-align: center;
  182. }
  183. .filter-tag.active {
  184. background: #2c8c34;
  185. border-color: #2c8c34;
  186. color: white;
  187. }
  188. .filter-tag.active .tag-count {
  189. background: rgba(255, 255, 255, 0.3);
  190. color: white;
  191. }
  192. /* 专家列表区域 */
  193. .expert-list-section {
  194. padding: 0 30rpx 30rpx;
  195. }
  196. .list-header {
  197. display: flex;
  198. justify-content: space-between;
  199. align-items: center;
  200. padding: 30rpx 0 20rpx;
  201. border-bottom: 2rpx solid #f0f5f1;
  202. }
  203. .list-title {
  204. font-size: 36rpx;
  205. font-weight: bold;
  206. color: #333;
  207. }
  208. .list-count {
  209. font-size: 26rpx;
  210. color: #666;
  211. }
  212. .expert-cards {
  213. height: calc(100vh - 700rpx);
  214. padding-bottom: 30rpx;
  215. }
  216. /* 空状态 */
  217. .empty-state {
  218. display: flex;
  219. flex-direction: column;
  220. align-items: center;
  221. justify-content: center;
  222. padding: 120rpx 0;
  223. }
  224. .empty-image {
  225. width: 240rpx;
  226. height: 240rpx;
  227. margin-bottom: 40rpx;
  228. opacity: 0.6;
  229. }
  230. .empty-title {
  231. font-size: 34rpx;
  232. color: #999;
  233. font-weight: bold;
  234. margin-bottom: 20rpx;
  235. }
  236. /* 专家卡片 */
  237. .expert-card {
  238. background: white;
  239. border-radius: 30rpx;
  240. padding: 30rpx;
  241. margin-bottom: 10rpx;
  242. display: grid;
  243. grid-template-columns: 1fr 2fr;
  244. align-items: center;
  245. box-shadow: 0 6rpx 30rpx rgba(0, 0, 0, 0.05);
  246. border: 2rpx solid #f0f5f1;
  247. transition: all 0.3s;
  248. position: relative;
  249. }
  250. .expert-card:active {
  251. transform: translateY(-4rpx);
  252. box-shadow: 0 12rpx 40rpx rgba(0, 0, 0, 0.1);
  253. border-color: #e8f5e9;
  254. }
  255. .card-left {
  256. margin-right: 25rpx;
  257. }
  258. .avatar-container {
  259. position: relative;
  260. width: 150rpx;
  261. height: 180rpx;
  262. border-radius: 16rpx;
  263. overflow: hidden;
  264. }
  265. .expert-avatar {
  266. width: 100%;
  267. height: 100%;
  268. background: #f5f7fa;
  269. }
  270. .online-badge {
  271. position: absolute;
  272. bottom: 0rpx;
  273. right: 0rpx;
  274. padding: 5rpx 15rpx;
  275. border-radius: 20rpx;
  276. font-size: 18rpx;
  277. font-weight: bold;
  278. color: white;
  279. text-align: center;
  280. }
  281. .online-badge.online {
  282. background: linear-gradient(135deg, #4caf50 0%, #2c8c34 100%);
  283. }
  284. .online-badge.offline {
  285. background: linear-gradient(135deg, #9e9e9e 0%, #757575 100%);
  286. }
  287. .card-middle {
  288. flex: 1;
  289. }
  290. .name-title-row {
  291. display: flex;
  292. align-items: center;
  293. margin-bottom: 20rpx;
  294. }
  295. .expert-name {
  296. font-size: 36rpx;
  297. font-weight: bold;
  298. color: #333;
  299. margin-right: 15rpx;
  300. }
  301. .expert-title {
  302. font-size: 26rpx;
  303. color: #2c8c34;
  304. background: #f0f9f1;
  305. padding: 4rpx 12rpx;
  306. border-radius: 8rpx;
  307. font-weight: 500;
  308. }
  309. /* 信息展示区域 */
  310. .info-display {
  311. display: flex;
  312. flex-direction: column;
  313. gap: 12rpx;
  314. margin-bottom: 20rpx;
  315. }
  316. .info-item {
  317. display: flex;
  318. align-items: flex-start;
  319. font-size: 28rpx;
  320. line-height: 1.4;
  321. }
  322. .info-label {
  323. color: #666;
  324. min-width: 150rpx;
  325. font-weight: 500;
  326. }
  327. .info-value {
  328. color: #333;
  329. flex: 1;
  330. font-weight: 600;
  331. }
  332. .contact-btn {
  333. font-size: 22rpx;
  334. padding: 6rpx 20rpx;
  335. border-radius: 30rpx;
  336. border: none;
  337. color: white;
  338. font-weight: bold;
  339. box-shadow: 0 4rpx 15rpx rgba(0, 0, 0, 0.1);
  340. transition: all 0.3s;
  341. display: inline-block;
  342. position: absolute;
  343. right: 20rpx;
  344. bottom: 20rpx;
  345. }
  346. .contact-btn.online-btn {
  347. background: linear-gradient(135deg, #4caf50 0%, #2c8c34 100%);
  348. }
  349. .contact-btn.offline-btn {
  350. background: linear-gradient(135deg, #9e9e9e 0%, #757575 100%);
  351. }
  352. .contact-btn:active {
  353. transform: scale(0.95);
  354. box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.2);
  355. }
  356. /* 联系方式弹窗 */
  357. .dialog-overlay {
  358. position: fixed;
  359. top: 0;
  360. left: 0;
  361. right: 0;
  362. bottom: 0;
  363. background: rgba(0, 0, 0, 0.5);
  364. display: flex;
  365. align-items: center;
  366. justify-content: center;
  367. z-index: 1000;
  368. animation: fadeIn 0.3s ease;
  369. }
  370. @keyframes fadeIn {
  371. from {
  372. opacity: 0;
  373. }
  374. to {
  375. opacity: 1;
  376. }
  377. }
  378. .contact-modal {
  379. width: 86vw;
  380. max-height: 80vh;
  381. background: white;
  382. border-radius: 20rpx;
  383. overflow: hidden;
  384. animation: slideUp 0.4s cubic-bezier(0.22, 0.61, 0.36, 1);
  385. box-shadow: 0 20rpx 60rpx rgba(0, 0, 0, 0.2);
  386. display: flex;
  387. flex-direction: column;
  388. }
  389. @keyframes slideUp {
  390. from {
  391. opacity: 0;
  392. transform: translateY(100rpx) scale(0.95);
  393. }
  394. to {
  395. opacity: 1;
  396. transform: translateY(0) scale(1);
  397. }
  398. }
  399. /* 可滚动的内容区域 */
  400. .modal-content {
  401. flex: 1;
  402. overflow-y: auto;
  403. max-height: calc(80vh - 150rpx);
  404. }
  405. /* 模态框头部 */
  406. .modal-header {
  407. display: flex;
  408. justify-content: space-between;
  409. align-items: flex-start;
  410. padding: 40rpx 40rpx 30rpx;
  411. background: linear-gradient(135deg, #f0f9f1 0%, #ffffff 100%);
  412. border-bottom: 2rpx solid #f0f5f1;
  413. }
  414. .header-left {
  415. display: flex;
  416. align-items: flex-start;
  417. flex: 1;
  418. }
  419. .modal-avatar {
  420. width: 120rpx;
  421. height: 120rpx;
  422. border-radius: 50%;
  423. margin-right: 25rpx;
  424. border: 4rpx solid white;
  425. box-shadow: 0 6rpx 20rpx rgba(0, 0, 0, 0.1);
  426. }
  427. .expert-intro {
  428. flex: 1;
  429. }
  430. .modallei {
  431. display: flex;
  432. align-items: center;
  433. }
  434. .modal-name {
  435. display: block;
  436. font-size: 38rpx;
  437. font-weight: bold;
  438. color: #333;
  439. }
  440. .title-status {
  441. display: flex;
  442. align-items: center;
  443. margin: 10rpx 0;
  444. }
  445. .modal-title {
  446. font-size: 28rpx;
  447. color: #2c8c34;
  448. background: #f0f9f1;
  449. padding: 0rpx 10rpx;
  450. border-radius: 10rpx;
  451. font-weight: 500;
  452. margin: 0 20rpx;
  453. }
  454. .modal-status {
  455. display: flex;
  456. align-items: center;
  457. font-size: 26rpx;
  458. padding: 6rpx 15rpx;
  459. border-radius: 10rpx;
  460. font-weight: 500;
  461. }
  462. .modal-status.online {
  463. background: #e8f5e9;
  464. color: #2c8c34;
  465. }
  466. .modal-status.offline {
  467. background: #f5f5f5;
  468. color: #757575;
  469. }
  470. .status-dot {
  471. width: 12rpx;
  472. height: 12rpx;
  473. border-radius: 50%;
  474. margin-right: 8rpx;
  475. background: currentColor;
  476. }
  477. /* 专家简介 */
  478. .expert-bio {
  479. padding: 30rpx 40rpx;
  480. border-bottom: 2rpx solid #f0f5f1;
  481. }
  482. .bio-header {
  483. display: flex;
  484. align-items: center;
  485. margin-bottom: 10rpx;
  486. }
  487. .bio-title {
  488. font-size: 30rpx;
  489. font-weight: bold;
  490. color: #333;
  491. }
  492. .bio-content {
  493. font-size: 28rpx;
  494. color: #555;
  495. line-height: 1.6;
  496. }
  497. /* 联系方式区域 */
  498. .contact-section {
  499. padding: 30rpx 40rpx;
  500. border-bottom: 2rpx solid #f0f5f1;
  501. }
  502. .contact-item {
  503. display: flex;
  504. align-items: center;
  505. padding: 25rpx 0;
  506. }
  507. .contact-item:not(:last-child) {
  508. border-bottom: 1rpx solid #f5f5f5;
  509. }
  510. .contact-icon-container {
  511. width: 60rpx;
  512. height: 60rpx;
  513. border-radius: 18rpx;
  514. display: flex;
  515. align-items: center;
  516. justify-content: center;
  517. margin-right: 20rpx;
  518. }
  519. .phone-item .contact-icon-container {
  520. background: linear-gradient(135deg, #e8f5e9 0%, #c8e6c9 100%);
  521. }
  522. .email-item .contact-icon-container {
  523. background: linear-gradient(135deg, #e3f2fd 0%, #bbdefb 100%);
  524. }
  525. .institution-item .contact-icon-container {
  526. background: linear-gradient(135deg, #f3e5f5 0%, #e1bee7 100%);
  527. }
  528. .contact-item-icon {
  529. width: 32rpx;
  530. height: 32rpx;
  531. }
  532. .contact-info {
  533. flex: 1;
  534. }
  535. .contact-label {
  536. display: block;
  537. font-size: 26rpx;
  538. color: #888;
  539. margin-bottom: 6rpx;
  540. }
  541. .contact-value {
  542. display: block;
  543. font-size: 28rpx;
  544. color: #333;
  545. font-weight: 600;
  546. margin-bottom: 4rpx;
  547. }
  548. .contact-desc {
  549. display: block;
  550. font-size: 24rpx;
  551. color: #aaa;
  552. }
  553. .action-btn {
  554. display: flex;
  555. align-items: center;
  556. justify-content: center;
  557. border-radius: 50rpx;
  558. font-size: 22rpx;
  559. font-weight: 600;
  560. border: none;
  561. transition: all 0.3s;
  562. }
  563. .call-btn {
  564. background: linear-gradient(135deg, #4caf50 0%, #2c8c34 100%);
  565. color: white;
  566. }
  567. .copy-btn {
  568. background: linear-gradient(135deg, #2196f3 0%, #1976d2 100%);
  569. color: white;
  570. }
  571. .address-btn {
  572. background: linear-gradient(135deg, #9c27b0 0%, #7b1fa2 100%);
  573. color: white;
  574. }
  575. .action-btn:active {
  576. transform: scale(0.95);
  577. }
  578. /* 咨询时间 */
  579. .consultation-time {
  580. padding: 30rpx 40rpx;
  581. border-bottom: 2rpx solid #f0f5f1;
  582. }
  583. .time-header {
  584. display: flex;
  585. align-items: center;
  586. margin-bottom: 20rpx;
  587. }
  588. .time-title {
  589. font-size: 30rpx;
  590. font-weight: bold;
  591. color: #333;
  592. }
  593. .time-content {
  594. display: block;
  595. font-size: 28rpx;
  596. color: #555;
  597. line-height: 1.5;
  598. margin-bottom: 20rpx;
  599. }
  600. .time-slots {
  601. display: flex;
  602. gap: 20rpx;
  603. }
  604. .time-slot {
  605. background: #f8faf9;
  606. padding: 10rpx 20rpx;
  607. border-radius: 15rpx;
  608. font-size: 24rpx;
  609. color: #666;
  610. border: 1rpx solid #e8f5e9;
  611. }
  612. /* 操作按钮(固定在底部) */
  613. .modal-actions {
  614. display: flex;
  615. padding: 30rpx 40rpx;
  616. gap: 20rpx;
  617. border-top: 2rpx solid #f0f5f1;
  618. background: white;
  619. flex-shrink: 0;
  620. }
  621. .secondary-btn,
  622. .primary-btn {
  623. flex: 1;
  624. border-radius: 50rpx;
  625. font-size: 32rpx;
  626. font-weight: bold;
  627. transition: all 0.3s;
  628. }
  629. .secondary-btn {
  630. background: #f8faf9;
  631. color: #666;
  632. border:1px solid #F0F5F1;
  633. }
  634. .secondary-btn::after {
  635. display: none;
  636. }
  637. .primary-btn {
  638. background: linear-gradient(135deg, #4caf50 0%, #2c8c34 100%);
  639. color: white;
  640. box-shadow: 0 6rpx 20rpx rgba(44, 140, 52, 0.3);
  641. }
  642. .secondary-btn:active,
  643. .primary-btn:active {
  644. transform: scale(0.98);
  645. }