Files
spring-festival-greetings/pages/spring/index.vue
2026-01-09 11:24:40 +08:00

360 lines
11 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>
<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 } from '@dcloudio/uni-app'
import { getBavBarHeight } from '@/utils/system'
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()
}
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>