一个面向课堂互动的“数学打地鼠”多人 PK 网页游戏。教师可以投屏创建房间,学生通过固定入口加入课堂,在手机、平板或电脑上抢答或轮流作答。项目使用 React + Vite + TypeScript 构建,并提供 Docker + Nginx 部署配置。
- 中文课堂界面,适合投屏、大屏和触摸设备
- 教师端密码保护,默认密码:
tech - 固定学生入口:
/student - 学生自填姓名加入,教师端实时展示学生名单
- 支持同屏抢答和轮流答题
- 教师端开始后锁定关键设置,避免课堂中误操作
- 教师端只负责展示和控制,联机模式下不能直接点击答案
- 支持暂停、停止、重开、全屏、音效开关、解析显示开关
- 支持一年级到六年级不同题型
- 本地算法自动出题,预留 AI 出题接口
- 支持 Docker Compose 部署,对外暴露
12400端口
- React
- Vite
- TypeScript
- WebSocket
- Node.js
- Nginx
- Docker Compose
npm install
npm run dev默认开发地址:
http://localhost:5173
npm run buildnpm install
npm run build
npm run lan启动后访问:
教师端:http://教师电脑IP:4174/
学生端:http://教师电脑IP:4174/student
教师端输入密码 tech 后创建房间。学生打开 /student,输入房间码和姓名即可加入。
服务器上把整个项目复制过去,然后执行:
docker compose up -d --build访问地址:
教师端:http://服务器IP:12400/
学生端:http://服务器IP:12400/student
如果服务器拉取 Docker Hub 镜像较慢,可以新建 .env:
NODE_IMAGE=docker.m.daocloud.io/library/node:20-alpine
NGINX_IMAGE=docker.m.daocloud.io/library/nginx:1.27-alpine然后重新构建:
docker compose build --no-cache
docker compose up -d项目默认使用本地算法出题。AI 出题模式已经预留在 src/game/questionGenerator.ts,前端会请求 VITE_AI_QUESTION_ENDPOINT 指向的后端代理接口。
不要把 OpenAI 或其他大模型 API Key 写入前端代码。推荐做法:
- 在 Vercel Functions、Netlify Functions 或自己的 Node 服务中创建代理接口。
- API Key 只保存在服务端环境变量中。
- 前端
.env只配置代理地址。
示例:
VITE_AI_QUESTION_ENDPOINT=/api/generate-questionAI 接口需要返回 JSON:
{
"question": "35% 的 200 是多少?",
"correctAnswer": "70",
"options": ["70", "60", "80", "75"],
"explanation": "200 × 35% = 70",
"grade": 6,
"difficulty": "normal"
}