Files
QQuiz/README.md

227 lines
5.0 KiB
Markdown
Raw 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.

# QQuiz
QQuiz 是一个用于题库导入、刷题训练和错题管理的全栈应用,支持文档解析、题目去重、断点续做、管理员配置和多模型接入。
![QQuiz 界面截图](docs/cover.png)
## 功能
- 文档导入:支持 TXT / PDF / DOC / DOCX / XLS / XLSX
- 异步解析:后台解析文档并回传进度
- 题目去重:同题库内自动去重
- 刷题与续做:记录当前进度,支持继续作答
- 错题本:自动收集错误题目
- 管理后台:用户管理、系统配置、模型配置
- AI 提供商Gemini / OpenAI / Anthropic / Qwen
## 快速开始
### 方式一:直接运行 GitHub Actions 构建好的镜像
适合只想快速启动,不想先克隆仓库。
#### 1. 下载环境变量模板
Linux / macOS:
```bash
curl -L https://raw.githubusercontent.com/handsomezhuzhu/QQuiz/main/.env.example -o .env
```
Windows PowerShell:
```powershell
Invoke-WebRequest `
-Uri "https://raw.githubusercontent.com/handsomezhuzhu/QQuiz/main/.env.example" `
-OutFile ".env"
```
#### 2. 编辑 `.env`
至少填写以下字段:
```env
SECRET_KEY=replace-with-a-random-32-char-secret
ADMIN_USERNAME=admin
ADMIN_PASSWORD=replace-with-a-strong-password
AI_PROVIDER=gemini
GEMINI_API_KEY=your-real-gemini-api-key
```
如果你不用 Gemini也可以改成
- `AI_PROVIDER=openai` 并填写 `OPENAI_API_KEY`
- `AI_PROVIDER=anthropic` 并填写 `ANTHROPIC_API_KEY`
- `AI_PROVIDER=qwen` 并填写 `QWEN_API_KEY`
#### 3. 拉取镜像
```bash
docker pull ghcr.io/handsomezhuzhu/qquiz-backend:latest
docker pull ghcr.io/handsomezhuzhu/qquiz-frontend:latest
```
#### 4. 创建网络和数据卷
```bash
docker network create qquiz_net
docker volume create qquiz_sqlite_data
docker volume create qquiz_upload_files
```
#### 5. 启动后端
```bash
docker run -d \
--name qquiz_backend \
--network qquiz_net \
--env-file .env \
-e DATABASE_URL=sqlite+aiosqlite:////app/data/qquiz.db \
-e UPLOAD_DIR=/app/uploads \
-v qquiz_sqlite_data:/app/data \
-v qquiz_upload_files:/app/uploads \
-p 8000:8000 \
ghcr.io/handsomezhuzhu/qquiz-backend:latest
```
#### 6. 启动前端
```bash
docker run -d \
--name qquiz_frontend \
--network qquiz_net \
-e API_BASE_URL=http://qquiz_backend:8000 \
-p 3000:3000 \
ghcr.io/handsomezhuzhu/qquiz-frontend:latest
```
访问:
- 前端:`http://localhost:3000`
- 后端:`http://localhost:8000`
停止:
```bash
docker rm -f qquiz_frontend qquiz_backend
```
### 方式二:从源码用 Docker Compose 启动
#### 前后端分离,推荐
```bash
cp .env.example .env
docker compose up -d --build
```
访问:
- 前端:`http://localhost:3000`
- 后端:`http://localhost:8000`
#### 使用 MySQL
```bash
cp .env.example .env
docker compose -f docker-compose.yml -f docker-compose.mysql.yml up -d --build
```
#### 单容器模式
```bash
cp .env.example .env
docker compose -f docker-compose-single.yml up -d --build
```
访问:
- 应用:`http://localhost:8000`
- API 文档:`http://localhost:8000/docs`
## 本地开发
### 后端
```bash
cd backend
pip install -r requirements.txt
alembic upgrade head
uvicorn main:app --reload --host 0.0.0.0 --port 8000
```
### 前端
当前主前端在 `web/`
```bash
cd web
npm install
npm run dev
```
说明:
- `web/` 是当前主前端,基于 Next.js
- `frontend/` 是保留中的旧 Vite 前端,主要用于单容器兼容路径
## 关键环境变量
| 变量 | 说明 |
| --- | --- |
| `DATABASE_URL` | 数据库连接字符串 |
| `SECRET_KEY` | JWT 密钥,至少 32 位 |
| `ADMIN_USERNAME` | 默认管理员用户名 |
| `ADMIN_PASSWORD` | 默认管理员密码,至少 12 位 |
| `AI_PROVIDER` | `gemini` / `openai` / `anthropic` / `qwen` |
| `GEMINI_API_KEY` | Gemini API Key |
| `OPENAI_API_KEY` | OpenAI API Key |
| `OPENAI_BASE_URL` | OpenAI 或兼容网关地址 |
| `ANTHROPIC_API_KEY` | Anthropic API Key |
| `QWEN_API_KEY` | Qwen API Key |
| `ALLOW_REGISTRATION` | 是否允许注册 |
| `MAX_UPLOAD_SIZE_MB` | 单次上传大小限制 |
| `MAX_DAILY_UPLOADS` | 每日上传次数限制 |
完整模板见 [`.env.example`](.env.example)。
## 项目结构
```text
QQuiz/
├─ backend/ FastAPI 后端
├─ web/ Next.js 前端
├─ frontend/ Legacy Vite 前端
├─ docs/ 文档与截图
├─ test_data/ 示例题库文件
├─ docker-compose.yml 前后端分离部署
├─ docker-compose.mysql.yml MySQL overlay
├─ docker-compose-single.yml 单容器部署
└─ Dockerfile 单容器镜像构建
```
## 技术栈
- 后端FastAPI、SQLAlchemy、Alembic、SQLite / MySQL、httpx
- 前端Next.js 14、React 18、TypeScript、Tailwind CSS、TanStack Query
## 提交前建议检查
```bash
cd web && npm run build
docker compose build backend frontend
```
建议至少手动验证:
- 登录 / 退出
- 创建题库 / 上传文档 / 查看解析进度
- 刷题 / 续做 / 错题加入
- 管理员配置
- 大数据量列表分页
## 开源协议
本项目采用 [MIT License](LICENSE)。