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

856 lines
20 KiB

1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week 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">武汉市北京市上海市武汉市北京市上海市...</text>
  46. </view>
  47. <view class="Xiadan-section">
  48. <image src="/static/home/不会下单.png" 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="/static/home/关于我们.png" 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. // { icon: '/static/home/① 在线预约.png', text: '在线预约' },
  170. // { icon: '/static/home/② 快递上门.png', text: '快递上门' },
  171. // { icon: '/static/home/③ 透明质检.png', text: '透明质检' },
  172. // { icon: '/static/home/④ 现金打款.png', text: '现金打款' }
  173. ],
  174. priceList: [],
  175. priceListStatic: [
  176. { icon: '/static/home/羽绒服.png', name: '羽绒服', price: '3-10', unit: '件' },
  177. { icon: '/static/home/鞋子.png', name: '鞋子', price: '3-10', unit: '件' },
  178. { icon: '/static/home/包包.png', name: '包包', price: '3-10', unit: '件' },
  179. { icon: '/static/home/床被.png', name: '床被', price: '3-10', unit: '件' },
  180. { icon: '/static/home/品牌服饰.png', name: '品牌服饰', price: '3-10', unit: '件' },
  181. { icon: '/static/home/T 恤衬衣.png', name: 'T恤衬衫', price: '3-10', unit: '件' },
  182. { icon: '/static/home/羽绒裤.png', name: '羽绒裤', price: '3-10', unit: '件' },
  183. { icon: '/static/home/儿童羽绒服.png', name: '儿童羽绒服', price: '3-10', unit: '件' }
  184. ],
  185. records: [],
  186. destinations: [
  187. {
  188. icon: '/static/home/爱心援乡.png',
  189. title: '爱心援乡',
  190. desc: '精准帮扶贫困群体'
  191. },
  192. {
  193. icon: '/static/home/回塑新源.png',
  194. title: '回塑新源',
  195. desc: '塑料的第二次成型'
  196. },
  197. {
  198. icon: '/static/home/织物出海.png',
  199. title: '织物出海',
  200. desc: '分拣出最高价值'
  201. },
  202. {
  203. icon: '/static/home/碳循再生.png',
  204. title: '碳循再生',
  205. desc: '减碳从出发生系统'
  206. }
  207. ],
  208. bannerList: [],
  209. pricePreviewList: []
  210. }
  211. },
  212. methods: {
  213. changeTo(e){
  214. this.value = e
  215. console.log(e,'111')
  216. if(e==1){
  217. uni.reLaunch({
  218. url: '/pages/component/recycle'
  219. },true);
  220. }else if(e == 2){
  221. uni.reLaunch({
  222. url: '/pages/component/my'
  223. },true);
  224. }
  225. },
  226. goAbout(){
  227. uni.navigateTo({
  228. url: '/pages/subcomponent/about'
  229. })
  230. },
  231. goCity(){
  232. uni.navigateTo({
  233. url: '/pages/baoyou-city/baoyou-city'
  234. })
  235. },
  236. getPickupto(){
  237. uni.switchTab({
  238. url: '/pages/component/recycle'
  239. })
  240. },
  241. async onRefresh() {
  242. await new Promise(resolve => setTimeout(resolve, 1000))
  243. },
  244. getAreaList() {
  245. this.$api('getAreaList', {}, (res) => {
  246. console.log(res,'getAreaList');
  247. if (res.code == 200 && Array.isArray(res.result)) {
  248. // 按sort升序排序
  249. const sorted = res.result.slice().sort((a, b) => a.sort - b.sort)
  250. this.processes = sorted.map(item => ({
  251. // id: item.id,
  252. icon: item.image,
  253. text: item.title
  254. }))
  255. }
  256. })
  257. },
  258. goService(){
  259. uni.navigateTo({
  260. url: '/pages/subcomponent/admin_faq'
  261. })
  262. },
  263. goToRecycleCategory(id) {
  264. getApp().globalData.targetRecycleCategoryId = id
  265. console.log(getApp().globalData.targetRecycleCategoryId,'getApp().globalData.targetRecycleCategoryId')
  266. uni.switchTab({
  267. url: '/pages/component/recycle'
  268. })
  269. },
  270. getPricePreview() {
  271. const resList = this.pricePreviewList || []
  272. if (Array.isArray(resList)) {
  273. // 只取一级分类,按sort升序
  274. const firstLevel = resList.filter(item => item.pid === '0').sort((a, b) => a.sort - b.sort)
  275. this.priceList = firstLevel.map(item => {
  276. // 从静态表中找图片和价格
  277. const staticItem = this.priceListStatic.find(s => s.name.replace(/\s/g, '') === item.title.replace(/\s/g, ''))
  278. return {
  279. id: item.id, // 保证有id
  280. icon: staticItem ? staticItem.icon : '',
  281. name: item.title,
  282. price: staticItem ? staticItem.price : '',
  283. unit: '件'
  284. }
  285. })
  286. }
  287. },
  288. getRecentGoods() {
  289. this.$api('getRecentGoodsList', {}, res => {
  290. if (res && res.code === 200 && Array.isArray(res.result) && res.result.length > 0) {
  291. this.records = res.result.map(item => ({
  292. id: item.id,
  293. image: item.image,
  294. name: item.name,
  295. phone: item.phone,
  296. price: item.price
  297. }))
  298. } else {
  299. this.records = []
  300. }
  301. })
  302. },
  303. goToInspectionReport(item) {
  304. uni.navigateTo({
  305. url: `/pages/subcomponent/inspection-report?id=${item.id}`
  306. })
  307. }
  308. },
  309. onLoad() {
  310. this.getAreaList();
  311. this.getPricePreview();
  312. this.getRecentGoods();
  313. this.pricePreviewList = getApp().globalData.pricePreviewList || []
  314. this.bannerList = getApp().globalData.bannerList || []
  315. uni.$on('pricePreviewListUpdated', () => {
  316. this.pricePreviewList = getApp().globalData.pricePreviewList || []
  317. this.getPricePreview()
  318. })
  319. uni.$on('bannerListUpdated', () => {
  320. this.bannerList = getApp().globalData.bannerList || []
  321. })
  322. },
  323. onUnload() {
  324. uni.$off('pricePreviewListUpdated')
  325. uni.$off('bannerListUpdated')
  326. },
  327. onShow() {
  328. // 移除自动下拉刷新
  329. // uni.startPullDownRefresh()
  330. }
  331. }
  332. </script>
  333. <style lang="scss" scoped>
  334. .container {
  335. min-height: 100vh;
  336. background-color: #f8f8f8;
  337. display: flex;
  338. flex-direction: column;
  339. padding-bottom: calc(var(--window-bottom) + 70px);
  340. }
  341. .safe-area {
  342. padding-bottom: constant(safe-area-inset-bottom);
  343. padding-bottom: env(safe-area-inset-bottom);
  344. }
  345. .banner {
  346. width: 100%;
  347. height: 380rpx;
  348. position: relative;
  349. overflow: hidden;
  350. border-radius: 0 0 30rpx 30rpx;
  351. image {
  352. width: 100%;
  353. height: 100%;
  354. }
  355. }
  356. .content {
  357. // flex: 1;
  358. width: 90%;
  359. margin: -70rpx auto 0;
  360. position: relative;
  361. z-index: 3;
  362. padding-bottom: 20rpx;
  363. }
  364. .Xiadan-section{
  365. display: flex;
  366. // justify-content: space-around;
  367. align-items: center;
  368. margin-bottom: 20rpx;
  369. background: linear-gradient(to bottom, #fff3db 0%,#fffefb 50%);
  370. image{
  371. width: 80rpx;
  372. height: 80rpx;
  373. }
  374. .left-text{
  375. font-family: PingFang SC;
  376. font-weight: 400;
  377. font-size: 12px;
  378. line-height: 140%;
  379. letter-spacing: 0%;
  380. }
  381. .right{
  382. display: flex;
  383. // flex-direction: row-reverse;
  384. box-sizing: border-box;
  385. align-items: center;
  386. justify-content: center;
  387. background-color: #fff0d2;
  388. color: #da7143;
  389. font-size: 24rpx;
  390. // flex-grow: 2;
  391. border: 1px solid #da7143;
  392. border-radius: 10rpx;
  393. width: 25%;
  394. image{
  395. width: 40rpx;
  396. height: 40rpx;
  397. }
  398. }
  399. }
  400. .section-header {
  401. display: flex;
  402. // justify-content: space-around;
  403. align-items: center;
  404. margin-bottom: 20rpx;
  405. .title {
  406. font-size: 32rpx;
  407. font-weight: bold;
  408. color: #333;
  409. }
  410. .more {
  411. // justify-content: right;
  412. display: flex;
  413. flex-direction: row-reverse;
  414. align-items: center;
  415. color: #999;
  416. font-size: 24rpx;
  417. flex-grow: 2;
  418. // width: 100%;
  419. // margin-right: 0 auto;
  420. }
  421. }
  422. .process-section {
  423. background: #fff;
  424. border-radius: 50rpx;
  425. padding: 30rpx;
  426. margin-bottom: 20rpx;
  427. background: linear-gradient(to bottom, #fff5e1 0%,#fffefb 30%);
  428. .contact-service {
  429. display: flex;
  430. align-items: center;
  431. font-size: 24rpx;
  432. color: #666;
  433. border: 1px solid #da7143;
  434. background-color: #fff0d2;
  435. .service-icon {
  436. width: 32rpx;
  437. height: 32rpx;
  438. margin-right: 8rpx;
  439. }
  440. }
  441. .process-grid {
  442. display: grid;
  443. grid-template-columns: repeat(4, 1fr);
  444. gap: 20rpx;
  445. margin: 30rpx 0;
  446. border: none;
  447. }
  448. .process-item {
  449. position: relative;
  450. display: flex;
  451. flex-direction: column;
  452. align-items: center;
  453. background-color: #fff8ea;
  454. // left: 0; right: 0;
  455. .process-icon {
  456. width: 80rpx;
  457. height: 80rpx;
  458. margin-bottom: 10rpx;
  459. }
  460. .process-text {
  461. font-size: 24rpx;
  462. color: #333;
  463. }
  464. .process-number {
  465. position: absolute;
  466. top: -10rpx;
  467. left: 50%;
  468. transform: translateX(-50%);
  469. font-size: 24rpx;
  470. color: #999;
  471. }
  472. }
  473. .submit-btn {
  474. background: linear-gradient(to right, #ffd01e, #ff8917);
  475. border-radius: 70rpx;
  476. padding: 20rpx;
  477. text-align: center;
  478. position: relative;
  479. border: none;
  480. display: flex;
  481. flex-direction: column;
  482. overflow: visible;
  483. text {
  484. color: #ffffff;
  485. font-size: 32rpx;
  486. font-weight: bold;
  487. line-height: 40rpx;
  488. // display: block;
  489. }
  490. .btn-desc {
  491. font-size: 24rpx;
  492. font-weight: normal;
  493. // margin-top: 4rpx;
  494. }
  495. .arrow-icon {
  496. position: absolute;
  497. right: 10rpx;
  498. top: 10%;
  499. transform: translateY(-50%);
  500. width: 40rpx;
  501. height: 40rpx;
  502. // z-index: 5;
  503. }
  504. .arrow-icon-left {
  505. position: absolute;
  506. left: 1rpx;
  507. top: 90%;
  508. transform: translateY(-50%);
  509. width: 40rpx;
  510. height: 40rpx;
  511. // z-index: 4;
  512. }
  513. }
  514. .submit-btn::after{
  515. border: none !important;
  516. }
  517. }
  518. .city-section {
  519. background: #fff;
  520. border-radius: 20rpx;
  521. padding: 30rpx;
  522. margin-bottom: 20rpx;
  523. .city-header {
  524. display: flex;
  525. justify-content: space-between;
  526. align-items: center;
  527. font-size: 28rpx;
  528. color: #333;
  529. margin-bottom: 10rpx;
  530. }
  531. .city-list {
  532. font-size: 24rpx;
  533. color: #999;
  534. }
  535. }
  536. .price-section {
  537. background: #f0f9eb;
  538. border-radius: 20rpx;
  539. padding: 30rpx;
  540. margin-bottom: 20rpx;
  541. background-color: #fffefb;
  542. background: linear-gradient(to bottom, #fff3db 0%,#fffefb 5%);
  543. .section-header{
  544. margin-bottom: 40rpx;
  545. }
  546. .price-grid {
  547. display: grid;
  548. grid-template-columns: repeat(2, 1fr);
  549. gap: 20rpx;
  550. }
  551. .price-item {
  552. display: flex;
  553. flex-direction: column;
  554. align-items: center;
  555. background: #fff;
  556. border-radius: 16rpx;
  557. padding: 30rpx;
  558. background-color: #fff8ea;
  559. .item-icon {
  560. width: 80rpx;
  561. height: 80rpx;
  562. margin-bottom: 10rpx;
  563. &.placeholder {
  564. width: 80rpx;
  565. height: 80rpx;
  566. margin-bottom: 10rpx;
  567. background: #f5f5f5;
  568. border-radius: 16rpx;
  569. }
  570. }
  571. .item-name {
  572. font-size: 26rpx;
  573. color: #333;
  574. margin-bottom: 6rpx;
  575. }
  576. .item-price {
  577. font-family: PingFang SC;
  578. font-weight: 400;
  579. font-size: 24rpx;
  580. line-height: 140%;
  581. letter-spacing: 0%;
  582. text-align: center;
  583. .item-price-right{
  584. text-align: center;
  585. font-size: 24rpx;
  586. color: #666;
  587. line-height: 140%;
  588. letter-spacing: 0%;
  589. }
  590. }
  591. }
  592. }
  593. .recent-section {
  594. background: #f0f9eb;
  595. border-radius: 20rpx;
  596. padding: 30rpx;
  597. margin-bottom: 20rpx;
  598. background-color: #fffefb;
  599. background: linear-gradient(to bottom, #e8ffe0 0%,#fffefb 15%);
  600. .records-grid {
  601. display: grid;
  602. grid-template-columns: repeat(3, 1fr);
  603. gap: 20rpx;
  604. }
  605. .record-item {
  606. display: flex;
  607. flex-direction: column;
  608. align-items: center;
  609. background: linear-gradient(to top, #e8ffe0 0%,#fffefb 100%);
  610. border-radius: 16rpx;
  611. padding: 10rpx;
  612. background-color: #fff8ea;
  613. image{
  614. width: 60rpx;
  615. height: 60rpx;
  616. }
  617. .location {
  618. font-size: 28rpx;
  619. color: #333;
  620. font-weight: bold;
  621. }
  622. .amount {
  623. font-size: 30rpx;
  624. color: #13ac47;
  625. font-weight: bold;
  626. margin: 6rpx 0;
  627. }
  628. .user-id {
  629. font-family: PingFang SC;
  630. font-weight: 500;
  631. font-size: 24rpx;
  632. line-height: 140%;
  633. letter-spacing: 0%;
  634. text-align: center;
  635. color: #183c5c;
  636. }
  637. .user-id-f{
  638. font-family: PingFang SC;
  639. font-weight: 400;
  640. font-size: 22rpx;
  641. line-height: 140%;
  642. letter-spacing: 0%;
  643. text-align: center;
  644. color: #9b9b9b;
  645. }
  646. }
  647. }
  648. .destination-section {
  649. // background: #fff;
  650. border-radius: 20rpx;
  651. padding: 30rpx;
  652. margin-bottom: 20rpx;
  653. background: linear-gradient(to bottom, #f2f0fc 0%,#fffefb 10%);
  654. padding-bottom: calc(var(--window-bottom) + 60px);
  655. .destination-grid {
  656. display: grid;
  657. grid-template-columns: repeat(2, 1fr);
  658. gap: 20rpx;
  659. }
  660. .destination-item {
  661. display: flex;
  662. align-items: center;
  663. // background: #fff9f9;
  664. border-radius: 16rpx;
  665. padding: 20rpx;
  666. .dest-icon {
  667. width: 60rpx;
  668. height: 60rpx;
  669. margin-right: 16rpx;
  670. }
  671. .dest-info {
  672. flex: 1;
  673. .dest-title {
  674. font-size: 26rpx;
  675. color: #333;
  676. margin-bottom: 4rpx;
  677. }
  678. .dest-desc {
  679. font-size: 22rpx;
  680. color: #999;
  681. }
  682. }
  683. }
  684. }
  685. .destination-item1{
  686. background: linear-gradient(to top, #ffebeb,#fffefb);
  687. }
  688. .destination-item2{
  689. background: linear-gradient(to top, #ebf8ff,#fffefb);
  690. }
  691. .destination-item3{
  692. background: linear-gradient(to top, #ebedff,#fffefb);
  693. }
  694. .destination-item4{
  695. background: linear-gradient(to top, #ebfff2,#fffefb);
  696. }
  697. .about-section {
  698. background: linear-gradient(to bottom, #fff3db 0%,#fffefb 30%);
  699. border-radius: 20rpx;
  700. padding: 30rpx;
  701. display: flex;
  702. justify-content: space-between;
  703. flex-direction: column;
  704. .about-footer{
  705. display: flex;
  706. flex-direction: row;
  707. align-items: center;
  708. justify-content: center;
  709. }
  710. .about-header {
  711. display: flex;
  712. align-items: center;
  713. .logo {
  714. width: 60rpx;
  715. height: 60rpx;
  716. margin-right: 16rpx;
  717. }
  718. .about-title {
  719. font-size: 28rpx;
  720. color: #333;
  721. }
  722. }
  723. .about-content {
  724. flex: 1;
  725. margin-left: 20rpx;
  726. text {
  727. display: block;
  728. font-size: 26rpx;
  729. color: #333;
  730. }
  731. .about-desc {
  732. font-size: 22rpx;
  733. color: #999;
  734. margin-top: 4rpx;
  735. }
  736. }
  737. }
  738. .tab-bar {
  739. position: fixed;
  740. bottom: 0;
  741. left: 0;
  742. right: 0;
  743. height: 100rpx;
  744. background-color: #fff;
  745. display: flex;
  746. justify-content: space-around;
  747. align-items: center;
  748. border-top: 1rpx solid #f5f5f5;
  749. box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05);
  750. .tab-item {
  751. display: flex;
  752. flex-direction: column;
  753. align-items: center;
  754. padding: 10rpx 0;
  755. transition: all 0.3s ease;
  756. .tab-icon {
  757. width: 48rpx;
  758. height: 48rpx;
  759. margin-bottom: 6rpx;
  760. }
  761. text {
  762. font-size: 22rpx;
  763. color: #666;
  764. transition: color 0.3s ease;
  765. }
  766. &.active {
  767. text {
  768. color: #ff5e00;
  769. }
  770. }
  771. &:active {
  772. transform: scale(0.95);
  773. }
  774. }
  775. }
  776. @keyframes fadeInUp {
  777. from {
  778. opacity: 0;
  779. transform: translateY(20rpx);
  780. }
  781. to {
  782. opacity: 1;
  783. transform: translateY(0);
  784. }
  785. }
  786. @keyframes fadeInScale {
  787. from {
  788. opacity: 0;
  789. transform: scale(0.8);
  790. }
  791. to {
  792. opacity: 1;
  793. transform: scale(1);
  794. }
  795. }
  796. </style>