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

10 months ago
10 months ago
10 months ago
10 months ago
9 months ago
10 months ago
9 months ago
9 months ago
10 months ago
9 months ago
9 months ago
10 months ago
9 months ago
9 months ago
10 months ago
10 months ago
9 months ago
9 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
9 months ago
10 months ago
9 months ago
9 months ago
9 months ago
9 months ago
10 months ago
10 months ago
9 months ago
10 months ago
10 months ago
10 months ago
9 months ago
10 months ago
9 months ago
9 months ago
9 months ago
9 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
9 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
9 months ago
9 months ago
10 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 || 0}}</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 || 0}}</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>