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

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