feat: 评分标准持久化到 SQLite

This commit is contained in:
2026-07-16 06:07:55 +08:00
parent a96f01007d
commit 748140a017
+34 -2
View File
@@ -58,6 +58,14 @@ function getDb() {
max_score INTEGER,
rubric TEXT
)`).run()
db.prepare(`CREATE TABLE IF NOT EXISTS rubric (
id INTEGER PRIMARY KEY AUTOINCREMENT,
question_title TEXT NOT NULL DEFAULT '',
max_score REAL NOT NULL DEFAULT 100,
reference_answer TEXT NOT NULL DEFAULT '',
rubric TEXT NOT NULL DEFAULT '',
sort_order INTEGER NOT NULL DEFAULT 0
)`).run()
}
return db
}
@@ -243,12 +251,36 @@ export function setupIpc(win: BrowserWindow): void {
return { base64: buffer.toString('base64'), mime, filePath }
})
// --- Rubric data bridge (toolbar ↔ rubric window) ---
// --- Rubric data bridge (toolbar ↔ rubric window), persisted to DB ---
ipcMain.handle('rubric:storeData', (_event, data: any) => {
const d = getDb()
d.prepare('DELETE FROM rubric').run()
const insert = d.prepare('INSERT INTO rubric (question_title, max_score, reference_answer, rubric, sort_order) VALUES (?, ?, ?, ?, ?)')
const questions = data?.questions || []
for (let i = 0; i < questions.length; i++) {
const q = questions[i]
insert.run(q.questionTitle || '', q.maxScore ?? 100, q.referenceAnswer || '', q.rubric || '', i)
}
rubricPayload = data
})
ipcMain.handle('rubric:getData', () => rubricPayload)
ipcMain.handle('rubric:getData', () => {
if (rubricPayload) return rubricPayload
const d = getDb()
const rows: any[] = d.prepare('SELECT * FROM rubric ORDER BY sort_order').all()
if (rows.length) {
return {
questions: rows.map(r => ({
questionTitle: r.question_title,
maxScore: r.max_score,
referenceAnswer: r.reference_answer,
rubric: r.rubric
})),
currentIndex: 0
}
}
return null
})
// --- Grading data bridge (toolbar → result window) ---
ipcMain.handle('grading:storeData', (_event, data: any) => {