feat: initialize AutoTeacher Next.js project structure

This commit is contained in:
gameloader
2025-11-10 19:07:47 +08:00
commit 4cb9db1b7c
34 changed files with 8032 additions and 0 deletions

71
src/lib/validators.ts Normal file
View File

@ -0,0 +1,71 @@
import { z } from "zod";
export const courseSchema = z.object({
name: z.string().min(1, "课程名称不能为空"),
description: z.string().optional(),
});
export const classroomSchema = z.object({
name: z.string().min(1, "班级名称不能为空"),
description: z.string().optional(),
courseId: z.number().int().positive(),
});
export const assignmentSchema = z.object({
title: z.string().min(1, "作业标题不能为空"),
description: z.string().optional(),
courseId: z.number().int().positive(),
classroomId: z.number().int().positive(),
gradingCriteria: z.string().optional(),
autoEvaluate: z.boolean().optional(),
formSchema: z
.object({
fields: z
.array(
z.object({
name: z.string().min(1),
label: z.string().min(1),
type: z.enum(["text", "textarea"]).default("text"),
placeholder: z.string().optional(),
required: z.boolean().optional(),
}),
)
.default([]),
file_upload: z
.object({
accept: z.array(z.string()).default([".pdf"]),
label: z.string().optional(),
})
.default({ accept: [".pdf"], label: "上传 PDF 文件" }),
})
.default({
fields: [
{
name: "student_id",
label: "学号",
type: "text",
placeholder: "请输入学号",
required: true,
},
{
name: "student_name",
label: "姓名",
type: "text",
placeholder: "请输入姓名",
required: true,
},
],
file_upload: { accept: [".pdf"], label: "上传 PDF 文件" },
}),
});
export const submissionSchema = z.object({
formPayload: z.record(z.any()).optional(),
studentId: z.string().min(1, "学号不能为空"),
studentName: z.string().min(1, "姓名不能为空"),
});
export const assignmentUpdateSchema = z.object({
gradingCriteria: z.string().nullable().optional(),
autoEvaluate: z.boolean().optional(),
});