317 lines
9.0 KiB
Vue
317 lines
9.0 KiB
Vue
<template>
|
||
<view class="event-detail-page">
|
||
<!-- 赛事标题和信息 -->
|
||
<view class="event-header">
|
||
<view class="event-title">{{ eventInfo.title }}</view>
|
||
<view class="divider"></view>
|
||
<view class="event-info">
|
||
<text class="label">地点:</text>
|
||
<text class="value">{{ eventInfo.location }}</text>
|
||
</view>
|
||
<view class="event-info">
|
||
<text class="label">报名时间:</text>
|
||
<text class="value">{{ eventInfo.registerTime }}</text>
|
||
</view>
|
||
<view class="event-info">
|
||
<text class="label">比赛时间:</text>
|
||
<text class="value">{{ eventInfo.matchTime }}</text>
|
||
</view>
|
||
<view class="event-info">
|
||
<text class="label">报名人数:</text>
|
||
<text class="value">{{ eventInfo.registerCount }}</text>
|
||
</view>
|
||
<view class="divider"></view>
|
||
</view>
|
||
|
||
<!-- 功能网格 -->
|
||
<view class="function-grid">
|
||
<view class="function-item" @click="handleFunction('info')">
|
||
<image class="function-icon-img" src="/static/images/信息发布@3x.png" mode="aspectFit"></image>
|
||
<text class="function-text">信息发布</text>
|
||
</view>
|
||
<view class="function-item" @click="handleFunction('rules')">
|
||
<image class="function-icon-img" src="/static/images/赛事规程@3x.png" mode="aspectFit"></image>
|
||
<text class="function-text">赛事规程</text>
|
||
</view>
|
||
<view class="function-item" @click="handleFunction('schedule')">
|
||
<image class="function-icon-img" src="/static/images/活动日程@3x.png" mode="aspectFit"></image>
|
||
<text class="function-text">活动日程</text>
|
||
</view>
|
||
<view class="function-item" @click="handleFunction('players')">
|
||
<image class="function-icon-img" src="/static/images/参赛选手@3x.png" mode="aspectFit"></image>
|
||
<text class="function-text">参赛选手</text>
|
||
</view>
|
||
<view class="function-item" @click="handleFunction('match')">
|
||
<image class="function-icon-img" src="/static/images/比赛实况@3x.png" mode="aspectFit"></image>
|
||
<text class="function-text">比赛实况</text>
|
||
</view>
|
||
<view class="function-item" @click="handleFunction('lineup')">
|
||
<image class="function-icon-img" src="/static/images/出场顺序@3x.png" mode="aspectFit"></image>
|
||
<text class="function-text">出场顺序</text>
|
||
</view>
|
||
<view class="function-item" @click="handleFunction('score')">
|
||
<image class="function-icon-img" src="/static/images/成绩@3x.png" mode="aspectFit"></image>
|
||
<text class="function-text">成绩</text>
|
||
</view>
|
||
<view class="function-item" @click="handleFunction('awards')">
|
||
<image class="function-icon-img" src="/static/images/奖牌榜.png" mode="aspectFit"></image>
|
||
<text class="function-text">奖牌榜</text>
|
||
</view>
|
||
<view class="function-item" @click="handleFunction('photos')">
|
||
<image class="function-icon-img" src="/static/images/图片直播@3x.png" mode="aspectFit"></image>
|
||
<text class="function-text">图片直播</text>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 报名按钮 -->
|
||
<view class="register-btn-wrapper" v-if="eventInfo.status === 'open'">
|
||
<view class="register-btn" @click="goToRegister">去报名</view>
|
||
</view>
|
||
|
||
<!-- 报名已结束状态 -->
|
||
<view class="register-btn-wrapper" v-if="eventInfo.status === 'finished'">
|
||
<view class="register-btn disabled">报名已结束</view>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
import competitionAPI from '@/api/competition.js'
|
||
|
||
export default {
|
||
data() {
|
||
return {
|
||
eventId: '',
|
||
eventInfo: {
|
||
id: '',
|
||
title: '',
|
||
location: '',
|
||
registerTime: '',
|
||
matchTime: '',
|
||
registerCount: '0',
|
||
status: 'open'
|
||
}
|
||
};
|
||
},
|
||
onLoad(options) {
|
||
if (options.id) {
|
||
this.eventId = options.id
|
||
this.loadEventDetail(options.id)
|
||
}
|
||
},
|
||
methods: {
|
||
/**
|
||
* 加载赛事详情
|
||
* @param {String|Number} id 赛事ID
|
||
*/
|
||
async loadEventDetail(id) {
|
||
try {
|
||
const res = await competitionAPI.getCompetitionDetail(id)
|
||
|
||
console.log('赛事详情API返回:', res)
|
||
|
||
// 尝试多个可能的时间字段
|
||
const regStartTime = res.registrationStartTime || res.registerStartTime || res.signUpStartTime
|
||
const regEndTime = res.registrationEndTime || res.registerEndTime || res.signUpEndTime
|
||
const startTime = res.startTime || res.competitionStartTime || res.beginTime || res.startDate
|
||
const endTime = res.endTime || res.competitionEndTime || res.finishTime || res.endDate
|
||
|
||
// 数据映射
|
||
this.eventInfo = {
|
||
id: res.id,
|
||
title: res.name || res.title || res.competitionName || '未命名赛事',
|
||
location: res.location || res.address || res.venue || '待定',
|
||
registerTime: this.formatTimeRange(regStartTime, regEndTime) ||
|
||
res.registerTime || res.registrationPeriod || '待定',
|
||
matchTime: this.formatTimeRange(startTime, endTime) ||
|
||
res.matchTime || res.competitionTime || '待定',
|
||
registerCount: res.registrationCount || res.registerCount || res.signUpCount || res.totalParticipants || '0',
|
||
status: this.getStatus(res.status)
|
||
}
|
||
|
||
console.log('格式化后的赛事信息:', this.eventInfo)
|
||
} catch (err) {
|
||
console.error('加载赛事详情失败:', err)
|
||
uni.showToast({
|
||
title: '加载失败,请重试',
|
||
icon: 'none'
|
||
})
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 格式化时间范围
|
||
*/
|
||
formatTimeRange(startTime, endTime) {
|
||
if (!startTime || !endTime) return ''
|
||
|
||
const formatDate = (dateStr) => {
|
||
if (!dateStr) return ''
|
||
const date = new Date(dateStr)
|
||
const year = date.getFullYear()
|
||
const month = String(date.getMonth() + 1).padStart(2, '0')
|
||
const day = String(date.getDate()).padStart(2, '0')
|
||
return `${year}.${month}.${day}`
|
||
}
|
||
|
||
return `${formatDate(startTime)}-${formatDate(endTime)}`
|
||
},
|
||
|
||
/**
|
||
* 获取赛事状态
|
||
*/
|
||
getStatus(status) {
|
||
// 1: 报名中, 2: 进行中, 3: 已结束
|
||
if (status === 3 || status === '3' || status === 'finished') {
|
||
return 'finished'
|
||
}
|
||
return 'open'
|
||
},
|
||
|
||
handleFunction(type) {
|
||
// 需要跳转到附件展示页面的类型
|
||
const attachmentTypes = ['info', 'rules', 'schedule', 'score', 'awards', 'photos']
|
||
|
||
if (attachmentTypes.includes(type)) {
|
||
// 跳转到通用附件展示页面
|
||
const name = encodeURIComponent(this.eventInfo.title)
|
||
uni.navigateTo({
|
||
url: `/pages/attachment-view/attachment-view?type=${type}&competitionId=${this.eventId}&name=${name}`
|
||
})
|
||
return
|
||
}
|
||
|
||
// 其他功能页面的路由映射
|
||
const routeMap = {
|
||
'players': '/pages/event-players/event-players',
|
||
'match': '/pages/event-live/event-live',
|
||
'lineup': '/pages/event-lineup/event-lineup'
|
||
};
|
||
|
||
const url = routeMap[type];
|
||
if (url) {
|
||
// 跳转时传递赛事ID
|
||
uni.navigateTo({
|
||
url: `${url}?eventId=${this.eventId}`
|
||
})
|
||
} else {
|
||
uni.showToast({
|
||
title: '功能开发中',
|
||
icon: 'none'
|
||
});
|
||
}
|
||
},
|
||
goToRegister() {
|
||
uni.navigateTo({
|
||
url: '/pages/register-type/register-type?id=' + this.eventInfo.id
|
||
});
|
||
}
|
||
}
|
||
};
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.event-detail-page {
|
||
min-height: 100vh;
|
||
background-color: #f5f5f5;
|
||
padding-bottom: 180rpx;
|
||
}
|
||
|
||
.event-header {
|
||
background-color: #fff;
|
||
padding: 30rpx;
|
||
margin-bottom: 20rpx;
|
||
}
|
||
|
||
.event-title {
|
||
font-size: 36rpx;
|
||
font-weight: bold;
|
||
color: #333333;
|
||
line-height: 1.5;
|
||
margin-bottom: 20rpx;
|
||
}
|
||
|
||
.divider {
|
||
height: 6rpx;
|
||
background-color: #C93639;
|
||
width: 120rpx;
|
||
margin: 30rpx 0;
|
||
}
|
||
|
||
.event-info {
|
||
display: flex;
|
||
margin-bottom: 15rpx;
|
||
}
|
||
|
||
.label {
|
||
font-size: 28rpx;
|
||
color: #666666;
|
||
flex-shrink: 0;
|
||
}
|
||
|
||
.value {
|
||
font-size: 28rpx;
|
||
color: #666666;
|
||
}
|
||
|
||
.function-grid {
|
||
background-color: #fff;
|
||
padding: 30rpx;
|
||
display: grid;
|
||
grid-template-columns: repeat(3, 1fr);
|
||
gap: 40rpx 30rpx;
|
||
}
|
||
|
||
.function-item {
|
||
display: flex;
|
||
flex-direction: column;
|
||
align-items: center;
|
||
gap: 15rpx;
|
||
}
|
||
|
||
.function-icon {
|
||
width: 120rpx;
|
||
height: 120rpx;
|
||
border-radius: 16rpx;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
font-size: 60rpx;
|
||
}
|
||
|
||
.function-icon-img {
|
||
width: 90rpx;
|
||
height: 90rpx;
|
||
}
|
||
|
||
.function-text {
|
||
font-size: 26rpx;
|
||
color: #333333;
|
||
text-align: center;
|
||
}
|
||
|
||
.register-btn-wrapper {
|
||
position: fixed;
|
||
bottom: 0;
|
||
left: 0;
|
||
right: 0;
|
||
padding: 30rpx;
|
||
background-color: #fff;
|
||
box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.05);
|
||
}
|
||
|
||
.register-btn {
|
||
background-color: #C93639;
|
||
color: #fff;
|
||
text-align: center;
|
||
padding: 20rpx;
|
||
border-radius: 12rpx;
|
||
font-size: 28rpx;
|
||
font-weight: bold;
|
||
}
|
||
|
||
.register-btn.disabled {
|
||
background-color: #999999;
|
||
}
|
||
</style>
|