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

903 lines
22 KiB

2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
1 month ago
1 month ago
2 months ago
1 month ago
1 month ago
2 months ago
1 month ago
1 month ago
2 months ago
2 months ago
1 month 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
1 month 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
1 month ago
2 months ago
1 month 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
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
1 month ago
2 months ago
  1. <template>
  2. <view class="promotion-page">
  3. <!-- 顶部渐变导航栏 -->
  4. <view class="nav-bar" :style="{height: navBarTotalHeight + 'px', paddingTop: statusBarHeight + 'px'}">
  5. <view class="nav-bar-inner">
  6. <view class="back-icon" @tap="navigateBack">
  7. <uni-icons type="left" size="22" color="#222" />
  8. </view>
  9. <view class="nav-bar-title">爱简收·推客联盟</view>
  10. <view class="nav-bar-right">
  11. <uni-icons type="more-filled" size="22" color="#222" />
  12. </view>
  13. </view>
  14. </view>
  15. <!-- 打钩标签区 -->
  16. <view class="feature-tags" :style="{marginTop: navBarTotalHeight+statusBarHeight + 'px'}">
  17. <view class="tag" v-for="(t, i) in featureTags" :key="i">
  18. <text class="check"></text>
  19. <text class="text">{{t}}</text>
  20. </view>
  21. </view>
  22. <!-- 主内容区卡片悬浮覆盖打钩区 -->
  23. <view class="main-content">
  24. <!-- 用户卡片 -->
  25. <view class="user-card">
  26. <view class="user-info-row">
  27. <view class="avatar-box">
  28. <view class="avatar-frame">
  29. <image class="avatar-img" :src="userInfo.avatar" mode="aspectFill" />
  30. <view class="user-type">{{userInfo.type}}</view>
  31. </view>
  32. </view>
  33. <view class="user-meta">
  34. <view class="nickname">{{userInfo.name}}</view>
  35. <view class="userid">ID: {{userInfo.intentioCode}}</view>
  36. </view>
  37. <view class="user-count">推广人数</view>
  38. </view>
  39. <view class="user-stats-row">
  40. <view class="stat-block">
  41. <view class="stat-label">可提现佣金()</view>
  42. <view class="stat-value main">{{userInfo.money}}</view>
  43. <button class="withdraw-btn" @click="goWithdraw">提现</button>
  44. </view>
  45. <view class="stat-divider"></view>
  46. <view class="stat-block">
  47. <view class="stat-label">累计提现()</view>
  48. <view class="stat-value">{{userInfo.integerPrice}}</view>
  49. <button class="record-btn" @click="goWithdrawRecord">提现记录</button>
  50. </view>
  51. </view>
  52. <view class="bottom-menu-row">
  53. <view class="menu-item" @tap="goProfitDetail">
  54. <view class="menu-icon red">
  55. <uni-icons type="wallet" size="32" color="#fff" />
  56. </view>
  57. <text class="menu-text">收益明细</text>
  58. </view>
  59. <view class="menu-item" @tap="goTeam">
  60. <view class="menu-icon blue">
  61. <uni-icons type="person" size="32" color="#fff" />
  62. </view>
  63. <text class="menu-text">我的团队</text>
  64. </view>
  65. </view>
  66. </view>
  67. <!-- 推广排行榜 -->
  68. <view class="rank-section">
  69. <view class="rank-title">推广排行榜</view>
  70. <view class="rank-list">
  71. <view class="rank-item" v-for="(item, idx) in rankList.slice(0, 5)" :key="idx">
  72. <view class="rank-icon">
  73. <image v-if="idx<3" :src="getRankIcon(idx+1)" class="crown" mode="aspectFit" />
  74. <image v-else :src="getRankIcon(idx+1)" class="num-icon" mode="aspectFit" />
  75. </view>
  76. <image class="rank-avatar" :src="item.headImage" mode="aspectFill" />
  77. <text class="rank-phone">{{item.nickName}}</text>
  78. <text class="rank-amount">¥{{item.price}}</text>
  79. </view>
  80. </view>
  81. </view>
  82. <!-- 权益说明表格 -->
  83. <view class="rights-section">
  84. <view class="rights-title">权益说明</view>
  85. <image :src="indexLvxingUrl" mode="widthFix" class="rights-image" />
  86. </view>
  87. <!-- 联系客服二维码 -->
  88. <view class="qrcode-section">
  89. <view class="qrcode-title">联系客服</view>
  90. <image class="qrcode-img" :src="qrcodeUrl" mode="aspectFit" @click="openQrcodeModal" />
  91. <text class="qrcode-modal-benefit">添加客服可以获取更多推广福利</text>
  92. </view>
  93. </view>
  94. <!-- 底部按钮区 -->
  95. <view class="bottom-btns">
  96. <button class="btn gray" @tap="goQrcode">我的二维码</button>
  97. <button class="btn green" @tap="goUpgrade" v-if="status== 3">立即升级推广官</button>
  98. <button class="btn gray" v-if="status==0" @tap="showProgressModal = true">查看申请进度</button>
  99. </view>
  100. <!-- 申请进度弹窗 -->
  101. <view v-if="showProgressModal" class="progress-modal-mask">
  102. <view class="progress-modal-box">
  103. <view class="progress-modal-title">联系运营商\n升级解锁更多权益</view>
  104. <view class="progress-modal-list">
  105. <view class="progress-modal-item" @tap="goToFaq">
  106. <text>在线客服</text>
  107. <uni-icons type="right" size="22" color="#bbb" />
  108. </view>
  109. <view class="progress-modal-item" @tap="goToFaq">
  110. <text>客服电话</text>
  111. <uni-icons type="right" size="22" color="#bbb" />
  112. </view>
  113. </view>
  114. <button class="progress-modal-btn" @tap="showProgressModal = false">我知道了</button>
  115. </view>
  116. </view>
  117. <!-- 客服二维码放大弹窗 -->
  118. <view v-if="showQrcodeModal" class="qrcode-modal-mask" @click="closeQrcodeModal">
  119. <view class="qrcode-modal-content" @click.stop>
  120. <view class="qrcode-modal-header">
  121. <text class="qrcode-modal-title">联系客服</text>
  122. <view class="qrcode-modal-close" @click="closeQrcodeModal">
  123. <uni-icons type="close" size="24" color="#999"></uni-icons>
  124. </view>
  125. </view>
  126. <view class="qrcode-modal-body">
  127. <image
  128. v-if="qrcodeUrl"
  129. :src="qrcodeUrl"
  130. mode="aspectFit"
  131. class="qrcode-modal-img"
  132. :show-menu-by-longpress="true"
  133. @longpress="onQrcodeLongPress"
  134. />
  135. <view v-else class="qrcode-placeholder">
  136. <text>二维码加载中...</text>
  137. </view>
  138. <text class="qrcode-modal-tip">长按识别二维码添加客服微信</text>
  139. <text class="qrcode-modal-benefit">添加客服可以获取更多推广福利</text>
  140. </view>
  141. </view>
  142. </view>
  143. </view>
  144. </template>
  145. <script>
  146. import pullRefreshMixin from '@/pages/mixins/pullRefreshMixin.js'
  147. export default {
  148. mixins: [pullRefreshMixin],
  149. data() {
  150. return {
  151. statusBarHeight: 0,
  152. navBarHeight: 44, // px
  153. navBarTotalHeight: 44, // px
  154. featureTags: ['收益高', '品类全', '到账快', '城市多'],
  155. userInfo: {
  156. avatar: '',
  157. name: '',
  158. id: '',
  159. type: '',
  160. balance: '',
  161. totalWithdraw: '',
  162. },
  163. tabActive: 0,
  164. rankList: [
  165. ],
  166. status: 0,
  167. showProgressModal: false,
  168. showQrcodeModal: false
  169. }
  170. },
  171. computed: {
  172. qrcodeUrl() {
  173. console.log(getApp().globalData.configData,'getApp().globalData.configData')
  174. const item = getApp().globalData.configData.find(i => i.keyName === 'kefu_code')
  175. return item ? item.keyContent : ''
  176. },
  177. indexLvxingUrl() {
  178. console.log(getApp().globalData.configData,'getApp().globalData.configData')
  179. const item = getApp().globalData.configData.find(i => i.keyName === 'index_lvxing')
  180. return item ? item.keyContent : ''
  181. }
  182. },
  183. onLoad() {
  184. const sysInfo = uni.getSystemInfoSync()
  185. this.statusBarHeight = sysInfo.statusBarHeight
  186. this.navBarHeight = 44
  187. this.navBarTotalHeight = this.statusBarHeight + this.navBarHeight
  188. this.getUserInfoByToken()
  189. this.getRankList()
  190. this.getMyPromotionInfo()
  191. },
  192. onShow(){
  193. this.getMyPromotionInfo()
  194. },
  195. onPullDownRefresh() {
  196. this.getUserInfoByToken()
  197. uni.stopPullDownRefresh()
  198. },
  199. methods: {
  200. async onRefresh() {
  201. // 模拟刷新数据
  202. await new Promise(resolve => setTimeout(resolve, 1000))
  203. uni.stopPullRefresh()
  204. },
  205. navigateBack() {
  206. uni.navigateBack()
  207. },
  208. getRankIcon(idx) {
  209. return `/static/tui/${idx}.png`
  210. },
  211. goQrcode() {
  212. uni.navigateTo({ url: '/pages/subcomponent/promo-qrcode' })
  213. },
  214. goUpgrade() {
  215. uni.navigateTo({ url: '/pages/subcomponent/upgrad' })
  216. },
  217. getUserInfoByToken() {
  218. this.$api('getUserByToken', {}, (res) => {
  219. if (res && res.success && res.result) {
  220. this.userInfo.avatar = res.result.headImage || ''
  221. this.userInfo.name = res.result.nickName || ''
  222. this.userInfo.id = res.result.id || ''
  223. this.userInfo.intentioCode = res.result.intentioCode || ''
  224. this.userInfo.money = res.result.money || ''
  225. this.userInfo.integerPrice = res.result.integerPrice || ''
  226. // 你可以根据实际接口补充type、balance、totalWithdraw等字段
  227. }
  228. })
  229. },
  230. goWithdrawRecord() {
  231. uni.navigateTo({ url: '/pages/subcomponent/promotion-withdraw-record' })
  232. },
  233. goWithdraw() {
  234. uni.navigateTo({ url: '/pages/subcomponent/withdraw?fromPromotion=true' })
  235. },
  236. goProfitDetail() {
  237. uni.navigateTo({ url: '/pages/subcomponent/promotion-profit-detail' })
  238. },
  239. goTeam() {
  240. uni.navigateTo({ url: '/pages/subcomponent/promotion-team' })
  241. },
  242. getRankList(){
  243. this.$api('getRankList', {}, (res) => {
  244. if (res && res.success && res.result) {
  245. this.rankList = res.result.records || []
  246. }
  247. })
  248. },
  249. getMyPromotionInfo(){
  250. this.$api('getMyPromotionInfo', {}, (res) => {
  251. if (res && res.success && res.result) {
  252. if (res.result.status == 0) {
  253. this.status = res.result.status
  254. console.log(this.status,'this.status')
  255. }
  256. }else{
  257. this.status = 3
  258. console.log(this.status,'this.status')
  259. }
  260. })
  261. },
  262. goToFaq() {
  263. uni.navigateTo({ url: '/pages/subcomponent/admin_faq' })
  264. },
  265. // 显示客服二维码弹窗
  266. openQrcodeModal() {
  267. this.showQrcodeModal = true;
  268. },
  269. // 关闭二维码弹窗
  270. closeQrcodeModal() {
  271. this.showQrcodeModal = false;
  272. },
  273. // 处理二维码长按事件
  274. onQrcodeLongPress() {
  275. console.log('长按二维码');
  276. // 在微信小程序中,show-menu-by-longpress="true" 会自动处理长按识别
  277. // 这里可以添加一些反馈提示
  278. uni.showToast({
  279. title: '长按识别二维码',
  280. icon: 'none',
  281. duration: 1500
  282. });
  283. }
  284. }
  285. }
  286. </script>
  287. <style lang="scss" scoped>
  288. .promotion-page {
  289. min-height: 100vh;
  290. background: linear-gradient(to right, #b2f08d 0%, #39e9d2 100%);
  291. padding-bottom: calc(env(safe-area-inset-bottom) + 120rpx);
  292. }
  293. .nav-bar {
  294. position: fixed;
  295. top: 0;
  296. left: 0;
  297. right: 0;
  298. z-index: 1000;
  299. width: 100vw;
  300. background: linear-gradient(to right, #b2f08d 0%, #39e9d2 100%);
  301. box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.03);
  302. .nav-bar-inner {
  303. display: flex;
  304. align-items: center;
  305. height: 44px;
  306. width: 100vw;
  307. position: relative;
  308. }
  309. .back-icon {
  310. width: 44px;
  311. height: 44px;
  312. display: flex;
  313. align-items: center;
  314. justify-content: center;
  315. position: absolute;
  316. left: 0;
  317. top: 0;
  318. }
  319. .nav-bar-title {
  320. flex: 1;
  321. text-align: center;
  322. font-size: 36rpx;
  323. font-weight: bold;
  324. color: #222;
  325. letter-spacing: 2rpx;
  326. line-height: 44px;
  327. }
  328. .nav-bar-right {
  329. width: 44px;
  330. height: 44px;
  331. position: absolute;
  332. right: 0;
  333. top: 0;
  334. display: flex;
  335. align-items: center;
  336. justify-content: center;
  337. }
  338. }
  339. .feature-tags {
  340. // background: linear-gradient(to right, #b2f08d 0%, #39e9d2 100%);
  341. border-radius: 32rpx;
  342. display: flex;
  343. align-items: center;
  344. justify-content: space-between;
  345. padding: 0 24rpx;
  346. height: 80rpx;
  347. box-shadow: 0 4rpx 24rpx rgba(60, 167, 250, 0.08);
  348. .tag {
  349. flex: 1;
  350. display: flex;
  351. align-items: center;
  352. justify-content: center;
  353. .check {
  354. width: 36rpx;
  355. height: 36rpx;
  356. background: #fff;
  357. border-radius: 50%;
  358. display: flex;
  359. align-items: center;
  360. justify-content: center;
  361. font-size: 28rpx;
  362. color: #13ac47;
  363. font-weight: bold;
  364. margin-right: 10rpx;
  365. box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.08);
  366. }
  367. .text {
  368. color: #fff;
  369. font-size: 28rpx;
  370. font-weight: bold;
  371. }
  372. }
  373. }
  374. .main-content {
  375. margin-top: 20rpx;
  376. padding-top: 88rpx;
  377. background: linear-gradient(180deg, #eaffe6 0%, #fff 30%);
  378. min-height: 100vh;
  379. width: 100vw;
  380. box-sizing: border-box;
  381. position: relative;
  382. z-index: 11;
  383. border-radius: 40rpx 40rpx 0 0;
  384. overflow: hidden;
  385. }
  386. .user-card {
  387. margin: 0 32rpx;
  388. background: linear-gradient(to bottom, #f6fff2 0%, #fff 100%);
  389. border-radius: 32rpx;
  390. box-shadow: 0 8rpx 32rpx rgba(60, 167, 250, 0.12);
  391. padding: 48rpx 36rpx 36rpx 36rpx;
  392. border: none;
  393. position: relative;
  394. top: -40rpx;
  395. display: flex;
  396. flex-direction: column;
  397. align-items: stretch;
  398. .user-info-row {
  399. display: flex;
  400. align-items: center;
  401. padding-bottom: 0;
  402. margin-bottom: 32rpx;
  403. // background-color: #fff;
  404. .avatar-box {
  405. margin-right: 24rpx;
  406. display: flex;
  407. flex-direction: column;
  408. align-items: center;
  409. .avatar-frame {
  410. width: 104rpx;
  411. height: 104rpx;
  412. border-radius: 10rpx;
  413. overflow: hidden;
  414. position: relative;
  415. background: #f2f2f2;
  416. box-shadow: 0 4rpx 16rpx rgba(0,0,0,0.10);
  417. .avatar-img {
  418. width: 104rpx;
  419. height: 80rpx;
  420. object-fit: cover;
  421. display: block;
  422. }
  423. .user-type {
  424. position: absolute;
  425. left: 0;
  426. bottom: 0;
  427. width: 100%;
  428. height: 32rpx;
  429. background: #e5e5e5;
  430. color: #888;
  431. font-size: 22rpx;
  432. font-weight: 500;
  433. text-align: center;
  434. line-height: 32rpx;
  435. border-bottom-left-radius: 10rpx;
  436. border-bottom-right-radius: 10rpx;
  437. }
  438. }
  439. }
  440. .user-meta {
  441. flex: 1;
  442. display: flex;
  443. flex-direction: column;
  444. justify-content: center;
  445. .nickname {
  446. font-size: 32rpx;
  447. font-weight: bold;
  448. color: #222;
  449. margin-bottom: 6rpx;
  450. }
  451. .userid {
  452. font-size: 24rpx;
  453. color: #bbb;
  454. }
  455. }
  456. .user-count {
  457. font-size: 30rpx;
  458. color: #222;
  459. font-weight: bold;
  460. text-align: right;
  461. min-width: 120rpx;
  462. margin-left: 16rpx;
  463. align-self: center;
  464. }
  465. }
  466. .user-stats-row {
  467. display: flex;
  468. align-items: stretch;
  469. justify-content: center;
  470. background: #f2fff6;
  471. border-radius: 24rpx;
  472. margin: 0 0 8rpx 0;
  473. padding: 32rpx 0;
  474. box-sizing: border-box;
  475. .stat-block {
  476. flex: 1;
  477. display: flex;
  478. flex-direction: column;
  479. align-items: center;
  480. justify-content: center;
  481. padding: 0 24rpx;
  482. .stat-label {
  483. font-size: 24rpx;
  484. color: #bbb;
  485. margin-bottom: 12rpx;
  486. text-align: center;
  487. }
  488. .stat-value {
  489. font-size: 40rpx;
  490. color: #222;
  491. font-weight: bold;
  492. margin-bottom: 18rpx;
  493. &.main {
  494. color: #13ac47;
  495. font-size: 48rpx;
  496. }
  497. }
  498. .withdraw-btn, .record-btn {
  499. width: 180rpx;
  500. height: 56rpx;
  501. border-radius: 28rpx;
  502. font-size: 26rpx;
  503. font-weight: bold;
  504. margin-top: 0;
  505. display: flex;
  506. align-items: center;
  507. justify-content: center;
  508. text-align: center;
  509. box-sizing: border-box;
  510. }
  511. .withdraw-btn {
  512. background: linear-gradient(90deg, #b2f08d, #39e9d2);
  513. color: #fff;
  514. border: none;
  515. }
  516. .record-btn {
  517. background: #fff;
  518. color: #13ac47;
  519. border: 2rpx solid #13ac47;
  520. &:active, &:focus {
  521. opacity: 0.8;
  522. }
  523. }
  524. }
  525. .stat-divider {
  526. width: 2rpx;
  527. height: 72rpx;
  528. background: #e0e0e0;
  529. margin: 0 16rpx;
  530. border-radius: 2rpx;
  531. align-self: center;
  532. }
  533. }
  534. .bottom-menu-row {
  535. display: flex;
  536. justify-content: center;
  537. align-items: center;
  538. margin: 40rpx 0 0 0;
  539. .menu-item {
  540. display: flex;
  541. align-items: center;
  542. margin: 0 40rpx;
  543. .menu-icon {
  544. width: 56rpx;
  545. height: 56rpx;
  546. border-radius: 50%;
  547. display: flex;
  548. align-items: center;
  549. justify-content: center;
  550. margin-right: 12rpx;
  551. &.red {
  552. background: #ff7e6a;
  553. }
  554. &.blue {
  555. background: #7eb6ff;
  556. }
  557. }
  558. .menu-text {
  559. font-size: 28rpx;
  560. color: #222;
  561. font-weight: 500;
  562. }
  563. }
  564. }
  565. }
  566. .rank-section {
  567. margin: 32rpx 32rpx 0 32rpx;
  568. .rank-title {
  569. font-size: 30rpx;
  570. color: #222;
  571. font-weight: bold;
  572. text-align: center;
  573. margin-bottom: 24rpx;
  574. }
  575. .rank-list {
  576. background: #fff;
  577. border-radius: 24rpx;
  578. box-shadow: 0 2rpx 8rpx rgba(60, 167, 250, 0.04);
  579. overflow: hidden;
  580. .rank-item {
  581. display: flex;
  582. align-items: center;
  583. padding: 0 44rpx;
  584. height: 104rpx;
  585. border-bottom: 1rpx solid #f3f3f3;
  586. &:last-child {
  587. border-bottom: none;
  588. }
  589. .rank-icon {
  590. width: 44rpx;
  591. display: flex;
  592. align-items: center;
  593. justify-content: center;
  594. .crown, .num-icon {
  595. width: 36rpx;
  596. height: 36rpx;
  597. }
  598. }
  599. .rank-avatar {
  600. width: 48rpx;
  601. height: 48rpx;
  602. border-radius: 50%;
  603. margin: 0 18rpx 0 10rpx;
  604. background: #f5f5f5;
  605. }
  606. .rank-phone {
  607. flex: 1;
  608. font-size: 28rpx;
  609. color: #222;
  610. font-weight: bold;
  611. }
  612. .rank-amount {
  613. font-size: 30rpx;
  614. color: #b98c4a;
  615. font-weight: bold;
  616. min-width: 120rpx;
  617. text-align: right;
  618. }
  619. }
  620. }
  621. }
  622. .rights-section {
  623. margin: 40rpx 32rpx 0 32rpx;
  624. .rights-title {
  625. font-size: 30rpx;
  626. color: #222;
  627. font-weight: bold;
  628. text-align: center;
  629. margin-bottom: 24rpx;
  630. }
  631. .rights-image {
  632. width: 100%;
  633. height: auto;
  634. }
  635. }
  636. .qrcode-section {
  637. margin: 48rpx 32rpx 0 32rpx;
  638. background: #fff;
  639. border-radius: 32rpx;
  640. box-shadow: 0 4rpx 24rpx rgba(60, 167, 250, 0.08);
  641. display: flex;
  642. flex-direction: column;
  643. align-items: center;
  644. padding: 32rpx 0 40rpx 0;
  645. .qrcode-title {
  646. font-size: 28rpx;
  647. color: #222;
  648. font-weight: bold;
  649. margin-bottom: 24rpx;
  650. }
  651. .qrcode-img {
  652. width: 220rpx;
  653. height: 220rpx;
  654. background: #fff;
  655. border-radius: 24rpx;
  656. box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.08);
  657. cursor: pointer;
  658. transition: transform 0.2s ease;
  659. &:active {
  660. transform: scale(0.95);
  661. }
  662. }
  663. }
  664. .bottom-btns {
  665. position: fixed;
  666. left: 0;
  667. right: 0;
  668. bottom: 0;
  669. display: flex;
  670. justify-content: space-between;
  671. padding: 24rpx 32rpx calc(env(safe-area-inset-bottom) + 24rpx) 32rpx;
  672. background: #fff;
  673. z-index: 100;
  674. .btn {
  675. flex: 1;
  676. height: 88rpx;
  677. border-radius: 44rpx;
  678. font-size: 32rpx;
  679. font-weight: bold;
  680. margin: 0 12rpx;
  681. border: none;
  682. &.gray {
  683. background: #f5f5f5;
  684. color: #999;
  685. }
  686. &.green {
  687. background: linear-gradient(90deg, #42dfc2, #9be48f);
  688. color: #fff;
  689. }
  690. }
  691. }
  692. .bottom-menu-row {
  693. display: flex;
  694. justify-content: center;
  695. align-items: center;
  696. margin: 40rpx 0 0 0;
  697. .menu-item {
  698. display: flex;
  699. align-items: center;
  700. margin: 0 40rpx;
  701. .menu-icon {
  702. width: 56rpx;
  703. height: 56rpx;
  704. border-radius: 50%;
  705. display: flex;
  706. align-items: center;
  707. justify-content: center;
  708. margin-right: 12rpx;
  709. &.red {
  710. background: #ff7e6a;
  711. }
  712. &.blue {
  713. background: #7eb6ff;
  714. }
  715. }
  716. .menu-text {
  717. font-size: 28rpx;
  718. color: #222;
  719. font-weight: 500;
  720. }
  721. }
  722. }
  723. .progress-modal-mask {
  724. position: fixed;
  725. left: 0; right: 0; top: 0; bottom: 0;
  726. background: rgba(0,0,0,0.25);
  727. z-index: 2000;
  728. display: flex;
  729. align-items: center;
  730. justify-content: center;
  731. }
  732. .progress-modal-box {
  733. width: 80vw;
  734. max-width: 420px;
  735. background: linear-gradient(180deg, #f3fff2 0%, #eafff6 100%);
  736. border-radius: 32rpx;
  737. box-shadow: 0 8rpx 32rpx rgba(60, 167, 250, 0.10);
  738. padding: 56rpx 0 32rpx 0;
  739. display: flex;
  740. flex-direction: column;
  741. align-items: center;
  742. }
  743. .progress-modal-title {
  744. font-size: 34rpx;
  745. color: #222;
  746. font-weight: bold;
  747. text-align: center;
  748. margin-bottom: 48rpx;
  749. white-space: pre-line;
  750. }
  751. .progress-modal-list {
  752. width: 88%;
  753. display: flex;
  754. flex-direction: column;
  755. gap: 18rpx;
  756. margin-bottom: 48rpx;
  757. }
  758. .progress-modal-item {
  759. // background: #fff;
  760. border-radius: 18rpx;
  761. height: 80rpx;
  762. display: flex;
  763. align-items: center;
  764. justify-content: space-between;
  765. font-size: 30rpx;
  766. color: #222;
  767. padding: 0 32rpx;
  768. box-shadow: 0 2rpx 8rpx rgba(60, 167, 250, 0.04);
  769. }
  770. .progress-modal-btn {
  771. width: 88%;
  772. height: 88rpx;
  773. background: linear-gradient(90deg, #b2f08d, #39e9d2);
  774. color: #222;
  775. font-size: 32rpx;
  776. font-weight: bold;
  777. border-radius: 44rpx;
  778. margin-top: 8rpx;
  779. box-shadow: 0 4rpx 16rpx rgba(60, 167, 250, 0.08);
  780. display: flex;
  781. align-items: center;
  782. justify-content: center;
  783. border: none;
  784. }
  785. // 客服二维码弹窗样式
  786. .qrcode-modal-mask {
  787. position: fixed;
  788. top: 0;
  789. left: 0;
  790. right: 0;
  791. bottom: 0;
  792. background: rgba(0, 0, 0, 0.6);
  793. display: flex;
  794. justify-content: center;
  795. align-items: center;
  796. z-index: 9999;
  797. backdrop-filter: blur(5rpx);
  798. }
  799. .qrcode-modal-content {
  800. background: #fff;
  801. border-radius: 24rpx;
  802. width: 600rpx;
  803. max-width: 90vw;
  804. animation: fadeInScale 0.3s ease;
  805. overflow: hidden;
  806. }
  807. .qrcode-modal-header {
  808. display: flex;
  809. justify-content: space-between;
  810. align-items: center;
  811. padding: 40rpx 40rpx 20rpx 40rpx;
  812. border-bottom: 1rpx solid #f0f0f0;
  813. }
  814. .qrcode-modal-title {
  815. font-size: 36rpx;
  816. font-weight: bold;
  817. color: #333;
  818. }
  819. .qrcode-modal-close {
  820. padding: 10rpx;
  821. margin: -10rpx;
  822. }
  823. .qrcode-modal-body {
  824. padding: 40rpx;
  825. display: flex;
  826. flex-direction: column;
  827. align-items: center;
  828. }
  829. .qrcode-modal-img {
  830. width: 400rpx;
  831. height: 400rpx;
  832. border-radius: 16rpx;
  833. margin-bottom: 30rpx;
  834. box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.1);
  835. }
  836. .qrcode-placeholder {
  837. width: 400rpx;
  838. height: 400rpx;
  839. border-radius: 16rpx;
  840. margin-bottom: 30rpx;
  841. background: #f5f5f5;
  842. display: flex;
  843. justify-content: center;
  844. align-items: center;
  845. text {
  846. color: #999;
  847. font-size: 28rpx;
  848. }
  849. }
  850. .qrcode-modal-tip {
  851. font-size: 28rpx;
  852. color: #666;
  853. text-align: center;
  854. line-height: 1.4;
  855. margin-bottom: 10rpx;
  856. }
  857. .qrcode-modal-benefit {
  858. font-size: 26rpx;
  859. color: #13ac47;
  860. text-align: center;
  861. font-weight: bold;
  862. }
  863. @keyframes fadeInScale {
  864. from {
  865. opacity: 0;
  866. transform: scale(0.8);
  867. }
  868. to {
  869. opacity: 1;
  870. transform: scale(1);
  871. }
  872. }
  873. </style>