文件
shanghaipeiwan/pwuniapp/pages/user/promote.vue

1333 行
34 KiB
Vue

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<template>
<view class="promote-page" :class="['theme-' + currentThemeKey]" :style="navStyle">
<!-- 顶部沉浸式自定义导航栏 -->
<view class="custom-nav-bar">
<view class="nav-content">
<view class="btn-nav-back btn-active" @click="handleBack">
<image class="nav-back-icon" :src="ICONS.chevronLeft" mode="aspectFit" />
</view>
<view class="nav-title-wrap">
<text class="nav-title">推广赚钱</text>
</view>
<!-- 胶囊右侧对称避让占位 -->
<view class="nav-capsule-placeholder"></view>
</view>
</view>
<!-- 主体滚动区域 -->
<scroll-view
scroll-y
class="page-scroll-body"
refresher-enabled
:refresher-triggered="isRefreshing"
@refresherrefresh="onRefresh"
>
<view class="promote-content-body">
<!-- 1. 顶部分销佣金与团队概览卡片 -->
<view class="dist-summary-banner">
<view class="dist-stat-col">
<text class="dist-stat-val tabular-num">¥{{ userCommission }}</text>
<text class="dist-stat-lbl">可提现佣金</text>
</view>
<view class="dist-stat-divider"></view>
<view class="dist-stat-col">
<text class="dist-stat-val tabular-num">{{ totalTeamCount }} 人</text>
<text class="dist-stat-lbl">下级团队成员</text>
</view>
<view class="dist-stat-divider"></view>
<view class="dist-stat-col">
<view class="code-box btn-active" @click="copyInviteCode">
<text class="code-txt">PW{{ user.id || 2006 }}</text>
<text class="copy-tag">一键复制</text>
</view>
<text class="dist-stat-lbl">专属邀请码</text>
</view>
</view>
<!-- 2. 四大功能选项卡 -->
<view class="dist-tabs-row">
<view
v-for="tab in tabs"
:key="tab.key"
class="dist-tab-pill btn-active"
:class="{ active: distActiveTab === tab.key }"
@click="distActiveTab = tab.key"
>
{{ tab.name }}
</view>
</view>
<!-- 3. Tab 内容区 -->
<!-- Tab 1: 专属太阳码海报 -->
<view class="tab-pane-poster" v-if="distActiveTab === 'poster'">
<view class="poster-preview-card">
<view class="poster-badge">官方认证邀请码</view>
<text class="poster-hero-title">电竞陪伴 · 同城玩乐</text>
<text class="poster-hero-sub">寻找心仪陪伴师,立享新人首单礼包</text>
<view class="suncode-box">
<view class="suncode-ring">
<view class="sun-dot" v-for="d in 12" :key="d"></view>
<view class="suncode-center">
<image class="suncode-avatar" :src="user.avatar || defaultAvatar" mode="aspectFill" />
</view>
</view>
<text class="suncode-hint">微信长按或扫码进入</text>
</view>
<view class="poster-footer-code">
<text class="lbl">邀请码:</text>
<text class="val">PW{{ user.id || 2006 }}</text>
</view>
</view>
<view class="poster-actions-row">
<button class="btn-poster-action secondary btn-active" @click="copyInviteLink">复制邀请链接</button>
<button class="btn-poster-action primary btn-active" @click="savePosterImage">保存海报至相册</button>
</view>
<view class="bind-inviter-card" style="margin-top: 24rpx; background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08); border-radius: 20rpx; padding: 20rpx 24rpx; display: flex; align-items: center; justify-content: space-between;">
<text style="font-size: 24rpx; color: #94A3B8;">{{ user.inviterId ? ('已绑定上级邀请人:PW' + user.inviterId) : '填写好友邀请码绑定上下级关系' }}</text>
<view v-if="!user.inviterId" style="display: flex; align-items: center; gap: 12rpx;">
<input v-model="bindCodeInput" placeholder="如 PW2001" placeholder-class="field-placeholder" style="width: 180rpx; height: 56rpx; background: rgba(0,0,0,0.25); border-radius: 12rpx; padding: 0 16rpx; font-size: 24rpx; color: #F8FAFC;" />
<button class="btn-active" style="margin: 0; height: 56rpx; line-height: 56rpx; padding: 0 24rpx; font-size: 24rpx; border-radius: 12rpx; background: #6366F1; color: #FFFFFF;" @click="handleBindInviteCode">绑定</button>
</view>
</view>
</view>
<!-- Tab 2: 下级团队列表 -->
<view class="tab-pane-team" v-if="distActiveTab === 'team'">
<view class="team-subtabs">
<view
class="subtab-item btn-active"
:class="{ active: teamLevelTab === 1 }"
@click="teamLevelTab = 1"
>
一级直推 ({{ distributionTeam.directCount || 0 }}人 · 5%)
</view>
<view
class="subtab-item btn-active"
:class="{ active: teamLevelTab === 2 }"
@click="teamLevelTab = 2"
>
二级间推 ({{ distributionTeam.indirectCount || 0 }}人 · 2%)
</view>
</view>
<view class="team-list-wrap">
<view
class="team-member-row"
v-for="m in currentTeamList"
:key="m.id"
>
<image class="m-avatar" :src="m.avatar || defaultAvatar" mode="aspectFill" />
<view class="m-info">
<view class="m-top">
<text class="m-name">{{ m.nickname }}</text>
<text class="m-level-badge">LV{{ m.level || teamLevelTab }} 好友</text>
</view>
<text class="m-time">加入时间:{{ m.createdAt }}</text>
</view>
<view class="m-contribute">
<text class="m-val tabular-num">¥{{ m.totalContribute || '0.00' }}</text>
<text class="m-lbl">贡献收益</text>
</view>
</view>
<view v-if="currentTeamList.length === 0" class="empty-state">
<image class="empty-icon" :src="ICONS.teamUp" mode="aspectFit" />
<text class="empty-txt">暂无此类下级成员,快去分享海报发展团队吧</text>
</view>
</view>
</view>
<!-- Tab 3: 返佣订单明细 -->
<view class="tab-pane-records" v-if="distActiveTab === 'records'">
<view class="records-list-wrap">
<view class="record-card" v-for="r in distributionRecords" :key="r.id">
<view class="rec-top">
<text class="rec-sn">{{ r.orderNo }}</text>
<text class="rec-status-tag">{{ r.status || '已入账' }}</text>
</view>
<view class="rec-mid">
<view class="rec-from">
<text class="rec-name">{{ r.fromUserName || '团队好友' }}</text>
<text class="rec-type">{{ r.level === 1 ? '直推订单' : '间推订单' }}</text>
</view>
<view class="rec-amount-box">
<text class="rec-comm tabular-num">+¥{{ r.commission }}</text>
<text class="rec-rate">提成 {{ r.ratePercent || (r.level === 1 ? 5 : 2) }}%</text>
</view>
</view>
<view class="rec-bot">
<text class="rec-time">{{ r.createdAt }}</text>
<text class="rec-ord-fee">消费:¥{{ r.orderAmount }}</text>
</view>
</view>
<view v-if="distributionRecords.length === 0" class="empty-state">
<image class="empty-icon" :src="ICONS.chart" mode="aspectFit" />
<text class="empty-txt">暂无返佣订单记录</text>
</view>
</view>
</view>
<!-- Tab 4: 快速佣金提现 -->
<view class="tab-pane-withdraw" v-if="distActiveTab === 'withdraw'">
<view class="dist-wd-box">
<view class="wd-box-head">
<text class="dist-wd-label">提现金额 (元)</text>
<view class="wd-history-link btn-active" @click="goToWithdrawRecords">
<text class="wd-history-txt">提现记录</text>
<image class="wd-history-arrow" :src="ICONS.chevronRight" mode="aspectFit" />
</view>
</view>
<view class="dist-input-row">
<text class="symbol">¥</text>
<input
type="digit"
class="dist-amount-input"
v-model="distWithdrawAmount"
placeholder="请输入提现金额"
placeholder-class="field-placeholder"
/>
<text class="btn-all btn-active" @click="handleFillAllCommission">全部提现</text>
</view>
<view class="dist-wd-tip">
<text class="tip-txt">支持自动提现至绑定微信零钱,平台免收手续费,T+0 快速审核到账。</text>
</view>
<button
class="btn-submit-dist-wd btn-active"
:disabled="submittingDistWithdraw"
@click="submitDistWithdraw"
>
{{ submittingDistWithdraw ? '正在提交...' : '确认发起提现' }}
</button>
</view>
</view>
</view>
</scroll-view>
</view>
</template>
<script setup>
import { ref, computed, onMounted } from 'vue';
import { onShow } from '@dcloudio/uni-app';
import {
getUserProfile,
getDistributionTeam,
getDistributionRecords,
withdrawCommission,
bindInviteCode
} from '@/common/api.js';
import { ICONS } from '@/common/icons.js';
import { getCurrentThemeKey, applyThemeToNativeUI } from '@/common/theme.js';
import { getNavBarInfo } from '@/common/nav.js';
const currentThemeKey = ref(getCurrentThemeKey());
const navInfo = ref(getNavBarInfo());
const isRefreshing = ref(false);
const bindCodeInput = ref('');
const defaultAvatar = 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=200';
const user = ref({
id: 2006,
nickname: '苏苏学姐',
avatar: defaultAvatar,
commission: '0.00',
invitedCount: 5
});
const distActiveTab = ref('poster');
const teamLevelTab = ref(1);
const tabs = [
{ key: 'poster', name: '推广海报' },
{ key: 'team', name: '下级团队' },
{ key: 'records', name: '返佣订单' },
{ key: 'withdraw', name: '佣金提现' }
];
const distributionTeam = ref({
directCount: 3,
indirectCount: 2,
totalTeamCount: 5,
directList: [
{ id: 3001, nickname: '晨光玩家', avatar: 'https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=200', level: 1, createdAt: '2026-10-08 14:20', totalContribute: '48.50' },
{ id: 3002, nickname: '风暴骑士', avatar: 'https://images.unsplash.com/photo-1570295999919-56ceb5ecca61?w=200', level: 1, createdAt: '2026-10-09 11:35', totalContribute: '32.00' },
{ id: 3003, nickname: '月下独酌', avatar: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=200', level: 1, createdAt: '2026-10-10 09:12', totalContribute: '19.80' }
],
indirectList: [
{ id: 4001, nickname: '极光闪电', avatar: 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=200', level: 2, createdAt: '2026-10-11 16:45', totalContribute: '12.60' },
{ id: 4002, nickname: '晴空万里', avatar: 'https://images.unsplash.com/photo-1522075469751-3a6694fb2f61?w=200', level: 2, createdAt: '2026-10-12 18:02', totalContribute: '8.40' }
]
});
const distributionRecords = ref([
{ id: 'REC_101', orderNo: 'ORD_2026101201', fromUserName: '晨光玩家', level: 1, ratePercent: 5, commission: '25.00', orderAmount: '500.00', status: '已入账', createdAt: '2026-10-12 20:30' },
{ id: 'REC_102', orderNo: 'ORD_2026101102', fromUserName: '风暴骑士', level: 1, ratePercent: 5, commission: '16.00', orderAmount: '320.00', status: '已入账', createdAt: '2026-10-11 19:15' },
{ id: 'REC_103', orderNo: 'ORD_2026101003', fromUserName: '极光闪电', level: 2, ratePercent: 2, commission: '6.40', orderAmount: '320.00', status: '已入账', createdAt: '2026-10-10 15:00' }
]);
const distWithdrawAmount = ref('');
const submittingDistWithdraw = ref(false);
const navStyle = computed(() => {
return {
'--safe-header-gap': `${navInfo.value.safeHeaderGap}px`,
'--capsule-right-space': `${navInfo.value.capsuleRightSpace}px`,
'--capsule-height': `${navInfo.value.capsuleHeight}px`
};
});
const userCommission = computed(() => {
const comm = Number(user.value.commission || 0);
return isNaN(comm) ? '0.00' : comm.toFixed(2);
});
const totalTeamCount = computed(() => {
return distributionTeam.value.totalTeamCount ||
((distributionTeam.value.directCount || 0) + (distributionTeam.value.indirectCount || 0)) ||
(user.value.invitedCount || 0);
});
const currentTeamList = computed(() => {
if (teamLevelTab.value === 1) {
return distributionTeam.value.directList || [];
}
return distributionTeam.value.indirectList || [];
});
const handleBack = () => {
const pages = getCurrentPages();
if (pages && pages.length > 1) {
uni.navigateBack();
} else {
uni.switchTab({
url: '/pages/user/index'
});
}
};
const copyInviteCode = () => {
const code = `PW${user.value.id || 2006}`;
uni.setClipboardData({
data: code,
success: () => {
uni.showToast({ title: '邀请码已复制', icon: 'success' });
}
});
};
const copyInviteLink = () => {
const link = `https://peiww.gynhc.com/invite?code=PW${user.value.id || 2006}`;
uni.setClipboardData({
data: link,
success: () => {
uni.showToast({ title: '邀请链接已复制', icon: 'success' });
}
});
};
const savePosterImage = () => {
uni.showToast({ title: '海报已保存至相册', icon: 'success' });
};
const handleBindInviteCode = async () => {
const code = bindCodeInput.value.trim();
if (!code) {
uni.showToast({ title: '请输入好友邀请码', icon: 'none' });
return;
}
try {
const uid = user.value.id || 2006;
const res = await bindInviteCode(uid, code);
user.value.inviterId = res.inviterId;
bindCodeInput.value = '';
uni.showToast({ title: `成功绑定上级:${res.inviterName || code}`, icon: 'success' });
loadData();
} catch (err) {
uni.showToast({ title: err.message || '绑定失败', icon: 'none' });
}
};
const handleFillAllCommission = () => {
const comm = Number(user.value.commission || 0);
if (comm <= 0) {
uni.showToast({ title: '当前无可用提现佣金', icon: 'none' });
return;
}
distWithdrawAmount.value = String(comm);
};
const goToWithdrawRecords = () => {
uni.navigateTo({
url: '/pages/user/withdraw-records'
});
};
const submitDistWithdraw = async () => {
const amount = Number(distWithdrawAmount.value);
if (!amount || amount <= 0) {
uni.showToast({ title: '请输入有效提现金额', icon: 'none' });
return;
}
const currentComm = Number(user.value.commission || 0);
if (amount > currentComm) {
uni.showToast({ title: '提现金额超出可用佣金', icon: 'none' });
return;
}
submittingDistWithdraw.value = true;
uni.showLoading({ title: '正在提交申请...' });
try {
const uid = user.value.id || 2006;
await withdrawCommission(uid, amount, { channel: 'WECHAT' });
user.value.commission = (currentComm - amount).toFixed(2);
distWithdrawAmount.value = '';
uni.hideLoading();
uni.showToast({ title: '提现申请已提交', icon: 'success' });
await loadData();
} catch (err) {
uni.hideLoading();
uni.showToast({ title: err.message || '提现提交失败', icon: 'none' });
} finally {
submittingDistWithdraw.value = false;
}
};
const loadData = async () => {
const uid = uni.getStorageSync('userId') || 2006;
try {
const [profile, teamData, records] = await Promise.all([
getUserProfile(uid).catch(() => null),
getDistributionTeam(uid).catch(() => null),
getDistributionRecords(uid).catch(() => null)
]);
if (profile) {
user.value = {
...user.value,
...profile
};
}
if (teamData) {
distributionTeam.value = {
...distributionTeam.value,
...teamData
};
}
if (Array.isArray(records) && records.length > 0) {
distributionRecords.value = records;
}
} catch (_) {
} finally {
isRefreshing.value = false;
}
};
const onRefresh = async () => {
isRefreshing.value = true;
await loadData();
};
onMounted(() => {
navInfo.value = getNavBarInfo();
currentThemeKey.value = getCurrentThemeKey();
applyThemeToNativeUI(currentThemeKey.value);
loadData();
});
onShow(() => {
currentThemeKey.value = getCurrentThemeKey();
applyThemeToNativeUI(currentThemeKey.value);
loadData();
});
</script>
<style lang="scss">
.promote-page {
min-height: 100vh;
background-color: #0A0F1D;
display: flex;
flex-direction: column;
box-sizing: border-box;
color: #F8FAFC;
}
/* 顶部沉浸式自定义顶栏 */
.custom-nav-bar {
position: sticky;
top: 0;
z-index: 100;
padding-top: var(--safe-header-gap, 44px);
background: rgba(10, 15, 29, 0.92);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
.nav-content {
position: relative;
height: var(--capsule-height, 44px);
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 24rpx;
.btn-nav-back {
width: 64rpx;
height: 64rpx;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
.nav-back-icon {
width: 36rpx;
height: 36rpx;
}
}
.nav-title-wrap {
position: absolute;
left: 50%;
transform: translateX(-50%);
text-align: center;
.nav-title {
font-size: 32rpx;
font-weight: 700;
color: #F8FAFC;
letter-spacing: 1rpx;
}
}
.nav-capsule-placeholder {
width: var(--capsule-right-space, 96px);
flex-shrink: 0;
}
}
}
/* 滚动区 */
.page-scroll-body {
flex: 1;
height: 0;
}
.promote-content-body {
padding: 24rpx 32rpx calc(80rpx + env(safe-area-inset-bottom));
}
/* 1. 顶部佣金总览卡片 */
.dist-summary-banner {
background: linear-gradient(135deg, rgba(99, 102, 241, 0.15), rgba(139, 92, 246, 0.15));
border: 1px solid rgba(99, 102, 241, 0.3);
border-radius: 24rpx;
padding: 32rpx 24rpx;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 28rpx;
box-shadow: 0 8rpx 28rpx rgba(0, 0, 0, 0.2);
.dist-stat-col {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
.dist-stat-val {
font-size: 36rpx;
font-weight: 700;
color: #10B981;
margin-bottom: 8rpx;
}
.dist-stat-lbl {
font-size: 22rpx;
color: #94A3B8;
}
.code-box {
display: inline-flex;
align-items: center;
gap: 8rpx;
background: rgba(99, 102, 241, 0.2);
border: 1px solid rgba(99, 102, 241, 0.4);
padding: 6rpx 14rpx;
border-radius: 12rpx;
margin-bottom: 8rpx;
.code-txt {
font-size: 26rpx;
font-weight: 700;
color: #818CF8;
font-family: monospace;
}
.copy-tag {
font-size: 18rpx;
color: #F8FAFC;
background: #6366F1;
padding: 2rpx 8rpx;
border-radius: 6rpx;
}
}
}
.dist-stat-divider {
width: 1px;
height: 48rpx;
background: rgba(255, 255, 255, 0.1);
}
}
/* 2. 选项卡切换行 */
.dist-tabs-row {
display: flex;
gap: 16rpx;
margin-bottom: 28rpx;
background: #151D30;
padding: 8rpx;
border-radius: 20rpx;
border: 1px solid rgba(255, 255, 255, 0.06);
.dist-tab-pill {
flex: 1;
text-align: center;
padding: 18rpx 0;
font-size: 26rpx;
color: #94A3B8;
border-radius: 14rpx;
font-weight: 500;
transition: all 0.2s;
&.active {
color: #FFFFFF;
background: linear-gradient(135deg, #6366F1, #8B5CF6);
font-weight: 700;
box-shadow: 0 4rpx 16rpx rgba(99, 102, 241, 0.35);
}
}
}
/* 3. Tab 1: 推广海报 */
.tab-pane-poster {
display: flex;
flex-direction: column;
align-items: center;
.poster-preview-card {
width: 100%;
background: linear-gradient(180deg, #151D30 0%, #0D1424 100%);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 24rpx;
padding: 40rpx 32rpx;
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 32rpx;
box-shadow: 0 12rpx 36rpx rgba(0, 0, 0, 0.3);
.poster-badge {
font-size: 20rpx;
color: #6366F1;
background: rgba(99, 102, 241, 0.15);
border: 1px solid rgba(99, 102, 241, 0.3);
padding: 6rpx 18rpx;
border-radius: 20rpx;
margin-bottom: 18rpx;
font-weight: 600;
}
.poster-hero-title {
font-size: 34rpx;
font-weight: 800;
color: #F8FAFC;
letter-spacing: 2rpx;
margin-bottom: 10rpx;
}
.poster-hero-sub {
font-size: 22rpx;
color: #94A3B8;
margin-bottom: 36rpx;
}
.suncode-box {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 32rpx;
.suncode-ring {
width: 240rpx;
height: 240rpx;
border-radius: 50%;
border: 4rpx dashed #6366F1;
display: flex;
align-items: center;
justify-content: center;
position: relative;
margin-bottom: 16rpx;
.sun-dot {
position: absolute;
width: 8rpx;
height: 8rpx;
background: #818CF8;
border-radius: 50%;
}
.suncode-center {
width: 180rpx;
height: 180rpx;
border-radius: 50%;
border: 4rpx solid #6366F1;
overflow: hidden;
.suncode-avatar {
width: 100%;
height: 100%;
}
}
}
.suncode-hint {
font-size: 22rpx;
color: #64748B;
}
}
.poster-footer-code {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 14rpx;
padding: 12rpx 28rpx;
display: inline-flex;
align-items: baseline;
gap: 10rpx;
.lbl {
font-size: 22rpx;
color: #94A3B8;
}
.val {
font-size: 28rpx;
font-weight: 800;
color: #F59E0B;
font-family: monospace;
}
}
}
.poster-actions-row {
width: 100%;
display: flex;
gap: 20rpx;
.btn-poster-action {
flex: 1;
height: 88rpx;
line-height: 88rpx;
font-size: 28rpx;
font-weight: 700;
border-radius: 44rpx;
text-align: center;
margin: 0;
&.secondary {
background: #1E293B;
border: 1px solid rgba(255, 255, 255, 0.1);
color: #94A3B8;
}
&.primary {
background: linear-gradient(135deg, #6366F1, #8B5CF6);
color: #FFFFFF;
box-shadow: 0 8rpx 24rpx rgba(99, 102, 241, 0.4);
}
}
}
}
/* 4. Tab 2: 下级团队 */
.tab-pane-team {
.team-subtabs {
display: flex;
gap: 16rpx;
margin-bottom: 24rpx;
.subtab-item {
flex: 1;
font-size: 24rpx;
text-align: center;
padding: 16rpx 0;
border-radius: 12rpx;
color: #94A3B8;
background: #151D30;
border: 1px solid rgba(255, 255, 255, 0.06);
&.active {
color: #818CF8;
background: rgba(99, 102, 241, 0.18);
border-color: rgba(99, 102, 241, 0.4);
font-weight: 700;
}
}
}
.team-list-wrap {
.team-member-row {
display: flex;
align-items: center;
background: #151D30;
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 18rpx;
padding: 22rpx 24rpx;
margin-bottom: 16rpx;
.m-avatar {
width: 88rpx;
height: 88rpx;
border-radius: 44rpx;
margin-right: 20rpx;
}
.m-info {
flex: 1;
.m-top {
display: flex;
align-items: center;
gap: 12rpx;
margin-bottom: 6rpx;
.m-name {
font-size: 28rpx;
font-weight: 600;
color: #F8FAFC;
}
.m-level-badge {
font-size: 20rpx;
color: #818CF8;
background: rgba(99, 102, 241, 0.15);
border: 1px solid rgba(99, 102, 241, 0.3);
padding: 2rpx 10rpx;
border-radius: 8rpx;
}
}
.m-time {
font-size: 22rpx;
color: #64748B;
}
}
.m-contribute {
text-align: right;
.m-val {
font-size: 30rpx;
font-weight: 700;
color: #10B981;
display: block;
}
.m-lbl {
font-size: 20rpx;
color: #64748B;
}
}
}
}
}
/* 5. Tab 3: 返佣订单明细 */
.tab-pane-records {
.records-list-wrap {
.record-card {
background: #151D30;
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 18rpx;
padding: 24rpx;
margin-bottom: 18rpx;
.rec-top {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12rpx;
.rec-sn {
font-size: 22rpx;
color: #64748B;
font-family: monospace;
}
.rec-status-tag {
font-size: 20rpx;
color: #10B981;
background: rgba(16, 185, 129, 0.12);
border: 1px solid rgba(16, 185, 129, 0.25);
padding: 2rpx 12rpx;
border-radius: 8rpx;
}
}
.rec-mid {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12rpx;
.rec-from {
display: flex;
align-items: baseline;
gap: 12rpx;
.rec-name {
font-size: 28rpx;
font-weight: 600;
color: #F8FAFC;
}
.rec-type {
font-size: 20rpx;
color: #818CF8;
}
}
.rec-amount-box {
text-align: right;
.rec-comm {
font-size: 32rpx;
font-weight: 700;
color: #F59E0B;
display: block;
}
.rec-rate {
font-size: 20rpx;
color: #64748B;
}
}
}
.rec-bot {
display: flex;
justify-content: space-between;
font-size: 22rpx;
color: #64748B;
border-top: 1px solid rgba(255, 255, 255, 0.04);
padding-top: 10rpx;
}
}
}
}
/* 6. Tab 4: 快速佣金提现 */
.tab-pane-withdraw {
.dist-wd-box {
background: #151D30;
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 24rpx;
padding: 32rpx;
.wd-box-head {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16rpx;
.dist-wd-label {
font-size: 26rpx;
color: #94A3B8;
font-weight: 500;
}
.wd-history-link {
display: inline-flex;
align-items: center;
gap: 4rpx;
.wd-history-txt {
font-size: 24rpx;
color: #6366F1;
font-weight: 500;
}
.wd-history-arrow {
width: 24rpx;
height: 24rpx;
}
}
}
.dist-input-row {
display: flex;
align-items: center;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 16rpx;
padding: 0 20rpx;
height: 96rpx;
margin-bottom: 20rpx;
.symbol {
font-size: 38rpx;
font-weight: 700;
color: #F8FAFC;
margin-right: 12rpx;
}
.dist-amount-input {
flex: 1;
font-size: 38rpx;
font-weight: 700;
color: #F8FAFC;
}
.btn-all {
font-size: 24rpx;
color: #6366F1;
font-weight: 600;
padding-left: 16rpx;
}
}
.dist-wd-tip {
margin-bottom: 32rpx;
.tip-txt {
font-size: 22rpx;
color: #64748B;
line-height: 1.5;
}
}
.btn-submit-dist-wd {
width: 100%;
height: 88rpx;
line-height: 88rpx;
background: linear-gradient(135deg, #10B981, #059669);
color: #FFFFFF;
font-size: 28rpx;
font-weight: 700;
border-radius: 44rpx;
text-align: center;
box-shadow: 0 8rpx 24rpx rgba(16, 185, 129, 0.35);
margin: 0;
&[disabled] {
opacity: 0.6;
}
}
}
}
.empty-state {
text-align: center;
padding: 60rpx 0;
.empty-icon {
width: 64rpx;
height: 64rpx;
opacity: 0.4;
margin: 0 auto 16rpx;
display: block;
}
.empty-txt {
font-size: 24rpx;
color: #64748B;
}
}
/* 暖阳浅色主题 (theme-warm) */
.promote-page.theme-warm {
background-color: #FFFDF9;
color: #1C1917;
.custom-nav-bar {
background: rgba(255, 253, 249, 0.95);
border-bottom: 1px solid rgba(234, 88, 12, 0.1);
.nav-content {
.btn-nav-back {
background: #FFF7ED;
border-color: #FED7AA;
}
.nav-title-wrap .nav-title {
color: #1C1917;
}
}
}
.dist-summary-banner {
background: linear-gradient(135deg, #FFF7ED 0%, #FFEDD5 100%);
border-color: #FED7AA;
box-shadow: 0 8rpx 28rpx rgba(234, 88, 12, 0.08);
.dist-stat-col {
.dist-stat-val {
color: #EA580C;
}
.dist-stat-lbl {
color: #78716C;
}
.code-box {
background: #FFFFFF;
border-color: #FDBA74;
.code-txt {
color: #EA580C;
}
.copy-tag {
background: #EA580C;
color: #FFFFFF;
}
}
}
.dist-stat-divider {
background: #FED7AA;
}
}
.dist-tabs-row {
background: #FFFFFF;
border-color: #FED7AA;
.dist-tab-pill {
color: #78716C;
&.active {
color: #FFFFFF;
background: linear-gradient(135deg, #F97316 0%, #EA580C 100%);
box-shadow: 0 4rpx 16rpx rgba(234, 88, 12, 0.3);
}
}
}
.tab-pane-poster {
.poster-preview-card {
background: #FFFFFF;
border-color: #FED7AA;
box-shadow: 0 10rpx 32rpx rgba(28, 25, 23, 0.06);
.poster-badge {
color: #EA580C;
background: #FFF7ED;
border-color: #FDBA74;
}
.poster-hero-title {
color: #1C1917;
}
.poster-hero-sub {
color: #78716C;
}
.suncode-box {
.suncode-ring {
border-color: #EA580C;
.sun-dot {
background: #F97316;
}
.suncode-center {
border-color: #EA580C;
}
}
.suncode-hint {
color: #78716C;
}
}
.poster-footer-code {
background: #FFF7ED;
border-color: #FED7AA;
.lbl {
color: #78716C;
}
.val {
color: #EA580C;
}
}
}
.poster-actions-row {
.btn-poster-action {
&.secondary {
background: #FFFFFF;
border-color: #FED7AA;
color: #78716C;
}
&.primary {
background: linear-gradient(135deg, #F97316 0%, #EA580C 100%);
box-shadow: 0 8rpx 24rpx rgba(234, 88, 12, 0.35);
}
}
}
}
.tab-pane-team {
.team-subtabs {
.subtab-item {
background: #FFFFFF;
border-color: #FED7AA;
color: #78716C;
&.active {
color: #EA580C;
background: #FFF7ED;
border-color: #FDBA74;
}
}
}
.team-list-wrap {
.team-member-row {
background: #FFFFFF;
border-color: #FED7AA;
.m-info {
.m-top {
.m-name {
color: #1C1917;
}
.m-level-badge {
color: #EA580C;
background: #FFF7ED;
border-color: #FDBA74;
}
}
.m-time {
color: #78716C;
}
}
.m-contribute {
.m-val {
color: #059669;
}
.m-lbl {
color: #78716C;
}
}
}
}
}
.tab-pane-records {
.records-list-wrap {
.record-card {
background: #FFFFFF;
border-color: #FED7AA;
.rec-top {
.rec-sn {
color: #78716C;
}
.rec-status-tag {
color: #059669;
background: #ECFDF5;
border-color: #A7F3D0;
}
}
.rec-mid {
.rec-from {
.rec-name {
color: #1C1917;
}
.rec-type {
color: #EA580C;
}
}
.rec-amount-box {
.rec-comm {
color: #EA580C;
}
.rec-rate {
color: #78716C;
}
}
}
.rec-bot {
color: #78716C;
border-top-color: #F5F2EC;
}
}
}
}
.tab-pane-withdraw {
.dist-wd-box {
background: #FFFFFF;
border-color: #FED7AA;
.wd-box-head {
.dist-wd-label {
color: #78716C;
}
.wd-history-link {
.wd-history-txt {
color: #EA580C;
}
}
}
.dist-input-row {
background: #FFFDF9;
border-color: #FED7AA;
.symbol,
.dist-amount-input {
color: #1C1917;
}
.btn-all {
color: #EA580C;
}
}
.dist-wd-tip .tip-txt {
color: #78716C;
}
.btn-submit-dist-wd {
background: linear-gradient(135deg, #10B981, #059669);
}
}
}
}
</style>