feat(competition): 支持决赛环节并添加加时赛管理功能

- 扩展竞赛环节类型,支持决赛环节(RoundType=3)
- 新增加时赛创建功能,支持多分组队伍选择
- 添加题目库禁用/启用功能,支持批量操作
- 优化用户端竞赛流程,区分常规赛和加时赛
- 重构操作按钮组件,提高代码复用性
This commit is contained in:
2026-03-09 17:34:40 +08:00
parent 8469e16638
commit 11fb5481d3
22 changed files with 468 additions and 142 deletions

View File

@ -103,7 +103,7 @@ async function fetchTeamListByGroupId(GroupID: number) {
/** 获取活动题目列表 */
async function getQuestionList(id: number) {
const { data, error } = await fetchGetQuestionList(id)
const { data, error } = await fetchGetQuestionList(id, 3)
if (!error) {
questionsList.value = data?.data || []
// eslint-disable-next-line no-console

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import { NButton, NCard, NForm, NFormItem, NInput, NInputNumber, NModal, NSelect, NTag, type SelectOption } from 'naive-ui'
import { NButton, NCard, NForm, NFormItem, NInputNumber, NModal, NSelect, NTag, type SelectOption } from 'naive-ui'
import { computed, onMounted, reactive, ref, watch } from 'vue'
import { VueDraggable } from 'vue-draggable-plus'
import { PublishStatus } from '@/enum/business'
@ -166,7 +166,7 @@ onMounted(() => {
}
})
function getRoundTypeName(roundType: string) {
function getRoundTypeName(roundType: number) {
const option = roundTypeOptions.value?.find((item: any) => item.value === roundType)
return option?.label || '未知类型'
}
@ -268,14 +268,14 @@ defineExpose({ validate, reset, modelValue })
<div class="flex items-center gap-4">
<div class="h-8 w-1.5 rounded-full bg-blue-500" />
<NTag type="primary" class="!text-blue-500">
{{ getRoundTypeName(round.roundType) }}
{{ getRoundTypeName(Number(round.roundType)) }}
</NTag>
<div class="flex items-center gap-3">
<NInput
<!-- <NInput
v-model:value="round.name" placeholder="请输入环节名称" :bordered="false"
:disabled="!isEdit"
class="border transition-all !w-80 !border-transparent !rounded-lg !bg-transparent !text-xl !font-bold focus-within:shadow-sm focus-within:!border-blue-500 hover:!border-gray-200 focus-within:!bg-white"
/>
/> -->
<div class="flex items-center gap-2">
<div
class="flex items-center gap-1 rounded-full bg-gray-100 px-3 py-1 text-xs text-gray-500 font-bold"