初次提交

This commit is contained in:
2025-10-14 20:05:29 +08:00
commit 6e4e48fdd2
673 changed files with 437006 additions and 0 deletions

View File

@@ -0,0 +1,491 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
重新创建完整的app目录结构和文件
"""
import os
from pathlib import Path
def create_app_directory():
"""创建app目录结构"""
print("=== 创建app目录结构 ===")
base_dir = Path('.')
# 创建主要目录结构
directories = [
'app',
'app/core',
'app/api',
'app/api/v1',
'app/api/v1/endpoints',
'app/models',
'app/schemas',
'app/services',
'app/utils'
]
for dir_path in directories:
full_path = base_dir / dir_path
full_path.mkdir(parents=True, exist_ok=True)
print(f"✓ 创建目录: {dir_path}")
def create_init_files():
"""创建__init__.py文件"""
print("\n=== 创建__init__.py文件 ===")
base_dir = Path('.')
# 各目录的__init__.py内容
init_contents = {
'app/__init__.py': '"""云盘应用包"""\n\n__version__ = "1.0.0"\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',
'app/models/__init__.py': '"""数据模型包"""\n',
'app/schemas/__init__.py': '"""Pydantic模式包"""\n',
'app/services/__init__.py': '"""业务逻辑服务包"""\n',
'app/utils/__init__.py': '"""工具函数包"""\n'
}
for file_path, content in init_contents.items():
full_path = base_dir / file_path
if not full_path.exists():
full_path.write_text(content, encoding='utf-8')
print(f"✓ 创建文件: {file_path}")
def create_core_files():
"""创建核心文件"""
print("\n=== 创建核心文件 ===")
base_dir = Path('.')
# app/core/config.py
config_content = '''from pydantic_settings import BaseSettings
from typing import List
import os
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配置
REDIS_URL: str = "redis://localhost:6379"
# JWT配置
JWT_SECRET_KEY: str = "your-super-secret-jwt-key-change-in-production"
JWT_ALGORITHM: str = "HS256"
JWT_EXPIRE_MINUTES: int = 30
JWT_REFRESH_EXPIRE_DAYS: int = 7
# CORS配置
ALLOWED_HOSTS: List[str] = [
"http://localhost:3000",
"http://localhost:3001",
"http://localhost:3002",
"http://localhost:3003",
"http://localhost:3004",
"http://127.0.0.1:3000",
"http://127.0.0.1:3001",
"http://127.0.0.1:3002",
"http://127.0.0.1:3003",
"http://127.0.0.1:3004",
"http://172.16.16.89:3000",
"http://172.16.16.89:3001",
"http://172.16.16.89:3002",
"http://172.16.16.89:3003",
"http://172.16.16.89:3004",
"*"
]
# 文件上传配置
MAX_FILE_SIZE: int = 10 * 1024 * 1024 # 10MB
UPLOAD_DIR: str = "uploads"
ALLOWED_EXTENSIONS: List[str] = [
# 图片
".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp", ".svg",
# 文档
".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx",
".txt", ".rtf", ".csv",
# 压缩文件
".zip", ".rar", ".7z", ".tar", ".gz",
# 音频
".mp3", ".wav", ".flac", ".aac", ".ogg",
# 视频
".mp4", ".avi", ".mkv", ".mov", ".wmv", ".flv",
# 代码文件
".py", ".js", ".html", ".css", ".json", ".xml", ".yaml", ".yml",
".java", ".cpp", ".c", ".h", ".cs", ".php", ".rb", ".go",
".sql", ".sh", ".bat", ".ps1", ".md", ".log"
]
# 安全配置
BCRYPT_ROUNDS: int = 12
class Config:
env_file = ".env"
case_sensitive = True
settings = Settings()
'''
config_file = base_dir / 'app' / 'core' / 'config.py'
config_file.write_text(config_content, encoding='utf-8')
print("✓ 创建 app/core/config.py")
# app/core/database.py
database_content = '''from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from app.core.config import settings
# 创建数据库引擎
engine = create_engine(
settings.DATABASE_URL,
pool_pre_ping=True,
pool_recycle=300,
)
# 创建会话工厂
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 创建Base类
Base = declarative_base()
def get_db():
"""获取数据库会话"""
db = SessionLocal()
try:
yield db
finally:
db.close()
'''
database_file = base_dir / 'app' / 'core' / 'database.py'
database_file.write_text(database_content, encoding='utf-8')
print("✓ 创建 app/core/database.py")
# app/core/security.py
security_content = '''from datetime import datetime, timedelta
from typing import Optional
from jose import JWTError, jwt
from passlib.context import CryptContext
from app.core.config import settings
# 密码加密上下文
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
def verify_password(plain_password: str, hashed_password: str) -> bool:
"""验证密码"""
return pwd_context.verify(plain_password, hashed_password)
def get_password_hash(password: str) -> str:
"""获取密码哈希"""
return pwd_context.hash(password)
def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
"""创建访问令牌"""
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
else:
expire = datetime.utcnow() + timedelta(minutes=settings.JWT_EXPIRE_MINUTES)
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, settings.JWT_SECRET_KEY, algorithm=settings.JWT_ALGORITHM)
return encoded_jwt
def verify_token(token: str):
"""验证令牌"""
try:
payload = jwt.decode(token, settings.JWT_SECRET_KEY, algorithms=[settings.JWT_ALGORITHM])
return payload
except JWTError:
return None
'''
security_file = base_dir / 'app' / 'core' / 'security.py'
security_file.write_text(security_content, encoding='utf-8')
print("✓ 创建 app/core/security.py")
def create_api_files():
"""创建API文件"""
print("\n=== 创建API文件 ===")
base_dir = Path('.')
# app/api/v1/endpoints/health.py
health_content = '''from fastapi import APIRouter, status
from datetime import datetime
router = APIRouter()
@router.get("/health", status_code=status.HTTP_200_OK)
async def health_check():
"""健康检查端点"""
return {
"status": "healthy",
"timestamp": datetime.utcnow(),
"version": "1.0.0",
"message": "云盘后端服务运行正常"
}
@router.get("/")
async def root():
"""根端点"""
return {
"message": "云盘应用 API",
"version": "1.0.0",
"docs": "/docs",
"health": "/api/v1/health"
}
'''
health_file = base_dir / 'app' / 'api' / 'v1' / 'endpoints' / 'health.py'
health_file.write_text(health_content, encoding='utf-8')
print("✓ 创建 app/api/v1/endpoints/health.py")
# app/api/v1/endpoints/auth.py
auth_content = '''from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from sqlalchemy.orm import Session
from typing import Optional
from datetime import timedelta
from app.core.database import get_db
from app.core.security import verify_password, create_access_token
from app.core.config import settings
from app.schemas.user import UserCreate, UserResponse, Token
router = APIRouter()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="api/v1/auth/token")
@router.post("/register", response_model=UserResponse)
async def register(user_data: UserCreate, db: Session = Depends(get_db)):
"""用户注册"""
# TODO: 实现用户注册逻辑
return {"message": "注册功能待实现"}
@router.post("/token", response_model=Token)
async def login(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)):
"""用户登录"""
# TODO: 实现用户登录逻辑
return {
"access_token": "dummy_token",
"token_type": "bearer",
"expires_in": settings.JWT_EXPIRE_MINUTES * 60
}
@router.get("/me", response_model=UserResponse)
async def get_current_user(token: str = Depends(oauth2_scheme), db: Session = Depends(get_db)):
"""获取当前用户信息"""
# TODO: 实现获取当前用户逻辑
return {"message": "用户信息功能待实现"}
'''
auth_file = base_dir / 'app' / 'api' / 'v1' / 'endpoints' / 'auth.py'
auth_file.write_text(auth_content, encoding='utf-8')
print("✓ 创建 app/api/v1/endpoints/auth.py")
# app/api/v1/endpoints/files.py
files_content = '''from fastapi import APIRouter, Depends, HTTPException, UploadFile, File
from sqlalchemy.orm import Session
from typing import List
from app.core.database import get_db
from app.schemas.file import FileResponse, FileUploadResponse
router = APIRouter()
@router.post("/upload", response_model=FileUploadResponse)
async def upload_file(
file: UploadFile = File(...),
db: Session = Depends(get_db)
):
"""上传文件"""
# TODO: 实现文件上传逻辑
return {
"message": "文件上传功能待实现",
"filename": file.filename,
"size": 0
}
@router.get("/list", response_model=List[FileResponse])
async def list_files(
skip: int = 0,
limit: int = 100,
db: Session = Depends(get_db)
):
"""获取文件列表"""
# TODO: 实现文件列表逻辑
return []
@router.get("/{file_id}", response_model=FileResponse)
async def get_file_info(file_id: int, db: Session = Depends(get_db)):
"""获取文件信息"""
# TODO: 实现获取文件信息逻辑
return {"message": "文件信息功能待实现"}
@router.delete("/{file_id}")
async def delete_file(file_id: int, db: Session = Depends(get_db)):
"""删除文件"""
# TODO: 实现文件删除逻辑
return {"message": "文件删除功能待实现"}
'''
files_file = base_dir / 'app' / 'api' / 'v1' / 'endpoints' / 'files.py'
files_file.write_text(files_content, encoding='utf-8')
print("✓ 创建 app/api/v1/endpoints/files.py")
def create_schema_files():
"""创建Pydantic模式文件"""
print("\n=== 创建模式文件 ===")
base_dir = Path('.')
# app/schemas/user.py
user_schema_content = '''from pydantic import BaseModel, EmailStr
from typing import Optional
class UserBase(BaseModel):
username: str
email: EmailStr
class UserCreate(UserBase):
password: str
confirm_password: str
class UserUpdate(BaseModel):
username: Optional[str] = None
email: Optional[EmailStr] = None
class UserResponse(UserBase):
id: int
is_active: bool
created_at: str
class Config:
from_attributes = True
class Token(BaseModel):
access_token: str
token_type: str
expires_in: int
'''
user_schema_file = base_dir / 'app' / 'schemas' / 'user.py'
user_schema_file.write_text(user_schema_content, encoding='utf-8')
print("✓ 创建 app/schemas/user.py")
# app/schemas/file.py
file_schema_content = '''from pydantic import BaseModel
from typing import Optional
from datetime import datetime
class FileBase(BaseModel):
filename: str
original_filename: str
file_size: int
content_type: str
class FileCreate(FileBase):
pass
class FileUpdate(BaseModel):
filename: Optional[str] = None
class FileResponse(FileBase):
id: int
user_id: int
file_path: str
created_at: datetime
class Config:
from_attributes = True
class FileUploadResponse(BaseModel):
message: str
filename: str
size: int
file_id: Optional[int] = None
'''
file_schema_file = base_dir / 'app' / 'schemas' / 'file.py'
file_schema_file.write_text(file_schema_content, encoding='utf-8')
print("✓ 创建 app/schemas/file.py")
def verify_structure():
"""验证项目结构"""
print("\n=== 验证项目结构 ===")
base_dir = Path('.')
required_files = [
'app/__init__.py',
'app/core/__init__.py',
'app/core/config.py',
'app/core/database.py',
'app/core/security.py',
'app/api/__init__.py',
'app/api/v1/__init__.py',
'app/api/v1/endpoints/__init__.py',
'app/api/v1/endpoints/health.py',
'app/api/v1/endpoints/auth.py',
'app/api/v1/endpoints/files.py',
'app/schemas/__init__.py',
'app/schemas/user.py',
'app/schemas/file.py'
]
all_exist = True
for file_path in required_files:
full_path = base_dir / file_path
if full_path.exists():
print(f"{file_path}")
else:
print(f"{file_path}")
all_exist = False
if all_exist:
print("\n🎉 所有文件创建成功!")
print("现在可以运行: python main.py")
else:
print("\n⚠️ 部分文件创建失败,请检查错误信息")
def main():
"""主函数"""
print("=== 重新创建app目录结构 ===")
# 创建目录结构
create_app_directory()
# 创建__init__.py文件
create_init_files()
# 创建核心文件
create_core_files()
# 创建API文件
create_api_files()
# 创建模式文件
create_schema_files()
# 验证结构
verify_structure()
print("\n=== 恢复完成 ===")
print("app目录结构和所有必要文件已重新创建")
print("下一步:")
print("1. 激活虚拟环境: source venv/bin/activate")
print("2. 安装依赖: pip install -r requirements.txt")
print("3. 启动服务: python main.py")
if __name__ == '__main__':
main()