From 93eb6b470773bc49ea6e1a9d4cbd914eb95d525b Mon Sep 17 00:00:00 2001 From: lrj <owen.stl@gmail.com> Date: 星期二, 30 九月 2025 17:38:04 +0800 Subject: [PATCH] feat: 完善比赛晋级功能并清理测试文件 --- web/src/views/ActivityDetail.vue | 84 ++++++++++++++++++++++++++++++++--------- 1 files changed, 65 insertions(+), 19 deletions(-) diff --git a/web/src/views/ActivityDetail.vue b/web/src/views/ActivityDetail.vue index 7b33dda..886b867 100644 --- a/web/src/views/ActivityDetail.vue +++ b/web/src/views/ActivityDetail.vue @@ -21,8 +21,6 @@ <el-descriptions-item label="鎶ュ悕鎴鏃堕棿">{{ formatDateTime(activity.signupDeadline) }}</el-descriptions-item> <el-descriptions-item label="姣旇禌寮�濮嬫椂闂�">{{ formatDateTime(activity.matchTime) }}</el-descriptions-item> <el-descriptions-item label="姣旇禌鍦板潃">{{ activity.address || '-' }}</el-descriptions-item> - <el-descriptions-item label="浜烘暟">{{ activity.playerMax || '-' }}</el-descriptions-item> - <el-descriptions-item label="褰撳墠鎶ュ悕浜烘暟">{{ activity.playerCount || 0 }}</el-descriptions-item> <el-descriptions-item label="璇勫垎妯℃澘"> {{ activity.ratingScheme ? activity.ratingScheme.name : '-' }} </el-descriptions-item> @@ -38,26 +36,17 @@ <!-- 姣旇禌闃舵 --> <div v-if="activity.stages && activity.stages.length > 0" class="stages-section"> <h3>姣旇禌闃舵</h3> - <el-table :data="activity.stages" style="width: 100%"> - <el-table-column prop="name" label="闃舵鍚嶇О" min-width="150" /> + <el-table :data="sortedStages" style="width: 100%" table-layout="auto"> + <el-table-column prop="sortOrder" label="椤哄簭" width="80" align="center" /> + <el-table-column prop="name" label="闃舵鍚嶇О" width="200" show-overflow-tooltip /> <el-table-column prop="matchTime" label="寮�濮嬫椂闂�" width="180"> <template #default="{ row }"> {{ formatDateTime(row.matchTime) }} </template> </el-table-column> - <el-table-column prop="address" label="鍦板潃" min-width="150"> + <el-table-column prop="address" label="鍦板潃" min-width="120" show-overflow-tooltip> <template #default="{ row }"> {{ row.address || '-' }} - </template> - </el-table-column> - <el-table-column prop="playerMax" label="鏈�澶т汉鏁�" width="100"> - <template #default="{ row }"> - {{ row.playerMax || '-' }} - </template> - </el-table-column> - <el-table-column prop="playerCount" label="瀹為檯浜烘暟" width="100"> - <template #default="{ row }"> - {{ row.playerCount || 0 }} </template> </el-table-column> <el-table-column prop="stateName" label="鐘舵��" width="100"> @@ -65,11 +54,36 @@ <el-tag :type="getStateType(row.state)">{{ row.stateName }}</el-tag> </template> </el-table-column> - <el-table-column label="鎿嶄綔" width="200"> + <el-table-column label="鎿嶄綔" width="220" fixed="right"> <template #default="{ row }"> <el-button size="small" @click="viewStageDetail(row)">鏌ョ湅璇︽儏</el-button> <el-button size="small" type="warning" @click="closeStage(row)" v-if="row.state === 1">鍏抽棴</el-button> <el-button size="small" type="danger" @click="deleteStage(row)">鍒犻櫎</el-button> + </template> + </el-table-column> + </el-table> + </div> + + <!-- 璇勫淇℃伅 --> + <div v-if="activity.judges && activity.judges.length > 0" class="judges-section"> + <h3>璇勫淇℃伅</h3> + <el-table :data="activity.judges" style="width: 100%"> + <el-table-column prop="name" label="璇勫濮撳悕" min-width="120" /> + <el-table-column prop="phone" label="鑱旂郴鐢佃瘽" width="150" /> + <el-table-column prop="description" label="绠�浠�" min-width="200" show-overflow-tooltip /> + <el-table-column label="璐熻矗闃舵" min-width="200"> + <template #default="{ row }"> + <el-tag + v-for="stageId in row.stageIds" + :key="stageId" + size="small" + style="margin-right: 5px;" + > + {{ getStageName(stageId) }} + </el-tag> + <el-tag v-if="!row.stageIds || row.stageIds.length === 0" type="info" size="small"> + 鍏ㄩ儴闃舵 + </el-tag> </template> </el-table-column> </el-table> @@ -96,7 +110,6 @@ </el-descriptions-item> <el-descriptions-item label="寮�濮嬫椂闂�">{{ formatDateTime(selectedStage.matchTime) }}</el-descriptions-item> <el-descriptions-item label="鍦板潃">{{ selectedStage.address || '-' }}</el-descriptions-item> - <el-descriptions-item label="浜烘暟">{{ selectedStage.playerMax || '-' }}</el-descriptions-item> <el-descriptions-item label="璇勫垎妯℃澘"> {{ selectedStage.ratingScheme ? selectedStage.ratingScheme.name : '缁ф壙姣旇禌妯℃澘' }} </el-descriptions-item> @@ -112,7 +125,7 @@ </template> <script setup> -import { ref, onMounted } from 'vue' +import { ref, onMounted, computed } from 'vue' import { useRouter, useRoute } from 'vue-router' import { ElMessage, ElMessageBox } from 'element-plus' import { getActivity } from '@/api/activity' @@ -125,6 +138,16 @@ const activity = ref(null) const stageDialogVisible = ref(false) const selectedStage = ref(null) + +// 璁$畻灞炴�� +const sortedStages = computed(() => { + if (!activity.value || !activity.value.stages) return [] + return [...activity.value.stages].sort((a, b) => { + const orderA = a.sortOrder || 999 + const orderB = b.sortOrder || 999 + return orderA - orderB + }) +}) // 鍔犺浇姣旇禌璇︽儏 const loadActivity = async () => { @@ -142,7 +165,7 @@ // 鎿嶄綔澶勭悊 const handleEdit = () => { - router.push(`/activity/form/${route.params.id}`) + router.push(`/activity/edit/${route.params.id}`) } const goBack = () => { @@ -207,6 +230,20 @@ } } +const getStageName = (stageId) => { + if (!activity.value) return '鏈煡闃舵' + + // 鍙鏌ユ瘮璧涢樁娈� + if (activity.value.stages) { + const stage = activity.value.stages.find(s => s.id === stageId) + if (stage) { + return stage.name + } + } + + return '鏈煡闃舵' +} + // 鐢熷懡鍛ㄦ湡 onMounted(() => { loadActivity() @@ -253,6 +290,15 @@ color: #303133; } +.judges-section { + margin-top: 30px; +} + +.judges-section h3 { + margin-bottom: 15px; + color: #303133; +} + .players-section { margin-top: 30px; } -- Gitblit v1.8.0