Files
hejiu/components/EventCard.vue
T
cg 99723497fa rename(app): 将应用名称从"干杯日记"更改为"碰盏日记"
- 替换所有文件中的品牌名称引用,包括App.vue、pages.json、uni.scss等
- 更新全局样式、导航栏标题和组件中的文案显示
- 修改分享功能中的应用名称显示
- 调整聊天页面的输入栏键盘适配逻辑
- 在多个页面组件中添加事件发射声明以支持交互功能
2026-07-21 22:20:08 +08:00

181 lines
3.9 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="event-card" @click="$emit('tap', event)">
<!-- 状态标签 -->
<view class="event-status" :class="'status-' + event.status">
<text class="event-status-text">{{ statusLabel }}</text>
</view>
<!-- 标题 -->
<text class="event-title">{{ event.title }}</text>
<!-- 信息行 -->
<view class="event-info">
<view class="event-info-row">
<text class="event-info-icon">🕐</text>
<text class="event-info-text">{{ event.time }}</text>
</view>
<view class="event-info-row">
<text class="event-info-icon">📍</text>
<text class="event-info-text">{{ event.location }}</text>
</view>
<view class="event-info-row">
<text class="event-info-icon">👥</text>
<text class="event-info-text">{{ event.joined }}/{{ event.maxPeople }} 人已报名</text>
</view>
</view>
<!-- 底部发起人 + 操作 -->
<view class="event-footer">
<view class="event-organizer">
<view class="event-org-avatar">
<text class="event-org-text">{{ event.organizer ? event.organizer.nickname[0] : '酒' }}</text>
</view>
<text class="event-org-name">{{ event.organizer ? event.organizer.nickname : '' }}</text>
</view>
<view class="event-action" v-if="event.status === 'open'">
<text class="event-action-text" v-if="event.isJoined"> 已报名</text>
<text class="event-action-text event-action-join" v-else>报名</text>
</view>
</view>
</view>
</template>
<script>
export default {
name: 'EventCard',
props: {
event: { type: Object, default: () => ({}) }
},
emits: ['tap'],
computed: {
statusLabel() {
const map = { open: '报名中', ongoing: '进行中', ended: '已结束' }
return map[this.event.status] || '报名中'
}
}
}
</script>
<style lang="scss" scoped>
.event-card {
background: $bg-card;
border-radius: $radius-xl;
border: 1rpx solid var(--border-faint, rgba(255,255,255,0.08));
padding: $sp-xl;
margin-bottom: $sp-md;
position: relative;
overflow: hidden;
&:active {
background: $bg-card-alt;
}
}
.event-status {
display: inline-flex;
padding: 6rpx 16rpx;
border-radius: $radius-full;
margin-bottom: $sp-md;
&.status-open {
background: rgba(94,198,160,0.12);
}
&.status-ongoing {
background: rgba(232,168,56,0.12);
}
&.status-ended {
background: $bg-elevated;
}
}
.event-status-text {
font-size: $fs-xs;
font-weight: $fw-medium;
.status-open & { color: $mint; }
.status-ongoing & { color: $amber; }
.status-ended & { color: $text-tertiary; }
}
.event-title {
display: block;
font-size: $fs-lg;
font-weight: $fw-bold;
color: $text-primary;
margin-bottom: $sp-lg;
}
.event-info {
display: flex;
flex-direction: column;
gap: $sp-sm;
margin-bottom: $sp-lg;
}
.event-info-row {
display: flex;
align-items: center;
gap: $sp-sm;
}
.event-info-icon {
font-size: $fs-sm;
width: 36rpx;
text-align: center;
}
.event-info-text {
font-size: $fs-sm;
color: $text-secondary;
}
.event-footer {
display: flex;
align-items: center;
justify-content: space-between;
padding-top: $sp-md;
border-top: 1rpx solid var(--divider-color, rgba(255,255,255,0.08));
}
.event-organizer {
display: flex;
align-items: center;
gap: $sp-sm;
}
.event-org-avatar {
width: 48rpx;
height: 48rpx;
border-radius: 50%;
background: $bg-elevated;
display: flex;
align-items: center;
justify-content: center;
}
.event-org-text {
font-size: $fs-xs;
font-weight: $fw-bold;
color: $lavender;
}
.event-org-name {
font-size: $fs-sm;
color: $text-tertiary;
}
.event-action-text {
font-size: $fs-sm;
color: $text-tertiary;
padding: 8rpx 24rpx;
border-radius: $radius-full;
background: $bg-elevated;
}
.event-action-join {
color: $text-on-amber;
background: linear-gradient(135deg, $amber, $amber-deep);
font-weight: $fw-bold;
}
</style>