feat: 改版阶段 3:老师按班级 × 任务批改,学生看本班同学作品
老师 - 新的“批改”页(教学默认页):左边班级 + 任务列表和完成进度,中间作品墙 (每人最新一版、未交 / 我未评 / 分数),右侧详情面板:各版本、提示词链、打分、 加入课上展示、加入作品展;J/K 切换学生,1–5 打分,P 课上展示 - “开始讲评”全屏依次播放课上展示的作品;成绩册点分数打开同一个详情面板 - 四色标记和“一键清除全站标记”去掉,flag 只用 present(课上展示);全部提交只给超管 学生 - “同学作品”:只看本班、自己交过这道题才开放,打分前匿名(服务端不返回作者) - 学生的提交列表只有自己的;别人的提交和提示词链只有本班同学交过同一题、或进了作品展才能看 - 随机互评不再返回作者,打完分由 PUT /:id/score 返回 服务端新增 routes/review.ts(/submission/review:options、progress、class、peers), 查询走 slim 覆盖索引 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
9c6c01eba1
commit
df3f842dac
18 files changed
+1616
-275
No files matched your search
+29
-6
@@ -24,6 +24,10 @@ import type {
|
||||
CreationSlim,
|
||||
CreationDetail,
|
||||
CreationIn,
|
||||
ReviewOptions,
|
||||
ReviewProgress,
|
||||
ReviewStudent,
|
||||
PeerWorks,
|
||||
} from "./utils/type"
|
||||
import { BASE_URL } from "./utils/const"
|
||||
import {
|
||||
@@ -320,7 +324,11 @@ export const Submission = {
|
||||
await http.post(`/submission/${id}/view`)
|
||||
},
|
||||
|
||||
async updateScore(id: string, score: number) {
|
||||
// 返回作者名:互评打分前是匿名的
|
||||
async updateScore(
|
||||
id: string,
|
||||
score: number,
|
||||
): Promise<{ message: string; username?: string }> {
|
||||
const res = await http.put(`/submission/${id}/score`, { score })
|
||||
return res.data
|
||||
},
|
||||
@@ -337,11 +345,6 @@ export const Submission = {
|
||||
return res.data
|
||||
},
|
||||
|
||||
async clearAllFlags() {
|
||||
const res = await http.delete(`/submission/flags`)
|
||||
return res.data as { cleared: number }
|
||||
},
|
||||
|
||||
async getStats(taskId: number, classname?: string): Promise<TaskStatsOut> {
|
||||
const params: Record<string, string | number> = {}
|
||||
if (classname) params.classname = classname
|
||||
@@ -457,6 +460,26 @@ export const Helper = {
|
||||
},
|
||||
}
|
||||
|
||||
// 老师按“班级 × 任务”批改;学生看本班同学的作品
|
||||
export const Review = {
|
||||
async options(): Promise<ReviewOptions> {
|
||||
return (await http.get("/submission/review/options")).data
|
||||
},
|
||||
async progress(classname: string): Promise<ReviewProgress> {
|
||||
return (await http.get("/submission/review/progress", { params: { classname } })).data
|
||||
},
|
||||
async classWall(classname: string, taskId: number): Promise<ReviewStudent[]> {
|
||||
return (
|
||||
await http.get("/submission/review/class", {
|
||||
params: { classname, task_id: taskId },
|
||||
})
|
||||
).data
|
||||
},
|
||||
async peers(taskId: number): Promise<PeerWorks> {
|
||||
return (await http.get(`/submission/review/peers/${taskId}`)).data
|
||||
},
|
||||
}
|
||||
|
||||
export const Showcase = {
|
||||
async list(): Promise<AwardSection[]> {
|
||||
const res = await http.get("/submission/showcase/")
|
||||
|
||||
Reference in new issue
Block a user