# AutoTeacher Next.js 使用 Next.js (App Router) 重写的 AutoTeacher 教学辅助应用 - 学生端:课程 / 班级 / 作业级联选择,动态表单填写,PDF 文件上传(存储于 S3 兼容对象存储),支持填写学号与姓名并限制同一学号仅提交一次,提交信息写入 PostgreSQL。 - 教师端:创建课程、班级、作业,自定义表单 JSON 配置,支持设置评分标准并选择学生提交后自动评分或手动触发评分,支持为班级导入 Excel 名册并强制学生提交校验。 - 后端:Next.js API Route + Prisma + PostgreSQL,文件持久化到 S3。 ## 快速开始 1. **安装依赖** ```bash npm install # 或 pnpm install / yarn install ``` 2. **配置环境变量** 复制 `.env.example` 为 `.env.local` 并根据实际环境修改: ```bash cp .env.example .env.local ``` 关键变量说明: | 变量 | 说明 | |------|------| | `DATABASE_URL` | PostgreSQL 连接字符串 | | `AUTOTEACHER_S3_BUCKET` | S3 Bucket 名称 | | `AUTOTEACHER_S3_REGION` | S3 区域;若使用自建兼容服务可留空 | | `AUTOTEACHER_S3_ENDPOINT_URL` | (可选)S3 兼容 Endpoint,如 `https://s3.example.com` | | `AUTOTEACHER_S3_ACCESS_KEY_ID` / `AUTOTEACHER_S3_SECRET_ACCESS_KEY` | 访问凭证 | | `AUTOTEACHER_S3_PUBLIC_BASE_URL` | (可选)对外访问地址前缀,例如 CDN | | `AUTOTEACHER_S3_USE_SSL` | 默认为 `true`,如需禁用 TLS 可设为 `false` | 3. **数据库迁移** ```bash npx prisma migrate dev --name init npx prisma generate ``` 4. **启动开发服务器** ```bash npm run dev ``` 访问: - 学生端:`http://localhost:3000/` - 教师后台:`http://localhost:3000/teacher` ## 目录结构 ``` autoteacher-next/ prisma/ schema.prisma # 数据模型定义 src/ app/ api/ # Next API Routes (课程/班级/作业/提交) page.tsx # 学生端提交界面 teacher/page.tsx # 教师后台 layout.tsx lib/ prisma.ts # Prisma 客户端 s3.ts # S3 上传工具 api.ts # 前端请求封装 validators.ts # zod 校验 styles/ globals.css # 全局样式 types/ index.ts # 共享类型定义 package.json next.config.js tsconfig.json .env.example README.md ``` ## 表单配置示例 创建作业时的 JSON 表单示例(默认值): ```json { "fields": [ { "name": "student_id", "label": "学号", "type": "text", "placeholder": "请输入学号", "required": true } ], "file_upload": { "accept": [".pdf"], "label": "上传作业文件" } } ``` 如需扩展字段,可添加 `textarea` 或更多 `text` 输入项;学生提交时的字段值会以 JSON 格式存入 `Submission.formPayload`。 ## 班级名单导入与校验 - **Excel 格式**:仅需两列,第一列是学号、第二列是姓名,表头可选;若保留表头,建议包含 “学号/Student/ID” 与 “姓名/Name” 等字样以便自动识别。 - **导入流程**:教师后台 → “班级管理” → 选择班级 → 使用“班级名单导入”上传 Excel。上传后会用文件内容替换该班级的全部名册并展示已导入人数。 - **学生提交校验**:学生在提交作业时需先选择班级,其输入的学号与姓名必须与该班级名册中的记录完全匹配,否则返回 “不在此班级内” 并禁止提交。每个学号仍然只能提交一次。 ## 生产部署提示 - 推荐设置独立的 S3 Bucket 权限策略,仅允许应用上传指定前缀。 - 上传接口已限制 Word 文件后缀,必要时可在 `src/app/api/assignments/[assignmentId]/submissions/route.ts` 添加 MIME 校验或病毒扫描。 - 若切换到其他存储(如 MinIO),只需调整环境变量(Endpoint/凭证)。 - 使用 `npm run build && npm run start` 可运行生产模式,Prisma `migrate deploy` 适用于 CI/CD。