feat(exam): 实现考试阶段单词判卷与学生水平智能诊断

- 新增ActionType枚举定义系统动作类型
- 新增DiagnosisResult和ZoneStats数据模型支持诊断结果及区域统计
- 优化ExamWordsJudgeServiceImpl判卷逻辑,支持识别图片、更新考试判卷结果
- 基于分区词汇掌握情况,实现学生当前水平年级的智能判定
- 实现基于多分区准确率的升级、降级、复习和触发重测等动作建议
- 更新学生实际年级actualGradeId并展示在学生详情页面
- 修正ExamWordsConstant年级常量及年级名称映射方法
- 优化前端生成试题对年级和难度的校验逻辑,简化参数传递
- 修改服务端端口及API代理配置,保持一致性
- 调整相关数据库Mapper,支持批量查询和更新实际年级字段
- 修改错误信息字段命名,统一为msg
- 增删改代码注释与日志,提升容错性和可读性
This commit is contained in:
lbw
2025-12-22 14:11:11 +08:00
parent 065da854ee
commit 515bd8fae2
24 changed files with 381 additions and 116 deletions

View File

@@ -2,18 +2,6 @@
<el-dialog v-model="visible" title="生成试题" width="520px" :close-on-click-modal="false">
<div class="space-y-4" v-loading="loading">
<el-form label-width="80px">
<el-form-item label="年级">
<el-select v-model="gradeId" placeholder="请选择年级" style="width: 240px">
<el-option v-for="g in gradeOptions" :key="g.id" :label="g.title" :value="g.id" />
</el-select>
</el-form-item>
<el-form-item label="难度">
<el-select v-model="level" placeholder="请选择难度" style="width: 240px">
<el-option :label="'一级'" :value="1" />
<el-option :label="'二级'" :value="2" />
<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" />
@@ -28,7 +16,7 @@
<template #footer>
<div class="flex justify-end gap-2">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" :disabled="!gradeId || !level || !type" @click="handleGenerate">生成并下载</el-button>
<el-button type="primary" :disabled="!type" @click="handleGenerate">生成并下载</el-button>
</div>
</template>
</el-dialog>
@@ -71,7 +59,7 @@ async function fetchGrades() {
}
async function handleGenerate() {
if (!gradeId.value || !level.value || !type.value || props.studentIds.length === 0) return
if (!type.value) return
await generateExamWords({
gradeId: Number(gradeId.value),
level: Number(level.value),

View File

@@ -16,6 +16,7 @@
<el-descriptions-item label="姓名">{{ detail.name }}</el-descriptions-item>
<el-descriptions-item label="班级">{{ detail.className }}</el-descriptions-item>
<el-descriptions-item label="年级">{{ detail.gradeName }}</el-descriptions-item>
<el-descriptions-item label="学生实际水平年级">{{ detail.actualGrade }}</el-descriptions-item>
</el-descriptions>
</template>
<template v-else>

View File

@@ -39,7 +39,7 @@
</template>
</el-table-column>
<el-table-column prop="startDate" label="开始时间" min-width="160" />
<el-table-column prop="errorMsg" label="错误信息" min-width="160" />
<el-table-column prop="msg" label="判卷结算" min-width="160" />
</el-table>
<div class="mt-4 flex justify-end">
<el-pagination