feat(competition): 实现比赛创建功能并集成后端API

- 新增比赛创建页面,包含基本信息、组别管理和题目配置三个步骤
- 添加 OSS 图片上传组件,支持海报上传到阿里云OSS
- 集成后端API:获取房间列表、创建活动、创建队伍和创建题目
- 优化表单数据绑定和验证逻辑,使用防抖减少频繁更新
- 修复组别管理Excel导入的数据填充问题
- 更新类型定义,添加CommonResponse和比赛相关接口类型
This commit is contained in:
2026-01-29 18:03:13 +08:00
parent 82b1dd7ebe
commit beaaee72b4
13 changed files with 493 additions and 147 deletions

View File

@ -3,13 +3,13 @@ import { roundTypeOptions, scoreTypeOptions } from '@/constants/business'
export interface QuestionItem {
id: string
value: string | null
questionId: string | null
score: number
time: number
title: string
scoreType: Api.Competition.QuestionScoreType
uiType?: string
templateId?: string
templateId?: number
}
export interface RoundModel {
@ -50,21 +50,6 @@ export function useQuestionConfig(props: any) {
}, { count: 0, score: 0, time: 0 })
})
const questionOptions = [
{ label: '请根据提示书写正确的汉字-jiū 表示小鸟的叫声。', value: 'hanzi' },
{ label: '请根据提示书写正确的汉字-“春色满园关不住,一枝红杏出墙来”。请书写“杏”字。', value: 'tongyin' },
{ label: '请写出含有“车”的汉字。', value: 'pianpang' },
{ label: '请根据拼音书写正确的词语。', value: 'ciyu' },
{ label: '请写出含有反义字的四字成语。 - 例如:“不日而月”', value: 'chengyu' },
{ label: '请根据图片书写正确的成语。', value: 'fanyi' },
{ label: '近义词挑战', value: 'jinyi' },
{ label: '看图猜字', value: 'kantu' },
{ label: '古诗词接龙', value: 'gushi' },
{ label: '名句听写', value: 'mingju' },
{ label: '极速成语接龙 - 每题10秒', value: 'speed10' },
{ label: '极速成语接龙 - 每题20秒', value: 'speed20' },
]
// 新增轮次
function addRound(customName?: string, customCount?: number, roundType?: Api.Competition.CompetitionRoundType) {
if (!props.modelValue.rounds) {
@ -80,7 +65,7 @@ export function useQuestionConfig(props: any) {
roundType: roundType || roundTypeOptions[0].value,
questions: Array.from({ length: count }).map(() => ({
id: generateId(),
value: null,
questionId: null,
score: 5,
time: 30,
title: '',
@ -138,7 +123,7 @@ export function useQuestionConfig(props: any) {
const question = round.questions[j]
const questionPrefix = `${round.name}${j + 1}`
if (!question.value) {
if (!question.questionId) {
window.$message?.error(`${questionPrefix}未选择题型`)
return false
}
@ -181,7 +166,6 @@ export function useQuestionConfig(props: any) {
getRoundScore,
getRoundTime,
totalStats,
questionOptions,
addRound,
removeRound,
addQuestion,