Files
msh-system/msh_single_uniapp/pages/tool/invite-rewards.vue

478 lines
9.8 KiB
Vue
Raw Normal View History

<template>
<view class="invite-rewards-page">
<!-- 内容区域 -->
<scroll-view class="content-scroll" scroll-y>
<!-- 主奖励卡片 -->
<view class="main-reward-card">
<!-- 橙色渐变头部 -->
<view class="reward-header">
<view class="header-content">
<view class="header-title">邀请好友双方有礼</view>
<view class="header-subtitle">每邀请1位好友首次注册</view>
</view>
<!-- 奖励展示 -->
<view class="rewards-display">
<!-- 我的奖励 -->
<view class="reward-box">
<view class="reward-icon-wrapper">
<image class="reward-icon" :src="iconMyReward" mode="aspectFit"></image>
</view>
<view class="reward-value">50积分</view>
<view class="reward-label">我的奖励</view>
</view>
<!-- 好友福利 -->
<view class="reward-box">
<view class="reward-icon-wrapper">
<image class="reward-icon" :src="iconFriendReward" mode="aspectFit"></image>
</view>
<view class="reward-value">99</view>
<view class="reward-label">好友福利</view>
</view>
</view>
</view>
<!-- 操作按钮区域 -->
<view class="action-buttons">
<view class="invite-btn" @click="handleInvite">
<image class="btn-icon" :src="iconShare" mode="aspectFit"></image>
<text class="btn-text">立即邀请好友</text>
</view>
<view class="poster-btn" @click="handleGeneratePoster">
<text class="poster-text">生成邀请海报</text>
</view>
</view>
</view>
<!-- 邀请福利说明 -->
<view class="benefits-card">
<view class="card-title">邀请福利</view>
<view class="benefits-list">
<view class="benefit-item">
<text class="check-icon"></text>
<text class="benefit-text">邀请好友注册双方都能获得奖励</text>
</view>
<view class="benefit-item">
<text class="check-icon"></text>
<text class="benefit-text">积分可兑换专业营养咨询服务</text>
</view>
<view class="benefit-item">
<text class="check-icon"></text>
<text class="benefit-text">邀请越多奖励越丰富</text>
</view>
</view>
</view>
<!-- 邀请统计 -->
<view class="stats-card">
<view class="card-title">邀请统计</view>
<view class="stats-display">
<view class="stat-box">
<view class="stat-value">{{ stats.points }}</view>
<view class="stat-label">已获得积分</view>
</view>
<view class="stat-box">
<view class="stat-value">{{ stats.friends }}</view>
<view class="stat-label">已邀请好友</view>
</view>
</view>
<view class="no-record" v-if="stats.friends === 0">
<text>暂无邀请记录</text>
</view>
</view>
<!-- 如何邀请 -->
<view class="how-to-card">
<view class="card-title">如何邀请</view>
<view class="steps-display">
<view class="step-item">
<view class="step-icon-wrapper">
<image class="step-icon" :src="iconShare" mode="aspectFit"></image>
</view>
<text class="step-text">分享给好友</text>
</view>
<view class="step-arrow">
<image class="arrow-icon" :src="iconArrow" mode="aspectFit"></image>
</view>
<view class="step-item">
<view class="step-icon-wrapper">
<image class="step-icon" :src="iconRegister" mode="aspectFit"></image>
</view>
<text class="step-text">好友完成注册</text>
</view>
<view class="step-arrow">
<image class="arrow-icon" :src="iconArrow" mode="aspectFit"></image>
</view>
<view class="step-item">
<view class="step-icon-wrapper">
<image class="step-icon" :src="iconGift" mode="aspectFit"></image>
</view>
<text class="step-text">获得奖励</text>
</view>
</view>
</view>
<!-- 底部安全距离 -->
<view class="safe-bottom"></view>
</scroll-view>
</view>
</template>
<script>
import { getUserPoints } from '@/api/tool.js';
export default {
data() {
return {
iconMyReward: 'https://www.figma.com/api/mcp/asset/d5ae7fb4-56a7-4bd0-94fa-971ad4384b13',
iconFriendReward: 'https://www.figma.com/api/mcp/asset/89930d2a-e987-4af5-99cb-2cb1a641bad8',
iconShare: 'https://www.figma.com/api/mcp/asset/fe80c44a-3977-4cc3-9cc5-e29301820cca',
iconRegister: 'https://www.figma.com/api/mcp/asset/7df7d3d4-78da-46a2-a499-257d30f169e9',
iconGift: 'https://www.figma.com/api/mcp/asset/128a1ad0-4cde-4ccd-a78e-31d8f9054e87',
iconArrow: 'https://www.figma.com/api/mcp/asset/6d69c739-78c8-4091-81f6-c551bd11dce4',
loading: false,
stats: {
points: 0,
friends: 0
}
}
},
onLoad() {
this.loadInviteStats()
},
onShareAppMessage() {
return {
title: '邀请你加入慢生活营养专家,一起管理饮食健康!',
path: '/pages/tool_main/index',
imageUrl: this.iconMyReward
}
},
onShareTimeline() {
return {
title: '慢生活营养专家 - 专业饮食健康管理',
query: 'from=invite'
}
},
methods: {
async loadInviteStats() {
this.loading = true
try {
const res = await getUserPoints()
const data = res.data || res
if (data) {
this.stats = {
points: data.invitePoints || data.totalPoints || data.points || 0,
friends: data.inviteCount || data.friendCount || data.friends || 0
}
}
} catch (error) {
console.error('加载邀请统计失败:', error)
// 保持默认值 0
} finally {
this.loading = false
}
},
handleInvite() {
uni.showShareMenu({
withShareTicket: true,
menus: ['shareAppMessage', 'shareTimeline']
})
},
handleGeneratePoster() {
uni.showToast({
title: '正在生成海报...',
icon: 'loading',
duration: 2000
})
// 使用 canvas 绘制邀请海报
setTimeout(() => {
uni.showToast({
title: '海报生成功能开发中',
icon: 'none'
})
}, 2000)
}
}
}
</script>
<style lang="scss" scoped>
.invite-rewards-page {
min-height: 100vh;
background: #f4f5f7;
display: flex;
flex-direction: column;
}
/* 内容滚动区域 */
.content-scroll {
flex: 1;
padding: 32rpx 0;
}
/* 主奖励卡片 */
.main-reward-card {
background: #ffffff;
border: 1rpx solid #d0dbea;
border-radius: 24rpx;
margin: 0 32rpx 32rpx;
overflow: hidden;
}
.reward-header {
background: linear-gradient(180deg, #ff6b35 0%, #ff8c5a 100%);
padding: 48rpx 48rpx 32rpx;
display: flex;
flex-direction: column;
gap: 32rpx;
}
.header-content {
display: flex;
flex-direction: column;
align-items: center;
gap: 16rpx;
}
.header-title {
font-size: 40rpx;
color: #ffffff;
font-weight: 500;
text-align: center;
}
.header-subtitle {
font-size: 28rpx;
color: rgba(255, 255, 255, 0.9);
text-align: center;
}
.rewards-display {
display: flex;
gap: 24rpx;
justify-content: center;
}
.reward-box {
background: #ffffff;
border-radius: 24rpx;
padding: 32rpx 32rpx 24rpx;
width: 280rpx;
display: flex;
flex-direction: column;
align-items: center;
gap: 16rpx;
}
.reward-icon-wrapper {
width: 96rpx;
height: 96rpx;
background: #fff5f0;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.reward-icon {
width: 48rpx;
height: 48rpx;
}
.reward-value {
font-size: 48rpx;
color: #ff6b35;
font-weight: 500;
text-align: center;
}
.reward-label {
font-size: 24rpx;
color: #9fa5c0;
text-align: center;
}
/* 操作按钮区域 */
.action-buttons {
padding: 32rpx 32rpx 24rpx;
display: flex;
flex-direction: column;
gap: 24rpx;
}
.invite-btn {
background: #ff6b35;
border-radius: 50rpx;
height: 96rpx;
display: flex;
align-items: center;
justify-content: center;
gap: 16rpx;
box-shadow: 0 2rpx 6rpx rgba(0, 0, 0, 0.1), 0 2rpx 4rpx rgba(0, 0, 0, 0.1);
.btn-icon {
width: 32rpx;
height: 32rpx;
}
.btn-text {
font-size: 28rpx;
color: #ffffff;
font-weight: 500;
}
}
.poster-btn {
height: 72rpx;
display: flex;
align-items: center;
justify-content: center;
.poster-text {
font-size: 28rpx;
color: #ff6b35;
text-align: center;
}
}
/* 通用卡片样式 */
.benefits-card,
.stats-card,
.how-to-card {
background: #ffffff;
border: 1rpx solid #d0dbea;
border-radius: 24rpx;
margin: 0 32rpx 32rpx;
padding: 32rpx;
}
.card-title {
font-size: 28rpx;
color: #2e3e5c;
font-weight: 500;
margin-bottom: 24rpx;
}
/* 邀请福利列表 */
.benefits-list {
display: flex;
flex-direction: column;
gap: 16rpx;
}
.benefit-item {
display: flex;
align-items: center;
gap: 16rpx;
}
.check-icon {
font-size: 28rpx;
color: #ff6b35;
font-weight: bold;
flex-shrink: 0;
}
.benefit-text {
font-size: 28rpx;
color: #3e5481;
line-height: 1.6;
}
/* 邀请统计 */
.stats-display {
display: flex;
gap: 24rpx;
margin-bottom: 32rpx;
}
.stat-box {
flex: 1;
background: #f4f5f7;
border-radius: 24rpx;
padding: 32rpx 32rpx 24rpx;
display: flex;
flex-direction: column;
align-items: center;
gap: 8rpx;
}
.stat-value {
font-size: 48rpx;
color: #2e3e5c;
font-weight: 500;
text-align: center;
}
.stat-label {
font-size: 24rpx;
color: #9fa5c0;
text-align: center;
}
.no-record {
padding-top: 32rpx;
border-top: 1rpx solid #d0dbea;
text-align: center;
text {
font-size: 28rpx;
color: #9fa5c0;
}
}
/* 如何邀请步骤 */
.steps-display {
display: flex;
align-items: center;
justify-content: space-between;
}
.step-item {
display: flex;
flex-direction: column;
align-items: center;
gap: 16rpx;
flex: 1;
}
.step-icon-wrapper {
width: 112rpx;
height: 112rpx;
background: #fff5f0;
border-radius: 24rpx;
display: flex;
align-items: center;
justify-content: center;
}
.step-icon {
width: 48rpx;
height: 48rpx;
}
.step-text {
font-size: 24rpx;
color: #3e5481;
text-align: center;
}
.step-arrow {
width: 72rpx;
height: 40rpx;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.arrow-icon {
width: 40rpx;
height: 40rpx;
}
/* 底部安全距离 */
.safe-bottom {
height: 40rpx;
}
</style>