feat: 初始化考培练系统项目

- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
This commit is contained in:
111
2026-01-24 19:33:28 +08:00
commit 998211c483
1197 changed files with 228429 additions and 0 deletions

82
backend/debug_api.py Normal file
View File

@@ -0,0 +1,82 @@
#!/usr/bin/env python3
"""
调试API问题
"""
import asyncio
import os
import sys
from pathlib import Path
# 设置环境变量
os.environ["DATABASE_URL"] = "mysql+aiomysql://root:root@localhost:3306/kaopeilian"
os.environ["SECRET_KEY"] = "dev-secret-key-for-testing-only-not-for-production"
# 添加项目根目录到Python路径
project_root = Path(__file__).parent
sys.path.insert(0, str(project_root))
async def debug_login():
"""调试登录问题"""
try:
# 导入所有必要的模块
from app.config.database import AsyncSessionLocal
from app.services.auth_service import AuthService
from app.schemas.auth import UserLogin, Token
from app.schemas.base import ResponseModel
from app.core.exceptions import BaseError
from app.core.logger import logger
from fastapi import HTTPException, status
print("🔍 开始调试登录流程...")
# 创建登录数据
login_data = UserLogin(username="testuser", password="TestPass123!")
print(f"📝 登录数据: {login_data}")
async with AsyncSessionLocal() as db:
try:
print("🔐 开始认证...")
auth_service = AuthService(db)
# 验证用户
user = await auth_service.authenticate_user(
username=login_data.username,
password=login_data.password
)
print(f"✅ 用户认证成功: {user.username}")
# 创建tokens
tokens = await auth_service.create_tokens_for_user(user)
print(f"✅ Token创建成功")
# 创建响应
response = ResponseModel(data=tokens)
print(f"✅ 响应创建成功: {response}")
return response
except BaseError as e:
print(f"❌ 业务错误: {e}")
raise HTTPException(
status_code=e.code,
detail={
"message": e.message,
"error_code": e.error_code
}
)
except Exception as e:
print(f"❌ 系统错误: {e}")
import traceback
traceback.print_exc()
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail={"message": "登录失败,请稍后重试"}
)
except Exception as e:
print(f"❌ 调试失败: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
asyncio.run(debug_login())