ylj20011123 18959b7500 update
2025-11-07 18:33:55 +08:00

494 lines
13 KiB
Vue

<template>
<div class="event-detail-page">
<!-- 活动封面 -->
<div class="event-cover">
<swiper>
<swiper-item v-for="(item, imgIndex) in eventDetail.ImageList" :key="imgIndex">
<image class="cover-image" :src="item.ImageUrl" mode="aspectFill" />
</swiper-item>
</swiper>
<div class="event-status"
:class="new Date(eventDetail.ACTIVITY_ENDDATE).getTime() < new Date().getTime() ? 'status-ended' : new Date(eventDetail.ACTIVITY_STARTDATE).getTime() < new Date().getTime() ? 'status-draft' : 'status-active'">
{{ getStatusText(eventDetail) }}
</div>
</div>
<!-- 活动基本信息 -->
<div class="event-header">
<div class="event-title">{{ eventDetail.ACTIVITY_NAME }}</div>
<div class="event-meta">
<div class="meta-item">
<span class="meta-icon">📅</span>
<span class="meta-text">{{ eventDetail.ACTIVITY_STARTDATE ? eventDetail.ACTIVITY_STARTDATE : ""
}}{{ eventDetail.ACTIVITY_ENDDATE ? `-` + eventDetail.ACTIVITY_ENDDATE : "" }}</span>
</div>
<div class="meta-item">
<span class="meta-icon">📍</span>
<span class="meta-text">{{ eventDetail.ACTIVITY_LOCATION }}</span>
</div>
<div class="meta-item">
<span class="meta-icon">👥</span>
<span class="meta-text">
{{ eventDetail.MAXIMUM_CAPACITY || '不限' }}
</span>
</div>
</div>
</div>
<!-- 活动内容 -->
<div class="content-section">
<div class="section-title">活动介绍</div>
<text class="content-text">{{ eventDetail.ACTIVITY_INFO }}</text>
</div>
<!-- 报名按钮 -->
<div class="action-section" v-if="errorType > 0">
<div
:class="errorType === 1 || errorType === 2 || errorType === 3 || errorType === 5 ? 'action-btn action-registered' : 'action-btn action-normal'"
@click="handleAction">
<span class="btn-text">{{ errorType === 0 ? '' : errorType === 1 ? '活动已结束' : errorType === 2 ? '活动已经开始' :
errorType === 3 ? '已报名' : errorType === 4 ? '重新报名' : errorType === 5 ? '未参加' : errorType === 6 ? '立即报名' : ''
}}</span>
</div>
</div>
</div>
</template>
<script>
import { mapGetters } from "vuex";
export default {
data() {
return {
eventId: "",
eventDetail: {},
hasRegistered: false, // 是否已报名当前活动
errorType: 0, // 0 默认 1 表示活动已经结束 2 表示活动已经开始 3 表示已经报名该活动 4 表示报过名 但是取消了 5 报名了 但是没有参加 6 从未报名
statusDetail: {},// 状态详情
};
},
computed: {
...mapGetters({
user: "user",
}),
},
onLoad(query) {
if (query.id) {
this.eventId = query.id;
}
// 活动详情
this.loadEventDetail();
},
onShow() {
this.loadEventDetail();
},
methods: {
// 加载活动详情
async loadEventDetail() {
const req = {
ACTIVITYId: this.eventId,
type: 'encryption'
}
uni.showLoading({
title: '加载中...',
mask: true
});
const data = await this.$api.$posMemberPost("/Member/GetACTIVITYDetail", req)
uni.hideLoading();
let detail = data.Result_Data
console.log('详情djaksjda', detail);
// 判断一下当前活动是不是已经开始 或结束了
let nowTime = new Date().getTime()
if (new Date(detail.ACTIVITY_ENDDATE).getTime() < nowTime) {
// 1 表示活动已经结束
this.errorType = 1
} else if (new Date(detail.ACTIVITY_STARTDATE).getTime() < nowTime) {
// 2 表示活动已经开始
this.errorType = 2
}
this.eventDetail = detail;
if (this.errorType > 0) {
} else {
}
// 查询当前用户是否报名了 这个活动
this.checkRegistrationStatus()
},
// 检查报名状态
async checkRegistrationStatus() {
const req = {
SearchParameter: {
ACTIVITY_IDS: this.eventId,
MEMBERSHIP_IDS: this.user.MEMBERSHIP_ID,
},
PageIndex: 1,
PageSize: 999999,
type: 'encryption'
}
const data = await this.$api.$posMemberPost("/Member/GetACTIVITYDETAILList", req)
let list = data.Result_Data.List
// 若这个list 有值 则说明之前报名过 看看是啥状态
console.log('这个用户这个活动的报名详细', list);
if (list && list.length > 0) {
let detail = list[0]
if (detail.ACTIVITYDETAIL_STATE === 1) {
// 1 表示当前是报名状态
this.hasRegistered = true;
// 3 表示已经报名该活动
this.errorType = 3
} else if (detail.ACTIVITYDETAIL_STATE === 0) {
// 0 表示报过名 但是取消了
// 4 表示报过名 但是取消了
this.errorType = 4
} else if (detail.ACTIVITYDETAIL_STATE === 2) {
// 2 报名了 但是没有参加
// 5 报名了 但是没有参加
this.errorType = 5
}
this.statusDetail = detail
} else {
this.hasRegistered = false;
// 6 从没报过名
this.errorType = 6
// 没查到 说明这个活动当前用户还没报名
}
},
// 处理按钮点击
handleAction() {
if (this.errorType === 1) {
uni.showToast({
title: "活动已结束",
icon: 'none'
})
} else if (this.errorType === 2) {
uni.showToast({
title: "活动已开始",
icon: 'none'
})
} else if (this.errorType === 3) {
let _this = this
uni.showModal({
title: "注意",
content: "您已报名成功,确认要取消报名?",
success: async (res) => {
if (res.confirm) {
let req = {
..._this.statusDetail,
ACTIVITYDETAIL_STATE: 0,
type: 'encryption'
}
const data = await _this.$api.$posMemberPost("/Member/SynchroACTIVITYDETAIL", req)
if (data.Result_Code === 100) {
uni.showToast({
title: '取消成功!',
icon: 'none'
})
_this.errorType = 0
_this.eventDetail = {}
_this.hasRegistered = false
_this.statusDetail = {}
_this.loadEventDetail();
} else {
uni.showToast({
title: data.Result_Desc,
icon: 'none'
})
}
}
},
});
} else if (this.errorType === 4) {
let _this = this
uni.showModal({
title: "注意",
content: "您有报名记录,是否重新报名",
success: async (res) => {
if (res.confirm) {
let req = {
..._this.statusDetail,
ACTIVITYDETAIL_STATE: 1,
type: 'encryption'
}
const data = await _this.$api.$posMemberPost("/Member/SynchroACTIVITYDETAIL", req)
if (data.Result_Code === 100) {
uni.showToast({
title: '重新报名成功!',
icon: 'none'
})
_this.errorType = 0
_this.eventDetail = {}
_this.hasRegistered = false
_this.statusDetail = {}
_this.loadEventDetail();
} else {
uni.showToast({
title: data.Result_Desc,
icon: 'none'
})
}
}
},
});
} else if (this.errorType === 5) {
} else if (this.errorType === 6) {
// 跳转到报名页面
uni.navigateTo({
url: `/pages/eventRegistration/registration?eventId=${this.eventId}`
});
}
// if (this.hasRegistered === true) {
// uni.showToast({
// title: "已报名!请勿重复报名",
// icon: 'none'
// })
// } else {
// // 跳转到报名页面
// uni.navigateTo({
// url: `/pages/eventRegistration/registration?eventId=${this.eventId}`
// });
// }
},
// 跳转到报名信息页面
goToRegistrationInfo() {
uni.navigateTo({
url: `/pages/eventRegistration/registration?eventId=${this.eventId}`
});
},
// 获取活动状态文本
getStatusText(status) {
if (new Date(status.ACTIVITY_ENDDATE).getTime() < new Date().getTime()) {
return '已结束'
} else if (new Date(status.ACTIVITY_STARTDATE).getTime() < new Date().getTime()) {
return '已开始'
} else {
return '报名中'
}
},
}
};
</script>
<style scoped lang="less">
.event-detail-page {
width: 100vw;
min-height: 100vh;
background: #f8fafc;
overflow-y: scroll;
.event-cover {
position: relative;
width: 100%;
height: 300rpx;
overflow: hidden;
.cover-image {
width: 100%;
height: 100%;
object-fit: cover;
}
.event-status {
position: absolute;
top: 40rpx;
right: 40rpx;
padding: 16rpx 32rpx;
border-radius: 24rpx;
font-size: 24rpx;
font-weight: 600;
backdrop-filter: blur(10rpx);
&.status-active {
background: rgba(34, 197, 94, 0.9);
color: white;
}
&.status-ended {
background: rgba(107, 114, 128, 0.9);
color: white;
}
&.status-draft {
background: rgba(251, 146, 60, 0.9);
color: white;
}
}
}
.event-header {
background: white;
padding: 24rpx;
margin: -40rpx 32rpx 32rpx;
border-radius: 24rpx 24rpx;
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.08);
position: relative;
z-index: 2;
.event-title {
font-size: 30rpx;
font-weight: 600;
color: #1f2937;
line-height: 1.4;
margin-bottom: 12rpx;
}
.event-meta {
.meta-item {
display: flex;
align-items: center;
margin-bottom: 12rpx;
&:last-child {
margin-bottom: 0;
}
.meta-icon {
font-size: 24rpx;
margin-right: 16rpx;
width: 40rpx;
text-align: center;
}
.meta-text {
font-size: 24rpx;
color: #374151;
line-height: 1.4;
}
}
}
}
.content-section,
.requirements-section,
.notice-section {
background: white;
margin: 0 32rpx 32rpx;
padding: 32rpx;
border-radius: 24rpx;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.06);
.section-title {
font-size: 28rpx;
font-weight: 600;
color: #1f2937;
margin-bottom: 12rpx;
position: relative;
padding-left: 16rpx;
&::before {
content: '';
position: absolute;
left: 0;
top: 8rpx;
bottom: 8rpx;
width: 6rpx;
background: #22c55e;
border-radius: 3rpx;
}
}
.content-text {
font-size: 24rpx;
color: #374151;
line-height: 1.6;
white-space: pre-wrap;
}
}
.notice-section {
margin: 0 32rpx calc(24rpx + env(safe-area-inset-bottom) + 24rpx + 28rpx + 40rpx);
}
.action-section {
position: fixed;
left: 0;
right: 0;
bottom: 0;
background: white;
border-top: 1rpx solid #f0f0f0;
padding: 24rpx 32rpx calc(24rpx + env(safe-area-inset-bottom));
z-index: 100;
.action-btn {
display: flex;
align-items: center;
justify-content: center;
padding: 20rpx;
border-radius: 40rpx;
font-size: 28rpx;
font-weight: 600;
transition: all 0.3s ease;
border: 2rpx solid #e5e7eb;
&.action-normal {
background: linear-gradient(135deg, #22c55e, #16a34a);
color: white;
border-color: #22c55e;
&:active {
opacity: 0.9;
}
.btn-text {
margin-right: 12rpx;
}
.btn-icon {
font-size: 28rpx;
}
}
&.action-registered {
background: #f3f4f6;
color: #9ca3af;
border-color: #e5e7eb;
&:active {
background: #e5e7eb;
}
.btn-text {
margin-right: 12rpx;
}
.registered-icon {
font-size: 24rpx;
color: #6b7280;
}
}
&.action-full {
background: #f3f4f6;
color: #9ca3af;
border-color: #e5e7eb;
&:active {
background: #e5e7eb;
}
}
&.action-disabled {
background: #f9fafb;
color: #d1d5db;
border-color: #f3f4f6;
}
}
}
}
.event-detail-page::-webkit-scrollbar {
display: none;
}
</style>