diff --git a/.env.example b/.env.example index 0c87966..60eb4eb 100644 --- a/.env.example +++ b/.env.example @@ -7,19 +7,27 @@ DATABASE_URL=mysql+aiomysql://qquiz:qquiz_password@localhost:3306/qquiz_db SECRET_KEY=your-super-secret-key-change-in-production-minimum-32-characters # AI Provider Configuration -AI_PROVIDER=openai -# Options: openai, anthropic, qwen +AI_PROVIDER=gemini +# Options: gemini (推荐), openai, anthropic, qwen +# 推荐 Gemini:支持原生 PDF 理解,完整保留图片、表格、公式 -# OpenAI Configuration +# Google Gemini Configuration (推荐) +GEMINI_API_KEY=AIza-your-gemini-api-key +GEMINI_BASE_URL=https://generativelanguage.googleapis.com +# GEMINI_BASE_URL 可选,留空使用默认。如需使用代理或 Key 轮训服务,可配置自定义地址 +GEMINI_MODEL=gemini-2.0-flash-exp +# 获取 API Key: https://aistudio.google.com/apikey (免费额度充足) + +# OpenAI Configuration (仅文本,PDF会丢失格式) OPENAI_API_KEY=sk-your-openai-api-key OPENAI_BASE_URL=https://api.openai.com/v1 OPENAI_MODEL=gpt-4o-mini -# Anthropic Configuration +# Anthropic Configuration (仅文本,PDF会丢失格式) ANTHROPIC_API_KEY=sk-ant-your-anthropic-api-key ANTHROPIC_MODEL=claude-3-haiku-20240307 -# Qwen Configuration +# Qwen Configuration (仅文本,PDF会丢失格式) QWEN_API_KEY=sk-your-qwen-api-key QWEN_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1 QWEN_MODEL=qwen-plus diff --git a/.gitignore b/.gitignore index 872baf7..4f510a9 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,4 @@ htmlcov/ # Docker *.log +docker-compose.override.yml diff --git a/README.md b/README.md index 71e4809..2097fd7 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,9 @@ QQuiz 是一个支持 Docker/源码双模部署的智能刷题平台,核心功 ## 功能特性 - 📚 **多文件上传与去重**: 支持向同一题库追加文档,自动识别并过滤重复题目 -- 🤖 **AI 智能解析**: 支持 OpenAI/Anthropic/Qwen 多种 AI 提供商 +- 🤖 **AI 智能解析**: 支持 Google Gemini (推荐) / OpenAI / Anthropic / Qwen 多种 AI 提供商 +- 📄 **原生 PDF 理解**: Gemini 支持直接处理 PDF(最多1000页),完整保留图片、表格、公式等内容 +- 🎓 **AI 参考答案**: 对于没有提供答案的题目,自动生成 AI 参考答案 - 📊 **断点续做**: 自动记录刷题进度,随时继续 - ❌ **错题本管理**: 自动收集错题,支持手动添加/移除 - 🎯 **多题型支持**: 单选、多选、判断、简答 @@ -66,6 +68,23 @@ chmod +x scripts/run_local.sh **MySQL 安装指南:** 详见 [docs/MYSQL_SETUP.md](docs/MYSQL_SETUP.md) +### Docker 构建加速(中国用户) + +如果你在中国大陆,Docker 构建速度可能较慢。我们提供了使用国内镜像的可选配置: + +**详细指南:** 参见 [docs/CHINA_MIRROR_GUIDE.md](docs/CHINA_MIRROR_GUIDE.md) + +**快速使用:** +```bash +# 后端使用中国镜像构建 +docker build -f backend/Dockerfile.china -t qquiz-backend ./backend + +# 前端使用中国镜像构建 +docker build -f frontend/Dockerfile.china -t qquiz-frontend ./frontend +``` + +构建速度可提升 3-5 倍 ⚡ + ## 默认账户 **管理员账户:** @@ -98,11 +117,13 @@ QQuiz/ │ ├── fix_and_start.bat # Windows 快速启动(推荐) │ ├── start_with_docker_db.bat # Docker 数据库启动 │ ├── setup.bat # 环境配置脚本 -│ └── run_local.sh # Linux/macOS 启动脚本 +│ ├── run_local.sh # Linux/macOS 启动脚本 +│ └── [其他辅助脚本...] ├── docs/ # 文档目录 -│ ├── QUICK_START.md # 快速入门指南 -│ ├── WINDOWS_DEPLOYMENT.md # Windows 部署指南 -│ ├── DOCKER_MIRROR_SETUP.md # Docker 镜像加速配置 +│ ├── AI_CONFIGURATION.md # AI 提供商配置指南(重要) +│ ├── MYSQL_SETUP.md # MySQL 安装配置指南 +│ ├── CHINA_MIRROR_GUIDE.md # 中国镜像加速指南 +│ ├── WINDOWS_DEPLOYMENT.md # Windows 部署详细指南 │ └── PROJECT_STRUCTURE.md # 项目架构详解 ├── test_data/ # 测试数据 │ └── sample_questions.txt # 示例题目 @@ -141,12 +162,51 @@ QQuiz/ |------|------|--------| | `DATABASE_URL` | 数据库连接字符串 | - | | `SECRET_KEY` | JWT 密钥 | - | -| `AI_PROVIDER` | AI 提供商 (openai/anthropic/qwen) | openai | +| `AI_PROVIDER` | AI 提供商 (gemini/openai/anthropic/qwen) | gemini | +| `GEMINI_API_KEY` | Google Gemini API 密钥 | - | +| `GEMINI_BASE_URL` | Gemini API 地址(可选,支持代理) | https://generativelanguage.googleapis.com | +| `GEMINI_MODEL` | Gemini 模型 | gemini-2.0-flash-exp | | `OPENAI_API_KEY` | OpenAI API 密钥 | - | +| `OPENAI_BASE_URL` | OpenAI API 地址 | https://api.openai.com/v1 | +| `OPENAI_MODEL` | OpenAI 模型 | gpt-4o-mini | +| `ANTHROPIC_API_KEY` | Anthropic API 密钥 | - | +| `ANTHROPIC_MODEL` | Anthropic 模型 | claude-3-haiku-20240307 | +| `QWEN_API_KEY` | 通义千问 API 密钥 | - | +| `QWEN_BASE_URL` | 通义千问 API 地址 | https://dashscope.aliyuncs.com/compatible-mode/v1 | +| `QWEN_MODEL` | 通义千问模型 | qwen-plus | | `ALLOW_REGISTRATION` | 是否允许注册 | true | | `MAX_UPLOAD_SIZE_MB` | 最大上传文件大小 (MB) | 10 | | `MAX_DAILY_UPLOADS` | 每日上传次数限制 | 20 | +### AI 提供商对比 + +| 提供商 | PDF 原生支持 | 文本解析 | 推荐度 | 说明 | +|--------|--------------|----------|--------|------| +| **Google Gemini** | ✅ | ✅ | ⭐⭐⭐⭐⭐ | 支持原生 PDF(最多1000页),保留图片、表格、公式 | +| OpenAI | ❌ | ✅ | ⭐⭐⭐⭐ | 仅文本提取,PDF 会丢失格式和图片 | +| Anthropic | ❌ | ✅ | ⭐⭐⭐⭐ | 仅文本提取,PDF 会丢失格式和图片 | +| Qwen (通义千问) | ❌ | ✅ | ⭐⭐⭐ | 仅文本提取,PDF 会丢失格式和图片 | + +**推荐使用 Gemini**:如果你的题库包含 PDF 文件(特别是含有图片、公式、表格的学科试卷),强烈推荐使用 Gemini。 + +### 如何获取 API Key + +- **Google Gemini**: https://aistudio.google.com/apikey (免费额度充足) +- **OpenAI**: https://platform.openai.com/api-keys +- **Anthropic**: https://console.anthropic.com/settings/keys +- **Qwen (通义千问)**: https://dashscope.console.aliyun.com/apiKey + +### AI 配置方式 + +QQuiz 支持两种配置方式: + +1. **环境变量配置** (`.env` 文件):适合 Docker 部署和开发环境 +2. **数据库配置** (管理员后台):适合生产环境,支持在线修改,无需重启服务 + +**推荐流程**:首次部署使用环境变量,部署成功后通过管理员后台修改配置。 + +**Gemini 自定义代理**: 如果需要使用 Key 轮训服务或代理,可以在管理员后台配置 `GEMINI_BASE_URL`,支持自定义 Gemini API 地址。 + ## 技术栈 **后端:** diff --git a/backend/Dockerfile b/backend/Dockerfile index 766dc8f..01cb0d5 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -2,10 +2,9 @@ FROM python:3.11-slim WORKDIR /app -# Install system dependencies -RUN apt-get update && apt-get install -y \ +# Install system dependencies (gcc for compiling Python packages) +RUN apt-get update && apt-get install -y --no-install-recommends \ gcc \ - postgresql-client \ && rm -rf /var/lib/apt/lists/* # Copy requirements and install Python dependencies diff --git a/backend/Dockerfile.china b/backend/Dockerfile.china new file mode 100644 index 0000000..bfbc4b3 --- /dev/null +++ b/backend/Dockerfile.china @@ -0,0 +1,32 @@ +# Dockerfile with China mirrors for faster builds +# Usage: docker build -f Dockerfile.china -t qquiz-backend . + +FROM python:3.11-slim + +WORKDIR /app + +# Use Alibaba Cloud mirror for faster apt-get +RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || \ + sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list || true + +# Install system dependencies (gcc for compiling Python packages) +RUN apt-get update && apt-get install -y --no-install-recommends \ + gcc \ + && rm -rf /var/lib/apt/lists/* + +# Copy requirements and install Python dependencies +COPY requirements.txt . +# Use Tsinghua PyPI mirror for faster pip install +RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt + +# Copy application code +COPY . . + +# Create uploads directory +RUN mkdir -p uploads + +# Expose port +EXPOSE 8000 + +# Run database migrations and start server +CMD alembic upgrade head && uvicorn main:app --host 0.0.0.0 --port 8000 diff --git a/backend/services/auth_service.py b/backend/services/auth_service.py index 80c5266..35dd6f4 100644 --- a/backend/services/auth_service.py +++ b/backend/services/auth_service.py @@ -28,24 +28,19 @@ async def get_current_user( headers={"WWW-Authenticate": "Bearer"}, ) - print(f"🔍 Received token (first 50 chars): {token[:50] if token else 'None'}...") - # Decode token payload = decode_access_token(token) if payload is None: - print(f"❌ Token decode failed - Invalid or expired token") raise credentials_exception user_id = payload.get("sub") if user_id is None: - print(f"❌ No 'sub' in payload: {payload}") raise credentials_exception # Convert user_id to int if it's a string try: user_id = int(user_id) except (ValueError, TypeError): - print(f"❌ Invalid user_id format: {user_id}") raise credentials_exception # Get user from database @@ -53,10 +48,8 @@ async def get_current_user( user = result.scalar_one_or_none() if user is None: - print(f"❌ User not found with id: {user_id}") raise credentials_exception - print(f"✅ User authenticated: {user.username} (id={user.id})") return user diff --git a/backend/utils.py b/backend/utils.py index c608c8f..74f37c4 100644 --- a/backend/utils.py +++ b/backend/utils.py @@ -37,8 +37,6 @@ def create_access_token(data: dict, expires_delta: Optional[timedelta] = None) - expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) to_encode.update({"exp": expire}) - print(f"🔑 Creating token with SECRET_KEY (first 20 chars): {SECRET_KEY[:20]}...") - print(f"📦 Token payload: {to_encode}") encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) return encoded_jwt @@ -46,12 +44,9 @@ def create_access_token(data: dict, expires_delta: Optional[timedelta] = None) - def decode_access_token(token: str) -> Optional[dict]: """Decode a JWT access token""" try: - print(f"🔑 SECRET_KEY (first 20 chars): {SECRET_KEY[:20]}...") payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) - print(f"✅ Token decoded successfully: {payload}") return payload - except JWTError as e: - print(f"❌ JWT decode error: {type(e).__name__}: {str(e)}") + except JWTError: return None diff --git a/docs/AI_CONFIGURATION.md b/docs/AI_CONFIGURATION.md new file mode 100644 index 0000000..c3deb06 --- /dev/null +++ b/docs/AI_CONFIGURATION.md @@ -0,0 +1,201 @@ +# AI 提供商配置指南 + +QQuiz 支持多个 AI 提供商,推荐使用 Google Gemini 以获得最佳的 PDF 解析体验。 + +## 🌟 推荐:Google Gemini + +### 优势 + +- ✅ **原生 PDF 理解**:直接处理 PDF(最多1000页),完整保留图片、表格、公式 +- ✅ **免费额度充足**:每天免费 15 次/分钟,1500 次/天 +- ✅ **多模态理解**:支持图片、图表、公式的理解 +- ✅ **自定义代理**:支持配置自定义 Base URL 实现 Key 轮训等功能 + +### 获取 API Key + +1. 访问 https://aistudio.google.com/apikey +2. 使用 Google 账号登录 +3. 点击 "Create API Key" +4. 复制生成的 API Key(格式:`AIza...`) + +### 配置方式 + +#### 方式一:环境变量配置(推荐首次部署) + +编辑 `.env` 文件: + +```env +AI_PROVIDER=gemini +GEMINI_API_KEY=AIza-your-actual-gemini-api-key +GEMINI_BASE_URL=https://generativelanguage.googleapis.com +GEMINI_MODEL=gemini-2.0-flash-exp +``` + +#### 方式二:管理员后台配置(推荐生产环境) + +1. 使用管理员账号登录(默认:admin / admin123) +2. 进入"系统设置" +3. 选择 AI 提供商:"Google Gemini (推荐)" +4. 填入 API Key +5. 点击"保存所有设置" + +**优势**:无需重启服务即可生效,支持在线修改配置 + +### 自定义 Gemini Base URL(可选) + +如果需要使用 Key 轮训服务或代理(例如提高速度、负载均衡),可以配置自定义 Base URL: + +```env +# 使用自定义代理服务 +GEMINI_BASE_URL=https://your-proxy-service.com/proxy/gemini-self +``` + +**使用场景**: +- Key 轮训(多个 API Key 负载均衡) +- 国内加速代理 +- 自建中转服务 + +--- + +## 其他 AI 提供商 + +### OpenAI (GPT) + +**限制**:⚠️ 仅支持文本解析,PDF 文件会通过文本提取处理,丢失图片和格式信息 + +#### 获取 API Key +- 访问:https://platform.openai.com/api-keys +- 创建新的 Secret Key + +#### 配置 +```env +AI_PROVIDER=openai +OPENAI_API_KEY=sk-your-openai-api-key +OPENAI_BASE_URL=https://api.openai.com/v1 +OPENAI_MODEL=gpt-4o-mini +``` + +**推荐模型**: +- `gpt-4o-mini`(推荐,性价比高) +- `gpt-4o`(最强,成本高) +- `gpt-3.5-turbo`(便宜,效果一般) + +--- + +### Anthropic (Claude) + +**限制**:⚠️ 仅支持文本解析,PDF 文件会通过文本提取处理,丢失图片和格式信息 + +#### 获取 API Key +- 访问:https://console.anthropic.com/settings/keys +- 创建新的 API Key + +#### 配置 +```env +AI_PROVIDER=anthropic +ANTHROPIC_API_KEY=sk-ant-your-anthropic-api-key +ANTHROPIC_MODEL=claude-3-haiku-20240307 +``` + +**推荐模型**: +- `claude-3-haiku-20240307`(推荐,速度快) +- `claude-3-5-sonnet-20241022`(最强,成本高) +- `claude-3-opus-20240229`(超强,成本很高) + +--- + +### Qwen (通义千问) + +**限制**:⚠️ 仅支持文本解析,PDF 文件会通过文本提取处理,丢失图片和格式信息 + +#### 获取 API Key +- 访问:https://dashscope.console.aliyun.com/apiKey +- 使用阿里云账号登录 +- 创建新的 API Key + +#### 配置 +```env +AI_PROVIDER=qwen +QWEN_API_KEY=sk-your-qwen-api-key +QWEN_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1 +QWEN_MODEL=qwen-plus +``` + +**推荐模型**: +- `qwen-plus`(推荐,平衡) +- `qwen-max`(最强,成本高) +- `qwen-turbo`(快速,效果一般) +- `qwen-long`(超长文本支持) + +--- + +## AI 提供商对比表 + +| 提供商 | PDF 原生支持 | 图片/表格/公式 | 文本解析 | 免费额度 | 推荐度 | +|--------|--------------|----------------|----------|----------|--------| +| **Google Gemini** | ✅ 支持 | ✅ 完整保留 | ✅ | ⭐⭐⭐⭐⭐ | 最推荐 | +| OpenAI (GPT) | ❌ 不支持 | ❌ 丢失 | ✅ | 💰 | ⭐⭐⭐⭐ | +| Anthropic (Claude) | ❌ 不支持 | ❌ 丢失 | ✅ | 💰 | ⭐⭐⭐⭐ | +| Qwen (通义千问) | ❌ 不支持 | ❌ 丢失 | ✅ | ✅ | ⭐⭐⭐ | + +--- + +## 常见问题 + +### Q1: 如何判断 AI 提供商是否配置正确? + +上传一个包含题目的文档,如果能成功解析出题目,说明配置正确。查看后端日志可以看到详细的解析过程。 + +### Q2: 可以同时配置多个 AI 提供商吗? + +可以。配置多个提供商的 API Key,通过 `AI_PROVIDER` 环境变量或管理员后台切换使用哪个提供商。 + +### Q3: Gemini 原生 PDF 处理和文本提取有什么区别? + +- **原生 PDF 处理**(Gemini):AI 直接"看"PDF,能识别图片中的文字、理解表格结构、识别数学公式 +- **文本提取**(其他提供商):先用 PyPDF2/python-docx 提取纯文本,然后交给 AI,丢失所有图片和格式 + +**示例**:如果试卷中有带图的选择题,Gemini 能理解图片内容并提取题目,其他提供商只能提取文字部分。 + +### Q4: Gemini 自定义 Base URL 有什么用? + +- **场景一**:使用多个 API Key 的轮训服务,避免单个 Key 频率限制 +- **场景二**:使用国内加速代理,提高访问速度 +- **场景三**:自建中转服务,统一管理和监控 API 调用 + +**格式要求**:Base URL 应该是完整的域名,例如 `https://your-service.com`,后端会自动拼接 `/v1beta/models/{model}:generateContent` + +### Q5: 如果文档中没有提供答案怎么办? + +QQuiz 会自动使用 AI 生成参考答案,标注为"AI参考答案:"。这个功能对所有 AI 提供商都支持。 + +--- + +## 推荐配置方案 + +### 方案一:仅使用 Gemini(推荐) +```env +AI_PROVIDER=gemini +GEMINI_API_KEY=your-key +``` +- ✅ 最佳 PDF 支持 +- ✅ 免费额度充足 +- ✅ 配置简单 + +### 方案二:Gemini + OpenAI(备用) +```env +AI_PROVIDER=gemini +GEMINI_API_KEY=your-gemini-key +OPENAI_API_KEY=your-openai-key +``` +- 主用 Gemini,当遇到限制时手动切换到 OpenAI + +### 方案三:全配置(多选) +配置所有提供商,根据需求灵活切换 + +--- + +**推荐流程**: +1. 首次部署:使用 Gemini(免费额度充足) +2. 生产环境:使用管理员后台配置,支持在线切换 +3. 高频使用:配置 Gemini 自定义 Base URL 使用 Key 轮训服务 diff --git a/docs/CHINA_MIRROR_GUIDE.md b/docs/CHINA_MIRROR_GUIDE.md new file mode 100644 index 0000000..0c5cacb --- /dev/null +++ b/docs/CHINA_MIRROR_GUIDE.md @@ -0,0 +1,124 @@ +# 中国镜像加速指南 + +如果你在中国大陆,Docker 构建速度可能很慢。我们提供了使用国内镜像的可选 Dockerfile。 + +## 使用方法 + +### 方法一:使用中国镜像版 Dockerfile(推荐) + +```bash +# 构建后端(使用中国镜像) +cd backend +docker build -f Dockerfile.china -t qquiz-backend . + +# 构建前端(使用中国镜像) +cd ../frontend +docker build -f Dockerfile.china -t qquiz-frontend . + +# 或者一次性构建所有服务 +docker-compose build +``` + +### 方法二:临时使用 Docker Compose 覆盖 + +创建 `docker-compose.override.yml`(已在 .gitignore 中): + +```yaml +version: '3.8' + +services: + backend: + build: + context: ./backend + dockerfile: Dockerfile.china + + frontend: + build: + context: ./frontend + dockerfile: Dockerfile.china +``` + +然后正常运行: +```bash +docker-compose up -d --build +``` + +### 方法三:配置 Docker Hub 镜像加速 + +编辑 Docker 配置文件: +- **Windows**: Docker Desktop → Settings → Docker Engine +- **Linux**: `/etc/docker/daemon.json` + +添加以下内容: +```json +{ + "registry-mirrors": [ + "https://docker.mirrors.ustc.edu.cn", + "https://hub-mirror.c.163.com", + "https://mirror.baidubce.com" + ] +} +``` + +重启 Docker 服务。 + +## 镜像源说明 + +### Dockerfile.china 使用的镜像源: + +- **apt-get**: 阿里云镜像 (mirrors.aliyun.com) +- **pip**: 清华大学镜像 (pypi.tuna.tsinghua.edu.cn) +- **npm**: 淘宝镜像 (registry.npmmirror.com) + +### 其他可选镜像源: + +**Python PyPI:** +- 清华:https://pypi.tuna.tsinghua.edu.cn/simple +- 阿里云:https://mirrors.aliyun.com/pypi/simple/ +- 中科大:https://pypi.mirrors.ustc.edu.cn/simple/ + +**Node.js npm:** +- 淘宝:https://registry.npmmirror.com +- 华为云:https://repo.huaweicloud.com/repository/npm/ + +**Debian/Ubuntu apt:** +- 阿里云:mirrors.aliyun.com +- 清华:mirrors.tuna.tsinghua.edu.cn +- 中科大:mirrors.ustc.edu.cn + +## 注意事项 + +⚠️ **不要提交 docker-compose.override.yml 到 Git** +⚠️ **Dockerfile.china 仅供中国大陆用户使用** +⚠️ **国际用户请使用默认的 Dockerfile** + +## 速度对比 + +| 构建步骤 | 默认源 | 中国镜像 | 加速比 | +|---------|--------|---------|--------| +| apt-get update | 30-60s | 5-10s | 3-6x | +| pip install | 3-5min | 30-60s | 3-5x | +| npm install | 2-4min | 30-60s | 2-4x | +| **总计** | **5-10min** | **1-3min** | **3-5x** | + +## 故障排除 + +### 如果镜像源失效 + +1. 尝试其他镜像源(见上方"其他可选镜像源") +2. 检查镜像源是否可访问: + ```bash + # 测试 PyPI 镜像 + curl -I https://pypi.tuna.tsinghua.edu.cn/simple + + # 测试 npm 镜像 + curl -I https://registry.npmmirror.com + ``` + +3. 如果所有镜像都不可用,使用默认的 Dockerfile + +### 如果构建仍然很慢 + +1. 检查 Docker Desktop 内存分配(建议 ≥ 4GB) +2. 清理 Docker 缓存:`docker system prune -a` +3. 使用 BuildKit:`DOCKER_BUILDKIT=1 docker-compose build` diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md deleted file mode 100644 index ae34971..0000000 --- a/docs/DEPLOYMENT.md +++ /dev/null @@ -1,376 +0,0 @@ -# QQuiz 部署指南 - -## 🚀 快速开始 - -### 方式一:Docker Compose(推荐) - -这是最简单的部署方式,适合快速体验和生产环境。 - -```bash -# 1. 配置环境变量 -cp .env.example .env - -# 2. 编辑 .env 文件,填入必要配置 -# 必填项: -# - SECRET_KEY: JWT 密钥(至少 32 字符) -# - OPENAI_API_KEY: OpenAI API 密钥(或其他 AI 提供商) - -# 3. 启动所有服务 -docker-compose up -d - -# 4. 查看日志 -docker-compose logs -f - -# 5. 访问应用 -# 前端:http://localhost:3000 -# 后端:http://localhost:8000 -# API 文档:http://localhost:8000/docs -``` - -### 方式二:本地源码运行 - -适合开发环境和自定义部署。 - -#### 前置要求 -- Python 3.11+ -- Node.js 18+ -- PostgreSQL 15+ - -#### 步骤 - -**1. 安装并启动 PostgreSQL** - -```bash -# macOS -brew install postgresql@15 -brew services start postgresql@15 - -# Ubuntu/Debian -sudo apt install postgresql-15 -sudo systemctl start postgresql - -# Windows -# 下载并安装 PostgreSQL 官方安装包 -``` - -**2. 创建数据库** - -```bash -psql -U postgres -CREATE DATABASE qquiz_db; -CREATE USER qquiz WITH PASSWORD 'qquiz_password'; -GRANT ALL PRIVILEGES ON DATABASE qquiz_db TO qquiz; -\q -``` - -**3. 配置环境变量** - -```bash -cp .env.example .env -``` - -编辑 `.env` 文件: -```env -# 数据库(本地部署) -DATABASE_URL=postgresql+asyncpg://qquiz:qquiz_password@localhost:5432/qquiz_db - -# JWT 密钥(必须修改!) -SECRET_KEY=your-very-long-secret-key-at-least-32-characters-long - -# AI 提供商(选择一个) -AI_PROVIDER=openai -OPENAI_API_KEY=sk-your-openai-api-key -OPENAI_MODEL=gpt-4o-mini - -# 或者使用其他提供商 -# AI_PROVIDER=anthropic -# ANTHROPIC_API_KEY=sk-ant-your-key -# ANTHROPIC_MODEL=claude-3-haiku-20240307 - -# AI_PROVIDER=qwen -# QWEN_API_KEY=sk-your-key -# QWEN_MODEL=qwen-plus -``` - -**4. 启动后端** - -```bash -cd backend - -# 创建虚拟环境 -python3 -m venv venv -source venv/bin/activate # Windows: venv\Scripts\activate - -# 安装依赖 -pip install -r requirements.txt - -# 运行数据库迁移 -alembic upgrade head - -# 启动服务 -uvicorn main:app --reload -``` - -**5. 启动前端** - -打开新终端: - -```bash -cd frontend - -# 安装依赖 -npm install - -# 启动开发服务器 -npm start -``` - -**6. 访问应用** - -- 前端:http://localhost:3000 -- 后端:http://localhost:8000 -- API 文档:http://localhost:8000/docs - ---- - -## 🔐 默认账户 - -首次启动后,系统会自动创建管理员账户: - -- **用户名:** `admin` -- **密码:** `admin123` - -⚠️ **重要:** 首次登录后请立即修改密码! - ---- - -## ⚙️ 配置说明 - -### 必填配置 - -| 配置项 | 说明 | 示例 | -|--------|------|------| -| `DATABASE_URL` | 数据库连接字符串 | `postgresql+asyncpg://user:pass@host:5432/db` | -| `SECRET_KEY` | JWT 密钥(至少 32 字符) | `your-super-secret-key-change-in-production` | -| `OPENAI_API_KEY` | OpenAI API 密钥 | `sk-...` | - -### 可选配置 - -| 配置项 | 说明 | 默认值 | -|--------|------|--------| -| `ALLOW_REGISTRATION` | 是否允许用户注册 | `true` | -| `MAX_UPLOAD_SIZE_MB` | 最大上传文件大小(MB) | `10` | -| `MAX_DAILY_UPLOADS` | 每日上传次数限制 | `20` | -| `AI_PROVIDER` | AI 提供商 | `openai` | - -### AI 提供商配置 - -#### OpenAI -```env -AI_PROVIDER=openai -OPENAI_API_KEY=sk-your-key -OPENAI_BASE_URL=https://api.openai.com/v1 -OPENAI_MODEL=gpt-4o-mini -``` - -#### Anthropic Claude -```env -AI_PROVIDER=anthropic -ANTHROPIC_API_KEY=sk-ant-your-key -ANTHROPIC_MODEL=claude-3-haiku-20240307 -``` - -#### 通义千问 (Qwen) -```env -AI_PROVIDER=qwen -QWEN_API_KEY=sk-your-key -QWEN_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1 -QWEN_MODEL=qwen-plus -``` - ---- - -## 📋 使用流程 - -### 1. 创建题库 - -1. 登录后进入「题库管理」 -2. 点击「创建题库」 -3. 输入题库名称 -4. 上传题目文档(支持 TXT/PDF/DOCX/XLSX) -5. 等待 AI 解析完成(状态会自动刷新) - -### 2. 追加题目 - -1. 进入题库详情页 -2. 点击「添加题目文档」 -3. 上传新文档 -4. 系统会自动解析并去重 - -### 3. 开始刷题 - -1. 题库状态为「就绪」后,点击「开始刷题」或「继续刷题」 -2. 选择答案并提交 -3. 查看解析和正确答案 -4. 点击「下一题」继续 - -### 4. 错题本 - -- 答错的题目会自动加入错题本 -- 可以手动添加或移除题目 -- 在错题本中复习和巩固 - ---- - -## 🛠️ 常见问题 - -### Q: 文档解析失败? - -**A:** 检查以下几点: -1. AI API Key 是否正确配置 -2. 文档格式是否支持 -3. 文档内容是否包含题目 -4. 查看后端日志获取详细错误信息 - -### Q: 如何修改上传限制? - -**A:** 在「系统设置」中修改: -- 最大文件大小 -- 每日上传次数 - -或直接修改 `.env` 文件: -```env -MAX_UPLOAD_SIZE_MB=20 -MAX_DAILY_UPLOADS=50 -``` - -### Q: 如何更换 AI 提供商? - -**A:** 修改 `.env` 文件中的 `AI_PROVIDER` 和对应的 API Key: -```env -AI_PROVIDER=anthropic -ANTHROPIC_API_KEY=sk-ant-your-key -``` - -### Q: 如何备份数据? - -**A:** 备份 PostgreSQL 数据库: -```bash -# Docker 环境 -docker exec qquiz_postgres pg_dump -U qquiz qquiz_db > backup.sql - -# 本地环境 -pg_dump -U qquiz qquiz_db > backup.sql -``` - -### Q: 如何关闭用户注册? - -**A:** 在「系统设置」中关闭「允许用户注册」,或修改 `.env`: -```env -ALLOW_REGISTRATION=false -``` - ---- - -## 📊 生产环境建议 - -### 安全配置 - -1. **更改默认密码** - - 首次登录后立即修改 `admin` 账户密码 - -2. **生成强密钥** - ```bash - # 生成随机密钥 - openssl rand -hex 32 - ``` - -3. **配置 HTTPS** - - 使用 Nginx 或 Caddy 作为反向代理 - - 配置 SSL 证书 - -4. **限制 CORS** - ```env - CORS_ORIGINS=https://yourdomain.com - ``` - -### 性能优化 - -1. **数据库连接池** - - 根据负载调整连接池大小 - -2. **文件存储** - - 考虑使用对象存储(如 S3)替代本地存储 - -3. **缓存** - - 使用 Redis 缓存频繁查询的数据 - -### 监控和日志 - -1. **日志收集** - ```bash - # 查看 Docker 日志 - docker-compose logs -f backend - - # 保存日志到文件 - docker-compose logs backend > backend.log - ``` - -2. **健康检查** - - 访问 `http://localhost:8000/health` 检查服务状态 - ---- - -## 🐛 故障排查 - -### 后端无法启动 - -```bash -# 检查数据库连接 -psql -U qquiz -d qquiz_db - -# 检查端口占用 -lsof -i :8000 - -# 查看详细日志 -uvicorn main:app --reload --log-level debug -``` - -### 前端无法访问 - -```bash -# 检查端口占用 -lsof -i :3000 - -# 清除缓存重新安装 -rm -rf node_modules package-lock.json -npm install -``` - -### Docker 容器无法启动 - -```bash -# 查看容器状态 -docker-compose ps - -# 查看特定容器日志 -docker-compose logs backend - -# 重新构建 -docker-compose build --no-cache -docker-compose up -d -``` - ---- - -## 📞 获取帮助 - -- GitHub Issues: [报告问题](https://github.com/your-repo/qquiz/issues) -- 文档: [README.md](./README.md) -- API 文档: http://localhost:8000/docs - ---- - -## 📄 许可证 - -MIT License diff --git a/docs/DOCKER_MIRROR_SETUP.md b/docs/DOCKER_MIRROR_SETUP.md deleted file mode 100644 index 7486c54..0000000 --- a/docs/DOCKER_MIRROR_SETUP.md +++ /dev/null @@ -1,199 +0,0 @@ -# Docker 镜像加速器配置指南 - -## 问题描述 - -错误信息:`failed to resolve reference "docker.io/library/postgres:15-alpine"` - -**原因**:无法访问 Docker Hub,需要配置国内镜像加速器。 - ---- - -## 解决方案一:配置 Docker Desktop 镜像加速(推荐) - -### 方法 1:使用阿里云镜像加速器 - -1. **打开 Docker Desktop** - -2. **进入设置** - - 点击右上角齿轮图标 ⚙️ - - 选择 "Docker Engine" - -3. **添加镜像加速器配置** - -在 JSON 配置中添加以下内容: - -```json -{ - "builder": { - "gc": { - "defaultKeepStorage": "20GB", - "enabled": true - } - }, - "experimental": false, - "registry-mirrors": [ - "https://docker.mirrors.ustc.edu.cn", - "https://hub-mirror.c.163.com", - "https://mirror.baidubce.com" - ] -} -``` - -4. **应用并重启** - - 点击 "Apply & Restart" - - 等待 Docker Desktop 重启完成 - -5. **验证配置** - -```powershell -docker info | findstr "Registry Mirrors" -``` - -应该看到配置的镜像地址。 - ---- - -## 解决方案二:手动拉取镜像(临时方案) - -如果配置镜像加速器后仍然失败,可以手动拉取镜像: - -```powershell -# 尝试使用不同的镜像源拉取 -docker pull docker.mirrors.ustc.edu.cn/library/postgres:15-alpine -docker tag docker.mirrors.ustc.edu.cn/library/postgres:15-alpine postgres:15-alpine - -docker pull docker.mirrors.ustc.edu.cn/library/node:18-alpine -docker tag docker.mirrors.ustc.edu.cn/library/node:18-alpine node:18-alpine - -docker pull docker.mirrors.ustc.edu.cn/library/python:3.11-slim -docker tag docker.mirrors.ustc.edu.cn/library/python:3.11-slim python:3.11-slim -``` - ---- - -## 解决方案三:使用国内可用的基础镜像 - -修改 `docker-compose.yml` 使用国内镜像源: - -```yaml -services: - postgres: - image: registry.cn-hangzhou.aliyuncs.com/library/postgres:15-alpine - # 或使用 - # image: docker.mirrors.ustc.edu.cn/library/postgres:15-alpine -``` - ---- - -## 推荐配置(完整版) - -### Docker Desktop 完整配置 - -```json -{ - "builder": { - "gc": { - "defaultKeepStorage": "20GB", - "enabled": true - } - }, - "experimental": false, - "features": { - "buildkit": true - }, - "registry-mirrors": [ - "https://docker.mirrors.ustc.edu.cn", - "https://hub-mirror.c.163.com", - "https://mirror.baidubce.com", - "https://dockerproxy.com" - ], - "insecure-registries": [], - "debug": false -} -``` - ---- - -## 常用镜像加速器地址 - -| 提供商 | 镜像地址 | 说明 | -|--------|----------|------| -| 中科大 | https://docker.mirrors.ustc.edu.cn | 稳定,推荐 | -| 网易 | https://hub-mirror.c.163.com | 速度快 | -| 百度云 | https://mirror.baidubce.com | 国内访问快 | -| Docker Proxy | https://dockerproxy.com | 备用 | - ---- - -## 验证是否成功 - -### 1. 检查配置 -```powershell -docker info -``` - -查找 "Registry Mirrors" 部分,应该显示配置的镜像地址。 - -### 2. 测试拉取镜像 -```powershell -docker pull hello-world -``` - -如果成功,说明镜像加速器配置正确。 - -### 3. 重新启动 QQuiz -```powershell -cd E:\QQuiz -docker-compose up -d -``` - ---- - -## 如果仍然失败 - -### 检查网络连接 - -```powershell -# 测试是否能访问镜像加速器 -curl https://docker.mirrors.ustc.edu.cn -``` - -### 尝试其他镜像源 - -如果某个镜像源不可用,尝试注释掉它,只保留可用的: - -```json -{ - "registry-mirrors": [ - "https://docker.mirrors.ustc.edu.cn" - ] -} -``` - -### 检查防火墙/代理 - -- 暂时关闭防火墙测试 -- 如果使用代理,在 Docker Desktop 设置中配置代理 - ---- - -## 完成后的下一步 - -配置成功后: - -```powershell -# 1. 重新启动服务 -cd E:\QQuiz -docker-compose down -docker-compose up -d - -# 2. 查看启动日志 -docker-compose logs -f - -# 3. 访问应用 -# http://localhost:3000 -``` - ---- - -祝你成功!🎉 diff --git a/docs/GITHUB_PUSH_GUIDE.md b/docs/GITHUB_PUSH_GUIDE.md deleted file mode 100644 index 3d5be40..0000000 --- a/docs/GITHUB_PUSH_GUIDE.md +++ /dev/null @@ -1,214 +0,0 @@ -# GitHub 推送指南 - -## 方式一:使用 Personal Access Token(推荐) - -GitHub 已不再支持密码认证,需要使用 Personal Access Token (PAT)。 - -### 步骤 1:创建 GitHub Personal Access Token - -1. **访问 GitHub 设置** - - 登录 GitHub: https://github.com - - 点击右上角头像 → Settings - - 左侧菜单选择 **Developer settings** - - 选择 **Personal access tokens** → **Tokens (classic)** - - 点击 **Generate new token** → **Generate new token (classic)** - -2. **配置 Token** - - Note: `QQuiz Deploy` - - Expiration: 选择过期时间(建议 90 days 或 No expiration) - - 勾选权限: - - ✅ **repo** (完整仓库访问权限) - - 点击 **Generate token** - -3. **保存 Token** - - ⚠️ **重要**:立即复制生成的 token,它只会显示一次! - - 格式类似:`ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` - -### 步骤 2:配置 Git 凭据 - -**方式 A:使用 Git Credential Manager(推荐)** - -```powershell -# 配置凭据存储 -git config --global credential.helper manager-core - -# 首次推送时会弹出窗口,输入: -# Username: handsomezhuzhu -# Password: 粘贴你的 Personal Access Token -``` - -**方式 B:直接在 URL 中使用 Token** - -```powershell -cd E:\QQuiz - -# 移除旧的 remote -git remote remove origin - -# 添加包含 token 的 remote -git remote add origin https://ghp_YOUR_TOKEN_HERE@github.com/handsomezhuzhu/QQuiz.git - -# 推送 -git push -u origin main -``` - -将 `ghp_YOUR_TOKEN_HERE` 替换为你的实际 token。 - -### 步骤 3:推送到 GitHub - -```powershell -cd E:\QQuiz - -# 推送代码 -git push -u origin main -``` - -如果使用方式 A,会弹出认证窗口,输入: -- **Username**: `handsomezhuzhu` -- **Password**: 粘贴你的 Personal Access Token - ---- - -## 方式二:使用 SSH Key(适合频繁推送) - -### 步骤 1:生成 SSH Key - -```powershell -# 生成新的 SSH Key -ssh-keygen -t ed25519 -C "your_email@example.com" - -# 按提示操作: -# - 文件位置:直接回车(使用默认) -# - 密码:可以留空或设置密码 -``` - -### 步骤 2:添加 SSH Key 到 GitHub - -```powershell -# 查看公钥 -cat ~/.ssh/id_ed25519.pub - -# 或在 Windows 上 -type %USERPROFILE%\.ssh\id_ed25519.pub -``` - -复制输出的公钥(以 `ssh-ed25519` 开头) - -1. 访问 GitHub Settings → SSH and GPG keys -2. 点击 **New SSH key** -3. Title: `QQuiz Dev PC` -4. Key: 粘贴公钥 -5. 点击 **Add SSH key** - -### 步骤 3:修改 Remote 为 SSH - -```powershell -cd E:\QQuiz - -# 移除旧的 HTTPS remote -git remote remove origin - -# 添加 SSH remote -git remote add origin git@github.com:handsomezhuzhu/QQuiz.git - -# 推送 -git push -u origin main -``` - ---- - -## 快速推送脚本 - -创建 `push_to_github.bat`: - -```batch -@echo off -echo Pushing to GitHub... - -cd /d "%~dp0" - -git add . -git status - -echo. -set /p commit_msg="Enter commit message: " - -git commit -m "%commit_msg%" -git push origin main - -echo. -echo Done! -pause -``` - ---- - -## 验证推送成功 - -推送成功后: - -1. 访问:https://github.com/handsomezhuzhu/QQuiz -2. 应该能看到所有代码文件 -3. 查看 Commits 历史 - ---- - -## 常见问题 - -### Q1: 推送失败 - Authentication failed - -**原因**:密码认证已被 GitHub 禁用 - -**解决**:使用 Personal Access Token 或 SSH Key - -### Q2: 推送被拒绝 - Updates were rejected - -``` -! [rejected] main -> main (fetch first) -``` - -**解决**: -```powershell -# 拉取远程更改 -git pull origin main --allow-unrelated-histories - -# 再次推送 -git push -u origin main -``` - -### Q3: 推送很慢 - -**解决**:配置代理(如果使用 VPN) -```powershell -# 设置 HTTP 代理 -git config --global http.proxy http://127.0.0.1:7890 - -# 取消代理 -git config --global --unset http.proxy -``` - ---- - -## 后续推送 - -首次推送成功后,以后只需: - -```powershell -cd E:\QQuiz - -# 查看更改 -git status - -# 添加文件 -git add . - -# 提交 -git commit -m "your commit message" - -# 推送 -git push -``` - ---- - -祝你推送成功!🚀 diff --git a/docs/QUICK_START.md b/docs/QUICK_START.md deleted file mode 100644 index cd43048..0000000 --- a/docs/QUICK_START.md +++ /dev/null @@ -1,234 +0,0 @@ -# 🚀 QQuiz 快速开始指南(5 分钟上手) - -## Windows 用户快速部署 - -### 第一步:准备工作(2 分钟) - -1. **安装 Docker Desktop** - - 下载:https://www.docker.com/products/docker-desktop/ - - 安装后重启电脑 - - 启动 Docker Desktop,等待启动完成 - -2. **配置 API Key** - ```powershell - # 在项目目录打开 PowerShell - cd E:\QQuiz - - # 复制环境变量模板 - copy .env.example .env - - # 编辑 .env 文件 - notepad .env - ``` - - **修改以下两项:** - ```env - SECRET_KEY=change-this-to-a-very-long-random-string-at-least-32-characters - OPENAI_API_KEY=sk-your-actual-openai-api-key-here - ``` - -### 第二步:启动服务(2 分钟) - -**方式一:使用启动脚本(推荐)** -```powershell -# 双击运行 -start_windows.bat -``` - -**方式二:手动启动** -```powershell -cd E:\QQuiz -docker-compose up -d -``` - -等待服务启动完成(首次启动需要下载镜像,约 1-2 分钟) - -### 第三步:开始使用(1 分钟) - -1. **访问应用** - - 打开浏览器访问:http://localhost:3000 - -2. **登录** - - 用户名:`admin` - - 密码:`admin123` - -3. **创建第一个题库** - - 点击「题库管理」 - - 点击「创建题库」 - - 输入名称:`Python 基础测试` - - 上传文件:`test_data/sample_questions.txt` - - 等待解析完成(约 10-30 秒) - -4. **开始刷题** - - 点击「开始刷题」 - - 答题并查看解析 - ---- - -## 🎯 测试功能清单 - -完成以下测试,确保所有功能正常: - -### ✅ 基础功能 -- [ ] 登录系统 -- [ ] 创建题库 -- [ ] 上传文档并等待解析完成 -- [ ] 开始刷题 -- [ ] 答对一题 -- [ ] 答错一题(应自动加入错题本) -- [ ] 查看错题本 - -### ✅ 高级功能 -- [ ] 向已有题库追加新文档 -- [ ] 验证去重功能(上传重复题目) -- [ ] 测试不同题型(单选、多选、判断、简答) -- [ ] 测试断点续做(刷到一半退出,再次进入继续) -- [ ] 手动添加/移除错题 -- [ ] 修改管理员密码 - -### ✅ 管理员功能(使用 admin 账户) -- [ ] 访问系统设置 -- [ ] 修改上传限制 -- [ ] 关闭用户注册 - ---- - -## 📝 测试数据文件 - -项目提供了两个测试文件: - -1. **`test_data/sample_questions.txt`** - 基础选择题和判断题 - - 10 道题 - - 包含单选、多选、判断题 - - 适合快速测试 - -2. **`test_data/sample_questions_advanced.txt`** - 简答题 - - 8 道题 - - 全部为简答题 - - 测试 AI 评分功能 - -**使用方法:** -1. 创建题库时上传 `sample_questions.txt` -2. 解析完成后,点击「添加题目文档」 -3. 再次上传 `sample_questions.txt`(测试去重) -4. 观察日志,应该显示"去重 10 题,新增 0 题" - ---- - -## 🛠️ 常用命令 - -### 查看日志 -```powershell -# 方式一:使用脚本 -logs_windows.bat - -# 方式二:命令行 -docker-compose logs -f -``` - -### 重启服务 -```powershell -docker-compose restart -``` - -### 停止服务 -```powershell -# 方式一:使用脚本 -stop_windows.bat - -# 方式二:命令行 -docker-compose down -``` - -### 完全重置(清除所有数据) -```powershell -docker-compose down -v -docker-compose up -d -``` - ---- - -## ❓ 常见问题 - -### 问题 1: 端口被占用 - -**错误信息:** `Bind for 0.0.0.0:3000 failed: port is already allocated` - -**解决方案:** -```powershell -# 查找占用端口的进程 -netstat -ano | findstr :3000 - -# 结束进程(替换 为实际进程 ID) -taskkill /F /PID - -# 重新启动 -docker-compose up -d -``` - -### 问题 2: Docker Desktop 未启动 - -**错误信息:** `error during connect: ... Is the docker daemon running?` - -**解决方案:** -1. 打开 Docker Desktop 应用 -2. 等待底部状态显示 "Running" -3. 重新运行启动脚本 - -### 问题 3: API Key 未配置 - -**现象:** 文档解析一直处于 "processing" 状态 - -**解决方案:** -1. 检查 `.env` 文件中的 `OPENAI_API_KEY` 是否正确 -2. 查看后端日志:`docker-compose logs backend` -3. 重新启动:`docker-compose restart` - -### 问题 4: 前端无法连接后端 - -**现象:** 登录失败,显示网络错误 - -**解决方案:** -```powershell -# 检查后端是否运行 -docker-compose ps - -# 检查后端健康状态 -# 浏览器访问: http://localhost:8000/health - -# 查看后端日志 -docker-compose logs backend -``` - ---- - -## 📚 下一步 - -✅ **部署成功后,建议阅读:** - -1. **完整功能说明**: `README.md` -2. **详细部署文档**: `DEPLOYMENT.md` -3. **Windows 专用指南**: `WINDOWS_DEPLOYMENT.md` -4. **项目架构**: `PROJECT_STRUCTURE.md` - -✅ **进阶使用:** - -1. 修改管理员密码 -2. 创建普通用户账户 -3. 上传真实的题目文档 -4. 配置系统限制(上传大小、次数等) -5. 尝试不同的 AI 提供商(Qwen、Claude) - ---- - -## 🎉 恭喜! - -如果你已经完成了上述测试,说明 QQuiz 已经在你的 Windows 系统上成功部署运行了! - -现在你可以: -- 📚 上传自己的题库文档 -- 🎯 开始高效刷题学习 -- 📊 通过错题本巩固薄弱知识点 -- ⚙️ 自定义系统配置 - -祝你学习愉快!如有问题,请查看详细文档或提交 Issue。 diff --git a/docs/README_QUICKSTART.md b/docs/README_QUICKSTART.md deleted file mode 100644 index 4660806..0000000 --- a/docs/README_QUICKSTART.md +++ /dev/null @@ -1,94 +0,0 @@ -# QQuiz Quick Start Guide - -## Step 1: Configure (30 seconds) - -Double-click to run: -``` -setup.bat -``` - -This will: -- Create `.env` file -- Open it in Notepad -- You need to replace `sk-your-openai-api-key-here` with your real OpenAI API key - -**Where to get API key:** -- Visit: https://platform.openai.com/api-keys -- Create new secret key -- Copy and paste into `.env` file - -## Step 2: Start Application (3-5 minutes) - -Double-click to run: -``` -start_app.bat -``` - -**PostgreSQL Password:** -- When prompted, enter your PostgreSQL password -- Default is usually: `postgres` -- Or just press Enter to try without password - -The script will automatically: -- ✓ Check Python and Node.js -- ✓ Create database -- ✓ Install all dependencies -- ✓ Start backend (new window) -- ✓ Start frontend (new window) - -## Step 3: Access System - -Browser will open automatically: http://localhost:3000 - -**Login:** -- Username: `admin` -- Password: `admin123` - -**Test the system:** -1. Click "题库管理" (Exam Management) -2. Click "创建题库" (Create Exam) -3. Enter name: `Test Exam` -4. Upload file: `test_data/sample_questions.txt` -5. Wait 10-30 seconds for AI to process -6. Click "开始刷题" (Start Quiz) - -## What You'll See - -✅ Beautiful login page -✅ Dashboard with statistics -✅ Create exam and upload documents -✅ AI processes questions automatically -✅ Quiz player with different question types -✅ Automatic mistake collection -✅ Progress tracking - -## Troubleshooting - -### Can't find PostgreSQL password -- Try: `postgres` or leave empty -- Or check PostgreSQL installation - -### Port already in use -```cmd -netstat -ano | findstr :3000 -taskkill /F /PID -``` - -### Dependencies install failed -- Check internet connection -- Script uses China mirrors for speed - -## Success! - -If you see the login page at http://localhost:3000 - congratulations! 🎉 - -The system is now running. You can: -- Create exam banks -- Upload documents (TXT/PDF/DOCX/XLSX) -- Start quizzing -- Review mistakes -- Track progress - ---- - -Enjoy using QQuiz! 🚀 diff --git a/docs/START_HERE.txt b/docs/START_HERE.txt deleted file mode 100644 index f31d489..0000000 --- a/docs/START_HERE.txt +++ /dev/null @@ -1,64 +0,0 @@ -========================================== - QQuiz 快速启动指南 (3步完成) -========================================== - -【第1步】配置 OpenAI API Key -------------------------------------------- -1. 双击运行: quick_config.bat -2. 会自动打开记事本,找到这一行: - OPENAI_API_KEY=sk-your-openai-api-key-here -3. 将 "sk-your-openai-api-key-here" 替换为你的真实 API Key -4. 保存并关闭记事本 - -如果没有 API Key,可以: -- 去 https://platform.openai.com/api-keys 创建 -- 或者暂时使用测试 Key(功能受限) - - -【第2步】启动系统 -------------------------------------------- -双击运行: auto_setup_and_run.bat - -脚本会自动: -✓ 检查 Python 和 Node.js -✓ 创建数据库 -✓ 安装所有依赖 -✓ 启动后端和前端 - -整个过程 3-5 分钟,请耐心等待 - - -【第3步】访问系统 -------------------------------------------- -浏览器打开: http://localhost:3000 - -默认账户: - 用户名: admin - 密码: admin123 - - -【如果遇到问题】 -------------------------------------------- -1. PostgreSQL 密码 - - 脚本会询问 PostgreSQL 管理员密码 - - 如果是首次安装,密码可能是你安装时设置的 - - 常见默认密码: postgres 或 root - -2. 数据库连接失败 - - 确保 PostgreSQL 服务正在运行 - - 打开"服务"查看 postgresql 服务状态 - -3. 端口被占用 - - 3000/8000 端口可能被占用 - - 关闭占用端口的程序重试 - - -【测试数据】 -------------------------------------------- -创建题库时可以上传: - test_data/sample_questions.txt - - -========================================== - 准备好了吗?现在开始第1步! -========================================== diff --git a/frontend/Dockerfile.china b/frontend/Dockerfile.china new file mode 100644 index 0000000..91700be --- /dev/null +++ b/frontend/Dockerfile.china @@ -0,0 +1,22 @@ +# Dockerfile with China mirrors for faster builds +# Usage: docker build -f Dockerfile.china -t qquiz-frontend . + +FROM node:18-alpine + +WORKDIR /app + +# Copy package files +COPY package*.json ./ + +# Install dependencies using Taobao npm registry +RUN npm config set registry https://registry.npmmirror.com && \ + npm install + +# Copy application code +COPY . . + +# Expose port +EXPOSE 3000 + +# Start development server +CMD ["npm", "start"] diff --git a/frontend/src/pages/ExamList.jsx b/frontend/src/pages/ExamList.jsx index 7c62c30..3681fc5 100644 --- a/frontend/src/pages/ExamList.jsx +++ b/frontend/src/pages/ExamList.jsx @@ -98,9 +98,17 @@ export const ExamList = () => { toast.success('题库创建成功,正在解析文档...') setShowCreateModal(false) setFormData({ title: '', file: null }) - await loadExams() + + // 跳转到新创建的试卷详情页 + if (response.data && response.data.exam_id) { + navigate(`/exams/${response.data.exam_id}`) + } else { + // 如果没有返回 exam_id,刷新列表 + await loadExams() + } } catch (error) { console.error('Failed to create exam:', error) + toast.error('创建失败:' + (error.response?.data?.detail || error.message)) } finally { setCreating(false) } diff --git a/scripts/auto_setup_and_run.bat b/scripts/auto_setup_and_run.bat deleted file mode 100644 index 8a3a260..0000000 --- a/scripts/auto_setup_and_run.bat +++ /dev/null @@ -1,258 +0,0 @@ -@echo off -chcp 65001 >nul -title QQuiz - 全自动部署 - -color 0A -echo. -echo ██████╗ ██████╗ ██╗ ██╗██╗███████╗ -echo ██╔═══██╗██╔═══██╗██║ ██║██║╚══███╔╝ -echo ██║ ██║██║ ██║██║ ██║██║ ███╔╝ -echo ██║▄▄ ██║██║▄▄ ██║██║ ██║██║ ███╔╝ -echo ╚██████╔╝╚██████╔╝╚██████╔╝██║███████╗ -echo ╚══▀▀═╝ ╚══▀▀═╝ ╚═════╝ ╚═╝╚══════╝ -echo. -echo ========================================== -echo 智能刷题与题库管理平台 -echo 全自动部署脚本 -echo ========================================== -echo. - -cd /d "%~dp0.." - -REM ============================================ -REM 步骤 1: 检查环境 -REM ============================================ -echo [1/8] 检查运行环境... -echo. - -REM 检查 Python -python --version >nul 2>&1 -if %errorlevel% neq 0 ( - echo [错误] 未检测到 Python! - echo 请先安装 Python 3.11+: https://www.python.org/downloads/ - pause - exit /b 1 -) -echo ✓ Python 已安装 - -REM 检查 Node.js -node --version >nul 2>&1 -if %errorlevel% neq 0 ( - echo [错误] 未检测到 Node.js! - echo 请先安装 Node.js 18+: https://nodejs.org/ - pause - exit /b 1 -) -echo ✓ Node.js 已安装 - -REM 检查 PostgreSQL -psql --version >nul 2>&1 -if %errorlevel% neq 0 ( - echo [警告] 未检测到 PostgreSQL 命令行工具 - echo 可能已安装但未加入 PATH,继续尝试... -) -echo ✓ 环境检查完成 -echo. - -REM ============================================ -REM 步骤 2: 配置环境变量 -REM ============================================ -echo [2/8] 配置环境变量... -echo. - -if not exist ".env" ( - copy .env.example .env >nul - echo ✓ 已创建 .env 文件 - echo. - echo [重要] 请编辑 .env 文件,配置以下项: - echo 1. SECRET_KEY - JWT密钥(至少32字符) - echo 2. OPENAI_API_KEY - OpenAI API密钥 - echo. - echo 按任意键打开 .env 文件编辑... - pause >nul - notepad .env - echo. - echo 编辑完成后,按任意键继续... - pause >nul -) else ( - echo ✓ .env 文件已存在 -) -echo. - -REM ============================================ -REM 步骤 3: 创建数据库 -REM ============================================ -echo [3/8] 配置数据库... -echo. - -echo 请输入 PostgreSQL 信息(或直接回车使用默认值): -echo. -set /p PGHOST="数据库主机 [默认: localhost]: " -if "%PGHOST%"=="" set PGHOST=localhost - -set /p PGPORT="数据库端口 [默认: 5432]: " -if "%PGPORT%"=="" set PGPORT=5432 - -set /p PGUSER="管理员用户名 [默认: postgres]: " -if "%PGUSER%"=="" set PGUSER=postgres - -echo. -echo 正在创建数据库和用户... -echo. - -REM 创建数据库脚本 -echo DROP DATABASE IF EXISTS qquiz_db; > temp_create_db.sql -echo DROP USER IF EXISTS qquiz; >> temp_create_db.sql -echo CREATE USER qquiz WITH PASSWORD 'qquiz_password'; >> temp_create_db.sql -echo CREATE DATABASE qquiz_db OWNER qquiz; >> temp_create_db.sql -echo GRANT ALL PRIVILEGES ON DATABASE qquiz_db TO qquiz; >> temp_create_db.sql - -REM 执行 SQL -psql -h %PGHOST% -p %PGPORT% -U %PGUSER% -f temp_create_db.sql 2>nul -if %errorlevel% equ 0 ( - echo ✓ 数据库创建成功 - del temp_create_db.sql -) else ( - echo ! 数据库创建可能失败,继续尝试... - del temp_create_db.sql -) -echo. - -REM 更新 .env 中的数据库连接 -powershell -Command "(Get-Content .env) -replace 'DATABASE_URL=.*', 'DATABASE_URL=postgresql+asyncpg://qquiz:qquiz_password@%PGHOST%:%PGPORT%/qquiz_db' | Set-Content .env" -echo ✓ 已更新数据库连接配置 -echo. - -REM ============================================ -REM 步骤 4: 安装后端依赖 -REM ============================================ -echo [4/8] 安装后端依赖... -echo. - -cd backend - -if not exist "venv" ( - echo 创建虚拟环境... - python -m venv venv -) - -echo 激活虚拟环境并安装依赖... -call venv\Scripts\activate.bat && pip install -q -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple - -if %errorlevel% equ 0 ( - echo ✓ 后端依赖安装成功 -) else ( - echo ! 部分依赖可能安装失败,继续尝试... -) -echo. - -REM ============================================ -REM 步骤 5: 初始化数据库 -REM ============================================ -echo [5/8] 初始化数据库表... -echo. - -call venv\Scripts\activate.bat && alembic upgrade head 2>nul -if %errorlevel% equ 0 ( - echo ✓ 数据库表创建成功 -) else ( - echo ! 数据库迁移失败,将在启动时自动创建 -) -echo. - -cd .. - -REM ============================================ -REM 步骤 6: 安装前端依赖 -REM ============================================ -echo [6/8] 安装前端依赖... -echo. - -cd frontend - -if not exist "node_modules" ( - echo 使用淘宝镜像加速... - call npm config set registry https://registry.npmmirror.com - echo 安装依赖(需要几分钟)... - call npm install --silent - - if %errorlevel% equ 0 ( - echo ✓ 前端依赖安装成功 - ) else ( - echo ! 前端依赖安装失败 - cd .. - pause - exit /b 1 - ) -) else ( - echo ✓ 前端依赖已安装 -) -echo. - -cd .. - -REM ============================================ -REM 步骤 7: 启动后端服务 -REM ============================================ -echo [7/8] 启动后端服务... -echo. - -start "QQuiz Backend" cmd /k "cd /d %~dp0..\backend && call venv\Scripts\activate.bat && echo ======================================== && echo QQuiz 后端服务 && echo ======================================== && echo. && echo API 地址: http://localhost:8000 && echo API 文档: http://localhost:8000/docs && echo. && echo 按 Ctrl+C 停止服务 && echo. && uvicorn main:app --reload" - -echo ✓ 后端服务已在新窗口中启动 -echo 等待服务启动... -timeout /t 8 /nobreak >nul -echo. - -REM ============================================ -REM 步骤 8: 启动前端服务 -REM ============================================ -echo [8/8] 启动前端服务... -echo. - -start "QQuiz Frontend" cmd /k "cd /d %~dp0..\frontend && echo ======================================== && echo QQuiz 前端服务 && echo ======================================== && echo. && echo 前端地址: http://localhost:3000 && echo. && echo 按 Ctrl+C 停止服务 && echo. && npm start" - -echo ✓ 前端服务已在新窗口中启动 -echo 等待服务启动... -timeout /t 5 /nobreak >nul -echo. - -REM ============================================ -REM 完成 -REM ============================================ -color 0B -echo. -echo ========================================== -echo 🎉 部署完成! -echo ========================================== -echo. -echo 服务地址: -echo 前端: http://localhost:3000 -echo 后端: http://localhost:8000 -echo 文档: http://localhost:8000/docs -echo. -echo 默认账户: -echo 用户名: admin -echo 密码: admin123 -echo. -echo ⚠️ 首次登录后请立即修改密码! -echo. -echo 测试数据: -echo test_data/sample_questions.txt -echo. -echo ========================================== -echo. - -REM 询问是否打开浏览器 -choice /C YN /M "是否打开浏览器访问系统" -if %errorlevel% equ 1 ( - timeout /t 3 /nobreak >nul - start http://localhost:3000 -) - -echo. -echo 系统正在运行中... -echo 关闭此窗口不会停止服务 -echo 要停止服务,请关闭后端和前端窗口 -echo. -pause diff --git a/scripts/check_postgres.bat b/scripts/check_postgres.bat deleted file mode 100644 index d007d31..0000000 --- a/scripts/check_postgres.bat +++ /dev/null @@ -1,93 +0,0 @@ -@echo off -title PostgreSQL Status Check -color 0B - -echo. -echo ======================================== -echo PostgreSQL Database Status Check -echo ======================================== -echo. - -REM Check PostgreSQL installation -echo [1] Checking PostgreSQL Installation... -if exist "C:\Program Files\PostgreSQL\18" ( - echo OK - PostgreSQL 18 is installed - echo Location: C:\Program Files\PostgreSQL\18 -) else ( - echo ERROR - PostgreSQL 18 not found! - pause - exit /b 1 -) -echo. - -REM Check PostgreSQL service -echo [2] Checking PostgreSQL Service... -sc query postgresql-x64-18 >nul 2>&1 -if %errorlevel% equ 0 ( - echo OK - PostgreSQL service exists - echo. - echo Service details: - sc query postgresql-x64-18 - echo. -) else ( - echo WARNING - PostgreSQL service not found! - echo Trying alternative names... - sc query | findstr /i "postgres" -) -echo. - -REM Check if port 5432 is listening -echo [3] Checking Port 5432... -netstat -ano | findstr ":5432" | findstr "LISTENING" >nul -if %errorlevel% equ 0 ( - echo OK - PostgreSQL is listening on port 5432 - netstat -ano | findstr ":5432" | findstr "LISTENING" -) else ( - echo ERROR - Port 5432 is NOT listening! - echo PostgreSQL service is probably not running. - echo. - echo To start the service, you can: - echo 1. Open Services (services.msc) - echo 2. Find "postgresql-x64-18" service - echo 3. Right-click and select "Start" - echo. - echo OR run: net start postgresql-x64-18 -) -echo. - -REM Try to connect to database -echo [4] Testing Database Connection... -set PGPASSWORD=postgres -"C:\Program Files\PostgreSQL\18\pgAdmin 4\runtime\psql.exe" -h localhost -U postgres -c "SELECT version();" postgres >nul 2>&1 -if %errorlevel% equ 0 ( - echo OK - Successfully connected to PostgreSQL! - echo. - "C:\Program Files\PostgreSQL\18\pgAdmin 4\runtime\psql.exe" -h localhost -U postgres -c "SELECT version();" postgres - echo. - - REM Check if qquiz database exists - echo [5] Checking QQuiz Database... - "C:\Program Files\PostgreSQL\18\pgAdmin 4\runtime\psql.exe" -h localhost -U postgres -c "\l" postgres | findstr "qquiz_db" >nul - if %errorlevel% equ 0 ( - echo OK - qquiz_db database exists - ) else ( - echo INFO - qquiz_db database does not exist yet - echo This is normal for first-time setup - ) -) else ( - echo ERROR - Cannot connect to PostgreSQL! - echo. - echo Possible reasons: - echo 1. PostgreSQL service is not running - echo 2. Default password 'postgres' is incorrect - echo 3. PostgreSQL is not configured to accept local connections - echo. - echo Please start the PostgreSQL service first! -) -echo. - -echo ======================================== -echo Check Complete -echo ======================================== -echo. -pause diff --git a/scripts/logs_windows.bat b/scripts/logs_windows.bat deleted file mode 100644 index 220f73f..0000000 --- a/scripts/logs_windows.bat +++ /dev/null @@ -1,15 +0,0 @@ -@echo off -chcp 65001 >nul -title QQuiz - 查看日志 - -cd /d "%~dp0.." - -echo. -echo ========================================== -echo QQuiz 服务日志 -echo ========================================== -echo. -echo 按 Ctrl+C 退出日志查看 -echo. - -docker-compose logs -f diff --git a/scripts/push_to_github.bat b/scripts/push_to_github.bat deleted file mode 100644 index ee778e0..0000000 --- a/scripts/push_to_github.bat +++ /dev/null @@ -1,83 +0,0 @@ -@echo off -chcp 65001 >nul -title QQuiz - 推送到 GitHub - -echo. -echo ========================================== -echo 推送 QQuiz 到 GitHub -echo ========================================== -echo. - -cd /d "%~dp0.." - -REM 检查是否有远程仓库 -git remote -v | findstr "origin" >nul -if %errorlevel% neq 0 ( - echo [提示] 首次推送,正在配置远程仓库... - git remote add origin https://github.com/handsomezhuzhu/QQuiz.git - echo [完成] 远程仓库已配置 - echo. -) - -echo [1/4] 检查更改... -git status - -echo. -echo [2/4] 添加所有更改... -git add . - -echo. -set /p commit_msg="请输入提交信息 (或直接回车使用默认): " - -if "%commit_msg%"=="" ( - set commit_msg=Update: minor changes -) - -echo. -echo [3/4] 提交更改... -git commit -m "%commit_msg%" - -if %errorlevel% neq 0 ( - echo [提示] 没有需要提交的更改 -) - -echo. -echo [4/4] 推送到 GitHub... -echo. -echo [重要] 如果是首次推送,需要输入 GitHub 认证: -echo Username: handsomezhuzhu -echo Password: 使用 Personal Access Token (不是密码!) -echo. -echo 如何获取 Token: 参考 docs/GITHUB_PUSH_GUIDE.md -echo. -pause - -git push -u origin main - -if %errorlevel% equ 0 ( - echo. - echo ========================================== - echo ✅ 推送成功! - echo ========================================== - echo. - echo 访问仓库: https://github.com/handsomezhuzhu/QQuiz - echo. -) else ( - echo. - echo ========================================== - echo ❌ 推送失败! - echo ========================================== - echo. - echo 可能的原因: - echo 1. 未配置 GitHub 认证 - echo 2. Token 过期或无效 - echo 3. 网络连接问题 - echo. - echo 解决方案: - echo 1. 阅读 docs/GITHUB_PUSH_GUIDE.md 配置认证 - echo 2. 确认 Personal Access Token 有效 - echo 3. 检查网络连接 - echo. -) - -pause diff --git a/scripts/quick_config.bat b/scripts/quick_config.bat deleted file mode 100644 index d5dcbbd..0000000 --- a/scripts/quick_config.bat +++ /dev/null @@ -1,56 +0,0 @@ -@echo off -chcp 65001 >nul -title QQuiz - 快速配置 - -echo. -echo ========================================== -echo QQuiz 快速配置 -echo ========================================== -echo. - -cd /d "%~dp0.." - -REM 创建 .env 文件 -echo 正在创建配置文件... -echo. - -( -echo # QQuiz 配置文件 - 快速启动版 -echo. -echo # 数据库配置 -echo DATABASE_URL=postgresql+asyncpg://qquiz:qquiz_password@localhost:5432/qquiz_db -echo. -echo # JWT 密钥(安全随机生成) -echo SECRET_KEY=qquiz-secret-key-for-development-change-in-production-32chars -echo. -echo # AI 配置 - OpenAI -echo AI_PROVIDER=openai -echo OPENAI_API_KEY=sk-your-openai-api-key-here -echo OPENAI_BASE_URL=https://api.openai.com/v1 -echo OPENAI_MODEL=gpt-4o-mini -echo. -echo # 系统配置 -echo ALLOW_REGISTRATION=true -echo MAX_UPLOAD_SIZE_MB=10 -echo MAX_DAILY_UPLOADS=20 -echo. -echo # CORS -echo CORS_ORIGINS=http://localhost:3000,http://127.0.0.1:3000 -echo. -echo # 上传目录 -echo UPLOAD_DIR=./uploads -) > .env - -echo ✓ 配置文件已创建 -echo. -echo [重要] 请编辑 OPENAI_API_KEY -echo. -echo 按任意键打开配置文件... -pause >nul - -notepad .env - -echo. -echo 配置完成!现在可以运行 scripts\auto_setup_and_run.bat 启动系统 -echo. -pause diff --git a/scripts/rebuild_backend.bat b/scripts/rebuild_backend.bat new file mode 100644 index 0000000..02e1b04 --- /dev/null +++ b/scripts/rebuild_backend.bat @@ -0,0 +1,48 @@ +@echo off +chcp 65001 >nul +echo ======================================== +echo 重新构建并启动后端服务 +echo ======================================== +echo. + +cd /d "%~dp0.." + +echo [1/3] 停止后端容器... +docker-compose stop backend +if %ERRORLEVEL% NEQ 0 ( + echo ❌ 停止后端失败 + pause + exit /b 1 +) +echo ✅ 后端已停止 +echo. + +echo [2/3] 重新构建后端镜像(这可能需要几分钟)... +docker-compose build backend +if %ERRORLEVEL% NEQ 0 ( + echo ❌ 构建失败 + pause + exit /b 1 +) +echo ✅ 构建完成 +echo. + +echo [3/3] 启动后端容器... +docker-compose up -d backend +if %ERRORLEVEL% NEQ 0 ( + echo ❌ 启动失败 + pause + exit /b 1 +) +echo ✅ 后端已启动 +echo. + +echo ======================================== +echo 重新构建完成! +echo ======================================== +echo. +echo 现在可以查看后端日志: +echo docker-compose logs -f backend +echo. +echo 或者按任意键退出... +pause >nul diff --git a/scripts/restart_docker.bat b/scripts/restart_docker.bat deleted file mode 100644 index fd6cf40..0000000 --- a/scripts/restart_docker.bat +++ /dev/null @@ -1,47 +0,0 @@ -@echo off -title QQuiz - Restart Docker Services -color 0B - -cd /d "%~dp0.." - -echo. -echo ======================================== -echo Restarting QQuiz Docker Services -echo ======================================== -echo. - -echo [1/4] Stopping existing containers... -docker-compose down -echo OK -echo. - -echo [2/4] Rebuilding backend image... -docker-compose build backend --no-cache -echo OK -echo. - -echo [3/4] Starting all services... -docker-compose up -d -echo OK -echo. - -echo [4/4] Waiting for services to be ready... -timeout /t 15 /nobreak >nul -echo. - -echo ======================================== -echo Services Restarted! -echo ======================================== -echo. -echo Checking service status... -docker-compose ps -echo. - -echo Frontend: http://localhost:3000 -echo Backend: http://localhost:8000 -echo Database: MySQL on port 3306 -echo. -echo Login: admin / admin123 -echo. - -pause diff --git a/scripts/setup_docker_mirror.bat b/scripts/setup_docker_mirror.bat deleted file mode 100644 index 00cbd8b..0000000 --- a/scripts/setup_docker_mirror.bat +++ /dev/null @@ -1,56 +0,0 @@ -@echo off -chcp 65001 >nul -title QQuiz - 配置 Docker 镜像加速器 - -echo. -echo ========================================== -echo 配置 Docker 镜像加速器 -echo ========================================== -echo. - -echo [提示] 此脚本将帮助您配置 Docker Desktop 使用国内镜像源 -echo. -echo 请按照以下步骤操作: -echo. -echo 1. 打开 Docker Desktop -echo 2. 点击右上角的齿轮图标 ⚙️ (设置) -echo 3. 选择左侧菜单的 "Docker Engine" -echo 4. 在 JSON 配置中找到或添加 "registry-mirrors" 部分 -echo. -echo 将以下内容复制到配置中: -echo. -echo ========================================== -echo. -echo "registry-mirrors": [ -echo "https://docker.mirrors.ustc.edu.cn", -echo "https://hub-mirror.c.163.com", -echo "https://mirror.baidubce.com" -echo ] -echo. -echo ========================================== -echo. -echo 完整配置示例: -echo. -echo { -echo "builder": { -echo "gc": { -echo "defaultKeepStorage": "20GB", -echo "enabled": true -echo } -echo }, -echo "experimental": false, -echo "registry-mirrors": [ -echo "https://docker.mirrors.ustc.edu.cn", -echo "https://hub-mirror.c.163.com", -echo "https://mirror.baidubce.com" -echo ] -echo } -echo. -echo ========================================== -echo. -echo 5. 点击 "Apply & Restart" 应用并重启 Docker -echo 6. 等待 Docker Desktop 重启完成 -echo 7. 重新运行 start_windows.bat -echo. - -pause diff --git a/scripts/start_app.bat b/scripts/start_app.bat deleted file mode 100644 index 2d53fff..0000000 --- a/scripts/start_app.bat +++ /dev/null @@ -1,117 +0,0 @@ -@echo off -title QQuiz - Starting Application -color 0A - -echo. -echo ======================================== -echo QQuiz - Auto Deploy Script -echo ======================================== -echo. - -cd /d "%~dp0.." - -REM Check if .env exists -if not exist ".env" ( - echo ERROR: .env file not found! - echo Please run setup.bat first - pause - exit /b 1 -) - -echo [1/7] Checking Python... -python --version >nul 2>&1 -if %errorlevel% neq 0 ( - echo ERROR: Python not found! - echo Please install Python 3.11+ from https://www.python.org/ - pause - exit /b 1 -) -echo OK - Python installed -echo. - -echo [2/7] Checking Node.js... -node --version >nul 2>&1 -if %errorlevel% neq 0 ( - echo ERROR: Node.js not found! - echo Please install Node.js 18+ from https://nodejs.org/ - pause - exit /b 1 -) -echo OK - Node.js installed -echo. - -echo [3/7] Creating MySQL database... -echo. -echo Please enter MySQL root password when prompted -echo (Leave blank if no password set) -echo. - -mysql -u root -p -e "DROP DATABASE IF EXISTS qquiz_db; DROP USER IF EXISTS 'qquiz'@'localhost'; CREATE DATABASE qquiz_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'qquiz'@'localhost' IDENTIFIED BY 'qquiz_password'; GRANT ALL PRIVILEGES ON qquiz_db.* TO 'qquiz'@'localhost'; FLUSH PRIVILEGES;" 2>nul - -echo Database setup complete -echo. - -echo [4/7] Installing backend dependencies... -cd backend - -if not exist "venv" ( - python -m venv venv -) - -call venv\Scripts\activate.bat -pip install -q -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple - -echo Backend dependencies installed -echo. - -echo [5/7] Running database migrations... -alembic upgrade head 2>nul - -cd .. -echo. - -echo [6/7] Installing frontend dependencies... -cd frontend - -if not exist "node_modules" ( - call npm config set registry https://registry.npmmirror.com - call npm install --silent -) - -cd .. -echo. - -echo [7/7] Starting services... -echo. - -start "QQuiz Backend" cmd /k "cd /d %~dp0..\backend && call venv\Scripts\activate.bat && echo Backend API: http://localhost:8000 && echo API Docs: http://localhost:8000/docs && echo. && uvicorn main:app --reload" - -timeout /t 5 /nobreak >nul - -start "QQuiz Frontend" cmd /k "cd /d %~dp0..\frontend && echo Frontend: http://localhost:3000 && echo. && npm start" - -timeout /t 3 /nobreak >nul - -echo. -echo ======================================== -echo SUCCESS! QQuiz is starting... -echo ======================================== -echo. -echo Frontend: http://localhost:3000 -echo Backend: http://localhost:8000 -echo API Docs: http://localhost:8000/docs -echo. -echo Default login: -echo Username: admin -echo Password: admin123 -echo. -echo ======================================== -echo. - -timeout /t 5 /nobreak >nul -start http://localhost:3000 - -echo System is running... -echo Close backend and frontend windows to stop -echo. -pause diff --git a/scripts/start_postgres.bat b/scripts/start_postgres.bat deleted file mode 100644 index 03ec064..0000000 --- a/scripts/start_postgres.bat +++ /dev/null @@ -1,44 +0,0 @@ -@echo off -title Start PostgreSQL Service -color 0B - -echo. -echo ======================================== -echo Starting PostgreSQL Service -echo ======================================== -echo. - -echo Attempting to start PostgreSQL service... -echo. - -net start postgresql-x64-18 - -if %errorlevel% equ 0 ( - echo. - echo ======================================== - echo SUCCESS! - echo ======================================== - echo. - echo PostgreSQL service is now running - echo Port: 5432 - echo. - echo You can now run: scripts\fix_and_start.bat - echo. -) else ( - echo. - echo ======================================== - echo Failed to start service - echo ======================================== - echo. - echo Please try starting manually: - echo 1. Press Win+R - echo 2. Type: services.msc - echo 3. Find "postgresql-x64-18" - echo 4. Right-click and select "Start" - echo. - echo OR run this script as Administrator: - echo Right-click this bat file and select "Run as administrator" - echo. -) - -pause diff --git a/scripts/start_windows.bat b/scripts/start_windows.bat deleted file mode 100644 index 79991c8..0000000 --- a/scripts/start_windows.bat +++ /dev/null @@ -1,94 +0,0 @@ -@echo off -chcp 65001 >nul -title QQuiz - 启动服务 - -cd /d "%~dp0.." - -echo. -echo ========================================== -echo QQuiz - 智能刷题与题库管理平台 -echo ========================================== -echo. - -REM 检查是否在项目目录 -if not exist "docker-compose.yml" ( - echo [错误] 请在项目根目录运行此脚本! - pause - exit /b 1 -) - -REM 检查 .env 文件 -if not exist ".env" ( - echo [警告] .env 文件不存在,正在从模板创建... - copy .env.example .env >nul - echo [完成] 已创建 .env 文件,请编辑后重新运行此脚本 - notepad .env - pause - exit /b 1 -) - -echo [1/4] 检查 Docker Desktop... -docker info >nul 2>&1 -if %errorlevel% neq 0 ( - echo [提示] Docker Desktop 未运行,正在启动... - echo. - echo 请手动启动 Docker Desktop,然后按任意键继续... - pause >nul - - REM 再次检查 - docker info >nul 2>&1 - if %errorlevel% neq 0 ( - echo [错误] Docker Desktop 启动失败! - echo 请确保已安装 Docker Desktop: https://www.docker.com/products/docker-desktop/ - pause - exit /b 1 - ) -) -echo [完成] Docker Desktop 运行正常 -echo. - -echo [2/4] 停止旧容器... -docker-compose down >nul 2>&1 -echo [完成] 旧容器已停止 -echo. - -echo [3/4] 启动服务(首次启动需要几分钟下载镜像)... -docker-compose up -d -if %errorlevel% neq 0 ( - echo [错误] 服务启动失败! - echo 请查看错误信息或运行: docker-compose logs - pause - exit /b 1 -) -echo [完成] 服务启动成功 -echo. - -echo [4/4] 等待服务就绪... -timeout /t 5 /nobreak >nul -echo. - -echo ========================================== -echo 服务已启动! -echo ========================================== -echo. -echo 前端地址: http://localhost:3000 -echo 后端地址: http://localhost:8000 -echo API 文档: http://localhost:8000/docs -echo. -echo 默认账户: -echo 用户名: admin -echo 密码: admin123 -echo. -echo ========================================== -echo. - -REM 询问是否打开浏览器 -choice /C YN /M "是否打开浏览器" -if %errorlevel% equ 1 ( - start http://localhost:3000 -) - -echo. -echo 按任意键查看日志(Ctrl+C 退出日志查看)... -pause >nul -docker-compose logs -f diff --git a/scripts/start_windows_china.bat b/scripts/start_windows_china.bat deleted file mode 100644 index 51b7902..0000000 --- a/scripts/start_windows_china.bat +++ /dev/null @@ -1,134 +0,0 @@ -@echo off -chcp 65001 >nul -title QQuiz - 启动服务 (国内优化版) - -cd /d "%~dp0.." - -echo. -echo ========================================== -echo QQuiz - 智能刷题与题库管理平台 -echo (国内网络优化版) -echo ========================================== -echo. - -REM 检查是否在项目目录 -if not exist "docker-compose.yml" ( - echo [错误] 请在项目根目录运行此脚本! - pause - exit /b 1 -) - -REM 检查 .env 文件 -if not exist ".env" ( - echo [警告] .env 文件不存在,正在从模板创建... - copy .env.example .env >nul - echo [完成] 已创建 .env 文件,请编辑后重新运行此脚本 - notepad .env - pause - exit /b 1 -) - -echo [1/5] 检查 Docker Desktop... -docker info >nul 2>&1 -if %errorlevel% neq 0 ( - echo [错误] Docker Desktop 未运行! - echo. - echo 请先启动 Docker Desktop,然后按任意键继续... - pause >nul - - REM 再次检查 - docker info >nul 2>&1 - if %errorlevel% neq 0 ( - echo [错误] Docker Desktop 启动失败! - pause - exit /b 1 - ) -) -echo [完成] Docker Desktop 运行正常 -echo. - -echo [2/5] 检查镜像加速器配置... -docker info | findstr "Registry Mirrors" >nul -if %errorlevel% neq 0 ( - echo [警告] 未检测到镜像加速器配置 - echo. - echo 强烈建议配置镜像加速器以提高下载速度! - echo. - choice /C YN /M "是否现在配置镜像加速器" - if %errorlevel% equ 1 ( - echo. - echo 请按照提示配置 Docker Desktop 镜像加速器... - call scripts\setup_docker_mirror.bat - echo. - echo 配置完成后,请重新运行此脚本 - pause - exit /b 0 - ) -) else ( - echo [完成] 已配置镜像加速器 -) -echo. - -echo [3/5] 停止旧容器... -docker-compose down >nul 2>&1 -echo [完成] -echo. - -echo [4/5] 启动服务(首次启动需要几分钟)... -echo. -echo [提示] 如果下载镜像失败,请: -echo 1. 配置镜像加速器(运行 setup_docker_mirror.bat) -echo 2. 或使用备用启动方式(见下方提示) -echo. - -docker-compose up -d -if %errorlevel% neq 0 ( - echo. - echo [错误] 服务启动失败! - echo. - echo 可能的原因: - echo 1. 网络问题 - 无法下载 Docker 镜像 - echo 2. 端口被占用 - 3000/8000/5432 端口已被使用 - echo 3. 配置错误 - 检查 .env 文件 - echo. - echo 解决方案: - echo 1. 配置镜像加速器: 运行 scripts\setup_docker_mirror.bat - echo 2. 查看详细错误: docker-compose logs - echo 3. 阅读文档: docs\DOCKER_MIRROR_SETUP.md - echo. - pause - exit /b 1 -) -echo [完成] 服务启动成功 -echo. - -echo [5/5] 等待服务就绪... -timeout /t 8 /nobreak >nul -echo. - -echo ========================================== -echo 服务已启动! -echo ========================================== -echo. -echo 前端地址: http://localhost:3000 -echo 后端地址: http://localhost:8000 -echo API 文档: http://localhost:8000/docs -echo. -echo 默认账户: -echo 用户名: admin -echo 密码: admin123 -echo. -echo 镜像加速: 已配置国内镜像源 -echo ========================================== -echo. - -REM 询问是否打开浏览器 -choice /C YN /M "是否打开浏览器" -if %errorlevel% equ 1 ( - start http://localhost:3000 -) - -echo. -echo 按任意键查看日志(Ctrl+C 退出日志查看)... -pause >nul -docker-compose logs -f diff --git a/scripts/view_backend_logs_follow.bat b/scripts/view_backend_logs_follow.bat new file mode 100644 index 0000000..3268b3b --- /dev/null +++ b/scripts/view_backend_logs_follow.bat @@ -0,0 +1,12 @@ +@echo off +chcp 65001 >nul +echo ======================================== +echo 实时查看后端日志 +echo ======================================== +echo. +echo 按 Ctrl+C 可以停止查看日志 +echo. + +cd /d "%~dp0.." + +docker-compose logs -f backend