Files
spring-festival-greetings/pages/mine/mine.vue

555 lines
12 KiB
Vue
Raw Normal View History

2026-01-09 11:24:40 +08:00
<template>
2026-01-15 08:43:10 +08:00
<view class="mine-page">
<!-- Custom Navbar -->
2026-01-21 22:33:37 +08:00
<view
class="nav-bar"
:style="{ paddingTop: navBarTop + 'px', height: navBarHeight + 'px' }"
>
2026-01-15 08:43:10 +08:00
<!-- <text class="nav-title">我的</text> -->
</view>
2026-01-21 22:33:37 +08:00
<scroll-view
scroll-y
class="content-scroll"
:style="{ paddingTop: navBarTop + navBarHeight + 'px' }"
>
2026-01-15 08:43:10 +08:00
<view class="content-wrap">
<!-- User Card -->
<view class="user-card" @tap="handleUserClick">
<view class="avatar-box">
2026-01-21 22:33:37 +08:00
<image :src="userInfo.avatarUrl" class="avatar" mode="aspectFill" />
2026-02-02 14:59:34 +08:00
<!-- <view class="red-badge"><text class="fire">🔥</text></view> -->
2026-01-15 08:43:10 +08:00
</view>
<view class="user-info">
<view class="row-1">
<text class="nickname">{{ userInfo.nickName }}</text>
2026-02-01 16:32:37 +08:00
<view class="vip-tag" v-if="isLoggedIn && userInfo.isVip">
2026-01-15 08:43:10 +08:00
<text class="vip-text">VIP 祥瑞会员</text>
</view>
</view>
<view class="row-2" v-if="isLoggedIn">
2026-02-03 05:14:31 +08:00
<!-- <text class="arrow-icon"></text> -->
<!-- <text class="stats-text"
2026-01-21 22:33:37 +08:00
>已发送 <text class="num">3</text> 条新春祝福</text
2026-02-03 05:14:31 +08:00
> -->
2026-01-15 08:43:10 +08:00
</view>
<view class="row-2" v-else>
<text class="stats-text">点击登录解锁更多功能</text>
</view>
</view>
<view class="card-arrow"></view>
</view>
2026-01-30 01:06:22 +08:00
<!-- VIP Banner -->
2026-02-05 14:12:52 +08:00
<view v-if="!isIos" class="vip-banner" @tap="navTo('vip')">
2026-01-30 01:06:22 +08:00
<view class="vip-left">
<view class="vip-icon-box">
<uni-icons type="vip-filled" size="32" color="#5d4037" />
</view>
<view class="vip-content">
<view class="vip-title-row">
<text class="vip-title">祥瑞会员中心</text>
<view class="diamond-tag">DIAMOND</view>
</view>
<text class="vip-subtitle">开通永久会员解锁全部特权</text>
</view>
</view>
<view class="vip-right">
<text class="open-text">立即开通</text>
<text class="arrow"></text>
</view>
</view>
2026-01-15 08:43:10 +08:00
<!-- My Creations -->
<view class="section-title">我的创作</view>
<view class="menu-group">
2026-02-03 10:25:47 +08:00
<view class="menu-item" @tap="navTo('greetings')">
2026-01-15 08:43:10 +08:00
<view class="icon-box red-bg"><text>🧧</text></view>
<text class="menu-text">我的新春祝福</text>
<text class="arrow"></text>
2026-02-03 10:25:47 +08:00
</view>
2026-01-21 22:33:37 +08:00
<view class="menu-item" @tap="navTo('fortune-record')">
2026-01-15 08:43:10 +08:00
<view class="icon-box orange-bg"><text>📹</text></view>
2026-01-21 22:33:37 +08:00
<text class="menu-text">我的新年运势</text>
2026-01-15 08:43:10 +08:00
<text class="arrow"></text>
</view>
2026-01-28 23:08:34 +08:00
<view class="menu-item" @tap="navTo('avatar')">
2026-01-15 08:43:10 +08:00
<view class="icon-box pink-bg"><text></text></view>
2026-01-28 23:08:34 +08:00
<text class="menu-text">我的新春头像</text>
2026-01-15 08:43:10 +08:00
<text class="arrow"></text>
</view>
2026-01-28 23:08:34 +08:00
<view class="menu-item" @tap="navTo('wallpaper')">
2026-01-15 08:43:10 +08:00
<view class="icon-box yellow-bg"><text>🖼</text></view>
2026-01-28 23:08:34 +08:00
<text class="menu-text">我的新春壁纸</text>
2026-01-15 08:43:10 +08:00
<view class="new-badge">NEW</view>
<text class="arrow"></text>
</view>
</view>
<!-- History -->
2026-01-26 11:18:24 +08:00
<!-- <view class="section-title">历史记录</view>
2026-01-15 08:43:10 +08:00
<view class="menu-group">
<view class="menu-item" @tap="navTo('history')">
<view class="icon-box gray-bg"><text>🕒</text></view>
<text class="menu-text">新春祝福记录</text>
<text class="arrow"></text>
</view>
<view class="menu-item" @tap="navTo('archive')">
<view class="icon-box gray-bg"><text>📂</text></view>
<text class="menu-text">历年祝福存档</text>
<text class="arrow"></text>
</view>
2026-01-26 11:18:24 +08:00
</view> -->
2026-01-15 08:43:10 +08:00
2026-01-21 22:33:37 +08:00
<!-- Other Actions -->
2026-01-15 08:43:10 +08:00
<view class="menu-group mt-30">
<button class="menu-item share-btn" open-type="share">
<view class="icon-left"><text class="share-icon">🔗</text></view>
<text class="menu-text">分享给好友</text>
<text class="arrow"></text>
</button>
2026-01-26 11:18:24 +08:00
<view class="menu-item" @tap="navTo('feedback')">
<view class="icon-left"><text class="feedback-icon">📝</text></view>
<text class="menu-text">意见反馈</text>
<text class="arrow"></text>
</view>
2026-01-15 08:43:10 +08:00
<view class="menu-item" @tap="navTo('help')">
<view class="icon-left"><text class="help-icon"></text></view>
<text class="menu-text">使用说明 / 帮助</text>
<text class="arrow"></text>
</view>
</view>
<!-- Footer -->
<view class="version-info">2026 丙午马年 · 新春助手 v1.0.2</view>
2026-01-21 22:33:37 +08:00
2026-01-15 08:43:10 +08:00
<!-- Bottom Spacer for TabBar -->
2026-01-21 22:33:37 +08:00
<view style="height: 120rpx"></view>
2026-01-15 08:43:10 +08:00
</view>
</scroll-view>
<!-- Login Popup -->
2026-01-21 22:33:37 +08:00
<LoginPopup ref="loginPopupRef" @logind="handleLogind" />
2026-01-15 08:43:10 +08:00
</view>
2026-01-09 11:24:40 +08:00
</template>
<script setup>
2026-01-21 22:33:37 +08:00
import { ref, computed, onMounted } from "vue";
import { useUserStore } from "@/stores/user";
2026-02-03 02:41:19 +08:00
import { onShareAppMessage } from "@dcloudio/uni-app";
2026-01-21 22:33:37 +08:00
import LoginPopup from "@/components/LoginPopup/LoginPopup.vue";
2026-01-15 08:43:10 +08:00
2026-01-21 22:33:37 +08:00
const userStore = useUserStore();
const loginPopupRef = ref(null);
2026-01-09 11:24:40 +08:00
2026-01-15 08:43:10 +08:00
// Navigation Bar
2026-01-21 22:33:37 +08:00
const navBarTop = ref(20);
const navBarHeight = ref(44);
2026-01-15 08:43:10 +08:00
// User Info
2026-01-21 22:33:37 +08:00
const defaultAvatarUrl =
"https://file.lihailezzc.com/resource/d9b329082b32f8305101f708593a4882.png";
2026-01-09 11:24:40 +08:00
const userInfo = computed(() => ({
2026-01-21 22:33:37 +08:00
nickName: userStore.userInfo.nickName || "点击登录",
avatarUrl: userStore.userInfo.avatarUrl || defaultAvatarUrl,
2026-02-03 05:14:31 +08:00
isVip: userStore.userInfo.isVip || false,
2026-01-21 22:33:37 +08:00
}));
2026-01-09 11:24:40 +08:00
2026-01-21 22:33:37 +08:00
const isLoggedIn = computed(() => !!userStore.userInfo.nickName);
2026-01-09 11:24:40 +08:00
2026-02-05 14:12:52 +08:00
const isIos = computed(() => uni.getSystemInfoSync().osName === "ios");
2026-01-09 11:24:40 +08:00
onMounted(() => {
2026-01-21 22:33:37 +08:00
const sysInfo = uni.getSystemInfoSync();
navBarTop.value = sysInfo.statusBarHeight;
2026-01-15 08:43:10 +08:00
// Assuming standard nav bar height
2026-01-21 22:33:37 +08:00
navBarHeight.value = 44;
});
2026-01-09 11:24:40 +08:00
2026-02-03 02:41:19 +08:00
onShareAppMessage(() => {
2026-02-01 09:40:56 +08:00
return {
2026-02-03 02:41:19 +08:00
title: "新年好运已送达 🎊|祝福卡·头像·壁纸",
path: "/pages/index/index",
};
2026-02-01 09:40:56 +08:00
});
2026-01-15 08:43:10 +08:00
const handleUserClick = () => {
if (!isLoggedIn.value) {
2026-01-21 22:33:37 +08:00
loginPopupRef.value.open();
2026-01-15 08:43:10 +08:00
} else {
2026-01-30 17:56:14 +08:00
// Navigate to profile details
uni.navigateTo({
url: "/pages/mine/profile",
});
2026-01-15 08:43:10 +08:00
}
2026-01-21 22:33:37 +08:00
};
2026-01-09 11:24:40 +08:00
2026-01-15 08:43:10 +08:00
const handleLogind = async () => {
// Logic after successful login if needed
2026-01-21 22:33:37 +08:00
};
2026-01-09 11:24:40 +08:00
2026-01-15 08:43:10 +08:00
const navTo = (page) => {
2026-01-28 22:54:40 +08:00
if (!isLoggedIn.value) {
loginPopupRef.value.open();
uni.showToast({ title: "请先登录", icon: "none" });
return;
}
2026-01-28 22:44:47 +08:00
if (page === "greetings") {
uni.navigateTo({
url: "/pages/mine/greeting",
});
return;
}
2026-01-21 22:33:37 +08:00
if (page === "fortune-record") {
uni.navigateTo({
url: "/pages/fortune/record",
});
return;
}
2026-01-28 23:08:34 +08:00
if (page === "wallpaper") {
uni.navigateTo({
url: "/pages/mine/wallpaper",
});
return;
}
2026-01-28 23:21:10 +08:00
if (page === "avatar") {
uni.navigateTo({
url: "/pages/mine/avatar",
});
return;
}
2026-01-26 11:18:24 +08:00
if (page === "feedback") {
uni.navigateTo({
url: "/pages/feedback/index",
});
return;
}
2026-01-28 23:54:15 +08:00
if (page === "help") {
uni.navigateTo({
url: "/pages/mine/help",
});
return;
}
2026-01-30 01:06:22 +08:00
if (page === "vip") {
uni.navigateTo({
url: "/pages/mine/vip",
});
return;
}
2026-01-21 22:33:37 +08:00
uni.showToast({ title: "功能开发中", icon: "none" });
};
2026-01-09 11:24:40 +08:00
</script>
2026-01-15 08:43:10 +08:00
<style lang="scss" scoped>
.mine-page {
min-height: 100vh;
background: #f9f9f9;
box-sizing: border-box;
}
2026-01-09 11:24:40 +08:00
2026-01-15 08:43:10 +08:00
.nav-bar {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
display: flex;
align-items: center;
justify-content: center;
background: #f9f9f9;
}
.nav-title {
font-size: 32rpx;
font-weight: bold;
color: #000;
}
2026-01-09 11:24:40 +08:00
2026-01-15 08:43:10 +08:00
.content-scroll {
height: 100vh;
}
.content-wrap {
padding: 20rpx 30rpx 40rpx;
}
/* User Card */
.user-card {
background: #fff;
border-radius: 30rpx;
padding: 40rpx;
display: flex;
align-items: center;
margin-bottom: 40rpx;
position: relative;
2026-01-21 22:33:37 +08:00
box-shadow: 0 10rpx 30rpx rgba(0, 0, 0, 0.03);
2026-01-15 08:43:10 +08:00
}
.avatar-box {
position: relative;
margin-right: 30rpx;
}
.avatar {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
border: 4rpx solid #fff;
2026-01-21 22:33:37 +08:00
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
2026-01-15 08:43:10 +08:00
}
.red-badge {
position: absolute;
top: 0;
right: -10rpx;
width: 40rpx;
height: 40rpx;
background: #ff3b30;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
border: 2rpx solid #fff;
}
.fire {
font-size: 24rpx;
color: #fff;
}
2026-01-09 11:24:40 +08:00
2026-01-15 08:43:10 +08:00
.user-info {
flex: 1;
}
.row-1 {
display: flex;
align-items: center;
margin-bottom: 12rpx;
}
.nickname {
font-size: 36rpx;
font-weight: bold;
color: #333;
margin-right: 16rpx;
}
.vip-tag {
background: #ffecec;
padding: 4rpx 16rpx;
border-radius: 999rpx;
}
.vip-text {
color: #ff3b30;
font-size: 20rpx;
font-weight: bold;
}
.row-2 {
display: flex;
align-items: center;
}
.arrow-icon {
color: #ff3b30;
font-size: 20rpx;
margin-right: 8rpx;
}
.stats-text {
font-size: 24rpx;
color: #666;
}
.num {
font-weight: bold;
color: #333;
margin: 0 4rpx;
}
.card-arrow {
font-size: 40rpx;
color: #ccc;
margin-left: 10rpx;
}
2026-01-09 11:24:40 +08:00
2026-01-30 01:06:22 +08:00
/* VIP Banner */
.vip-banner {
background: linear-gradient(135deg, #2e2424 0%, #1a1616 100%);
border-radius: 30rpx;
padding: 30rpx 40rpx;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 40rpx;
box-shadow: 0 10rpx 30rpx rgba(0, 0, 0, 0.1);
}
.vip-left {
display: flex;
align-items: center;
}
.vip-icon-box {
width: 80rpx;
height: 80rpx;
background: #fceea9;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-right: 24rpx;
border: 4rpx solid #bfa46f;
}
.vip-content {
display: flex;
flex-direction: column;
}
.vip-title-row {
display: flex;
align-items: center;
margin-bottom: 8rpx;
}
.vip-title {
font-size: 32rpx;
font-weight: bold;
color: #fceea9;
margin-right: 12rpx;
}
.diamond-tag {
background: rgba(252, 238, 169, 0.15);
color: #fceea9;
font-size: 18rpx;
padding: 2rpx 8rpx;
border-radius: 6rpx;
border: 1px solid rgba(252, 238, 169, 0.4);
}
.vip-subtitle {
font-size: 22rpx;
color: rgba(252, 238, 169, 0.6);
}
.vip-right {
display: flex;
align-items: center;
}
.open-text {
font-size: 26rpx;
color: #fceea9;
margin-right: 4rpx;
font-weight: 500;
}
.vip-banner .arrow {
color: #fceea9;
font-size: 32rpx;
}
2026-01-15 08:43:10 +08:00
/* Section Title */
.section-title {
font-size: 26rpx;
font-weight: bold;
color: #999;
margin-bottom: 20rpx;
padding-left: 10rpx;
}
2026-01-09 11:24:40 +08:00
2026-01-15 08:43:10 +08:00
/* Menu Group */
.menu-group {
background: #fff;
border-radius: 24rpx;
overflow: hidden;
margin-bottom: 40rpx;
2026-01-21 22:33:37 +08:00
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.02);
2026-01-15 08:43:10 +08:00
}
.menu-group.mt-30 {
margin-top: 30rpx;
}
.menu-item {
display: flex;
align-items: center;
padding: 30rpx;
background: #fff;
position: relative;
}
.menu-item:active {
background: #f9f9f9;
}
/* For button reset */
.menu-item.share-btn {
width: 100%;
text-align: left;
line-height: normal;
border-radius: 0;
}
.menu-item.share-btn::after {
border: none;
}
2026-01-09 11:24:40 +08:00
2026-01-15 08:43:10 +08:00
.icon-box {
width: 72rpx;
height: 72rpx;
border-radius: 16rpx;
display: flex;
align-items: center;
justify-content: center;
margin-right: 24rpx;
font-size: 36rpx;
}
2026-01-21 22:33:37 +08:00
.red-bg {
background: #fff0f0;
color: #ff3b30;
}
.orange-bg {
background: #fff8e6;
color: #ff9500;
}
.pink-bg {
background: #fff0f5;
color: #ff2d55;
}
.yellow-bg {
background: #fffae0;
color: #ffcc00;
}
.gray-bg {
background: #f5f5f5;
color: #666;
}
2026-01-15 08:43:10 +08:00
.icon-left {
width: 40rpx;
display: flex;
justify-content: center;
margin-right: 24rpx;
margin-left: 16rpx;
}
2026-01-21 22:33:37 +08:00
.share-icon,
2026-01-26 11:18:24 +08:00
.help-icon,
.feedback-icon {
2026-01-15 08:43:10 +08:00
font-size: 36rpx;
color: #666;
}
.menu-text {
flex: 1;
font-size: 28rpx;
color: #333;
font-weight: 500;
}
.new-badge {
background: #ff3b30;
color: #fff;
font-size: 20rpx;
padding: 2rpx 10rpx;
border-radius: 8rpx;
margin-right: 16rpx;
}
.arrow {
color: #ccc;
font-size: 32rpx;
}
/* Version Info */
.version-info {
text-align: center;
color: #ccc;
font-size: 22rpx;
margin-top: 60rpx;
2026-01-09 11:24:40 +08:00
}
2026-01-21 22:33:37 +08:00
</style>