feat: 评分标准持久化到 SQLite
This commit is contained in:
+34
-2
@@ -58,6 +58,14 @@ function getDb() {
|
|||||||
max_score INTEGER,
|
max_score INTEGER,
|
||||||
rubric TEXT
|
rubric TEXT
|
||||||
)`).run()
|
)`).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
|
return db
|
||||||
}
|
}
|
||||||
@@ -243,12 +251,36 @@ export function setupIpc(win: BrowserWindow): void {
|
|||||||
return { base64: buffer.toString('base64'), mime, filePath }
|
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) => {
|
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
|
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) ---
|
// --- Grading data bridge (toolbar → result window) ---
|
||||||
ipcMain.handle('grading:storeData', (_event, data: any) => {
|
ipcMain.handle('grading:storeData', (_event, data: any) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user