比赛
All checks were successful
Deploy to Server / deploy (push) Successful in 37s

This commit is contained in:
jeremygan2021
2026-03-10 11:09:15 +08:00
parent 724dd3857c
commit 417cda952d
11 changed files with 778 additions and 3 deletions

View File

@@ -0,0 +1,74 @@
import { View, Text, Image, ScrollView } from '@tarojs/components'
import Taro, { useLoad } from '@tarojs/taro'
import { useState } from 'react'
import { getCompetitions } from '../../api'
import './index.scss'
export default function CompetitionList() {
const [competitions, setCompetitions] = useState<any[]>([])
const [loading, setLoading] = useState(false)
useLoad(() => {
fetchCompetitions()
})
const fetchCompetitions = async () => {
setLoading(true)
try {
const res = await getCompetitions()
if (res && res.results) {
setCompetitions(res.results)
}
} catch (e) {
Taro.showToast({ title: '加载失败', icon: 'none' })
} finally {
setLoading(false)
}
}
const goDetail = (id) => {
Taro.navigateTo({ url: `/pages/competition/detail?id=${id}` })
}
const getStatusText = (status) => {
const map = {
'registration': '报名中',
'submission': '作品提交中',
'judging': '评审中',
'ended': '已结束',
'draft': '草稿'
}
return map[status] || status
}
return (
<View className='competition-page'>
<ScrollView scrollY className='comp-list'>
{competitions.map(item => (
<View key={item.id} className='comp-card' onClick={() => goDetail(item.id)}>
<Image
className='cover'
mode='aspectFill'
src={item.display_cover_image || 'https://via.placeholder.com/400x200'}
/>
<View className='info'>
<View className='header'>
<Text className='title'>{item.title}</Text>
<Text className={`status ${item.status}`}>{getStatusText(item.status)}</Text>
</View>
<Text className='desc'>{item.description}</Text>
<View className='footer'>
<Text className='time'>
{item.start_time?.split('T')[0]} ~ {item.end_time?.split('T')[0]}
</Text>
</View>
</View>
</View>
))}
{!loading && competitions.length === 0 && (
<View className='empty'></View>
)}
</ScrollView>
</View>
)
}