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

888 lines
21 KiB

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