爱简收旧衣按件回收前端代码仓库
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.

895 lines
21 KiB

5 months ago
4 months ago
5 months ago
5 months ago
5 months ago
4 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
4 months ago
5 months ago
4 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
4 months ago
5 months ago
4 months ago
4 months ago
5 months ago
5 months ago
5 months ago
5 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
4 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
4 months ago
5 months ago
5 months ago
5 months ago
5 months ago
4 months ago
4 months ago
4 months ago
4 months ago
5 months ago
5 months ago
  1. <template>
  2. <view class="container safe-area">
  3. <!-- 顶部banner -->
  4. <view class="banner">
  5. <swiper
  6. :indicator-dots="false"
  7. :autoplay="true"
  8. :interval="3000"
  9. :duration="500"
  10. circular
  11. style="width: 100%; height: 380rpx;"
  12. >
  13. <swiper-item v-for="(item, index) in bannerList" :key="item.id || index">
  14. <image :src="item.image" mode="aspectFill" style="width: 100%; height: 100%;" v-if="item.type == 0"/>
  15. <video :src="item.voUrl" mode="aspectFill" style="width: 100%; height: 100%;" v-else/>
  16. </swiper-item>
  17. </swiper>
  18. </view>
  19. <view class="content">
  20. <!-- 回收流程 -->
  21. <view class="process-section">
  22. <view class="section-header">
  23. <text class="title">回收流程</text>
  24. </view>
  25. <view class="process-grid">
  26. <view class="process-item" v-for="(item, index) in processes" :key="index">
  27. <image :src="item.icon" mode="aspectFit" class="process-icon"></image>
  28. <text class="process-text">{{item.text}}</text>
  29. <!-- <text class="process-number">{{index + 1}}</text> -->
  30. </view>
  31. </view>
  32. <button class="submit-btn" hover-class="submit-btn-hover" @click="getPickupto">
  33. <text class="submit-btn-hearder">快速免费上门</text>
  34. <text class="btn-desc">点击开始预约</text>
  35. <image src="/static/home/1745478917401 3.png" mode="aspectFit" class="arrow-icon"></image>
  36. <image src="/static/home/1745478917401 4.png" mode="aspectFit" class="arrow-icon-left"></image>
  37. </button>
  38. </view>
  39. <uv-divider :dashed="true" ></uv-divider>
  40. <!-- 服务城市 -->
  41. <view class="city-section" @click="goCity">
  42. <view class="city-header">
  43. <text>已开通包邮服务城市有哪些</text>
  44. <uni-icons type="right" size="16" color="#999"></uni-icons>
  45. </view>
  46. <text class="city-list">{{ cityListStr }}</text>
  47. </view>
  48. <view class="Xiadan-section">
  49. <image :src="addressCion" alt="" class="process-icon"/>
  50. <text class="left-text">不会下单联系客服了解回收流程</text>
  51. <view class="right" @click="goService">
  52. <image src="/static/home/联系客服.png" mode=""></image>
  53. <text>联系客服</text>
  54. </view>
  55. </view>
  56. <!-- 关于我们 -->
  57. <view class="about-section">
  58. <view class="section-header">
  59. <text class="title">关于我们</text>
  60. </view>
  61. <view class="about-footer" @click="goAbout">
  62. <view class="about-header">
  63. <image :src="sbkCion" mode="aspectFit" class="logo"></image>
  64. <!-- <text class="about-title">关于我们</text> -->
  65. </view>
  66. <view class="about-content">
  67. <text>免费寄送件验秒到账助环保</text>
  68. <text class="about-desc">让二手交易更轻松让地球多一份绿意</text>
  69. </view>
  70. <uni-icons type="right" size="16" color="#999"></uni-icons>
  71. </view>
  72. </view>
  73. <!-- 价格概览 -->
  74. <view class="price-section"
  75. @click="changeTo(1)">
  76. <view class="section-header">
  77. <text class="title">价格概览</text>
  78. <view class="more">
  79. <uni-icons type="right" size="14" color="#999"></uni-icons>
  80. <text>查看更多</text>
  81. </view>
  82. </view>
  83. <view class="price-grid">
  84. <view class="price-item" v-for="(item, index) in priceList" :key="item.id || index"
  85. @tap.stop="goToRecycleCategory(item.id)">
  86. <image v-if="item.icon"
  87. :src="item.icon"
  88. mode="aspectFill"
  89. style="width: 200rpx;height: 200rpx;"
  90. class="item-icon"></image>
  91. <view v-else class="item-icon placeholder"></view>
  92. <text class="item-name">{{item.name}}</text>
  93. <text class="item-price">¥ {{item.price}}
  94. <text class="item-price-right">/{{item.unit}}</text>
  95. </text>
  96. </view>
  97. </view>
  98. </view>
  99. <!-- 最近回收 -->
  100. <view class="recent-section">
  101. <view class="section-header">
  102. <text class="title">最近回收</text>
  103. </view>
  104. <view class="records-grid">
  105. <view
  106. class="record-item"
  107. v-for="(item, index) in records"
  108. :key="index"
  109. @tap="goToInspectionReport(item)"
  110. >
  111. <image :src="item.image" mode=""></image>
  112. <text class="location">{{item.name}}</text>
  113. <text class="user-id">****{{item.phone ? item.phone.slice(-4) : ''}}</text>
  114. <text class="user-id-f">成功完成衣物回收已到账</text>
  115. <text class="amount">+ ¥{{item.price}}</text>
  116. </view>
  117. </view>
  118. </view>
  119. <!-- 回收去向 -->
  120. <view class="destination-section">
  121. <view class="section-header">
  122. <text class="title">回收去向</text>
  123. </view>
  124. <view class="destination-grid">
  125. <view class="destination-item " :class="`destination-item${index + 1}`" v-for="(item, index) in destinations" :key="index">
  126. <image :src="item.icon" mode="aspectFit" class="dest-icon"></image>
  127. <view class="dest-info">
  128. <text class="dest-title">{{item.title}}</text>
  129. <text class="dest-desc">{{item.desc}}</text>
  130. </view>
  131. </view>
  132. </view>
  133. </view>
  134. </view>
  135. <!-- 根据角色显示不同的导航栏 -->
  136. <uv-tabbar
  137. :value="value"
  138. :fixed="true"
  139. @change="changeTo"
  140. >
  141. <uv-tabbar-item text="首页" >
  142. <template v-slot:active-icon>
  143. <image class="icon" src="/static/home/首页-点击.png"></image>
  144. </template>
  145. <template v-slot:inactive-icon>
  146. <image class="icon" src="/static/home/首页-未点击.png"></image>
  147. </template>
  148. </uv-tabbar-item>
  149. <uv-tabbar-item text="回收" >
  150. <template v-slot:active-icon>
  151. <image class="icon" src="/static/home/回收-点击.png"></image>
  152. </template>
  153. <template v-slot:inactive-icon>
  154. <image class="icon" src="/static/home/回收-未点击.png"></image>
  155. </template>
  156. </uv-tabbar-item>
  157. <uv-tabbar-item text="我的" >
  158. <template v-slot:active-icon>
  159. <image class="icon" src="/static/home/我的-点击.png"></image>
  160. </template>
  161. <template v-slot:inactive-icon>
  162. <image class="icon" src="/static/home/我的-未点击.png"></image>
  163. </template>
  164. </uv-tabbar-item>
  165. </uv-tabbar>
  166. </view>
  167. </template>
  168. <script>
  169. import pullRefreshMixin from '../mixins/pullRefreshMixin.js'
  170. export default {
  171. mixins: [pullRefreshMixin],
  172. data() {
  173. return {
  174. value:0,
  175. processes: [
  176. ],
  177. priceList: [],
  178. records: [],
  179. destinations: [
  180. {
  181. icon: '/static/home/爱心援乡.png',
  182. title: '爱心援乡',
  183. desc: '精准帮扶贫困群体'
  184. },
  185. {
  186. icon: '/static/home/回塑新源.png',
  187. title: '回塑新源',
  188. desc: '塑料的第二次成型'
  189. },
  190. {
  191. icon: '/static/home/织物出海.png',
  192. title: '织物出海',
  193. desc: '分拣出最高价值'
  194. },
  195. {
  196. icon: '/static/home/碳循再生.png',
  197. title: '碳循再生',
  198. desc: '减碳从出发生系统'
  199. }
  200. ],
  201. bannerList: [],
  202. pricePreviewList: [],
  203. cityList: [],
  204. addressCion: '',
  205. sbkCion: '',
  206. }
  207. },
  208. computed: {
  209. cityListStr() {
  210. // 只取前8个城市,超出用...结尾
  211. const names = this.cityList.map(c => c.name)
  212. const max = 8
  213. if (names.length > max) {
  214. return names.slice(0, max).join('、') + '...'
  215. }
  216. return names.join('、')
  217. },
  218. address_cion() {
  219. console.log(getApp().globalData.configData,'home-getApp().globalData.configData')
  220. const item = getApp().globalData.configData.find(i => i.keyName === 'address_cion')
  221. return item ? item.keyContent : ''
  222. },
  223. sbk_cion() {
  224. const item = getApp().globalData.configData.find(i => i.keyName === 'sbk_cion')
  225. return item ? item.keyContent : ''
  226. }
  227. },
  228. methods: {
  229. changeTo(e){
  230. this.value = e
  231. console.log(e,'111')
  232. if(e==1){
  233. uni.reLaunch({
  234. url: '/pages/component/recycle'
  235. },true);
  236. }else if(e == 2){
  237. uni.reLaunch({
  238. url: '/pages/component/my'
  239. },true);
  240. }
  241. },
  242. goAbout(){
  243. uni.navigateTo({
  244. url: '/pages/subcomponent/about'
  245. })
  246. },
  247. goCity(){
  248. uni.navigateTo({
  249. url: '/pages/baoyou-city/baoyou-city'
  250. })
  251. },
  252. getPickupto(){
  253. uni.switchTab({
  254. url: '/pages/component/recycle'
  255. })
  256. },
  257. async onRefresh() {
  258. await new Promise(resolve => setTimeout(resolve, 1000))
  259. },
  260. getAreaList() {
  261. this.$api('getAreaList', {}, (res) => {
  262. console.log(res,'getAreaList');
  263. if (res.code == 200 && Array.isArray(res.result)) {
  264. // 按sort升序排序
  265. const sorted = res.result.slice().sort((a, b) => a.sort - b.sort)
  266. this.processes = sorted.map(item => ({
  267. // id: item.id,
  268. icon: item.image,
  269. text: item.title
  270. }))
  271. }
  272. })
  273. },
  274. goService(){
  275. uni.navigateTo({
  276. url: '/pages/subcomponent/admin_faq'
  277. })
  278. },
  279. goToRecycleCategory(id) {
  280. getApp().globalData.targetRecycleCategoryId = id
  281. console.log(getApp().globalData.targetRecycleCategoryId,'getApp().globalData.targetRecycleCategoryId')
  282. uni.switchTab({
  283. url: '/pages/component/recycle'
  284. })
  285. },
  286. getPricePreview() {
  287. const resList = this.pricePreviewList || []
  288. if (Array.isArray(resList)) {
  289. // 只取一级分类,按sort升序
  290. const firstLevel = resList.filter(item => item.pid === '0').sort((a, b) => a.sort - b.sort)
  291. // console.log(firstLevel,'firstLevel');
  292. this.priceList = firstLevel.map(item => {
  293. // 从静态表中找图片和价格
  294. // const staticItem = this.priceListStatic.find(s => s.name.replace(/\s/g, '') === item.title.replace(/\s/g, ''))
  295. // console.log(item,'item');
  296. return {
  297. id: item.id, // 保证有id
  298. icon: item.icon ? item.icon : '',
  299. name: item.title,
  300. price: item.priceNo ? item.priceNo : '',
  301. unit: item.unit ? item.unit : ''
  302. }
  303. })
  304. }
  305. },
  306. getRecentGoods() {
  307. this.$api('getRecentGoodsList', {}, res => {
  308. if (res && res.code === 200 && Array.isArray(res.result) && res.result.length > 0) {
  309. this.records = res.result.map(item => ({
  310. id: item.id,
  311. image: item.image,
  312. name: item.name,
  313. phone: item.phone,
  314. price: item.price
  315. }))
  316. } else {
  317. this.records = []
  318. }
  319. })
  320. },
  321. goToInspectionReport(item) {
  322. uni.navigateTo({
  323. url: `/pages/subcomponent/inspection-report?id=${item.id}`
  324. })
  325. },
  326. getFreeCityList() {
  327. this.$api('getFreeCityList', {}, res => {
  328. if (res && res.code === 200 && Array.isArray(res.result)) {
  329. // 只取一级城市(有children的name)
  330. this.cityList = res.result.map(item => ({ name: item.name })).filter(item => item.name)
  331. } else {
  332. this.cityList = []
  333. }
  334. })
  335. },
  336. updateCionData() {
  337. const configData = getApp().globalData.configData || [];
  338. const address = configData.find(i => i.keyName === 'address_cion');
  339. const sbk = configData.find(i => i.keyName === 'sbk_cion');
  340. this.addressCion = address ? address.keyContent : '';
  341. this.sbkCion = sbk ? sbk.keyContent : '';
  342. },
  343. },
  344. onLoad() {
  345. this.getAreaList();
  346. this.getPricePreview();
  347. this.getRecentGoods();
  348. this.pricePreviewList = getApp().globalData.pricePreviewList || []
  349. this.bannerList = getApp().globalData.bannerList || []
  350. this.getFreeCityList();
  351. uni.$on('pricePreviewListUpdated', () => {
  352. this.pricePreviewList = getApp().globalData.pricePreviewList || []
  353. this.getPricePreview()
  354. })
  355. uni.$on('bannerListUpdated', () => {
  356. this.bannerList = getApp().globalData.bannerList || []
  357. })
  358. },
  359. onUnload() {
  360. uni.$off('pricePreviewListUpdated')
  361. uni.$off('bannerListUpdated')
  362. uni.$off('configDataUpdated', this.updateCionData)
  363. },
  364. onShow() {
  365. this.updateCionData();
  366. // 监听全局数据更新
  367. uni.$on('configDataUpdated', this.updateCionData);
  368. this.getPricePreview();
  369. }
  370. }
  371. </script>
  372. <style lang="scss" scoped>
  373. .container {
  374. min-height: 100vh;
  375. background-color: #f8f8f8;
  376. display: flex;
  377. flex-direction: column;
  378. padding-bottom: calc(var(--window-bottom) + 70px);
  379. }
  380. .safe-area {
  381. padding-bottom: constant(safe-area-inset-bottom);
  382. padding-bottom: env(safe-area-inset-bottom);
  383. }
  384. .banner {
  385. width: 100%;
  386. height: 380rpx;
  387. position: relative;
  388. overflow: hidden;
  389. border-radius: 0 0 30rpx 30rpx;
  390. image {
  391. width: 100%;
  392. height: 100%;
  393. }
  394. }
  395. .content {
  396. // flex: 1;
  397. width: 90%;
  398. margin: -70rpx auto 0;
  399. position: relative;
  400. z-index: 3;
  401. padding-bottom: 20rpx;
  402. }
  403. .Xiadan-section{
  404. display: flex;
  405. // justify-content: space-around;
  406. align-items: center;
  407. margin-bottom: 20rpx;
  408. background: linear-gradient(to bottom, #fff3db 0%,#fffefb 50%);
  409. image{
  410. width: 80rpx;
  411. height: 80rpx;
  412. }
  413. .left-text{
  414. font-family: PingFang SC;
  415. font-weight: 400;
  416. font-size: 12px;
  417. line-height: 140%;
  418. letter-spacing: 0%;
  419. }
  420. .right{
  421. display: flex;
  422. // flex-direction: row-reverse;
  423. box-sizing: border-box;
  424. align-items: center;
  425. justify-content: center;
  426. background-color: #fff0d2;
  427. color: #da7143;
  428. font-size: 24rpx;
  429. // flex-grow: 2;
  430. border: 1px solid #da7143;
  431. border-radius: 10rpx;
  432. width: 25%;
  433. image{
  434. width: 40rpx;
  435. height: 40rpx;
  436. }
  437. }
  438. }
  439. .section-header {
  440. display: flex;
  441. // justify-content: space-around;
  442. align-items: center;
  443. margin-bottom: 20rpx;
  444. .title {
  445. font-size: 32rpx;
  446. font-weight: bold;
  447. color: #333;
  448. }
  449. .more {
  450. // justify-content: right;
  451. display: flex;
  452. flex-direction: row-reverse;
  453. align-items: center;
  454. color: #999;
  455. font-size: 24rpx;
  456. flex-grow: 2;
  457. // width: 100%;
  458. // margin-right: 0 auto;
  459. }
  460. }
  461. .process-section {
  462. background: #fff;
  463. border-radius: 50rpx;
  464. padding: 30rpx;
  465. margin-bottom: 20rpx;
  466. background: linear-gradient(to bottom, #fff5e1 0%,#fffefb 30%);
  467. .contact-service {
  468. display: flex;
  469. align-items: center;
  470. font-size: 24rpx;
  471. color: #666;
  472. border: 1px solid #da7143;
  473. background-color: #fff0d2;
  474. .service-icon {
  475. width: 32rpx;
  476. height: 32rpx;
  477. margin-right: 8rpx;
  478. }
  479. }
  480. .process-grid {
  481. display: grid;
  482. grid-template-columns: repeat(4, 1fr);
  483. gap: 20rpx;
  484. margin: 30rpx 0;
  485. border: none;
  486. }
  487. .process-item {
  488. position: relative;
  489. display: flex;
  490. flex-direction: column;
  491. align-items: center;
  492. background-color: #fff8ea;
  493. // left: 0; right: 0;
  494. .process-icon {
  495. width: 80rpx;
  496. height: 80rpx;
  497. margin-bottom: 10rpx;
  498. }
  499. .process-text {
  500. font-size: 24rpx;
  501. color: #333;
  502. }
  503. .process-number {
  504. position: absolute;
  505. top: -10rpx;
  506. left: 50%;
  507. transform: translateX(-50%);
  508. font-size: 24rpx;
  509. color: #999;
  510. }
  511. }
  512. .submit-btn {
  513. background: linear-gradient(to right, #ffd01e, #ff8917);
  514. border-radius: 70rpx;
  515. padding: 20rpx;
  516. text-align: center;
  517. position: relative;
  518. border: none;
  519. display: flex;
  520. flex-direction: column;
  521. overflow: visible;
  522. text {
  523. color: #ffffff;
  524. font-size: 32rpx;
  525. font-weight: bold;
  526. line-height: 40rpx;
  527. // display: block;
  528. }
  529. .btn-desc {
  530. font-size: 24rpx;
  531. font-weight: normal;
  532. // margin-top: 4rpx;
  533. }
  534. .arrow-icon {
  535. position: absolute;
  536. right: 10rpx;
  537. top: 10%;
  538. transform: translateY(-50%);
  539. width: 40rpx;
  540. height: 40rpx;
  541. // z-index: 5;
  542. }
  543. .arrow-icon-left {
  544. position: absolute;
  545. left: 1rpx;
  546. top: 90%;
  547. transform: translateY(-50%);
  548. width: 40rpx;
  549. height: 40rpx;
  550. // z-index: 4;
  551. }
  552. }
  553. .submit-btn::after{
  554. border: none !important;
  555. }
  556. }
  557. .city-section {
  558. background: #fff;
  559. border-radius: 20rpx;
  560. padding: 30rpx;
  561. margin-bottom: 20rpx;
  562. .city-header {
  563. display: flex;
  564. justify-content: space-between;
  565. align-items: center;
  566. font-size: 28rpx;
  567. color: #333;
  568. margin-bottom: 10rpx;
  569. }
  570. .city-list {
  571. font-size: 24rpx;
  572. color: #999;
  573. }
  574. }
  575. .price-section {
  576. background: #f0f9eb;
  577. border-radius: 20rpx;
  578. padding: 30rpx;
  579. margin-bottom: 20rpx;
  580. background-color: #fffefb;
  581. background: linear-gradient(to bottom, #fff3db 0%,#fffefb 5%);
  582. .section-header{
  583. margin-bottom: 40rpx;
  584. }
  585. .price-grid {
  586. display: grid;
  587. grid-template-columns: repeat(2, 1fr);
  588. gap: 20rpx;
  589. }
  590. .price-item {
  591. display: flex;
  592. flex-direction: column;
  593. align-items: center;
  594. background: #fff;
  595. border-radius: 16rpx;
  596. padding: 30rpx;
  597. background-color: #fff8ea;
  598. .item-icon {
  599. width: 80rpx;
  600. height: 80rpx;
  601. margin-bottom: 10rpx;
  602. &.placeholder {
  603. width: 80rpx;
  604. height: 80rpx;
  605. margin-bottom: 10rpx;
  606. background: #f5f5f5;
  607. border-radius: 16rpx;
  608. }
  609. }
  610. .item-name {
  611. font-size: 26rpx;
  612. color: #333;
  613. margin-bottom: 6rpx;
  614. }
  615. .item-price {
  616. font-family: PingFang SC;
  617. font-weight: 400;
  618. font-size: 24rpx;
  619. line-height: 140%;
  620. letter-spacing: 0%;
  621. text-align: center;
  622. .item-price-right{
  623. text-align: center;
  624. font-size: 24rpx;
  625. color: #666;
  626. line-height: 140%;
  627. letter-spacing: 0%;
  628. }
  629. }
  630. }
  631. }
  632. .recent-section {
  633. background: #f0f9eb;
  634. border-radius: 20rpx;
  635. padding: 30rpx;
  636. margin-bottom: 20rpx;
  637. background-color: #fffefb;
  638. background: linear-gradient(to bottom, #e8ffe0 0%,#fffefb 15%);
  639. .records-grid {
  640. display: grid;
  641. grid-template-columns: repeat(3, 1fr);
  642. gap: 20rpx;
  643. }
  644. .record-item {
  645. display: flex;
  646. flex-direction: column;
  647. align-items: center;
  648. background: linear-gradient(to top, #e8ffe0 0%,#fffefb 100%);
  649. border-radius: 16rpx;
  650. padding: 10rpx;
  651. background-color: #fff8ea;
  652. image{
  653. width: 60rpx;
  654. height: 60rpx;
  655. }
  656. .location {
  657. font-size: 28rpx;
  658. color: #333;
  659. font-weight: bold;
  660. }
  661. .amount {
  662. font-size: 30rpx;
  663. color: #13ac47;
  664. font-weight: bold;
  665. margin: 6rpx 0;
  666. }
  667. .user-id {
  668. font-family: PingFang SC;
  669. font-weight: 500;
  670. font-size: 24rpx;
  671. line-height: 140%;
  672. letter-spacing: 0%;
  673. text-align: center;
  674. color: #183c5c;
  675. }
  676. .user-id-f{
  677. font-family: PingFang SC;
  678. font-weight: 400;
  679. font-size: 22rpx;
  680. line-height: 140%;
  681. letter-spacing: 0%;
  682. text-align: center;
  683. color: #9b9b9b;
  684. }
  685. }
  686. }
  687. .destination-section {
  688. // background: #fff;
  689. border-radius: 20rpx;
  690. padding: 30rpx;
  691. margin-bottom: 20rpx;
  692. background: linear-gradient(to bottom, #f2f0fc 0%,#fffefb 10%);
  693. padding-bottom: calc(var(--window-bottom) + 60px);
  694. .destination-grid {
  695. display: grid;
  696. grid-template-columns: repeat(2, 1fr);
  697. gap: 20rpx;
  698. }
  699. .destination-item {
  700. display: flex;
  701. align-items: center;
  702. // background: #fff9f9;
  703. border-radius: 16rpx;
  704. padding: 20rpx;
  705. .dest-icon {
  706. width: 60rpx;
  707. height: 60rpx;
  708. margin-right: 16rpx;
  709. }
  710. .dest-info {
  711. flex: 1;
  712. .dest-title {
  713. font-size: 26rpx;
  714. color: #333;
  715. margin-bottom: 4rpx;
  716. }
  717. .dest-desc {
  718. font-size: 22rpx;
  719. color: #999;
  720. }
  721. }
  722. }
  723. }
  724. .destination-item1{
  725. background: linear-gradient(to top, #ffebeb,#fffefb);
  726. }
  727. .destination-item2{
  728. background: linear-gradient(to top, #ebf8ff,#fffefb);
  729. }
  730. .destination-item3{
  731. background: linear-gradient(to top, #ebedff,#fffefb);
  732. }
  733. .destination-item4{
  734. background: linear-gradient(to top, #ebfff2,#fffefb);
  735. }
  736. .about-section {
  737. background: linear-gradient(to bottom, #fff3db 0%,#fffefb 30%);
  738. border-radius: 20rpx;
  739. padding: 30rpx;
  740. display: flex;
  741. justify-content: space-between;
  742. flex-direction: column;
  743. .about-footer{
  744. display: flex;
  745. flex-direction: row;
  746. align-items: center;
  747. justify-content: center;
  748. }
  749. .about-header {
  750. display: flex;
  751. align-items: center;
  752. .logo {
  753. width: 60rpx;
  754. height: 60rpx;
  755. margin-right: 16rpx;
  756. }
  757. .about-title {
  758. font-size: 28rpx;
  759. color: #333;
  760. }
  761. }
  762. .about-content {
  763. flex: 1;
  764. margin-left: 20rpx;
  765. text {
  766. display: block;
  767. font-size: 26rpx;
  768. color: #333;
  769. }
  770. .about-desc {
  771. font-size: 22rpx;
  772. color: #999;
  773. margin-top: 4rpx;
  774. }
  775. }
  776. }
  777. .tab-bar {
  778. position: fixed;
  779. bottom: 0;
  780. left: 0;
  781. right: 0;
  782. height: 100rpx;
  783. background-color: #fff;
  784. display: flex;
  785. justify-content: space-around;
  786. align-items: center;
  787. border-top: 1rpx solid #f5f5f5;
  788. box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05);
  789. .tab-item {
  790. display: flex;
  791. flex-direction: column;
  792. align-items: center;
  793. padding: 10rpx 0;
  794. transition: all 0.3s ease;
  795. .tab-icon {
  796. width: 48rpx;
  797. height: 48rpx;
  798. margin-bottom: 6rpx;
  799. }
  800. text {
  801. font-size: 22rpx;
  802. color: #666;
  803. transition: color 0.3s ease;
  804. }
  805. &.active {
  806. text {
  807. color: #ff5e00;
  808. }
  809. }
  810. &:active {
  811. transform: scale(0.95);
  812. }
  813. }
  814. }
  815. @keyframes fadeInUp {
  816. from {
  817. opacity: 0;
  818. transform: translateY(20rpx);
  819. }
  820. to {
  821. opacity: 1;
  822. transform: translateY(0);
  823. }
  824. }
  825. @keyframes fadeInScale {
  826. from {
  827. opacity: 0;
  828. transform: scale(0.8);
  829. }
  830. to {
  831. opacity: 1;
  832. transform: scale(1);
  833. }
  834. }
  835. </style>