diff --git a/backend/config/__init__.py b/backend/config/__init__.py new file mode 100644 index 00000000..fc83fea7 --- /dev/null +++ b/backend/config/__init__.py @@ -0,0 +1,12 @@ +from .settings import get_settings, Settings +from .database import get_db, init_db, Base, engine, AsyncSessionLocal + +__all__ = [ + "get_settings", + "Settings", + "get_db", + "init_db", + "Base", + "engine", + "AsyncSessionLocal", +] diff --git a/backend/config/__pycache__/__init__.cpython-310.pyc b/backend/config/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 00000000..ab6cf7e2 Binary files /dev/null and b/backend/config/__pycache__/__init__.cpython-310.pyc differ diff --git a/backend/config/__pycache__/database.cpython-310.pyc b/backend/config/__pycache__/database.cpython-310.pyc new file mode 100644 index 00000000..dbe433aa Binary files /dev/null and b/backend/config/__pycache__/database.cpython-310.pyc differ diff --git a/backend/config/__pycache__/settings.cpython-310.pyc b/backend/config/__pycache__/settings.cpython-310.pyc new file mode 100644 index 00000000..aa592d1e Binary files /dev/null and b/backend/config/__pycache__/settings.cpython-310.pyc differ diff --git a/backend/config/database.py b/backend/config/database.py new file mode 100644 index 00000000..4ca91096 --- /dev/null +++ b/backend/config/database.py @@ -0,0 +1,36 @@ +from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker +from sqlalchemy.orm import declarative_base +from .settings import get_settings + +settings = get_settings() + +DATABASE_URL = ( + f"mysql+aiomysql://{settings.DB_USER}:{settings.DB_PASSWORD}" + f"@{settings.DB_HOST}:{settings.DB_PORT}/{settings.DB_NAME}" + f"?charset={settings.DB_CHARSET}" +) + +engine = create_async_engine(DATABASE_URL, echo=settings.DEBUG, future=True) + +AsyncSessionLocal = async_sessionmaker( + engine, class_=AsyncSession, expire_on_commit=False +) + +Base = declarative_base() + + +async def get_db(): + async with AsyncSessionLocal() as session: + try: + yield session + await session.commit() + except Exception: + await session.rollback() + raise + finally: + await session.close() + + +async def init_db(): + async with engine.begin() as conn: + await conn.run_sync(Base.metadata.create_all) diff --git a/backend/config/settings.py b/backend/config/settings.py new file mode 100644 index 00000000..df0589a5 --- /dev/null +++ b/backend/config/settings.py @@ -0,0 +1,29 @@ +from pydantic_settings import BaseSettings +from functools import lru_cache + +class Settings(BaseSettings): + APP_NAME: str = "海洋项目管理系统" + APP_VERSION: str = "1.0.0" + DEBUG: bool = True + + DB_HOST: str = "localhost" + DB_PORT: int = 3306 + DB_USER: str = "root" + DB_PASSWORD: str = "rootpassword" + DB_NAME: str = "project_manager" + DB_CHARSET: str = "utf8mb4" + + SECRET_KEY: str = "your-secret-key-change-this-in-production" + ALGORITHM: str = "HS256" + ACCESS_TOKEN_EXPIRE_MINUTES: int = 1440 + + CORS_ORIGINS: list[str] = ["http://localhost:3000", "http://127.0.0.1:3000"] + + class Config: + env_file = ".env" + case_sensitive = True + + +@lru_cache() +def get_settings(): + return Settings() diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 00000000..a6e1600c --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,9 @@ +fastapi==0.104.1 +uvicorn[standard]==0.24.0 +sqlalchemy==2.0.23 +aiomysql==0.2.0 +pydantic==2.5.0 +pydantic-settings==2.1.0 +pyjwt==2.8.0 +bcrypt==4.1.1 +python-multipart==0.0.6