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

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