P2全部完成: 尝试限制/预约时段/题目回顾/随机排序

后端:
- assessment-template entity: attemptLimit/scheduledStart/End/reviewMode/shuffleQuestions
- DTO 更新: 新增 P2 字段验证
- startSession: 尝试次数检查、预约时段检查、题目随机排序
- getSessionState: reviewMode 控制答案可见性
- 新增 GET /assessment/:id/review 回顾端点

前端:
- AssessmentTemplateManager: 新增尝试次数/答题回顾/题目排序/预约时段配置
- AssessmentView: 答题回顾按钮(完成页)+提交确认弹窗+标记回头功能
- types.ts: 新增 P2 字段类型
- assessmentService: 新增 getReview 方法
- 进度导航点: 可视化题序+标记状态

测试 20项全部通过 + 系统测试 142项全部通过 

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Developer
2026-06-09 14:57:32 +08:00
parent 9fd503b42b
commit 46a10ba091
8 changed files with 450 additions and 5 deletions
+20
View File
@@ -1004,6 +1004,26 @@ export const AssessmentView: React.FC<AssessmentViewProps> = ({
>
{t('exportExcel')}
</button>
{/* P2: Review button (visible when reviewMode enabled) */}
{state?.templateJson?.reviewMode && state.templateJson.reviewMode !== 'none' && (
<button
onClick={async () => {
if (!session) return;
try {
const reviewData = await assessmentService.getReview(session.id);
const reviewText = (reviewData.questions || []).map((q: any, i: number) =>
`${i + 1}题: ${(q.questionText || '').substring(0, 80)}\n 正确答案: ${q.correctAnswer || '见解析'}\n 解析: ${q.judgment || '无'}`
).join('\n\n');
alert(`📋 答题回顾\n\n${reviewText || '暂无回顾数据'}`);
} catch (err: any) {
setError(err.message || '获取回顾失败');
}
}}
className="px-6 py-4 bg-emerald-50 border-2 border-emerald-200 text-emerald-700 rounded-2xl font-bold hover:bg-emerald-100 transition-all active:scale-[0.98]"
>
📋
</button>
)}
<button
onClick={async () => {
if (!session) return;