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

1027 lines
31 KiB

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