518 lines
12 KiB
Vue
518 lines
12 KiB
Vue
<template>
|
||
<view class="spring-page" :style="{ paddingTop: getBavBarHeight() + 'px' }">
|
||
<!-- 顶部 Banner -->
|
||
<view class="hero">
|
||
<view class="hero-badge">
|
||
<text class="badge-dot">•</text>
|
||
<text class="badge-text">距春节还有 15 天</text>
|
||
</view>
|
||
<view class="hero-title">
|
||
<text class="year">2026</text>
|
||
<text class="main">新春祝福</text>
|
||
</view>
|
||
<text class="hero-sub">新年快乐,万事如意</text>
|
||
<image
|
||
class="hero-decor"
|
||
src="https://file.lihailezzc.com/resource/58c8d19e5f2d9c958a7b8b9f44b8c3e3.png"
|
||
mode="aspectFill"
|
||
/>
|
||
</view>
|
||
|
||
<!-- 功能入口宫格 -->
|
||
<view class="feature-grid">
|
||
<view
|
||
v-for="(item, idx) in features"
|
||
:key="idx"
|
||
class="feature-item"
|
||
@tap="onFeatureTap(item)"
|
||
>
|
||
<image class="feature-icon" :src="item.icon" mode="aspectFill" />
|
||
<view class="feature-texts">
|
||
<text class="feature-title">{{ item.title }}</text>
|
||
<text class="feature-sub">{{ item.subtitle }}</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 大家都在用 -->
|
||
<view class="section">
|
||
<view class="section-header">
|
||
<view class="section-bar"></view>
|
||
<text class="section-title">大家都在用</text>
|
||
<text class="section-more" @tap="onMore('use')">更多</text>
|
||
</view>
|
||
<scroll-view scroll-x class="cards-scroll" show-scrollbar="false">
|
||
<view class="cards-wrap">
|
||
<view
|
||
v-for="(card, i) in popularCards"
|
||
:key="i"
|
||
class="use-card"
|
||
@tap="previewCard(card)"
|
||
>
|
||
<image :src="card.cover" class="use-cover" mode="aspectFill" />
|
||
<view class="use-info">
|
||
<text class="use-title">{{ card.title }}</text>
|
||
<text class="use-sub">{{ card.sub }}</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</scroll-view>
|
||
</view>
|
||
|
||
<!-- 最新祝福 -->
|
||
<view class="section">
|
||
<view class="section-header">
|
||
<view class="section-bar"></view>
|
||
<text class="section-title">最新祝福</text>
|
||
</view>
|
||
|
||
<view class="feed-list">
|
||
<view v-for="(post, i) in feeds" :key="i" class="feed-item">
|
||
<view class="feed-header">
|
||
<image :src="post.avatar" class="feed-avatar" mode="aspectFill" />
|
||
<view class="feed-user">
|
||
<text class="feed-name">{{ post.name }}</text>
|
||
<text class="feed-time">{{ post.time }}</text>
|
||
</view>
|
||
</view>
|
||
<view class="feed-content">
|
||
<text class="feed-text">{{ post.text }}</text>
|
||
<image
|
||
v-if="post.image"
|
||
:src="post.image"
|
||
class="feed-image"
|
||
mode="aspectFill"
|
||
/>
|
||
</view>
|
||
<view class="feed-actions">
|
||
<view class="action" @tap="like(i)">
|
||
<text class="icon">❤</text>
|
||
<text>{{ post.likes }}</text>
|
||
</view>
|
||
<view class="action" @tap="comment(i)">
|
||
<text class="icon">💬</text>
|
||
<text>{{ post.comments }}</text>
|
||
</view>
|
||
<view class="action" @tap="share(i)">
|
||
<text class="icon">↗</text>
|
||
<text>分享</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
|
||
<view class="see-more" @tap="onMore('feed')">查看更多祝福…</view>
|
||
</view>
|
||
|
||
<!-- 底部中间发布按钮 -->
|
||
<view class="fab" @tap="createGreeting">
|
||
<text class="fab-plus">+</text>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script setup>
|
||
import { ref } from "vue";
|
||
import {
|
||
onPullDownRefresh,
|
||
onShareAppMessage,
|
||
onShareTimeline,
|
||
} from "@dcloudio/uni-app";
|
||
import { getBavBarHeight } from "@/utils/system";
|
||
import { getShareReward } from "@/api/system";
|
||
import { getShareToken } from "@/utils/common";
|
||
|
||
const features = ref([
|
||
{
|
||
title: "新春祝福卡片",
|
||
subtitle: "龙年贺卡",
|
||
icon: "https://file.lihailezzc.com/resource/6b6cb83abf3a9c9b78a4744238b5b851.png",
|
||
type: "card",
|
||
},
|
||
{
|
||
title: "视频拜年",
|
||
subtitle: "AI合成短视频",
|
||
icon: "https://file.lihailezzc.com/resource/1a7b4b9d2b9b4bcb88f14c9f1ef4413a.png",
|
||
type: "video",
|
||
},
|
||
{
|
||
title: "新春头像装饰",
|
||
subtitle: "锦上添花",
|
||
icon: "https://file.lihailezzc.com/resource/5e7d2b8d1c34c22f9c4f4f4cb4cba70d.png",
|
||
type: "avatar_decor",
|
||
},
|
||
{
|
||
title: "马年主题头像框",
|
||
subtitle: "2026限定",
|
||
icon: "https://file.lihailezzc.com/resource/9f80ab295b7e0a7a5f62c3b0f2d7a11c.png",
|
||
type: "avatar_frame",
|
||
},
|
||
]);
|
||
|
||
const popularCards = ref([
|
||
{
|
||
title: "极简祝福金框",
|
||
sub: "极简风格",
|
||
cover:
|
||
"https://file.lihailezzc.com/resource/7a5b2f2f5d6c42b5b21b8b1c9b28a3a1.jpg",
|
||
},
|
||
{
|
||
title: "红包封面",
|
||
sub: "新春限定",
|
||
cover:
|
||
"https://file.lihailezzc.com/resource/9b3d2a1a4c7b4a4a9e3b94c4a2b9c3e2.jpg",
|
||
},
|
||
{
|
||
title: "新春大拜年卡",
|
||
sub: "全家福",
|
||
cover:
|
||
"https://file.lihailezzc.com/resource/3a2b1c9d7e6f5a4b3c2d1e0f9a8b7c6d.jpg",
|
||
},
|
||
]);
|
||
|
||
const feeds = ref([
|
||
{
|
||
name: "陈小明",
|
||
time: "刚刚",
|
||
avatar:
|
||
"https://file.lihailezzc.com/resource/1463f294244c11cf274a5eaae115872a.jpeg",
|
||
text: "祝大家新的一年万事如意,阖家幸福!龙年行大运,喜气满满~✨",
|
||
image:
|
||
"https://file.lihailezzc.com/resource/02b7d1f8a9c34f2b8a2a7d4e9b1a5c8d.jpg",
|
||
likes: 12,
|
||
comments: 3,
|
||
},
|
||
{
|
||
name: "李华",
|
||
time: "5分钟前",
|
||
avatar:
|
||
"https://file.lihailezzc.com/resource/1463f294244c11cf274a5eaae115872a.jpeg",
|
||
text: "新年快乐!祝朋友们身体健康、工作顺利,2026马到成功~",
|
||
image: "",
|
||
likes: 8,
|
||
comments: 2,
|
||
},
|
||
{
|
||
name: "王伟",
|
||
time: "10分钟前",
|
||
avatar:
|
||
"https://file.lihailezzc.com/resource/1463f294244c11cf274a5eaae115872a.jpeg",
|
||
text: "给你们拜年啦!",
|
||
image:
|
||
"https://file.lihailezzc.com/resource/1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f.jpg",
|
||
likes: 6,
|
||
comments: 1,
|
||
},
|
||
]);
|
||
|
||
const onFeatureTap = (item) => {
|
||
uni.showToast({ title: `进入:${item.title}`, icon: "none" });
|
||
// 可跳转到对应功能页面
|
||
// uni.navigateTo({ url: `/pages/${item.type}/index` })
|
||
};
|
||
|
||
const previewCard = (card) => {
|
||
uni.previewImage({ urls: [card.cover] });
|
||
};
|
||
|
||
const onMore = (type) => {
|
||
uni.showToast({ title: "即将开放~", icon: "none" });
|
||
};
|
||
|
||
const like = (index) => {
|
||
feeds.value[index].likes += 1;
|
||
};
|
||
|
||
const comment = (index) => {
|
||
uni.showToast({ title: "评论功能开发中~", icon: "none" });
|
||
};
|
||
|
||
const share = () => {
|
||
uni.showShareMenu && uni.showShareMenu();
|
||
};
|
||
|
||
onShareAppMessage(async () => {
|
||
const shareToken = await getShareToken("spring_index");
|
||
getShareReward({ scene: "spring_index" });
|
||
return {
|
||
title: "2026 丙午马年,送你一份新春祝福 🎊",
|
||
path: `/pages/spring/index?shareToken=${shareToken}`,
|
||
imageUrl:
|
||
"https://file.lihailezzc.com/resource/8dd026d76ef7a63d123b7fd698fb989b.png",
|
||
};
|
||
});
|
||
|
||
onShareTimeline(async () => {
|
||
const shareToken = await getShareToken("spring_timeline");
|
||
return {
|
||
title: "2026 丙午马年,送你一份新春祝福 🎊",
|
||
query: `shareToken=${shareToken}`,
|
||
imageUrl:
|
||
"https://file.lihailezzc.com/resource/8dd026d76ef7a63d123b7fd698fb989b.png",
|
||
};
|
||
});
|
||
|
||
const createGreeting = () => {
|
||
uni.showToast({ title: "去发布祝福~", icon: "none" });
|
||
};
|
||
|
||
onPullDownRefresh(() => {
|
||
setTimeout(() => {
|
||
uni.stopPullDownRefresh();
|
||
uni.showToast({ title: "已为你更新内容", icon: "success" });
|
||
}, 600);
|
||
});
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.spring-page {
|
||
min-height: 100vh;
|
||
box-sizing: border-box;
|
||
background: #fff;
|
||
}
|
||
|
||
/* 顶部 Banner */
|
||
.hero {
|
||
position: relative;
|
||
margin: 24rpx;
|
||
padding: 32rpx;
|
||
border-radius: 24rpx;
|
||
color: #fff;
|
||
background: linear-gradient(180deg, #e52e2e 0%, #c61a1a 100%);
|
||
overflow: hidden;
|
||
|
||
.hero-badge {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
background: rgba(255, 255, 255, 0.2);
|
||
border-radius: 999rpx;
|
||
padding: 8rpx 16rpx;
|
||
font-size: 22rpx;
|
||
.badge-dot {
|
||
margin-right: 8rpx;
|
||
}
|
||
}
|
||
.hero-title {
|
||
margin-top: 24rpx;
|
||
display: flex;
|
||
align-items: baseline;
|
||
.year {
|
||
font-size: 44rpx;
|
||
font-weight: 700;
|
||
margin-right: 12rpx;
|
||
}
|
||
.main {
|
||
font-size: 44rpx;
|
||
font-weight: 700;
|
||
}
|
||
}
|
||
.hero-sub {
|
||
margin-top: 8rpx;
|
||
font-size: 24rpx;
|
||
opacity: 0.9;
|
||
}
|
||
.hero-decor {
|
||
position: absolute;
|
||
right: 12rpx;
|
||
bottom: 12rpx;
|
||
width: 160rpx;
|
||
height: 160rpx;
|
||
opacity: 0.3;
|
||
border-radius: 16rpx;
|
||
}
|
||
}
|
||
|
||
/* 功能入口宫格 - 2x2 */
|
||
.feature-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(2, 1fr);
|
||
grid-gap: 20rpx;
|
||
padding: 0 24rpx;
|
||
margin-top: 8rpx;
|
||
|
||
.feature-item {
|
||
display: flex;
|
||
align-items: center;
|
||
padding: 20rpx;
|
||
border-radius: 18rpx;
|
||
background: #f9f5f0;
|
||
box-shadow: 0 6rpx 16rpx rgba(0, 0, 0, 0.04);
|
||
}
|
||
.feature-icon {
|
||
width: 80rpx;
|
||
height: 80rpx;
|
||
border-radius: 12rpx;
|
||
margin-right: 16rpx;
|
||
background: #fff;
|
||
}
|
||
.feature-texts {
|
||
display: flex;
|
||
flex-direction: column;
|
||
.feature-title {
|
||
font-size: 28rpx;
|
||
color: #222;
|
||
font-weight: 600;
|
||
}
|
||
.feature-sub {
|
||
font-size: 22rpx;
|
||
color: #888;
|
||
margin-top: 8rpx;
|
||
}
|
||
}
|
||
}
|
||
|
||
/* 通用区块标题 */
|
||
.section {
|
||
margin-top: 28rpx;
|
||
|
||
.section-header {
|
||
display: flex;
|
||
align-items: center;
|
||
padding: 0 24rpx;
|
||
.section-bar {
|
||
width: 10rpx;
|
||
height: 30rpx;
|
||
border-radius: 6rpx;
|
||
background: #ff3b30;
|
||
margin-right: 12rpx;
|
||
}
|
||
.section-title {
|
||
font-size: 28rpx;
|
||
color: #222;
|
||
flex: 1;
|
||
font-weight: 600;
|
||
}
|
||
.section-more {
|
||
font-size: 24rpx;
|
||
color: #999;
|
||
}
|
||
}
|
||
}
|
||
|
||
/* 大家都在用 - 横滑卡片 */
|
||
.cards-scroll {
|
||
margin-top: 16rpx;
|
||
padding-left: 24rpx;
|
||
}
|
||
.cards-wrap {
|
||
display: flex;
|
||
}
|
||
.use-card {
|
||
width: 260rpx;
|
||
flex-shrink: 0;
|
||
margin-right: 18rpx;
|
||
border-radius: 18rpx;
|
||
background: #fff;
|
||
box-shadow: 0 8rpx 20rpx rgba(0, 0, 0, 0.06);
|
||
overflow: hidden;
|
||
|
||
.use-cover {
|
||
width: 100%;
|
||
height: 200rpx;
|
||
}
|
||
.use-info {
|
||
padding: 16rpx;
|
||
}
|
||
.use-title {
|
||
font-size: 26rpx;
|
||
color: #333;
|
||
font-weight: 600;
|
||
}
|
||
.use-sub {
|
||
font-size: 22rpx;
|
||
color: #999;
|
||
margin-top: 6rpx;
|
||
}
|
||
}
|
||
|
||
/* 已移除:.cards-scroll、feed-list、feed-item、feed-header、feed-avatar、feed-user、feed-name、feed-time、feed-content、feed-text、feed-image、feed-actions、.see-more */
|
||
.feed-list {
|
||
padding: 0 24rpx;
|
||
}
|
||
.feed-item {
|
||
padding: 22rpx 0;
|
||
border-bottom: 1rpx solid #f0f0f0;
|
||
}
|
||
.feed-header {
|
||
display: flex;
|
||
align-items: center;
|
||
}
|
||
.feed-avatar {
|
||
width: 64rpx;
|
||
height: 64rpx;
|
||
border-radius: 50%;
|
||
margin-right: 16rpx;
|
||
}
|
||
.feed-user {
|
||
display: flex;
|
||
flex-direction: column;
|
||
}
|
||
.feed-name {
|
||
font-size: 26rpx;
|
||
color: #333;
|
||
font-weight: 600;
|
||
}
|
||
.feed-time {
|
||
font-size: 22rpx;
|
||
color: #999;
|
||
margin-top: 6rpx;
|
||
}
|
||
.feed-content {
|
||
margin-top: 12rpx;
|
||
}
|
||
.feed-text {
|
||
font-size: 26rpx;
|
||
color: #333;
|
||
line-height: 1.6;
|
||
}
|
||
.feed-image {
|
||
width: 100%;
|
||
height: 280rpx;
|
||
border-radius: 12rpx;
|
||
margin-top: 12rpx;
|
||
background: #f6f6f6;
|
||
}
|
||
.feed-actions {
|
||
margin-top: 12rpx;
|
||
display: flex;
|
||
.action {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
margin-right: 24rpx;
|
||
color: #666;
|
||
.icon {
|
||
margin-right: 8rpx;
|
||
}
|
||
}
|
||
}
|
||
|
||
.see-more {
|
||
margin: 24rpx;
|
||
padding: 18rpx 0;
|
||
text-align: center;
|
||
color: #999;
|
||
font-size: 24rpx;
|
||
}
|
||
|
||
/* 发布悬浮按钮 */
|
||
.fab {
|
||
position: fixed;
|
||
left: 50%;
|
||
transform: translateX(-50%);
|
||
bottom: 60rpx;
|
||
width: 100rpx;
|
||
height: 100rpx;
|
||
border-radius: 50%;
|
||
background: #ff3b30;
|
||
color: #fff;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
box-shadow: 0 12rpx 24rpx rgba(255, 59, 48, 0.4);
|
||
.fab-plus {
|
||
font-size: 48rpx;
|
||
line-height: 1;
|
||
}
|
||
}
|
||
</style>
|