Files
my-h5/pages/union/test.vue
2025-09-26 14:50:30 +08:00

720 lines
14 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="wealth-level-page">
<!-- 顶部导航栏 -->
<div class="header">
<div class="back-btn" @click="goBack">
<i class="icon-back"></i>
</div>
<div class="title-section">
<h1 class="main-title">财富等级</h1>
<span class="sub-title">主播等级</span>
</div>
<div class="help-btn" @click="showHelp">
<i class="icon-help">?</i>
</div>
</div>
<!-- 等级进度环形图 -->
<div class="level-progress-section">
<div class="progress-ring-container">
<!-- 等级标签 -->
<div class="level-labels">
<div
class="level-label"
v-for="(level, index) in levels"
:key="index"
:class="{ active: currentLevelIndex >= index }"
>
<span class="level-name">{{ level.name }}</span>
<div
class="level-dot"
:class="{ active: currentLevelIndex >= index }"
></div>
</div>
</div>
<!-- 中心头像和信息 -->
<div class="center-info">
<div class="avatar">
<img :src="userAvatar" alt="用户头像" />
</div>
<div class="experience-info">
<div class="current-exp">
<span class="exp-number">{{ currentExp }}</span>
<span class="exp-label">当前经验</span>
</div>
<div class="next-level-exp">
<span class="exp-number">{{ nextLevelExp }}</span>
<span class="exp-label">距离下一个等级</span>
</div>
</div>
</div>
<!-- 进度弧线 -->
<svg class="progress-ring" viewBox="0 0 200 200">
<circle
class="progress-ring-bg"
cx="100"
cy="100"
r="85"
fill="none"
stroke="#2a2a2a"
stroke-width="4"
/>
<circle
class="progress-ring-progress"
cx="100"
cy="100"
r="85"
fill="none"
stroke="#00ff88"
stroke-width="4"
stroke-linecap="round"
:stroke-dasharray="circumference"
:stroke-dashoffset="progressOffset"
transform="rotate(-90 100 100)"
/>
</svg>
</div>
</div>
<!-- 当前等级卡片 -->
<div class="current-level-card">
<div class="level-badge">
<img :src="currentLevel.badge" alt="等级徽章" />
</div>
<div class="level-info">
<h2 class="level-title">{{ currentLevel.name }}</h2>
<p class="level-description">{{ currentLevel.description }}</p>
<div class="level-progress-bar">
<div class="progress-track">
<div
class="progress-fill"
:style="{ width: levelProgress + '%' }"
></div>
</div>
<div class="progress-labels">
<span>Lv.{{ currentLevel.level }}</span>
<span>Lv.{{ currentLevel.level + 1 }}</span>
</div>
</div>
<p class="next-level-requirement">{{ nextLevelRequirement }}</p>
</div>
</div>
<!-- 每日奖励 -->
<div class="daily-rewards-section">
<h3 class="section-title">每日奖励</h3>
<div class="reward-item">
<div class="reward-icon">
<img src="/icons/coin.png" alt="金币" />
</div>
<div class="reward-info">
<p class="reward-title">段位达到富豪8</p>
<p class="reward-desc">可每日领取金币</p>
</div>
<button
class="claim-btn"
@click="claimDailyReward"
:disabled="dailyRewardClaimed"
>
{{ dailyRewardClaimed ? "已领取" : "立即领取" }}
</button>
</div>
</div>
<!-- 等级需求及福利 -->
<div class="level-benefits-section">
<h3 class="section-title">等级需求及福利</h3>
<div class="benefits-grid">
<div
class="benefit-item"
v-for="(benefit, index) in levelBenefits"
:key="index"
>
<div class="benefit-icon">
<img :src="benefit.icon" alt="福利图标" />
</div>
<p class="benefit-value">{{ benefit.value }}</p>
<p class="benefit-desc">{{ benefit.description }}</p>
</div>
</div>
</div>
<!-- 财富特权 -->
<div class="wealth-privileges-section">
<h3 class="section-title">财富特权</h3>
<div class="privileges-grid">
<div
class="privilege-item"
v-for="(privilege, index) in wealthPrivileges"
:key="index"
>
<div class="privilege-icon">
<img :src="privilege.icon" alt="特权图标" />
</div>
<p class="privilege-name">{{ privilege.name }}</p>
<p class="privilege-level">{{ privilege.level }}</p>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "WealthLevelPage",
data() {
return {
// 用户信息
userAvatar: "",
currentExp: 1608,
nextLevelExp: 1608,
currentLevelIndex: 1,
dailyRewardClaimed: false,
// 等级配置
levels: [
{ name: "新人", value: 0 },
{ name: "富豪", value: 1000 },
{ name: "星爵", value: 5000 },
{ name: "星侯", value: 15000 },
{ name: "星王", value: 50000 },
],
// 当前等级信息
currentLevel: {
name: "星爵",
level: 1,
description: "进30天保段已成功",
badge: "",
requirement: 10000,
},
// 等级福利
levelBenefits: [
{
icon: "",
value: "100万",
description: "所需经验值",
},
{
icon: "",
value: "100万",
description: "保段经验值",
},
{
icon: "",
value: "100万",
description: "每日可领",
},
{
icon: "",
value: "吉普",
description: "专属座驾",
},
],
// 财富特权
wealthPrivileges: Array(12)
.fill()
.map((_, index) => ({
name: "吉普",
level: "富豪6解锁",
icon: "",
})),
};
},
computed: {
// 计算圆形进度条
circumference() {
return 2 * Math.PI * 85;
},
progressOffset() {
const progress = this.levelProgress / 100;
return this.circumference - progress * this.circumference;
},
// 计算当前等级进度
levelProgress() {
const currentLevelExp = this.levels[this.currentLevelIndex].value;
const nextLevelExp =
this.levels[this.currentLevelIndex + 1]?.value ||
currentLevelExp + 10000;
const progress =
((this.currentExp - currentLevelExp) /
(nextLevelExp - currentLevelExp)) *
100;
return Math.min(Math.max(progress, 0), 100);
},
// 下一等级需求
nextLevelRequirement() {
const nextLevel = this.levels[this.currentLevelIndex + 1];
if (nextLevel) {
const remaining = nextLevel.value - this.currentExp;
return `距离下一个段位还差${remaining.toLocaleString()}经验`;
}
return "已达到最高等级";
},
},
methods: {
// 返回上一页
goBack() {
this.$router.go(-1);
},
// 显示帮助
showHelp() {
this.$toast("帮助信息");
},
// 领取每日奖励
claimDailyReward() {
if (this.dailyRewardClaimed) return;
this.dailyRewardClaimed = true;
this.$toast("领取成功!");
// 这里可以调用API
this.apiClaimDailyReward();
},
// API调用示例
async apiClaimDailyReward() {
try {
// const response = await this.$api.claimDailyReward()
console.log("API: 领取每日奖励");
} catch (error) {
console.error("领取失败:", error);
this.dailyRewardClaimed = false;
}
},
// 获取用户等级数据
async fetchUserLevelData() {
try {
// const response = await this.$api.getUserLevel()
// this.currentExp = response.currentExp
// this.currentLevelIndex = response.levelIndex
console.log("API: 获取用户等级数据");
} catch (error) {
console.error("获取数据失败:", error);
}
},
},
mounted() {
this.fetchUserLevelData();
},
};
</script>
<style scoped>
.wealth-level-page {
min-height: 100vh;
background: linear-gradient(180deg, #1a1a1a 0%, #2d2d2d 50%, #f5f5f5 50%);
color: #fff;
padding-bottom: 20px;
}
/* 顶部导航 */
.header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 44px 20px 20px;
position: relative;
}
.back-btn,
.help-btn {
width: 32px;
height: 32px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.1);
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: background 0.2s;
}
.back-btn:hover,
.help-btn:hover {
background: rgba(255, 255, 255, 0.2);
}
.icon-back {
font-size: 18px;
font-weight: bold;
}
.icon-help {
font-size: 14px;
font-weight: bold;
}
.title-section {
text-align: center;
}
.main-title {
font-size: 18px;
font-weight: 600;
margin: 0 0 4px 0;
}
.sub-title {
font-size: 12px;
color: #999;
}
/* 等级进度环形图 */
.level-progress-section {
padding: 20px;
display: flex;
justify-content: center;
}
.progress-ring-container {
position: relative;
width: 280px;
height: 280px;
}
.level-labels {
position: absolute;
width: 100%;
height: 100%;
z-index: 2;
}
.level-label {
position: absolute;
display: flex;
flex-direction: column;
align-items: center;
font-size: 12px;
}
.level-label:nth-child(1) {
top: 10px;
left: 20px;
} /* 新人 */
.level-label:nth-child(2) {
top: 40px;
right: 10px;
} /* 富豪 */
.level-label:nth-child(3) {
bottom: 40px;
right: 10px;
} /* 星爵 */
.level-label:nth-child(4) {
bottom: 10px;
left: 20px;
} /* 星侯 */
.level-label:nth-child(5) {
top: 50%;
right: 0;
transform: translateY(-50%);
} /* 星王 */
.level-name {
margin-bottom: 4px;
color: #999;
}
.level-label.active .level-name {
color: #00ff88;
}
.level-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: #333;
border: 2px solid #555;
}
.level-dot.active {
background: #00ff88;
border-color: #00ff88;
}
.center-info {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
text-align: center;
z-index: 3;
}
.avatar {
width: 60px;
height: 60px;
border-radius: 50%;
overflow: hidden;
margin: 0 auto 16px;
border: 3px solid #00ff88;
}
.avatar img {
width: 100%;
height: 100%;
object-fit: cover;
}
.experience-info {
display: flex;
justify-content: space-between;
width: 200px;
margin-top: 16px;
}
.current-exp,
.next-level-exp {
text-align: center;
}
.exp-number {
display: block;
font-size: 18px;
font-weight: bold;
color: #00ff88;
}
.exp-label {
font-size: 10px;
color: #999;
margin-top: 2px;
}
.progress-ring {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
transform: rotate(-90deg);
}
.progress-ring-progress {
transition: stroke-dashoffset 0.5s ease;
}
/* 当前等级卡片 */
.current-level-card {
margin: 20px;
background: rgba(255, 255, 255, 0.1);
border-radius: 16px;
padding: 20px;
display: flex;
align-items: center;
backdrop-filter: blur(10px);
}
.level-badge {
width: 60px;
height: 60px;
margin-right: 16px;
flex-shrink: 0;
}
.level-badge img {
width: 100%;
height: 100%;
object-fit: contain;
}
.level-info {
flex: 1;
}
.level-title {
font-size: 20px;
font-weight: bold;
margin: 0 0 4px 0;
color: #00ff88;
}
.level-description {
font-size: 12px;
color: #ccc;
margin: 0 0 12px 0;
}
.level-progress-bar {
margin: 8px 0;
}
.progress-track {
height: 4px;
background: #333;
border-radius: 2px;
overflow: hidden;
margin-bottom: 4px;
}
.progress-fill {
height: 100%;
background: linear-gradient(90deg, #00ff88, #00ccff);
border-radius: 2px;
transition: width 0.5s ease;
}
.progress-labels {
display: flex;
justify-content: space-between;
font-size: 10px;
color: #999;
}
.next-level-requirement {
font-size: 11px;
color: #999;
margin: 8px 0 0 0;
}
/* 每日奖励和福利区域 */
.daily-rewards-section,
.level-benefits-section,
.wealth-privileges-section {
background: #fff;
color: #333;
padding: 20px;
}
.section-title {
font-size: 16px;
font-weight: 600;
margin: 0 0 16px 0;
color: #333;
}
.reward-item {
display: flex;
align-items: center;
padding: 16px;
background: #f8f9fa;
border-radius: 12px;
}
.reward-icon {
width: 40px;
height: 40px;
margin-right: 12px;
}
.reward-icon img {
width: 100%;
height: 100%;
object-fit: contain;
}
.reward-info {
flex: 1;
}
.reward-title {
font-size: 14px;
font-weight: 500;
margin: 0 0 2px 0;
}
.reward-desc {
font-size: 12px;
color: #666;
margin: 0;
}
.claim-btn {
background: #00ff88;
color: #fff;
border: none;
border-radius: 20px;
padding: 8px 16px;
font-size: 12px;
cursor: pointer;
transition: background 0.2s;
}
.claim-btn:hover:not(:disabled) {
background: #00e67a;
}
.claim-btn:disabled {
background: #ccc;
cursor: not-allowed;
}
/* 福利网格 */
.benefits-grid,
.privileges-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 16px;
}
.benefit-item,
.privilege-item {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
padding: 12px;
background: #f8f9fa;
border-radius: 8px;
}
.benefit-icon,
.privilege-icon {
width: 32px;
height: 32px;
margin-bottom: 8px;
}
.benefit-icon img,
.privilege-icon img {
width: 100%;
height: 100%;
object-fit: contain;
}
.benefit-value,
.privilege-name {
font-size: 12px;
font-weight: 500;
margin: 0 0 2px 0;
color: #333;
}
.benefit-desc,
.privilege-level {
font-size: 10px;
color: #666;
margin: 0;
}
/* 响应式设计 */
@media (max-width: 375px) {
.progress-ring-container {
width: 240px;
height: 240px;
}
.experience-info {
width: 160px;
}
.benefits-grid,
.privileges-grid {
grid-template-columns: repeat(2, 1fr);
}
}
</style>