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

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