feat(admin): 支持模板页码和题目类型细分,优化评分界面

- 在模板详情页添加页码(PageNo)字段,支持模板按页管理
- 将汉字听写和成语题型细分为多个子类型,提升题目分类精度
- 重构结果详情页的评分界面,区分客观题(网格布局)和主观题(分屏布局)
- 添加AI评分推荐和人工校准功能,支持分数手动调整和快捷打分
- 实现活动复制功能,优化题目排序逻辑和界面间距
- 新增评委打分和状态更新接口,完善评分数据持久化机制
This commit is contained in:
2026-03-03 18:10:44 +08:00
parent 94af0bec6a
commit ed3c815cd7
14 changed files with 452 additions and 207 deletions

View File

@ -163,7 +163,7 @@ async function submitForm() {
})
// 根据 questionID 降序排序 (例如: 54455 -> 55544)
questionParams.sort((a, b) => Number(b.questionID) - Number(a.questionID))
// questionParams.sort((a, b) => Number(b.questionID) - Number(a.questionID))
// 重新计算 questionIndex
questionParams.forEach((item, index) => {

View File

@ -186,7 +186,7 @@ defineExpose({ validate, reset })
</div>
<!-- 列表内容 -->
<div v-else class="flex flex-col gap-6 pb-10">
<div v-else class="flex flex-col gap-6 pb-40">
<div
v-for="(round, roundIndex) in props.modelValue?.rounds" :key="round.id"
class="group relative overflow-hidden border border-gray-100 rounded-2xl bg-white p-1 shadow-sm transition-all hover:shadow-md"

View File

@ -114,8 +114,8 @@ async function getQuestionList(id: number) {
// 点击编辑模块
/** 请求编辑模块 */
function handleRequestEdit(moduleName: string) {
if (basicInfo.value.PublishStatus === PublishStatus.Processing || basicInfo.value.PublishStatus === PublishStatus.Finished) {
window.$message?.warning('进行中或已结束的赛事无法编辑')
if (basicInfo.value.PublishStatus === PublishStatus.Processing || basicInfo.value.PublishStatus === PublishStatus.Finished || basicInfo.value.PublishStatus === PublishStatus.Published) {
window.$message?.warning('已发布、进行中或已结束的赛事无法编辑')
return
}
if (activeEditModule.value && activeEditModule.value !== moduleName) {
@ -220,7 +220,7 @@ async function handleSaveQuestion() {
})
// 根据 questionID 降序排序 (例如: 54455 -> 55544)
flatQuestions.sort((a, b) => Number(b.QuestionID) - Number(a.QuestionID))
// flatQuestions.sort((a, b) => Number(b.QuestionID) - Number(a.QuestionID))
// 重新计算 questionIndex
flatQuestions.forEach((item, index) => {

View File

@ -2,7 +2,7 @@
import { NButton, NGi, NGrid, NSpace } from 'naive-ui'
import { computed, onMounted, ref } from 'vue'
import { useRouterPush } from '@/hooks/common/router'
import { fetchDeleteActivity, fetchGetActivityList } from '@/service/api/competition'
import { fetchCopyActivity, fetchDeleteActivity, fetchGetActivityList } from '@/service/api/competition'
import { useAppStore } from '@/store/modules/app'
import CompetitionAddModal from '../competition-add/index.vue'
@ -21,9 +21,23 @@ function handleAdd() {
showAddModal.value = true
}
function handleCopy(item: Api.Competition.CompetitionItem) {
async function handleCopy(item: Api.Competition.CompetitionItem) {
// TODO: 实现复制逻辑
try {
const { error } = await fetchCopyActivity(item.Id)
if (error) {
window.$message?.error(error.message || '复制失败')
return
}
}
catch (e) {
console.error(e)
window.$message?.error('复制失败')
return
}
window.$message?.success(`已复制活动:${item.Name}`)
// 刷新列表
fetchActivityList()
}
function handleDelete(item: Api.Competition.CompetitionItem) {