初次提交
This commit is contained in:
291
backend/quick_start_project.py
Normal file
291
backend/quick_start_project.py
Normal file
@@ -0,0 +1,291 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
快速启动和恢复脚本
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
def check_python_version():
|
||||
"""检查Python版本"""
|
||||
if sys.version_info < (3, 8):
|
||||
print("错误: 需要Python 3.8或更高版本")
|
||||
return False
|
||||
print(f"✓ Python版本: {sys.version}")
|
||||
return True
|
||||
|
||||
def check_virtual_env():
|
||||
"""检查虚拟环境"""
|
||||
venv_path = Path('venv')
|
||||
if venv_path.exists():
|
||||
print("✓ 虚拟环境存在")
|
||||
return True
|
||||
else:
|
||||
print("✗ 虚拟环境不存在,正在创建...")
|
||||
try:
|
||||
subprocess.run([sys.executable, '-m', 'venv', 'venv'], check=True)
|
||||
print("✓ 虚拟环境创建成功")
|
||||
return True
|
||||
except subprocess.CalledProcessError:
|
||||
print("✗ 虚拟环境创建失败")
|
||||
return False
|
||||
|
||||
def activate_virtual_env():
|
||||
"""激活虚拟环境"""
|
||||
if sys.platform == "win32":
|
||||
activate_script = Path('venv/Scripts/activate')
|
||||
else:
|
||||
activate_script = Path('venv/bin/activate')
|
||||
|
||||
if activate_script.exists():
|
||||
print("✓ 虚拟环境激活脚本存在")
|
||||
return True
|
||||
else:
|
||||
print("✗ 虚拟环境激活脚本不存在")
|
||||
return False
|
||||
|
||||
def install_dependencies():
|
||||
"""安装依赖"""
|
||||
print("安装依赖包...")
|
||||
|
||||
if sys.platform == "win32":
|
||||
pip_path = 'venv/Scripts/pip'
|
||||
python_path = 'venv/Scripts/python'
|
||||
else:
|
||||
pip_path = 'venv/bin/pip'
|
||||
python_path = 'venv/bin/python'
|
||||
|
||||
# 升级pip
|
||||
try:
|
||||
subprocess.run([python_path, '-m', 'pip', 'install', '--upgrade', 'pip'], check=True)
|
||||
print("✓ pip升级成功")
|
||||
except subprocess.CalledProcessError:
|
||||
print("✗ pip升级失败")
|
||||
|
||||
# 安装基础依赖
|
||||
basic_packages = [
|
||||
'fastapi==0.104.1',
|
||||
'uvicorn[standard]==0.24.0',
|
||||
'sqlalchemy==2.0.23',
|
||||
'pymysql==1.1.0',
|
||||
'python-jose[cryptography]==3.3.0',
|
||||
'passlib[bcrypt]==1.7.4',
|
||||
'python-multipart==0.0.6',
|
||||
'pydantic==2.5.0',
|
||||
'pydantic-settings==2.1.0',
|
||||
'httpx==0.25.2',
|
||||
'python-dotenv==1.0.0',
|
||||
'loguru>=0.7.0'
|
||||
]
|
||||
|
||||
try:
|
||||
for package in basic_packages:
|
||||
print(f"安装 {package}...")
|
||||
subprocess.run([pip_path, 'install', package], check=True)
|
||||
print("✓ 依赖安装成功")
|
||||
return True
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"✗ 依赖安装失败: {e}")
|
||||
return False
|
||||
|
||||
def create_basic_app_structure():
|
||||
"""创建基本的app结构"""
|
||||
print("创建基本app结构...")
|
||||
|
||||
# 创建目录
|
||||
directories = [
|
||||
'app',
|
||||
'app/core',
|
||||
'app/api/v1/endpoints'
|
||||
]
|
||||
|
||||
for dir_path in directories:
|
||||
Path(dir_path).mkdir(parents=True, exist_ok=True)
|
||||
print(f"✓ 创建目录: {dir_path}")
|
||||
|
||||
# 创建__init__.py文件
|
||||
init_files = [
|
||||
('app/__init__.py', '"""云盘应用包"""\n'),
|
||||
('app/core/__init__.py', '"""核心模块包"""\n'),
|
||||
('app/api/__init__.py', '"""API模块包"""\n'),
|
||||
('app/api/v1/__init__.py', '"""API v1模块包"""\n'),
|
||||
('app/api/v1/endpoints/__init__.py', '"""API端点模块包"""\n')
|
||||
]
|
||||
|
||||
for file_path, content in init_files:
|
||||
full_path = Path(file_path)
|
||||
if not full_path.exists():
|
||||
full_path.write_text(content, encoding='utf-8')
|
||||
print(f"✓ 创建文件: {file_path}")
|
||||
|
||||
def create_essential_files():
|
||||
"""创建必要的文件"""
|
||||
print("创建必要的文件...")
|
||||
|
||||
# app/core/config.py
|
||||
config_content = '''from pydantic_settings import BaseSettings
|
||||
from typing import List
|
||||
|
||||
class Settings(BaseSettings):
|
||||
ENVIRONMENT: str = "development"
|
||||
DEBUG: bool = True
|
||||
DATABASE_URL: str = "mysql+pymysql://mytest_db:mytest_db@101.126.85.76:3306/mytest_db"
|
||||
REDIS_URL: str = "redis://localhost:6379"
|
||||
JWT_SECRET_KEY: str = "your-super-secret-jwt-key-change-in-production"
|
||||
JWT_ALGORITHM: str = "HS256"
|
||||
JWT_EXPIRE_MINUTES: int = 30
|
||||
ALLOWED_HOSTS: List[str] = ["*"]
|
||||
MAX_FILE_SIZE: int = 10 * 1024 * 1024
|
||||
UPLOAD_DIR: str = "uploads"
|
||||
|
||||
class Config:
|
||||
env_file = ".env"
|
||||
case_sensitive = True
|
||||
|
||||
settings = Settings()
|
||||
'''
|
||||
|
||||
Path('app/core/config.py').write_text(config_content, encoding='utf-8')
|
||||
print("✓ 创建 app/core/config.py")
|
||||
|
||||
# app/api/v1/endpoints/health.py
|
||||
health_content = '''from fastapi import APIRouter
|
||||
from datetime import datetime
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
@router.get("/health")
|
||||
async def health_check():
|
||||
return {
|
||||
"status": "healthy",
|
||||
"timestamp": datetime.utcnow(),
|
||||
"version": "1.0.0"
|
||||
}
|
||||
|
||||
@router.get("/")
|
||||
async def root():
|
||||
return {
|
||||
"message": "云盘应用 API",
|
||||
"version": "1.0.0",
|
||||
"docs": "/docs"
|
||||
}
|
||||
'''
|
||||
|
||||
Path('app/api/v1/endpoints/health.py').write_text(health_content, encoding='utf-8')
|
||||
print("✓ 创建 app/api/v1/endpoints/health.py")
|
||||
|
||||
def create_simple_main():
|
||||
"""创建简化的main.py"""
|
||||
print("创建简化的main.py...")
|
||||
|
||||
main_content = '''import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# 添加当前目录到Python路径
|
||||
current_dir = Path(__file__).parent
|
||||
sys.path.insert(0, str(current_dir))
|
||||
|
||||
from fastapi import FastAPI
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from app.core.config import settings
|
||||
from app.api.v1.endpoints import health
|
||||
|
||||
app = FastAPI(
|
||||
title="云盘应用 API",
|
||||
description="现代化的云存储Web应用后端API",
|
||||
version="1.0.0",
|
||||
docs_url="/docs",
|
||||
redoc_url="/redoc"
|
||||
)
|
||||
|
||||
# CORS中间件
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=settings.ALLOWED_HOSTS,
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
# 包含路由
|
||||
app.include_router(health.router, prefix="/api/v1", tags=["health"])
|
||||
|
||||
if __name__ == "__main__":
|
||||
import uvicorn
|
||||
print("启动云盘后端服务...")
|
||||
print("访问地址: http://localhost:8000")
|
||||
print("API文档: http://localhost:8000/docs")
|
||||
|
||||
uvicorn.run(
|
||||
app,
|
||||
host="0.0.0.0",
|
||||
port=8000,
|
||||
reload=False
|
||||
)
|
||||
'''
|
||||
|
||||
Path('main.py').write_text(main_content, encoding='utf-8')
|
||||
print("✓ 创建 main.py")
|
||||
|
||||
def start_project():
|
||||
"""启动项目"""
|
||||
print("启动项目...")
|
||||
|
||||
if sys.platform == "win32":
|
||||
python_path = 'venv/Scripts/python'
|
||||
else:
|
||||
python_path = 'venv/bin/python'
|
||||
|
||||
try:
|
||||
# 直接运行main.py
|
||||
subprocess.run([python_path, 'main.py'], check=True)
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"启动失败: {e}")
|
||||
return False
|
||||
except KeyboardInterrupt:
|
||||
print("服务已停止")
|
||||
return True
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
print("=== 云盘后端快速启动脚本 ===")
|
||||
|
||||
# 检查Python版本
|
||||
if not check_python_version():
|
||||
return
|
||||
|
||||
# 检查和创建虚拟环境
|
||||
if not check_virtual_env():
|
||||
print("虚拟环境创建失败")
|
||||
return
|
||||
|
||||
# 安装依赖
|
||||
if not install_dependencies():
|
||||
print("依赖安装失败")
|
||||
return
|
||||
|
||||
# 创建基本结构
|
||||
create_basic_app_structure()
|
||||
|
||||
# 创建必要文件
|
||||
create_essential_files()
|
||||
|
||||
# 创建简化main.py
|
||||
create_simple_main()
|
||||
|
||||
# 创建日志和上传目录
|
||||
Path('logs').mkdir(exist_ok=True)
|
||||
Path('uploads').mkdir(exist_ok=True)
|
||||
|
||||
print("\n=== 准备完成 ===")
|
||||
print("现在启动项目...")
|
||||
|
||||
# 启动项目
|
||||
start_project()
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user