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

768 lines
12 KiB

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