feat: 实现数据库驱动的API配置管理和项目结构重组

## 新功能
- 实现管理后台API配置管理(OpenAI/Anthropic/Qwen)
- API配置保存到数据库,实时生效无需重启
- API密钥遮罩显示(前10位+后4位)
- 完整endpoint URL自动显示

## 后端改进
- 新增 config_service.py 用于加载数据库配置
- LLMService 支持动态配置注入,回退到环境变量
- 更新 exam.py 和 question.py 使用数据库配置
- 扩展 schemas.py 支持所有API配置字段

## 前端改进
- 重写 AdminSettings.jsx 增强UI体验
- API密钥显示/隐藏切换
- 当前使用的提供商可视化标识
- 移除"需要重启"的误导性提示

## 项目结构重组
- 移动所有脚本到 scripts/ 目录
- 移动所有文档到 docs/ 目录
- 清理 Python 缓存文件

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-12-01 19:24:12 +08:00
parent 0ea8e5aa1e
commit a01f3540c5
47 changed files with 1051 additions and 129 deletions

View File

@@ -0,0 +1,5 @@
@echo off
REM 激活虚拟环境的批处理脚本
cd /d "%~dp0..\backend"
call venv\Scripts\activate.bat
cmd /k

View File

@@ -0,0 +1,258 @@
@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

View File

@@ -0,0 +1,93 @@
@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

89
scripts/check_status.bat Normal file
View File

@@ -0,0 +1,89 @@
@echo off
title QQuiz - System Status Check
cd /d "%~dp0.."
echo.
echo ========================================
echo QQuiz System Status Check
echo ========================================
echo.
echo [1] Checking Python...
python --version
if %errorlevel% neq 0 (
echo ERROR: Python not found!
) else (
echo OK
)
echo.
echo [2] Checking Node.js...
node --version
if %errorlevel% neq 0 (
echo ERROR: Node.js not found!
) else (
echo OK
)
echo.
echo [3] Checking PostgreSQL...
psql --version
if %errorlevel% neq 0 (
echo WARNING: PostgreSQL command not found in PATH
) else (
echo OK
)
echo.
echo [4] Checking if backend is running...
curl -s http://localhost:8000/health >nul 2>&1
if %errorlevel% neq 0 (
echo ERROR: Backend is NOT running on port 8000
echo.
echo Backend must be started first!
echo Run the backend window manually:
echo cd backend
echo venv\Scripts\activate.bat
echo uvicorn main:app --reload
) else (
echo OK - Backend is running
)
echo.
echo [5] Checking if frontend is running...
curl -s http://localhost:3000 >nul 2>&1
if %errorlevel% neq 0 (
echo WARNING: Frontend is NOT running on port 3000
) else (
echo OK - Frontend is running
)
echo.
echo [6] Checking ports...
echo Checking port 8000 (Backend):
netstat -ano | findstr :8000
echo.
echo Checking port 3000 (Frontend):
netstat -ano | findstr :3000
echo.
echo [7] Checking .env configuration...
if exist ".env" (
echo OK - .env file exists
findstr /C:"OPENAI_API_KEY=sk-" .env >nul
if %errorlevel% neq 0 (
echo WARNING: OPENAI_API_KEY may not be configured properly
) else (
echo OK - API Key appears to be configured
)
) else (
echo ERROR: .env file not found!
)
echo.
echo ========================================
echo Diagnosis Complete
echo ========================================
echo.
pause

140
scripts/fix_and_start.bat Normal file
View File

@@ -0,0 +1,140 @@
@echo off
title QQuiz - Fix and Start
color 0E
echo.
echo ========================================
echo QQuiz - Automatic Fix and Start
echo ========================================
echo.
cd /d "%~dp0.."
REM Check if .env exists
if not exist ".env" (
echo Creating .env file...
copy .env.example .env >nul
echo.
echo IMPORTANT: Edit .env and set your OPENAI_API_KEY
echo Opening .env file...
timeout /t 2 /nobreak >nul
notepad .env
echo.
echo Save and close .env, then press any key to continue...
pause >nul
)
echo.
echo Choose database option:
echo.
echo [1] Use Docker (Recommended - Easy)
echo [2] Use Local PostgreSQL (Advanced)
echo.
choice /C 12 /M "Select option"
if %errorlevel% equ 1 (
echo.
echo Using Docker PostgreSQL...
echo.
REM Check Docker
docker --version >nul 2>&1
if %errorlevel% neq 0 (
echo ERROR: Docker not found!
echo.
echo Please install Docker Desktop:
echo https://www.docker.com/products/docker-desktop/
echo.
echo After installing Docker, run this script again.
pause
exit /b 1
)
echo Starting MySQL in Docker...
docker-compose up -d mysql
if %errorlevel% neq 0 (
echo.
echo Docker failed to start. Trying to fix...
docker-compose down
docker-compose up -d mysql
)
echo Waiting for database...
timeout /t 10 /nobreak >nul
) else (
echo.
echo Using Local MySQL...
echo.
echo Make sure MySQL is running on port 3306
echo.
echo If you see connection errors, you need to:
echo 1. Start MySQL service
echo 2. Or install MySQL from https://dev.mysql.com/downloads/installer/
echo 3. Or choose option 1 to use Docker instead
echo.
pause
)
echo.
echo ========================================
echo Starting Backend...
echo ========================================
echo.
cd backend
if not exist "venv\Scripts\activate.bat" (
echo Creating virtual environment...
python -m venv venv
)
echo Installing dependencies...
call venv\Scripts\activate.bat
pip install -q -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
echo.
echo Running database migrations...
alembic upgrade head
if %errorlevel% neq 0 (
echo.
echo WARNING: Database migration failed
echo The app will try to create tables automatically
echo.
)
cd ..
echo.
echo Starting services...
echo.
start "QQuiz Backend" cmd /k "cd /d %~dp0..backend && call venv\Scripts\activate.bat && echo Backend: http://localhost:8000 && echo Docs: http://localhost:8000/docs && echo. && uvicorn main:app --reload"
timeout /t 8 /nobreak >nul
start "QQuiz Frontend" cmd /k "cd /d %~dp0..frontend && echo Frontend: http://localhost:3000 && echo. && npm start"
echo.
echo ========================================
echo SUCCESS! QQuiz is starting...
echo ========================================
echo.
echo Frontend: http://localhost:3000
echo Backend: http://localhost:8000
echo.
echo Login: admin / admin123
echo.
echo ========================================
echo.
timeout /t 5 /nobreak >nul
start http://localhost:3000
echo.
echo System is running...
echo Close backend/frontend windows to stop
echo.
pause

15
scripts/logs_windows.bat Normal file
View File

@@ -0,0 +1,15 @@
@echo off
chcp 65001 >nul
title QQuiz - 查看日志
cd /d "%~dp0.."
echo.
echo ==========================================
echo QQuiz 服务日志
echo ==========================================
echo.
echo 按 Ctrl+C 退出日志查看
echo.
docker-compose logs -f

View File

@@ -0,0 +1,83 @@
@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

56
scripts/quick_config.bat Normal file
View File

@@ -0,0 +1,56 @@
@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

View File

@@ -0,0 +1,31 @@
@echo off
title QQuiz - Restart Backend
color 0B
cd /d "%~dp0.."
echo.
echo ========================================
echo Restarting Backend Container
echo ========================================
echo.
echo Restarting backend...
docker-compose restart backend
echo.
echo Waiting for backend to start...
timeout /t 5 /nobreak >nul
echo.
echo ========================================
echo Backend Restarted!
echo ========================================
echo.
echo Backend URL: http://localhost:8000
echo API Docs: http://localhost:8000/docs
echo.
echo View logs: scripts\view_backend_logs.bat
echo.
pause

View File

@@ -0,0 +1,47 @@
@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

View File

@@ -0,0 +1,60 @@
@echo off
chcp 65001 >nul
title QQuiz Backend - 本地运行
echo.
echo ==========================================
echo QQuiz Backend - 本地启动
echo ==========================================
echo.
cd /d "%~dp0..\backend"
REM 检查虚拟环境是否存在
if not exist "venv\Scripts\activate.bat" (
echo [1/5] 创建虚拟环境...
python -m venv venv
echo [完成]
echo.
) else (
echo [1/5] 虚拟环境已存在
echo.
)
echo [2/5] 激活虚拟环境...
call venv\Scripts\activate.bat
echo [完成]
echo.
echo [3/5] 安装依赖...
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
if %errorlevel% neq 0 (
echo [错误] 依赖安装失败
pause
exit /b 1
)
echo [完成]
echo.
echo [4/5] 运行数据库迁移...
alembic upgrade head
if %errorlevel% neq 0 (
echo [警告] 数据库迁移失败,请检查 PostgreSQL 是否运行
echo.
)
echo.
echo [5/5] 启动后端服务...
echo.
echo ==========================================
echo 后端服务启动中...
echo ==========================================
echo.
echo API 地址: http://localhost:8000
echo API 文档: http://localhost:8000/docs
echo.
echo 按 Ctrl+C 停止服务
echo ==========================================
echo.
uvicorn main:app --reload

View File

@@ -0,0 +1,44 @@
@echo off
chcp 65001 >nul
title QQuiz Frontend - 本地运行
echo.
echo ==========================================
echo QQuiz Frontend - 本地启动
echo ==========================================
echo.
cd /d "%~dp0..\frontend"
REM 检查 node_modules 是否存在
if not exist "node_modules" (
echo [1/2] 安装前端依赖(首次运行需要几分钟)...
echo.
echo [提示] 使用淘宝镜像加速下载...
call npm config set registry https://registry.npmmirror.com
call npm install
if %errorlevel% neq 0 (
echo [错误] 依赖安装失败
pause
exit /b 1
)
echo [完成]
echo.
) else (
echo [1/2] 依赖已安装
echo.
)
echo [2/2] 启动前端服务...
echo.
echo ==========================================
echo 前端服务启动中...
echo ==========================================
echo.
echo 前端地址: http://localhost:3000
echo.
echo 按 Ctrl+C 停止服务
echo ==========================================
echo.
call npm start

88
scripts/run_local.sh Normal file
View File

@@ -0,0 +1,88 @@
#!/bin/bash
set -e
echo "===== QQuiz Local Deployment Script ====="
# Check if .env exists
if [ ! -f .env ]; then
echo "Error: .env file not found!"
echo "Please copy .env.example to .env and configure it."
exit 1
fi
# Load environment variables
export $(grep -v '^#' .env | xargs)
# Check Python version
PYTHON_VERSION=$(python3 --version 2>&1 | awk '{print $2}')
echo "Python version: $PYTHON_VERSION"
# Check if PostgreSQL is running
echo "Checking PostgreSQL connection..."
if ! pg_isready -h localhost -p 5432 &> /dev/null; then
echo "Warning: PostgreSQL is not running on localhost:5432"
echo "Please start PostgreSQL or use Docker: docker-compose up -d postgres"
read -p "Continue anyway? (y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
fi
# Install backend dependencies
echo "Installing backend dependencies..."
cd backend
if [ ! -d "venv" ]; then
echo "Creating virtual environment..."
python3 -m venv venv
fi
source venv/bin/activate
pip install -r requirements.txt
# Run database migrations
echo "Running database migrations..."
alembic upgrade head || echo "Warning: Alembic migration failed. Database might not be initialized."
# Create uploads directory
mkdir -p uploads
# Start backend
echo "Starting backend on http://localhost:8000..."
uvicorn main:app --host 0.0.0.0 --port 8000 --reload &
BACKEND_PID=$!
cd ../frontend
# Install frontend dependencies
echo "Installing frontend dependencies..."
if [ ! -d "node_modules" ]; then
npm install
fi
# Start frontend
echo "Starting frontend on http://localhost:3000..."
npm start &
FRONTEND_PID=$!
echo ""
echo "===== QQuiz is running! ====="
echo "Backend: http://localhost:8000"
echo "Frontend: http://localhost:3000"
echo "API Docs: http://localhost:8000/docs"
echo ""
echo "Press Ctrl+C to stop all services"
# Handle cleanup on exit
cleanup() {
echo ""
echo "Stopping services..."
kill $BACKEND_PID $FRONTEND_PID 2>/dev/null
exit 0
}
trap cleanup SIGINT SIGTERM
# Wait for processes
wait

34
scripts/setup.bat Normal file
View File

@@ -0,0 +1,34 @@
@echo off
cd /d "%~dp0.."
echo Creating .env configuration file...
echo.
(
echo DATABASE_URL=mysql+aiomysql://qquiz:qquiz_password@localhost:3306/qquiz_db
echo SECRET_KEY=qquiz-secret-key-for-development-change-in-production-32chars
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 ALLOW_REGISTRATION=true
echo MAX_UPLOAD_SIZE_MB=10
echo MAX_DAILY_UPLOADS=20
echo CORS_ORIGINS=http://localhost:3000,http://127.0.0.1:3000
echo UPLOAD_DIR=./uploads
) > .env
echo Done! .env file created.
echo.
echo IMPORTANT: Please edit OPENAI_API_KEY in .env file
echo.
echo Opening .env file now...
timeout /t 2 /nobreak >nul
notepad .env
echo.
echo Configuration complete!
echo Now you can run: start_app.bat
echo.
pause

View File

@@ -0,0 +1,56 @@
@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

117
scripts/start_app.bat Normal file
View File

@@ -0,0 +1,117 @@
@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

View File

@@ -0,0 +1,44 @@
@echo off
title QQuiz Backend Server
color 0B
echo.
echo ========================================
echo Starting QQuiz Backend Server
echo ========================================
echo.
cd /d "%~dp0..\backend"
if not exist "venv\Scripts\activate.bat" (
echo Creating virtual environment...
python -m venv venv
)
echo Activating virtual environment...
call venv\Scripts\activate.bat
echo.
echo Installing/updating dependencies...
pip install -q -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
echo.
echo Running database migrations...
alembic upgrade head
echo.
echo ========================================
echo Backend Server Starting...
echo ========================================
echo.
echo API URL: http://localhost:8000
echo API Docs: http://localhost:8000/docs
echo Health: http://localhost:8000/health
echo.
echo Press Ctrl+C to stop
echo ========================================
echo.
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
pause

View File

@@ -0,0 +1,34 @@
@echo off
title QQuiz Frontend Server
color 0B
echo.
echo ========================================
echo Starting QQuiz Frontend Server
echo ========================================
echo.
cd /d "%~dp0..\frontend"
if not exist "node_modules" (
echo Installing dependencies (first time only)...
call npm config set registry https://registry.npmmirror.com
call npm install
)
echo.
echo ========================================
echo Frontend Server Starting...
echo ========================================
echo.
echo Frontend URL: http://localhost:3000
echo.
echo Make sure backend is running on port 8000!
echo.
echo Press Ctrl+C to stop
echo ========================================
echo.
npm start
pause

View File

@@ -0,0 +1,44 @@
@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

94
scripts/start_windows.bat Normal file
View File

@@ -0,0 +1,94 @@
@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

View File

@@ -0,0 +1,134 @@
@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

View File

@@ -0,0 +1,74 @@
@echo off
title QQuiz - Start with Docker Database
color 0B
echo.
echo ========================================
echo QQuiz - Starting with Docker DB
echo ========================================
echo.
cd /d "%~dp0.."
echo [1/4] Checking Docker...
docker --version >nul 2>&1
if %errorlevel% neq 0 (
echo ERROR: Docker not found!
echo Please install Docker Desktop from https://www.docker.com/
pause
exit /b 1
)
echo OK - Docker installed
echo.
echo [2/4] Starting MySQL in Docker...
docker-compose up -d mysql
if %errorlevel% neq 0 (
echo ERROR: Failed to start MySQL
echo Try: docker-compose down
echo Then run this script again
pause
exit /b 1
)
echo OK - MySQL started
echo Waiting for database to be ready...
echo.
timeout /t 10 /nobreak >nul
echo.
echo [3/4] Starting Backend...
start "QQuiz Backend" cmd /k "cd /d %~dp0..backend && call venv\Scripts\activate.bat && echo ======================================== && echo QQuiz Backend Server && echo ======================================== && echo. && echo API: http://localhost:8000 && echo Docs: http://localhost:8000/docs && echo. && alembic upgrade head && echo. && uvicorn main:app --reload"
echo Waiting for backend to start...
timeout /t 8 /nobreak >nul
echo.
echo [4/4] Starting Frontend...
start "QQuiz Frontend" cmd /k "cd /d %~dp0..frontend && echo ======================================== && echo QQuiz Frontend Server && echo ======================================== && echo. && echo URL: http://localhost:3000 && echo. && npm start"
echo.
echo ========================================
echo SUCCESS! QQuiz is starting...
echo ========================================
echo.
echo Frontend: http://localhost:3000
echo Backend: http://localhost:8000
echo Database: Running in Docker
echo.
echo Login:
echo Username: admin
echo Password: admin123
echo.
echo ========================================
echo.
timeout /t 5 /nobreak >nul
start http://localhost:3000
echo System running...
echo To stop: Close the backend/frontend windows
echo To stop database: docker-compose down
echo.
pause

24
scripts/stop_windows.bat Normal file
View File

@@ -0,0 +1,24 @@
@echo off
chcp 65001 >nul
title QQuiz - 停止服务
cd /d "%~dp0.."
echo.
echo ==========================================
echo 停止 QQuiz 服务
echo ==========================================
echo.
docker-compose down
if %errorlevel% equ 0 (
echo.
echo [完成] 服务已停止
) else (
echo.
echo [错误] 停止服务失败
)
echo.
pause

View File

@@ -0,0 +1,15 @@
@echo off
title QQuiz - Backend Logs
color 0B
cd /d "%~dp0.."
echo.
echo ========================================
echo QQuiz Backend Logs (Real-time)
echo ========================================
echo.
echo Press Ctrl+C to stop viewing logs
echo.
docker-compose logs -f --tail=50 backend