Files
autoteacher/README.md

119 lines
4.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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。