2025-12-02 09:49:31 +08:00

AutoTeacher Next.js

使用 Next.js (App Router) 重写的 AutoTeacher 教学辅助应用

  • 学生端:课程 / 班级 / 作业级联选择动态表单填写PDF 文件上传(存储于 S3 兼容对象存储),支持填写学号与姓名并限制同一学号仅提交一次,提交信息写入 PostgreSQL。
  • 教师端:创建课程、班级、作业,自定义表单 JSON 配置,支持设置评分标准并选择学生提交后自动评分或手动触发评分,支持为班级导入 Excel 名册并强制学生提交校验。
  • 后端Next.js API Route + Prisma + PostgreSQL文件持久化到 S3。

快速开始

  1. 安装依赖

    npm install
    # 或 pnpm install / yarn install
    
  2. 配置环境变量

    复制 .env.example.env.local 并根据实际环境修改:

    cp .env.example .env.local
    

    关键变量说明:

    变量 说明
    DATABASE_URL PostgreSQL 连接字符串
    AUTOTEACHER_S3_BUCKET S3 Bucket 名称
    AUTOTEACHER_S3_REGION S3 区域;若使用自建兼容服务可留空
    AUTOTEACHER_S3_ENDPOINT_URL 可选S3 兼容 Endpointhttps://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. 数据库迁移

    npx prisma migrate dev --name init
    npx prisma generate
    
  4. 启动开发服务器

    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 表单示例(默认值):

{
  "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。
Description
No description provided
Readme 160 KiB
Languages
TypeScript 97%
Dockerfile 2%
JavaScript 0.7%
CSS 0.3%