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

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