feat: 更新团队统计数据接口,优化统计信息展示样式

This commit is contained in:
2026-01-25 18:15:29 +07:00
parent 37dab6a506
commit 464db7f638

View File

@@ -19,10 +19,11 @@ const [depth3Query] = useResetRef({
pageSize: 10, pageSize: 10,
}); });
// 统计数据 // 统计数据
const { data: statistics } = safeClient(client.api.team.stats.get()); const { data: statistics } = safeClient(client.api.team.dashboard.summary.get());
const { data: earnings } = safeClient(client.api.team.earnings.get());
const { data: depth1, execute: executeDepth1 } = safeClient(() => client.api.team.members.get({ query: { ...depth1Query.value } })); const { data: depth1, execute: executeDepth1 } = safeClient(() => client.api.team.members.get({ query: { ...depth1Query.value } }));
const { data: depth2, execute: executeDepth2 } = safeClient(() => client.api.team.members.get({ query: { ...depth2Query.value } })); const { data: depth2, execute: executeDepth2 } = safeClient(() => client.api.team.members.get({ query: { ...depth2Query.value } }), { immediate: false });
const { data: depth3, execute: executeDepth3 } = safeClient(() => client.api.team.members.get({ query: { ...depth3Query.value } })); const { data: depth3, execute: executeDepth3 } = safeClient(() => client.api.team.members.get({ query: { ...depth3Query.value } }), { immediate: false });
// 当前选中的级别 // 当前选中的级别
const selectedLevel = ref<1 | 2 | 3>(1); const selectedLevel = ref<1 | 2 | 3>(1);
@@ -133,91 +134,158 @@ function nextPage() {
<ion-icon :icon="peopleOutline" class="title-icon" /> <ion-icon :icon="peopleOutline" class="title-icon" />
<span>团队规模</span> <span>团队规模</span>
</div> </div>
<div class="team-size-card"> <div class="stats-grid">
<div class="team-total"> <div class="stat-card primary">
<div class="total-value"> <div class="stat-value">
{{ statistics?.totalCount }} {{ statistics?.totalCount || 0 }}
</div> </div>
<div class="total-label"> <div class="stat-label">
团队总人数 团队总人数
</div> </div>
</div> </div>
<div class="team-growth"> <div class="stat-card">
<div class="growth-item"> <div class="stat-value small">
<span class="growth-label">今日新增</span> {{ statistics?.todayCount || 0 }}
<span class="growth-value">{{ statistics?.todayCount }}</span>
</div> </div>
<div class="growth-item"> <div class="stat-label">
<span class="growth-label">昨日新增</span> 今日新增
<span class="growth-value">{{ statistics?.yesterdayCount }}</span>
</div> </div>
<div class="growth-item"> </div>
<span class="growth-label">本月新增</span> <div class="stat-card">
<span class="growth-value">{{ statistics?.monthCount }}</span> <div class="stat-value small">
{{ statistics?.monthCount || 0 }}
</div>
<div class="stat-label">
本月新增
</div>
</div>
</div>
<div class="stats-grid mt-3">
<div class="stat-card">
<div class="stat-value small">
{{ statistics?.totalRegister || 0 }}
</div>
<div class="stat-label">
总注册
</div>
</div>
<div class="stat-card">
<div class="stat-value small">
{{ statistics?.totalKyc || 0 }}
</div>
<div class="stat-label">
总实名
</div>
</div>
<div class="stat-card">
<div class="stat-value small">
{{ statistics?.totalActivated || 0 }}
</div>
<div class="stat-label">
总激活
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- 助力统计 --> <!-- 助力统计 -->
<!-- <div class="stats-section"> <div class="stats-section">
<div class="section-title">
<ion-icon :icon="trendingUpOutline" class="title-icon" />
<span>团队助力</span>
</div>
<div class="unified-card">
<div class="unified-left">
<div class="unified-value">
¥{{ statistics?.totalSupport.toFixed(2) }}
</div>
<div class="unified-label">
团队总助力
</div>
</div>
<div class="unified-right">
<div class="unified-item">
<span class="unified-item-label">本月助力</span>
<span class="unified-item-value">¥{{ statistics?.monthSupport.toFixed(2) }}</span>
</div>
<div class="unified-item">
<span class="unified-item-label">较上月</span>
<span class="unified-item-value" :class="supportChange.isPositive ? 'success' : 'danger'">
{{ supportChange.isPositive ? '+' : '' }}{{ supportChange.percent }}%
</span>
</div>
</div>
</div>
</div> -->
<!-- 收益统计 -->
<!-- <div class="stats-section">
<div class="section-title"> <div class="section-title">
<ion-icon :icon="walletOutline" class="title-icon" /> <ion-icon :icon="walletOutline" class="title-icon" />
<span>团队收益</span> <span>团队助力</span>
</div> </div>
<div class="unified-card">
<div class="unified-left"> <!-- 总助力 -->
<div class="unified-value"> <div class="earnings-main-card">
¥{{ statistics?.todayIncome.toFixed(2) }} <div class="earnings-total">
<div class="earnings-label">
团队总助力
</div>
<div class="earnings-value">
¥{{ Number(earnings?.totalAmount || 0).toFixed(2) }}
</div>
</div>
</div>
<!-- 本月数据 -->
<div class="earnings-section">
<div class="earnings-section-title">
本月助力
</div>
<div class="stats-grid">
<div class="stat-card accent">
<div class="stat-value small">
¥{{ Number(earnings?.monthAmount || 0).toFixed(2) }}
</div>
<div class="stat-label">
本月金额
</div>
</div>
<div class="stat-card">
<div class="stat-value small">
¥{{ Number(earnings?.lastMonthAmount || 0).toFixed(2) }}
</div>
<div class="stat-label">
上月金额
</div>
</div>
<div class="stat-card" :class="Number(earnings?.monthIncreaseAmount || 0) >= 0 ? 'success' : 'danger'">
<div class="stat-value small">
{{ Number(earnings?.monthIncreaseAmount || 0) >= 0 ? '+' : '' }}¥{{ Number(earnings?.monthIncreaseAmount || 0).toFixed(2) }}
</div>
<div class="stat-label">
月增长
</div>
</div>
</div>
</div>
<!-- 本周数据 -->
<div class="earnings-section">
<div class="earnings-section-title">
本周助力
</div>
<div class="stats-grid">
<div class="stat-card accent">
<div class="stat-value small">
¥{{ Number(earnings?.weekAmount || 0).toFixed(2) }}
</div>
<div class="stat-label">
本周金额
</div>
</div>
<div class="stat-card">
<div class="stat-value small">
¥{{ Number(earnings?.lastWeekAmount || 0).toFixed(2) }}
</div>
<div class="stat-label">
上周金额
</div>
</div>
<div class="stat-card" :class="Number(earnings?.weekIncreaseAmount || 0) >= 0 ? 'success' : 'danger'">
<div class="stat-value small">
{{ Number(earnings?.weekIncreaseAmount || 0) >= 0 ? '+' : '' }}¥{{ Number(earnings?.weekIncreaseAmount || 0).toFixed(2) }}
</div>
<div class="stat-label">
周增长
</div>
</div>
</div>
</div>
<!-- 今日数据 -->
<div class="today-earnings-card">
<div class="flex items-center justify-between">
<div class="text-sm text-gray-600">
今日助力
</div>
<div class="text-xl font-bold text-[#c41e3a]">
¥{{ Number(earnings?.todayAmount || 0).toFixed(2) }}
</div> </div>
<div class="unified-label">
今日收益
</div>
</div>
<div class="unified-right">
<div class="unified-item">
<span class="unified-item-label">本周收益</span>
<span class="unified-item-value">¥{{ statistics.weekIncome.toFixed(2) }}</span>
</div>
<div class="unified-item">
<span class="unified-item-label">较上月</span>
<span class="unified-item-value" :class="incomeChange.isPositive ? 'success' : 'danger'">
{{ incomeChange.isPositive ? '+' : '' }}{{ incomeChange.percent }}%
</span>
</div> </div>
</div> </div>
</div> </div>
</div> -->
<!-- 团队列表 --> <!-- 团队列表 -->
<div class="team-list-section"> <div class="team-list-section">
@@ -328,6 +396,7 @@ function nextPage() {
overflow: hidden; overflow: hidden;
border-radius: 100%; border-radius: 100%;
} }
.stats-section { .stats-section {
background: white; background: white;
padding: 20px; padding: 20px;
@@ -349,113 +418,116 @@ function nextPage() {
color: #c41e3a; color: #c41e3a;
} }
.team-size-card { .stats-grid {
display: flex; display: grid;
align-items: center; grid-template-columns: repeat(3, 1fr);
background: linear-gradient(135deg, #fff7f0 0%, #ffe8e8 100%);
border-radius: 12px;
padding: 20px;
gap: 20px;
}
.team-total {
flex: 1;
text-align: center;
padding-right: 20px;
border-right: 1px solid #333;
}
.total-value {
font-size: 36px;
font-weight: 700;
color: #c41e3a;
margin-bottom: 8px;
}
.total-label {
font-size: 14px;
}
.team-growth {
flex: 1;
display: flex;
flex-direction: column;
gap: 12px; gap: 12px;
} }
.growth-item { .stat-card {
display: flex; background: #f5f7fa;
justify-content: space-between;
align-items: center;
}
.growth-label {
font-size: 14px;
}
.growth-value {
font-size: 18px;
font-weight: 700;
}
.unified-card {
display: flex;
align-items: center;
background: linear-gradient(135deg, #f5f7fa 0%, #e8edf3 100%);
border-radius: 12px; border-radius: 12px;
padding: 20px; padding: 16px 12px;
gap: 20px;
}
.unified-left {
flex: 1;
text-align: center; text-align: center;
padding-right: 20px; transition: all 0.3s ease;
border-right: 1px solid #333;
} }
.unified-value { .stat-card.primary {
background: linear-gradient(135deg, #c41e3a 0%, #8b1a2e 100%);
color: white;
}
.stat-card.accent {
background: linear-gradient(135deg, #fff7f0 0%, #ffe8e8 100%);
}
.stat-card.success {
background: linear-gradient(135deg, #f0fdf4 0%, #dcfce7 100%);
}
.stat-card.danger {
background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);
}
.stat-value {
font-size: 28px; font-size: 28px;
font-weight: 700; font-weight: 700;
margin-bottom: 4px;
}
.stat-card.primary .stat-value {
color: white;
}
.stat-card.accent .stat-value {
color: #c41e3a; color: #c41e3a;
}
.stat-card.success .stat-value {
color: #16a34a;
}
.stat-card.danger .stat-value {
color: #dc2626;
}
.stat-value.small {
font-size: 20px;
}
.stat-label {
font-size: 12px;
color: #666;
}
.stat-card.primary .stat-label {
color: rgba(255, 255, 255, 0.9);
}
.earnings-main-card {
background: linear-gradient(135deg, #c41e3a 0%, #8b1a2e 100%);
border-radius: 16px;
padding: 24px;
margin-bottom: 16px;
color: white;
}
.earnings-total {
text-align: center;
}
.earnings-label {
font-size: 14px;
opacity: 0.9;
margin-bottom: 8px; margin-bottom: 8px;
} }
.unified-label { .earnings-value {
font-size: 36px;
font-weight: 700;
}
.earnings-section {
margin-bottom: 16px;
}
.earnings-section:last-of-type {
margin-bottom: 0;
}
.earnings-section-title {
font-size: 14px; font-size: 14px;
color: #666;
}
.unified-right {
flex: 1;
display: flex;
flex-direction: column;
gap: 12px;
}
.unified-item {
display: flex;
justify-content: space-between;
align-items: center;
}
.unified-item-label {
font-size: 14px;
color: #666;
}
.unified-item-value {
font-size: 16px;
font-weight: 600; font-weight: 600;
color: #333; color: #666;
margin-bottom: 12px;
padding-left: 12px;
border-left: 3px solid #c41e3a;
} }
.unified-item-value.success { .today-earnings-card {
color: #52c41a; background: linear-gradient(135deg, #fff7f0 0%, #ffe8e8 100%);
} border-radius: 12px;
padding: 16px;
.unified-item-value.danger {
color: #ff4d4f;
} }
.team-list-section { .team-list-section {