实验页"评价项"和自测:提交前自己检查,不计分
- 工具栏"评价项"打开侧栏,列出自动检查的功能项(作业显示布置时的规则和各项分值) - "自己检查"在服务器上按评分规则运行学生现在的程序,逐项显示通过与否和原因;不计分、不留记录, 自由练习和作业都能用;每人同时一次,结果保留到下一次,之后改过代码提示结果可能过时; 和提交评分共用全站并发上限 - 实验的评价项接口学生也能用(老师布置作业的对话框改用它) - 修正:运行区的窗体和"放大"按钮会盖住网页的抽屉和对话框 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
aadb2c9e93
commit
f256b313f7
11 files changed
+345
-15
No files matched your search
@@ -1,6 +1,7 @@
|
||||
// 评分队列:学生提交后立即返回,后台按提交顺序评分(同时最多评 MAX_ACTIVE 份),结果写回数据库。
|
||||
// 服务器重启前没评完的提交,启动时继续评。评完调用 onGraded(接着做 AI 评阅)。
|
||||
import type { Database } from 'bun:sqlite'
|
||||
import type { SourceFile } from '@iot/shared'
|
||||
import { mkdir, rm } from 'node:fs/promises'
|
||||
import { dirname, join } from 'node:path'
|
||||
import { assignmentChecks, pendingSubmissionIds, saveGrade, submissionForGrading } from '../assignments'
|
||||
@@ -10,6 +11,16 @@ import { grade } from './grader'
|
||||
|
||||
const MAX_ACTIVE = 3
|
||||
|
||||
/** 把作品写进一个干净的工程目录(评分和自测用) */
|
||||
export async function writeProject(dir: string, files: SourceFile[]) {
|
||||
await rm(dir, { recursive: true, force: true })
|
||||
for (const file of files) {
|
||||
const target = safeJoin(dir, file.path)
|
||||
await mkdir(dirname(target), { recursive: true })
|
||||
await Bun.write(target, file.content)
|
||||
}
|
||||
}
|
||||
|
||||
export function createGradingQueue(db: Database, onGraded: (submissionId: number) => void = () => {}) {
|
||||
const queue: number[] = []
|
||||
let active = 0
|
||||
@@ -21,12 +32,7 @@ export function createGradingQueue(db: Database, onGraded: (submissionId: number
|
||||
if (!submission || !checks) return
|
||||
const dir = join(config.runsDir, `grade-${id}`)
|
||||
try {
|
||||
await rm(dir, { recursive: true, force: true })
|
||||
for (const file of submission.files) {
|
||||
const target = safeJoin(dir, file.path)
|
||||
await mkdir(dirname(target), { recursive: true })
|
||||
await Bun.write(target, file.content)
|
||||
}
|
||||
await writeProject(dir, submission.files)
|
||||
saveGrade(db, id, await grade(dir, checks, submission.sampleId))
|
||||
onGraded(id)
|
||||
} catch (error) {
|
||||
|
||||
Reference in new issue
Block a user