|
|
- <template>
- <view class="promotion-page">
- <!-- 顶部渐变导航栏 -->
- <view class="nav-bar" :style="{height: navBarTotalHeight + 'px', paddingTop: statusBarHeight + 'px'}">
- <view class="nav-bar-inner">
- <view class="back-icon" @tap="navigateBack">
- <uni-icons type="left" size="22" color="#222" />
- </view>
- <view class="nav-bar-title">回收侠·推客联盟</view>
- <view class="nav-bar-right">
- <uni-icons type="more-filled" size="22" color="#222" />
- </view>
- </view>
- </view>
- <!-- 打钩标签区 -->
- <view class="feature-tags" :style="{marginTop: navBarTotalHeight+statusBarHeight + 'px'}">
- <view class="tag" v-for="(t, i) in featureTags" :key="i">
- <text class="check">✓</text>
- <text class="text">{{t}}</text>
- </view>
- </view>
- <!-- 主内容区(卡片悬浮覆盖打钩区) -->
- <view class="main-content">
- <!-- 用户卡片 -->
- <view class="user-card">
- <view class="user-info-row">
- <view class="avatar-box">
- <view class="avatar-frame">
- <image class="avatar-img" :src="userInfo.avatar" mode="aspectFill" />
- <view class="user-type">{{userInfo.type}}</view>
- </view>
- </view>
- <view class="user-meta">
- <view class="nickname">{{userInfo.name}}</view>
- <view class="userid">ID: {{userInfo.id}}</view>
- </view>
- <view class="user-count">推广人数</view>
- </view>
- <view class="user-stats-row">
- <view class="stat-block">
- <view class="stat-label">可提现佣金(元)</view>
- <view class="stat-value main">{{userInfo.balance}}</view>
- <button class="withdraw-btn">提现</button>
- </view>
- <view class="stat-divider"></view>
- <view class="stat-block">
- <view class="stat-label">累计提现(元)</view>
- <view class="stat-value">{{userInfo.totalWithdraw}}</view>
- <button class="record-btn">提现记录</button>
- </view>
- </view>
- <view class="bottom-menu-row">
- <view class="menu-item">
- <view class="menu-icon red">
- <uni-icons type="wallet" size="32" color="#fff" />
- </view>
- <text class="menu-text">收益明细</text>
- </view>
- <view class="menu-item">
- <view class="menu-icon blue">
- <uni-icons type="person" size="32" color="#fff" />
- </view>
- <text class="menu-text">我的团队</text>
- </view>
- </view>
- </view>
- <!-- 推广排行榜 -->
- <view class="rank-section">
- <view class="rank-title">推广排行榜</view>
- <view class="rank-list">
- <view class="rank-item" v-for="(item, idx) in rankList" :key="idx">
- <view class="rank-icon">
- <image v-if="idx<3" :src="getRankIcon(idx+1)" class="crown" mode="aspectFit" />
- <image v-else :src="getRankIcon(idx+1)" class="num-icon" mode="aspectFit" />
- </view>
- <image class="rank-avatar" :src="item.avatar" mode="aspectFill" />
- <text class="rank-phone">{{item.phone}}</text>
- <text class="rank-amount">¥{{item.amount}}</text>
- </view>
- </view>
- </view>
- <!-- 权益说明表格 -->
- <view class="rights-section">
- <view class="rights-title">权益说明</view>
- <view class="rights-table">
- <view class="table-header">
- <view class="th" v-for="(h, i) in rightsHeader" :key="i">{{h}}</view>
- </view>
- <view class="table-row" v-for="(row, i) in rightsRows" :key="i">
- <view class="td" v-for="(cell, j) in row" :key="j">
- <text v-if="cell==='✓'" class="cell-check">✓</text>
- <text v-else-if="cell==='X'" class="cell-x">X</text>
- <text v-else>{{cell}}</text>
- </view>
- </view>
- </view>
- </view>
- <!-- 联系客服二维码 -->
- <view class="qrcode-section">
- <view class="qrcode-title">联系客服</view>
- <image class="qrcode-img" :src="qrcodeUrl" mode="aspectFit" />
- </view>
- </view>
- <!-- 底部按钮区 -->
- <view class="bottom-btns">
- <button class="btn gray" @tap="goQrcode">我的二维码</button>
- <button class="btn green" @tap="goUpgrade">立即升级推广官</button>
- </view>
- </view>
- </template>
-
- <script>
- import pullRefreshMixin from '@/pages/mixins/pullRefreshMixin.js'
-
- export default {
- mixins: [pullRefreshMixin],
- data() {
- return {
- statusBarHeight: 0,
- navBarHeight: 44, // px
- navBarTotalHeight: 44, // px
- featureTags: ['收益高', '品类全', '到账快', '城市多'],
- userInfo: {
- avatar: '',
- name: '',
- id: '',
- type: '',
- balance: '',
- totalWithdraw: '',
- },
- tabActive: 0,
- rankList: [
- { phone: '151****6712', amount: '8094.44', avatar: '/static/avatar1.png' },
- { phone: '151****5283', amount: '7912.19', avatar: '/static/avatar2.png' },
- { phone: '155****1691', amount: '6880.53', avatar: '/static/avatar3.png' },
- { phone: '185****9149', amount: '6784.96', avatar: '/static/avatar4.png' },
- { phone: '189****2462', amount: '5775.65', avatar: '/static/avatar5.png' },
- ],
- rightsHeader: ['推广锁粉权限', '用户', '推广官', '合伙人'],
- rightsRows: [
- ['推广锁粉权限', 'X', '✓', '✓'],
- ['直接推广收益', 'X', '20%', '20%'],
- ['间接推广收益', 'X', 'X', '5%'],
- ['官方群服务', 'X', '20%', '25%'],
- ['推广课程支持', 'X', '5%', '25%'],
- ['推广工具包', 'X', '20%', '25%'],
- ['VIP专属客服', 'X', 'X', '25%'],
- ['收益模式', 'X', '5%', '主动收益'],
- ['线下沙龙', 'X', '✓', '主动收益'],
- ],
- qrcodeUrl: '/static/qrcode.png',
- }
- },
- onLoad() {
- const sysInfo = uni.getSystemInfoSync()
- this.statusBarHeight = sysInfo.statusBarHeight
- this.navBarHeight = 44
- this.navBarTotalHeight = this.statusBarHeight + this.navBarHeight
- this.getUserInfoByToken()
- },
- onPullDownRefresh() {
- this.getUserInfoByToken()
- uni.stopPullDownRefresh()
- },
- methods: {
- async onRefresh() {
- // 模拟刷新数据
- await new Promise(resolve => setTimeout(resolve, 1000))
- uni.stopPullRefresh()
- },
- navigateBack() {
- uni.navigateBack()
- },
- getRankIcon(idx) {
- return `/static/crown${idx}.png`
- },
- goQrcode() {
- uni.navigateTo({ url: '/pages/subcomponent/promo-qrcode' })
- },
- goUpgrade() {
- uni.navigateTo({ url: '/pages/subcomponent/upgrad' })
- },
- getUserInfoByToken() {
- this.$api('getUserByToken', {}, (res) => {
- if (res && res.success && res.result) {
- this.userInfo.avatar = res.result.headImage || ''
- this.userInfo.name = res.result.nickName || ''
- this.userInfo.id = res.result.id || ''
- // 你可以根据实际接口补充type、balance、totalWithdraw等字段
- }
- })
- }
- }
- }
- </script>
-
- <style lang="scss" scoped>
- .promotion-page {
- min-height: 100vh;
- background: linear-gradient(to right, #b2f08d 0%, #39e9d2 100%);
- padding-bottom: calc(env(safe-area-inset-bottom) + 120rpx);
- }
-
- .nav-bar {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- z-index: 1000;
- width: 100vw;
- background: linear-gradient(to right, #b2f08d 0%, #39e9d2 100%);
- box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.03);
- .nav-bar-inner {
- display: flex;
- align-items: center;
- height: 44px;
- width: 100vw;
- position: relative;
- }
- .back-icon {
- width: 44px;
- height: 44px;
- display: flex;
- align-items: center;
- justify-content: center;
- position: absolute;
- left: 0;
- top: 0;
- }
- .nav-bar-title {
- flex: 1;
- text-align: center;
- font-size: 36rpx;
- font-weight: bold;
- color: #222;
- letter-spacing: 2rpx;
- line-height: 44px;
- }
- .nav-bar-right {
- width: 44px;
- height: 44px;
- position: absolute;
- right: 0;
- top: 0;
- display: flex;
- align-items: center;
- justify-content: center;
- }
- }
-
- .feature-tags {
- // background: linear-gradient(to right, #b2f08d 0%, #39e9d2 100%);
- border-radius: 32rpx;
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 0 24rpx;
- height: 80rpx;
- box-shadow: 0 4rpx 24rpx rgba(60, 167, 250, 0.08);
- .tag {
- flex: 1;
- display: flex;
- align-items: center;
- justify-content: center;
- .check {
- width: 36rpx;
- height: 36rpx;
- background: #fff;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: 28rpx;
- color: #13ac47;
- font-weight: bold;
- margin-right: 10rpx;
- box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.08);
- }
- .text {
- color: #fff;
- font-size: 28rpx;
- font-weight: bold;
- }
- }
- }
-
- .main-content {
- margin-top: 20rpx;
- padding-top: 88rpx;
- background: linear-gradient(180deg, #eaffe6 0%, #fff 30%);
- min-height: 100vh;
- width: 100vw;
- box-sizing: border-box;
- position: relative;
- z-index: 11;
- border-radius: 40rpx 40rpx 0 0;
- overflow: hidden;
- }
-
- .user-card {
- margin: 0 32rpx;
- background: linear-gradient(to bottom, #f6fff2 0%, #fff 100%);
- border-radius: 32rpx;
- box-shadow: 0 8rpx 32rpx rgba(60, 167, 250, 0.12);
- padding: 48rpx 36rpx 36rpx 36rpx;
- border: none;
- position: relative;
- top: -40rpx;
- display: flex;
- flex-direction: column;
- align-items: stretch;
- .user-info-row {
- display: flex;
- align-items: center;
- padding-bottom: 0;
- margin-bottom: 32rpx;
- // background-color: #fff;
- .avatar-box {
- margin-right: 24rpx;
- display: flex;
- flex-direction: column;
- align-items: center;
- .avatar-frame {
- width: 104rpx;
- height: 104rpx;
- border-radius: 10rpx;
- overflow: hidden;
- position: relative;
- background: #f2f2f2;
- box-shadow: 0 4rpx 16rpx rgba(0,0,0,0.10);
- .avatar-img {
- width: 104rpx;
- height: 80rpx;
- object-fit: cover;
- display: block;
- }
- .user-type {
- position: absolute;
- left: 0;
- bottom: 0;
- width: 100%;
- height: 32rpx;
- background: #e5e5e5;
- color: #888;
- font-size: 22rpx;
- font-weight: 500;
- text-align: center;
- line-height: 32rpx;
- border-bottom-left-radius: 10rpx;
- border-bottom-right-radius: 10rpx;
- }
- }
- }
- .user-meta {
- flex: 1;
- display: flex;
- flex-direction: column;
- justify-content: center;
- .nickname {
- font-size: 32rpx;
- font-weight: bold;
- color: #222;
- margin-bottom: 6rpx;
- }
- .userid {
- font-size: 24rpx;
- color: #bbb;
- }
- }
- .user-count {
- font-size: 30rpx;
- color: #222;
- font-weight: bold;
- text-align: right;
- min-width: 120rpx;
- margin-left: 16rpx;
- align-self: center;
- }
- }
- .user-stats-row {
- display: flex;
- align-items: stretch;
- justify-content: center;
- background: #f2fff6;
- border-radius: 24rpx;
- margin: 0 0 8rpx 0;
- padding: 32rpx 0;
- box-sizing: border-box;
- .stat-block {
- flex: 1;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- padding: 0 24rpx;
- .stat-label {
- font-size: 24rpx;
- color: #bbb;
- margin-bottom: 12rpx;
- text-align: center;
- }
- .stat-value {
- font-size: 40rpx;
- color: #222;
- font-weight: bold;
- margin-bottom: 18rpx;
- &.main {
- color: #13ac47;
- font-size: 48rpx;
- }
- }
- .withdraw-btn, .record-btn {
- width: 180rpx;
- height: 56rpx;
- border-radius: 28rpx;
- font-size: 26rpx;
- font-weight: bold;
- margin-top: 0;
- display: flex;
- align-items: center;
- justify-content: center;
- text-align: center;
- box-sizing: border-box;
- }
- .withdraw-btn {
- background: linear-gradient(90deg, #b2f08d, #39e9d2);
- color: #fff;
- border: none;
- }
- .record-btn {
- background: #fff;
- color: #13ac47;
- border: 2rpx solid #13ac47;
- }
- }
- .stat-divider {
- width: 2rpx;
- height: 72rpx;
- background: #e0e0e0;
- margin: 0 16rpx;
- border-radius: 2rpx;
- align-self: center;
- }
- }
- .bottom-menu-row {
- display: flex;
- justify-content: center;
- align-items: center;
- margin: 40rpx 0 0 0;
- .menu-item {
- display: flex;
- align-items: center;
- margin: 0 40rpx;
- .menu-icon {
- width: 56rpx;
- height: 56rpx;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- margin-right: 12rpx;
- &.red {
- background: #ff7e6a;
- }
- &.blue {
- background: #7eb6ff;
- }
- }
- .menu-text {
- font-size: 28rpx;
- color: #222;
- font-weight: 500;
- }
- }
- }
- }
-
- .rank-section {
- margin: 32rpx 32rpx 0 32rpx;
- .rank-title {
- font-size: 30rpx;
- color: #222;
- font-weight: bold;
- text-align: center;
- margin-bottom: 24rpx;
- }
- .rank-list {
- background: #fff;
- border-radius: 24rpx;
- box-shadow: 0 2rpx 8rpx rgba(60, 167, 250, 0.04);
- overflow: hidden;
- .rank-item {
- display: flex;
- align-items: center;
- padding: 0 44rpx;
- height: 104rpx;
- border-bottom: 1rpx solid #f3f3f3;
- &:last-child {
- border-bottom: none;
- }
- .rank-icon {
- width: 44rpx;
- display: flex;
- align-items: center;
- justify-content: center;
- .crown, .num-icon {
- width: 36rpx;
- height: 36rpx;
- }
- }
- .rank-avatar {
- width: 48rpx;
- height: 48rpx;
- border-radius: 50%;
- margin: 0 18rpx 0 10rpx;
- background: #f5f5f5;
- }
- .rank-phone {
- flex: 1;
- font-size: 28rpx;
- color: #222;
- font-weight: bold;
- }
- .rank-amount {
- font-size: 30rpx;
- color: #b98c4a;
- font-weight: bold;
- min-width: 120rpx;
- text-align: right;
- }
- }
- }
- }
-
- .rights-section {
- margin: 40rpx 32rpx 0 32rpx;
- .rights-title {
- font-size: 30rpx;
- color: #222;
- font-weight: bold;
- text-align: center;
- margin-bottom: 24rpx;
- }
- .rights-table {
- background: #fff;
- border-radius: 24rpx;
- border: 1rpx solid #ff9900;
- overflow: hidden;
- box-sizing: border-box;
- .table-header {
- display: flex;
- background: #fff7ed;
- border-bottom: 1rpx solid #ff9900;
- .th {
- flex: 1;
- text-align: center;
- font-size: 26rpx;
- color: #ff9900;
- font-weight: bold;
- padding: 24rpx 0;
- border-right: 1rpx solid #ff9900;
- &:last-child { border-right: none; }
- }
- }
- .table-row {
- display: flex;
- border-bottom: 1rpx solid #ffe5c2;
- &:last-child { border-bottom: none; }
- .td {
- flex: 1;
- text-align: center;
- font-size: 26rpx;
- color: #222;
- padding: 20rpx 0;
- border-right: 1rpx solid #ffe5c2;
- &:last-child { border-right: none; }
- .cell-check {
- color: #13ac47;
- font-size: 30rpx;
- font-weight: bold;
- }
- .cell-x {
- color: #bbb;
- font-size: 30rpx;
- }
- }
- }
- }
- }
-
- .qrcode-section {
- margin: 48rpx 32rpx 0 32rpx;
- background: #fff;
- border-radius: 32rpx;
- box-shadow: 0 4rpx 24rpx rgba(60, 167, 250, 0.08);
- display: flex;
- flex-direction: column;
- align-items: center;
- padding: 32rpx 0 40rpx 0;
- .qrcode-title {
- font-size: 28rpx;
- color: #222;
- font-weight: bold;
- margin-bottom: 24rpx;
- }
- .qrcode-img {
- width: 220rpx;
- height: 220rpx;
- background: #fff;
- border-radius: 24rpx;
- box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.08);
- }
- }
-
- .bottom-btns {
- position: fixed;
- left: 0;
- right: 0;
- bottom: 0;
- display: flex;
- justify-content: space-between;
- padding: 24rpx 32rpx calc(env(safe-area-inset-bottom) + 24rpx) 32rpx;
- background: #fff;
- z-index: 100;
- .btn {
- flex: 1;
- height: 88rpx;
- border-radius: 44rpx;
- font-size: 32rpx;
- font-weight: bold;
- margin: 0 12rpx;
- border: none;
- &.gray {
- background: #f5f5f5;
- color: #999;
- }
- &.green {
- background: linear-gradient(90deg, #42dfc2, #9be48f);
- color: #fff;
- }
- }
- }
-
- .bottom-menu-row {
- display: flex;
- justify-content: center;
- align-items: center;
- margin: 40rpx 0 0 0;
- .menu-item {
- display: flex;
- align-items: center;
- margin: 0 40rpx;
- .menu-icon {
- width: 56rpx;
- height: 56rpx;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- margin-right: 12rpx;
- &.red {
- background: #ff7e6a;
- }
- &.blue {
- background: #7eb6ff;
- }
- }
- .menu-text {
- font-size: 28rpx;
- color: #222;
- font-weight: 500;
- }
- }
- }
- </style>
|