feat(exam): 支持按单个学生和考试类型生成考试试题

- 修改生成试题按钮仅在选中特定一个学生时可用,避免多选时误操作
- 在考试生成对话框新增“类型”选择项,支持“摸底”和“期中|期末”类型
- 调整后台接口,使用单个学生ID和考试类型替代学生ID列表参数
- 优化考试生成服务,新增摸底考试生成逻辑,按年级分区随机抽词汇
- 考试相关数据对象新增类型字段,保持数据完整性和一致性
- 修改考试判卷服务,将错误信息字段统一为msg,避免字段混淆
- 调整数据库操作,支持单个学生考试与词汇随机获取
- 同步更新测试用例和词汇库数据插入逻辑,确保环境一致性
- 修复界面生成按钮状态和对话框提交按钮的校验逻辑,提升用户体验
This commit is contained in:
lbw
2025-12-18 17:21:37 +08:00
parent 7a66548aed
commit 065da854ee
21 changed files with 228 additions and 54 deletions

View File

@@ -14,6 +14,12 @@
<el-option :label="'三级'" :value="3" />
</el-select>
</el-form-item>
<el-form-item label="类型">
<el-select v-model="type" placeholder="请选择类型" style="width: 240px">
<el-option :label="'摸底'" :value="1" />
<el-option :label="'期中|期末'" :value="2" />
</el-select>
</el-form-item>
</el-form>
<div class="text-sm text-gray-500">
已选学生数量{{ studentIds.length }}
@@ -22,7 +28,7 @@
<template #footer>
<div class="flex justify-end gap-2">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" :disabled="!gradeId || !level" @click="handleGenerate">生成并下载</el-button>
<el-button type="primary" :disabled="!gradeId || !level || !type" @click="handleGenerate">生成并下载</el-button>
</div>
</template>
</el-dialog>
@@ -49,7 +55,7 @@ const loading = ref(false)
const gradeOptions = ref([])
const gradeId = ref(null)
const level = ref(null)
const type = ref(null)
async function fetchGrades() {
loading.value = true
try {
@@ -65,11 +71,12 @@ async function fetchGrades() {
}
async function handleGenerate() {
if (!gradeId.value || !level.value || props.studentIds.length === 0) return
if (!gradeId.value || !level.value || !type.value || props.studentIds.length === 0) return
await generateExamWords({
gradeId: Number(gradeId.value),
level: Number(level.value),
studentIds: props.studentIds
type: Number(type.value),
studentId: props.studentIds[0]
})
ElMessage.success('生成任务已提交,正在下载')
visible.value = false

View File

@@ -45,7 +45,7 @@
selectedGradeId }})</el-tag>
<el-button type="primary" @click="fetchStudents">查询</el-button>
<el-button @click="resetStudentFilters">重置</el-button>
<el-button type="success" :disabled="selectedStudentIds.length === 0"
<el-button type="success" :disabled="selectedStudentIds.length !== 1"
@click="showGenerateDialog = true">
生成试题
</el-button>