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

1002 lines
30 KiB

10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
7 months ago
10 months ago
10 months ago
7 months ago
10 months ago
7 months ago
10 months ago
10 months ago
7 months ago
9 months ago
9 months ago
9 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
  1. <template>
  2. <view class="container">
  3. <!-- 顶部banner -->
  4. <view class="banner">
  5. <image v-if="myBannerImage" :src="myBannerImage" mode="aspectFill" style="width: 100%; height: 100%;" />
  6. </view>
  7. <view class="user-cards" v-if="!login_status">
  8. <view class="user-info">
  9. <image class="avatars" src="/static/暂未登录 请先登录.png" mode="aspectFill"></image>
  10. <view class="info">
  11. <text class="names">暂未登录请先登录</text>
  12. </view>
  13. </view>
  14. </view>
  15. <view class="btns" v-if="!login_status">
  16. <uv-button class="btn" type="primary" text="立即登录" :custom-style="customStyle"
  17. color="linear-gradient(to right, rgb(255, 190, 61), rgb(255, 171, 2))" shape="circle"
  18. @click="logout"></uv-button>
  19. <text>暂未登录请先登录</text>
  20. </view>
  21. <!-- 用户信息卡片 -->
  22. <view class="user-card" v-if="login_status">
  23. <view class="user-info">
  24. <view class="avatar-badge-box">
  25. <image class="avatar" :src="userInfo.headImage" mode="aspectFill"></image>
  26. <view class="avatar-badge" :class="userTypeBadgeClass">{{ userTypeText }}</view>
  27. </view>
  28. <view class="info">
  29. <text class="name">{{ userInfo.nickName }}</text>
  30. <text class="id">ID: {{ userInfo.intentioCode }}</text>
  31. </view>
  32. </view>
  33. <view class="wallet-info">
  34. <view class="balance">
  35. <text class="label">我的余额</text>
  36. <view class="amount">
  37. <text class="symbol">¥</text>
  38. <text class="value">{{ userInfo.money || '0.00' }}</text>
  39. </view>
  40. <view class="withdraw-btn" @tap="goWithdraw">
  41. <text>去提现</text>
  42. <uni-icons type="right" size="10" color="#df8155" class="arrow"></uni-icons>
  43. </view>
  44. </view>
  45. <view class="recycle-count">
  46. <text class="label">累计回收</text>
  47. <view class="count">
  48. <text class="value">{{ totalOrders }}</text>
  49. <text class="unit"></text>
  50. </view>
  51. </view>
  52. </view>
  53. </view>
  54. <!-- 分享赚佣金模块 -->
  55. <view class="share-commission-card" @tap="onShareCommission" v-if="login_status">
  56. <text class="share-commission-text">分享赚佣金</text>
  57. </view>
  58. <!-- <view class="share-commission-card" @tap="onShareCommission" v-if="login_status && userInfo.isUser === 'N'">
  59. <text class="share-commission-text">申请成为推广官</text>
  60. </view> -->
  61. <!-- 订单区域 -->
  62. <view class="order-section" v-if="login_status" @tap="viewAllOrders">
  63. <view class="section-header">
  64. <text class="title">我的订单</text>
  65. <view class="view-all">
  66. <text>查看全部</text>
  67. <text class="arrow">></text>
  68. </view>
  69. </view>
  70. <view class="order-tabs" @tap.stop>
  71. <view v-for="(tab, index) in orderTabs" :key="index" class="tab-item"
  72. :class="{ active: currentTab === index }" @tap.stop="switchTab(index)">
  73. <text>{{ tab.name }}</text>
  74. <!-- <text class="badge" v-if="tab.badge">{{tab.badge}}</text> -->
  75. </view>
  76. </view>
  77. <!-- 订单列表 -->
  78. <view class="order-list">
  79. <view class="order-item" v-for="order in orderList" :key="order.id">
  80. <view class="order-header">
  81. <text class="order-id">订单编号 {{ order.ordeNo }}</text>
  82. </view>
  83. <view class="order-content">
  84. <image class="goods-image" :src="order.image || '/static/回收/衣物.png'" mode="aspectFill"></image>
  85. <view class="order-info-opt">
  86. <view class="order-info-top">
  87. <text class="order-info-count">{{ order.num || 1 }} {{ order.unit }}</text>
  88. <!-- <text class="order-info-price">{{ order.onePrice || 0 }} /</text> -->
  89. </view>
  90. <view class="order-info-estimate" v-if="order.price">
  91. 结算 ¥ {{ order.price }}
  92. </view>
  93. <view class="order-info-estimate" v-else>
  94. 预估 ¥ {{ order.estimatedPrice }}
  95. </view>
  96. </view>
  97. </view>
  98. <view class="order-footer">
  99. <view class="delivery-info">
  100. <text class="status">{{ order.status === 0 ? '【在线预约】' : order.status === 1 ? '【快递上门】' :
  101. order.status === 2 ? '【透明质检】' : order.status === 3 ? '【现金打款】' : ''}}</text>
  102. <text class="time">{{ order.goTime }}</text>
  103. </view>
  104. </view>
  105. </view>
  106. </view>
  107. </view>
  108. <!-- 管理中心列表型卡片 -->
  109. <view class="function-list manage-list"
  110. v-if="login_status && (userInfo.isOrderRole === 'Y' || userInfo.isAppletUserRole === 'Y' || userInfo.isUserRole === 'Y' || userInfo.isTuiRole === 'Y')">
  111. <view class="function-item" v-if="userInfo.isOrderRole === 'Y'" @tap="goOrderManage">
  112. <view class="item-left">
  113. <image class="icon" src="/static/my/订单管理.png" mode="aspectFit"></image>
  114. <text>订单管理</text>
  115. </view>
  116. <uni-icons type="right" size="15"></uni-icons>
  117. </view>
  118. <view class="function-item" v-if="userInfo.isAppletUserRole === 'Y'" @tap="goAppletUserManage">
  119. <view class="item-left">
  120. <image class="icon" src="/static/my/用户管理.png" mode="aspectFit"></image>
  121. <text>用户管理</text>
  122. </view>
  123. <uni-icons type="right" size="15"></uni-icons>
  124. </view>
  125. <view class="function-item" v-if="userInfo.isUserRole === 'Y'" @tap="goStaffManage">
  126. <view class="item-left">
  127. <image class="icon" src="/static/my/员工管理.png" mode="aspectFit"></image>
  128. <text>员工管理</text>
  129. </view>
  130. <uni-icons type="right" size="15"></uni-icons>
  131. </view>
  132. <view class="function-item" v-if="userInfo.isTuiRole === 'Y'" @tap="goTuiManage">
  133. <view class="item-left">
  134. <image class="icon" src="/static/my/推广官管理.png" mode="aspectFit"></image>
  135. <text>推广官管理</text>
  136. </view>
  137. <uni-icons type="right" size="15"></uni-icons>
  138. </view>
  139. </view>
  140. <!-- 功能列表 -->
  141. <view class="function-list" v-if="login_status">
  142. <view class="function-item" v-for="(item, index) in functionList" :key="index" @tap="handleFunction(index)">
  143. <view class="item-left">
  144. <image class="icon" :src="item.icon" mode="aspectFit"></image>
  145. <text>{{ item.name }}</text>
  146. </view>
  147. <uni-icons type="right" size="15"></uni-icons>
  148. </view>
  149. </view>
  150. <!-- 根据角色显示不同的导航栏 -->
  151. <tabbar select="my"></tabbar>
  152. </view>
  153. </template>
  154. <script>
  155. import pullRefreshMixin from '@/pages/mixins/pullRefreshMixin.js'
  156. import tabbar from '../../compoent/base/tabbar.vue'
  157. export default {
  158. mixins: [pullRefreshMixin],
  159. components: {
  160. tabbar
  161. },
  162. data() {
  163. return {
  164. value: 2,
  165. currentTab: 1,
  166. login_status: false,
  167. userInfo: {},
  168. orderTabs: [
  169. { name: '全部' },
  170. { name: '进行中', badge: '2' },
  171. { name: '已完成' }
  172. ],
  173. functionList: [
  174. // { name: '推广官', icon: '/static/my/promote.png' },
  175. { name: '我的地址', icon: '/static/my/地址.png' },
  176. { name: '联系客服', icon: '/static/my/客服.png' },
  177. { name: '修改信息', icon: '/static/my/修改信息.png' },
  178. { name: '退出登录', icon: '/static/my/退出登录.png' }
  179. ],
  180. orderList: [],
  181. totalOrders: 0 // 添加累计回收单数字段
  182. }
  183. },
  184. methods: {
  185. async onRefresh() {
  186. console.log('开始刷新')
  187. try {
  188. await this.fetchUserInfo()
  189. console.log('刷新完成')
  190. return true // 返回 true 表示刷新成功
  191. } catch (error) {
  192. console.error('刷新失败', error)
  193. throw error // 抛出错误表示刷新失败
  194. }
  195. },
  196. getSelectKey() {
  197. const keys = ['home', 'recycle', 'my']
  198. return keys[this.value] || 'my'
  199. },
  200. goWithdraw() {
  201. uni.navigateTo({
  202. url: '/pages/subcomponent/wallet'
  203. })
  204. },
  205. viewAllOrders() {
  206. uni.navigateTo({
  207. url: '/pages/subcomponent/order'
  208. })
  209. },
  210. switchTab(index) {
  211. this.currentTab = index
  212. this.fetchOrderList()
  213. },
  214. handleFunction(index) {
  215. const pages = [
  216. // '/pages/subcomponent/promotion',
  217. '/pages/subcomponent/select',
  218. '/pages/subcomponent/admin_faq',
  219. '/pages/subcomponent/edit_profile',
  220. 'logout'
  221. ]
  222. if (pages[index] === 'logout') {
  223. uni.showModal({
  224. title: '提示',
  225. content: '确定要退出登录吗?',
  226. success: (res) => {
  227. if (res.confirm) {
  228. // 执行退出登录逻辑
  229. getApp().globalData.login_status = false;
  230. console.log(getApp().globalData.login_status);
  231. this.login_status = false;
  232. uni.removeStorageSync('token');
  233. }
  234. }
  235. })
  236. return
  237. }
  238. uni.navigateTo({
  239. url: pages[index]
  240. })
  241. },
  242. logout() {
  243. uni.reLaunch({
  244. url: '/pages/index/index'
  245. });
  246. },
  247. onShareCommission() {
  248. uni.showToast({ title: '分享赚佣金', icon: 'none' });
  249. uni.navigateTo({ url: '/pages/subcomponent/promotion' })
  250. },
  251. goOrderManage() {
  252. uni.navigateTo({ url: '/pages/manager/order' })
  253. },
  254. goAppletUserManage() {
  255. uni.navigateTo({ url: '/pages/manager/user' })
  256. },
  257. goStaffManage() {
  258. uni.navigateTo({ url: '/pages/manager/staff' })
  259. },
  260. goTuiManage() {
  261. uni.navigateTo({ url: '/pages/manager/tui' })
  262. },
  263. fetchUserInfo() {
  264. if (uni.getStorageSync('token')) {
  265. this.login_status = getApp().globalData.login_status;
  266. this.$api("getUserByToken", {}, (res) => {
  267. if (res.code == 200) {
  268. this.userInfo = res.result
  269. // isTuiType 为0用户,1推广达人,2推广大使
  270. }
  271. })
  272. } else {
  273. this.login_status = false;
  274. }
  275. },
  276. fetchOrderList() {
  277. let status = ''
  278. if (this.currentTab === 1) status = 1 // 进行中
  279. if (this.currentTab === 2) status = 3 // 已完成
  280. const params = { pageSize: 1, current: 1 }
  281. if (status !== '') params.status = status
  282. this.$api && this.$api('getOrderListPage', params, res => {
  283. if (res && res.code === 200 && res.result && Array.isArray(res.result.records)) {
  284. this.orderList = res.result.records
  285. // 更新累计回收单数
  286. } else {
  287. this.orderList = []
  288. }
  289. })
  290. },
  291. getCumulativeRecoveryCount() {
  292. this.$api && this.$api('getCumulativeRecoveryCount', {}, res => {
  293. if (res && res.code === 200 && res.result) {
  294. this.totalOrders = res.result
  295. } else {
  296. this.totalOrders = 0
  297. }
  298. })
  299. },
  300. // 初始化页面数据的方法
  301. initializePageData() {
  302. // 移除自动下拉刷新
  303. // uni.startPullDownRefresh()
  304. uni.$on('refreshUserInfo', () => {
  305. this.fetchUserInfo()
  306. })
  307. this.fetchUserInfo()
  308. this.fetchOrderList()
  309. this.getCumulativeRecoveryCount()
  310. uni.$on('bannerListUpdated', () => {
  311. this.$forceUpdate && this.$forceUpdate()
  312. })
  313. if (getApp().globalData.bannerList && getApp().globalData.bannerList.length > 0) {
  314. this.$forceUpdate && this.$forceUpdate()
  315. }
  316. },
  317. goAbout() {
  318. }
  319. },
  320. computed: {
  321. customStyle() {
  322. return {
  323. // height: '80rpx',
  324. width: '70%',
  325. }
  326. },
  327. bannerList() {
  328. return getApp().globalData.bannerList || []
  329. },
  330. myBannerImage() {
  331. const item = getApp().globalData.configData.find(i => i.keyName === 'user_banner')
  332. return item ? item.keyContent : ''
  333. },
  334. userTypeText() {
  335. return this.userInfo.isTuiTypeTitle || '推广官'
  336. },
  337. userTypeBadgeClass() {
  338. // 根据用户类型返回不同的样式类
  339. switch (this.userInfo.isTuiTypeTitle) {
  340. case '推广达人':
  341. return 'avatar-badge-expert' // 推广达人
  342. case '推广大使':
  343. return 'avatar-badge-ambassador' // 推广大使
  344. default:
  345. return 'avatar-badge-user' // 普通用户
  346. }
  347. },
  348. },
  349. onLoad() {
  350. // 检查App数据是否已经准备好
  351. if (!getApp().globalData.isAppDataReady) {
  352. // 显示加载状态
  353. uni.showLoading({
  354. title: '加载中...',
  355. mask: true
  356. })
  357. // 监听App数据准备完成事件
  358. uni.$on('appDataReady', () => {
  359. uni.hideLoading()
  360. this.initializePageData()
  361. })
  362. } else {
  363. // App数据已经准备好,直接初始化页面数据
  364. this.initializePageData()
  365. }
  366. },
  367. onShow() {
  368. this.fetchUserInfo()
  369. this.getCumulativeRecoveryCount()
  370. },
  371. onPullDownRefresh() {
  372. this.fetchUserInfo()
  373. this.getCumulativeRecoveryCount()
  374. setTimeout(() => {
  375. uni.stopPullDownRefresh()
  376. uni.showToast({
  377. title: '刷新成功',
  378. icon: 'success',
  379. duration: 2000
  380. })
  381. }, 1000)
  382. },
  383. onUnload() {
  384. uni.$off('bannerListUpdated')
  385. },
  386. }
  387. </script>
  388. <style lang="scss" scoped>
  389. .container {
  390. min-height: 100vh;
  391. background: #f8f8f8;
  392. padding-bottom: 120rpx;
  393. }
  394. .banner {
  395. height: 320rpx;
  396. background: #ff6b35;
  397. position: relative;
  398. overflow: hidden;
  399. border-radius: 0 0 30rpx 30rpx;
  400. .banner-title {
  401. position: absolute;
  402. top: 30%;
  403. left: 20%;
  404. color: #fff;
  405. font-family: DingTalk JinBuTi;
  406. font-weight: 400;
  407. font-style: italic;
  408. font-size: 30px;
  409. line-height: 100%;
  410. letter-spacing: 0%;
  411. vertical-align: bottom;
  412. z-index: 2;
  413. }
  414. .banner-bg {
  415. position: absolute;
  416. width: 100%;
  417. height: 100%;
  418. object-fit: cover;
  419. }
  420. }
  421. .user-card {
  422. margin: -50rpx 30rpx 0;
  423. background: #fff;
  424. border-radius: 24rpx;
  425. padding: 30rpx;
  426. position: relative;
  427. z-index: 2;
  428. // box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05);
  429. .user-info {
  430. display: flex;
  431. align-items: center;
  432. margin-bottom: 40rpx;
  433. .avatar-badge-box {
  434. position: relative;
  435. width: 110rpx;
  436. height: 110rpx;
  437. border-radius: 12rpx;
  438. overflow: hidden;
  439. background: #fff;
  440. flex-shrink: 0;
  441. margin-right: 24rpx;
  442. display: flex;
  443. align-items: flex-end;
  444. justify-content: center;
  445. }
  446. .avatar {
  447. width: 100%;
  448. height: 100%;
  449. border-radius: 12rpx;
  450. display: block;
  451. }
  452. .avatar-badge {
  453. position: absolute;
  454. left: 0;
  455. bottom: 0;
  456. width: 100%;
  457. height: 32rpx;
  458. line-height: 32rpx;
  459. background: rgba(238, 238, 238, 0.95);
  460. color: #999;
  461. font-size: 24rpx;
  462. text-align: center;
  463. border-bottom-left-radius: 12rpx;
  464. border-bottom-right-radius: 12rpx;
  465. font-weight: 400;
  466. letter-spacing: 2rpx;
  467. z-index: 2;
  468. // 普通用户样式(默认)
  469. &.avatar-badge-user {
  470. background: rgba(238, 238, 238, 0.95);
  471. color: #999;
  472. }
  473. // 推广达人样式
  474. &.avatar-badge-expert {
  475. background: linear-gradient(90deg, #ff8917, #ffd01e);
  476. color: #fff;
  477. font-weight: 600;
  478. }
  479. // 推广大使样式
  480. &.avatar-badge-ambassador {
  481. background: linear-gradient(90deg, #b2f08d, #39e9d2);
  482. color: #fff;
  483. font-weight: 600;
  484. }
  485. }
  486. .info {
  487. .name {
  488. font-size: 34rpx;
  489. font-weight: 600;
  490. color: #222;
  491. margin-bottom: 12rpx;
  492. display: block;
  493. }
  494. .id {
  495. font-size: 26rpx;
  496. color: #999;
  497. display: flex;
  498. align-items: center;
  499. &::before {
  500. // content: 'ID: ';
  501. color: #999;
  502. margin-right: 4rpx;
  503. }
  504. }
  505. }
  506. }
  507. .wallet-info {
  508. display: flex;
  509. padding: 30rpx;
  510. background: #fff8ea;
  511. border-radius: 16rpx;
  512. position: relative;
  513. &::after {
  514. content: '';
  515. position: absolute;
  516. top: 50%;
  517. left: 50%;
  518. transform: translate(-50%, -50%);
  519. width: 1rpx;
  520. height: 50%;
  521. background: #FFE4D9;
  522. }
  523. .balance {
  524. flex: 1;
  525. padding-right: 30rpx;
  526. .label {
  527. font-size: 26rpx;
  528. color: #999;
  529. margin-bottom: 12rpx;
  530. display: block;
  531. }
  532. .amount {
  533. display: flex;
  534. align-items: baseline;
  535. margin-bottom: 20rpx;
  536. .symbol {
  537. font-size: 30rpx;
  538. color: #FF5B05;
  539. font-weight: normal;
  540. margin-right: 4rpx;
  541. }
  542. .value {
  543. font-size: 46rpx;
  544. font-weight: 600;
  545. color: #FF5B05;
  546. line-height: 1;
  547. }
  548. }
  549. .withdraw-btn {
  550. display: inline-flex;
  551. align-items: center;
  552. padding: 8rpx 16rpx;
  553. background: #fff0d2;
  554. border: 1rpx solid rgba(255, 91, 5, 0.2);
  555. border-radius: 13rpx;
  556. color: #FF5B05;
  557. font-size: 24rpx;
  558. .arrow {
  559. margin-left: 6rpx;
  560. font-family: "PingFang SC";
  561. }
  562. }
  563. }
  564. .recycle-count {
  565. flex: 1;
  566. padding-left: 30rpx;
  567. .label {
  568. font-size: 26rpx;
  569. color: #999;
  570. margin-bottom: 12rpx;
  571. display: block;
  572. }
  573. .count {
  574. display: flex;
  575. align-items: baseline;
  576. .value {
  577. font-size: 46rpx;
  578. font-weight: 600;
  579. color: #222;
  580. line-height: 1;
  581. }
  582. .unit {
  583. font-size: 26rpx;
  584. color: #999;
  585. margin-left: 8rpx;
  586. font-weight: normal;
  587. }
  588. }
  589. }
  590. }
  591. }
  592. .order-section {
  593. margin: 20rpx 30rpx;
  594. background: linear-gradient(to bottom, #fff4e0 0%, #fff 10%);
  595. border-radius: 20rpx;
  596. padding: 20rpx 30rpx;
  597. .section-header {
  598. display: flex;
  599. justify-content: space-between;
  600. align-items: center;
  601. margin-bottom: 30rpx;
  602. .title {
  603. font-size: 34rpx;
  604. font-weight: bold;
  605. color: #333;
  606. }
  607. .view-all {
  608. font-size: 26rpx;
  609. color: #999;
  610. display: flex;
  611. align-items: center;
  612. .arrow {
  613. margin-left: 4rpx;
  614. }
  615. }
  616. }
  617. .order-tabs {
  618. display: flex;
  619. margin-bottom: 30rpx;
  620. background: #f8f8f8;
  621. border-radius: 8rpx;
  622. padding: 4rpx;
  623. .tab-item {
  624. flex: 1;
  625. text-align: center;
  626. padding: 16rpx 0;
  627. position: relative;
  628. color: #666;
  629. font-size: 28rpx;
  630. border-radius: 6rpx;
  631. &.active {
  632. color: #333;
  633. font-weight: bold;
  634. background: #fff;
  635. box-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.05);
  636. }
  637. }
  638. }
  639. .order-item {
  640. background: #fff;
  641. border-radius: 16rpx;
  642. padding: 24rpx;
  643. border: none;
  644. box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.02);
  645. .order-header {
  646. margin-bottom: 24rpx;
  647. .order-id {
  648. font-size: 26rpx;
  649. color: #666;
  650. }
  651. }
  652. .order-content {
  653. display: flex;
  654. margin-bottom: 24rpx;
  655. align-items: center;
  656. justify-content: space-between;
  657. position: relative;
  658. &::after {
  659. content: '';
  660. position: absolute;
  661. left: 50%;
  662. top: 50%;
  663. transform: translate(-50%, -50%);
  664. width: 60rpx;
  665. height: 60rpx;
  666. background: #f8f8f8;
  667. border-radius: 50%;
  668. z-index: 1;
  669. }
  670. &::before {
  671. content: '⇌';
  672. position: absolute;
  673. left: 50%;
  674. top: 50%;
  675. transform: translate(-50%, -50%);
  676. color: #999;
  677. font-size: 32rpx;
  678. z-index: 2;
  679. }
  680. .goods-image {
  681. width: 200rpx;
  682. height: 200rpx;
  683. border-radius: 16rpx;
  684. background: #fffbe6;
  685. padding: 20rpx;
  686. box-sizing: border-box;
  687. display: block;
  688. }
  689. .order-info-opt {
  690. width: 200rpx;
  691. min-height: 110rpx;
  692. background: linear-gradient(180deg, #fffbe6 0%, #fff 100%);
  693. border-radius: 16rpx;
  694. display: flex;
  695. flex-direction: column;
  696. align-items: center;
  697. justify-content: space-between;
  698. padding: 24rpx 0 16rpx 0;
  699. box-sizing: border-box;
  700. margin-left: 16rpx;
  701. }
  702. .order-info-top {
  703. display: flex;
  704. flex-direction: column;
  705. align-items: center;
  706. margin-bottom: 8rpx;
  707. }
  708. .order-info-count {
  709. font-size: 32rpx;
  710. color: #222;
  711. font-weight: bold;
  712. margin-bottom: 4rpx;
  713. }
  714. .order-info-price {
  715. font-size: 22rpx;
  716. color: #999;
  717. }
  718. .order-info-estimate {
  719. background: linear-gradient(90deg, #ffd01e 0%, #ff8917 100%);
  720. color: #fff;
  721. font-size: 24rpx;
  722. font-weight: bold;
  723. border-radius: 0 0 16rpx 16rpx;
  724. padding: 12rpx 0;
  725. width: 100%;
  726. text-align: center;
  727. margin-top: 8rpx;
  728. box-shadow: 0 2rpx 8rpx rgba(255, 156, 0, 0.08);
  729. }
  730. }
  731. .order-footer {
  732. display: flex;
  733. align-items: center;
  734. padding: 24rpx;
  735. border-top: 1rpx solid #f5f5f5;
  736. background: #fafafa;
  737. border-radius: 12rpx;
  738. margin: 0 -24rpx -24rpx;
  739. .courier-avatar {
  740. width: 80rpx;
  741. height: 80rpx;
  742. border-radius: 12rpx;
  743. margin-right: 20rpx;
  744. background: #fff;
  745. }
  746. .delivery-info {
  747. flex: 1;
  748. display: flex;
  749. flex-direction: column;
  750. .status {
  751. font-size: 28rpx;
  752. color: #333;
  753. margin-bottom: 8rpx;
  754. font-weight: bold;
  755. }
  756. .time {
  757. font-size: 26rpx;
  758. color: #999;
  759. }
  760. }
  761. }
  762. }
  763. }
  764. .function-list {
  765. margin: 20rpx 30rpx;
  766. background: #fff;
  767. border-radius: 20rpx;
  768. padding: 0 30rpx;
  769. .function-item {
  770. display: flex;
  771. justify-content: space-between;
  772. align-items: center;
  773. padding: 30rpx 0;
  774. border-bottom: 1rpx solid #f5f5f5;
  775. &:last-child {
  776. border-bottom: none;
  777. }
  778. .item-left {
  779. display: flex;
  780. align-items: center;
  781. .icon {
  782. width: 40rpx;
  783. height: 40rpx;
  784. margin-right: 16rpx;
  785. }
  786. text {
  787. font-size: 28rpx;
  788. color: #333;
  789. }
  790. }
  791. .arrow {
  792. color: #999;
  793. font-size: 24rpx;
  794. }
  795. }
  796. }
  797. .tab-bar {
  798. position: fixed;
  799. bottom: 0;
  800. left: 0;
  801. right: 0;
  802. height: 100rpx;
  803. background: #fff;
  804. display: flex;
  805. padding-bottom: env(safe-area-inset-bottom);
  806. border-top: 1rpx solid #f5f5f5;
  807. .tab-item {
  808. flex: 1;
  809. display: flex;
  810. flex-direction: column;
  811. align-items: center;
  812. justify-content: center;
  813. padding: 10rpx 0;
  814. image {
  815. width: 48rpx;
  816. height: 48rpx;
  817. margin-bottom: 6rpx;
  818. }
  819. text {
  820. font-size: 20rpx;
  821. color: #999;
  822. }
  823. &.active {
  824. text {
  825. color: #ff6b35;
  826. }
  827. }
  828. }
  829. }
  830. .user-cards {
  831. margin: -50rpx 30rpx 0;
  832. background: #fff;
  833. border-radius: 24rpx;
  834. padding: 30rpx;
  835. position: relative;
  836. z-index: 2;
  837. box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05);
  838. .user-info {
  839. display: flex;
  840. align-items: center;
  841. margin-bottom: 40rpx;
  842. .avatars {
  843. width: 110rpx;
  844. height: 110rpx;
  845. border-radius: 50%;
  846. margin-right: 24rpx;
  847. }
  848. }
  849. .info {
  850. .name {
  851. font-size: 34rpx;
  852. font-weight: 600;
  853. color: #222;
  854. margin-bottom: 12rpx;
  855. display: block;
  856. }
  857. }
  858. }
  859. .btns {
  860. width: 100%;
  861. margin: 0 auto;
  862. margin-top: 30%;
  863. display: flex;
  864. flex-direction: column;
  865. justify-content: center;
  866. align-items: center;
  867. .uv-button,
  868. .btn {
  869. width: 100%;
  870. height: 100rpx;
  871. background: linear-gradient(90deg, #FFD36D 0%, #FFA800 100%);
  872. color: #fff;
  873. font-size: 36rpx;
  874. border-radius: 50rpx;
  875. font-weight: bold;
  876. display: flex;
  877. align-items: center;
  878. justify-content: center;
  879. box-shadow: 0 4rpx 16rpx rgba(255, 168, 0, 0.08);
  880. border: none;
  881. margin: 0 auto;
  882. }
  883. text {
  884. margin-top: 20rpx;
  885. font-family: PingFang SC;
  886. font-weight: 400;
  887. font-size: 13px;
  888. line-height: 100%;
  889. letter-spacing: 0%;
  890. text-align: center;
  891. color: #a3a3a3;
  892. }
  893. }
  894. .share-commission-card {
  895. width: 90%;
  896. margin: 32rpx auto 24rpx auto;
  897. height: 90rpx;
  898. background: linear-gradient(90deg, #ffd01e 0%, #ff8917 100%);
  899. border-radius: 24rpx;
  900. display: flex;
  901. align-items: center;
  902. justify-content: center;
  903. box-shadow: 0 4rpx 16rpx rgba(255, 156, 0, 0.08);
  904. cursor: pointer;
  905. }
  906. .share-commission-text {
  907. color: #fff;
  908. font-size: 32rpx;
  909. font-weight: bold;
  910. letter-spacing: 2rpx;
  911. }
  912. .manage-list {
  913. margin-bottom: 20rpx;
  914. }
  915. </style>