mirror of
https://github.com/handsomezhuzhu/QQuiz.git
synced 2026-02-20 12:00:14 +00:00
docs: 完善文档和清理项目,添加 Gemini 配置指南
主要更新: 📚 文档改进 - 新增 AI_CONFIGURATION.md:详细的 AI 提供商配置指南 - 新增 CHINA_MIRROR_GUIDE.md:中国镜像加速指南 - 删除 6 个过时文档(DEPLOYMENT.md, QUICK_START.md 等) - 更新 README.md:添加 Gemini 功能特性和 AI 提供商对比表 🧹 脚本清理 - 删除 11 个重复/过时脚本(从 25 个减少到 14 个) - 删除 PostgreSQL 相关脚本(项目使用 MySQL) - 删除重复的启动脚本(start_windows.bat, start_app.bat 等) ⚙️ 配置文件更新 - 更新 .env.example:添加 Gemini 配置示例和说明 - 默认 AI_PROVIDER 改为 gemini(推荐) - 添加各提供商的获取 API Key 链接 🎯 核心改进 - 突出 Gemini 原生 PDF 理解优势 - 提供清晰的 AI 提供商选择指南 - 简化项目结构,提高可维护性 清理内容: - 删除 docs: DEPLOYMENT.md, DOCKER_MIRROR_SETUP.md, GITHUB_PUSH_GUIDE.md, QUICK_START.md, README_QUICKSTART.md, START_HERE.txt - 删除 scripts: auto_setup_and_run.bat, check_postgres.bat, logs_windows.bat, push_to_github.bat, quick_config.bat, restart_docker.bat, setup_docker_mirror.bat, start_app.bat, start_postgres.bat, start_windows.bat, start_windows_china.bat 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
18
.env.example
18
.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
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -54,3 +54,4 @@ htmlcov/
|
||||
|
||||
# Docker
|
||||
*.log
|
||||
docker-compose.override.yml
|
||||
|
||||
72
README.md
72
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 地址。
|
||||
|
||||
## 技术栈
|
||||
|
||||
**后端:**
|
||||
|
||||
@@ -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
|
||||
|
||||
32
backend/Dockerfile.china
Normal file
32
backend/Dockerfile.china
Normal file
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
201
docs/AI_CONFIGURATION.md
Normal file
201
docs/AI_CONFIGURATION.md
Normal file
@@ -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 轮训服务
|
||||
124
docs/CHINA_MIRROR_GUIDE.md
Normal file
124
docs/CHINA_MIRROR_GUIDE.md
Normal file
@@ -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`
|
||||
@@ -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
|
||||
@@ -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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
祝你成功!🎉
|
||||
@@ -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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
祝你推送成功!🚀
|
||||
@@ -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
|
||||
|
||||
# 结束进程(替换 <PID> 为实际进程 ID)
|
||||
taskkill /F /PID <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。
|
||||
@@ -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 <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! 🚀
|
||||
@@ -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步!
|
||||
==========================================
|
||||
22
frontend/Dockerfile.china
Normal file
22
frontend/Dockerfile.china
Normal file
@@ -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"]
|
||||
@@ -98,9 +98,17 @@ export const ExamList = () => {
|
||||
toast.success('题库创建成功,正在解析文档...')
|
||||
setShowCreateModal(false)
|
||||
setFormData({ title: '', file: null })
|
||||
|
||||
// 跳转到新创建的试卷详情页
|
||||
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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
48
scripts/rebuild_backend.bat
Normal file
48
scripts/rebuild_backend.bat
Normal file
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
12
scripts/view_backend_logs_follow.bat
Normal file
12
scripts/view_backend_logs_follow.bat
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user