diff --git a/electron/main/ipc.ts b/electron/main/ipc.ts index 654d0f1..928a56d 100644 --- a/electron/main/ipc.ts +++ b/electron/main/ipc.ts @@ -314,6 +314,12 @@ export function setupIpc(win: BrowserWindow): void { return { questions, currentIndex: 0 } }) + // --- Rubric next question index (persisted between grading cycles) --- + let rubricNextIndex = 0 + ipcMain.handle('rubric:getNextIndex', () => rubricNextIndex) + ipcMain.handle('rubric:setNextIndex', (_event, idx: number) => { rubricNextIndex = idx }) + ipcMain.handle('rubric:resetNextIndex', () => { rubricNextIndex = 0 }) + // --- Grading data bridge (toolbar → result window) --- ipcMain.handle('grading:storeData', (_event, data: any) => { gradingPayload = data diff --git a/electron/preload/preload.ts b/electron/preload/preload.ts index cb1e781..d199853 100644 --- a/electron/preload/preload.ts +++ b/electron/preload/preload.ts @@ -52,7 +52,10 @@ contextBridge.exposeInMainWorld('electronAPI', { storeData: (data: any) => ipcRenderer.invoke('rubric:storeData', data), getData: () => ipcRenderer.invoke('rubric:getData'), exportJson: () => ipcRenderer.invoke('rubric:exportJson'), - importJson: () => ipcRenderer.invoke('rubric:importJson') + importJson: () => ipcRenderer.invoke('rubric:importJson'), + getNextIndex: () => ipcRenderer.invoke('rubric:getNextIndex'), + setNextIndex: (idx: number) => ipcRenderer.invoke('rubric:setNextIndex', idx), + resetNextIndex: () => ipcRenderer.invoke('rubric:resetNextIndex') }, template: { diff --git a/src/components/FloatingToolbar.vue b/src/components/FloatingToolbar.vue index 5f1acb0..7a3eccf 100644 --- a/src/components/FloatingToolbar.vue +++ b/src/components/FloatingToolbar.vue @@ -118,12 +118,13 @@ async function startGrading() { const questions = rubricData?.questions?.length ? JSON.parse(JSON.stringify(rubricData.questions)) : [{ questionTitle: '', maxScore: 100, referenceAnswer: '', rubric: '' }] + const nextIdx = Math.min(await window.electronAPI?.rubric.getNextIndex() ?? 0, questions.length - 1) gradingStore.setQuestions(questions) - gradingStore.setCurrentQuestionIndex(0) + gradingStore.setCurrentQuestionIndex(nextIdx) appStore.isGrading = true try { - const result = await gradeQuestion(0) + const result = await gradeQuestion(nextIdx) if (!result) return gradingStore.setResult(result) @@ -133,7 +134,7 @@ async function startGrading() { result, image: gradingStore.currentImage, questions, - currentQuestionIndex: 0 + currentQuestionIndex: nextIdx }) await window.electronAPI.dialog.open('result') } diff --git a/src/components/ResultDrawer.vue b/src/components/ResultDrawer.vue index 955196a..b3e6c7e 100644 --- a/src/components/ResultDrawer.vue +++ b/src/components/ResultDrawer.vue @@ -9,9 +9,9 @@
{{ errorMsg }}
- 上一题 + 上一题 {{ currentIdx + 1 }} / {{ questions.length }} - {{ currentIdx === questions.length - 1 ? '回到首题' : '下一题' }} + {{ currentIdx === questions.length - 1 ? '回到首题' : '下一题' }}
@@ -153,7 +153,6 @@ async function gradeAt(idx: number) { gradingStore.setResult(result) currentIdx.value = idx gradingStore.setCurrentQuestionIndex(idx) - // update grading bridge await window.electronAPI?.grading.storeData({ result, image: gradingStore.currentImage, @@ -170,12 +169,30 @@ async function gradeAt(idx: number) { async function nextQuestion() { const next = (currentIdx.value + 1) % questions.value.length - await gradeAt(next) + await saveAndAdvance(next) } async function prevQuestion() { const prev = (currentIdx.value - 1 + questions.value.length) % questions.value.length - await gradeAt(prev) + await saveAndAdvance(prev) +} + +async function saveAndAdvance(targetIdx: number) { + try { + await window.electronAPI.grading.submit({ + questionId: 0, + imagePath: '', + aiScore: gradingStore.currentResult?.score ?? 0, + teacherScore: teacherScore.value, + confidence: gradingStore.currentResult?.confidence ?? 0, + studentAnswer: '' + }) + await window.electronAPI?.rubric.setNextIndex(targetIdx) + gradingStore.reset() + closeDrawer() + } catch (err) { + ElMessage.error('保存失败:' + (err as Error).message) + } } async function reGrade() { diff --git a/src/components/RubricEditor.vue b/src/components/RubricEditor.vue index 004d494..12754a0 100644 --- a/src/components/RubricEditor.vue +++ b/src/components/RubricEditor.vue @@ -96,6 +96,7 @@ async function handleSave() { questions: JSON.parse(JSON.stringify(questions.value)), currentIndex: 0 }) + await window.electronAPI?.rubric.resetNextIndex() ElMessage.success('评分标准已保存') } catch (err) { ElMessage.error('保存失败:' + (err as Error).message) diff --git a/src/types/index.ts b/src/types/index.ts index 8aa3019..6995bcc 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -83,6 +83,9 @@ export interface ElectronAPI { getData: () => Promise exportJson: () => Promise importJson: () => Promise<{ questions: QuestionItem[]; currentIndex: number } | null> + getNextIndex: () => Promise + setNextIndex: (idx: number) => Promise + resetNextIndex: () => Promise } template: { list: () => Promise