From 827549fa0dff2ea0b69fd8b0662adeb10ef1046b Mon Sep 17 00:00:00 2001 From: xsl Date: Mon, 26 Jan 2026 08:09:35 +0800 Subject: [PATCH] =?UTF-8?q?[backend]=20feat:=20=E6=B7=BB=E5=8A=A0=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=9F=BA=E7=A1=80=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/config/__init__.py | 12 ++++++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 393 bytes .../__pycache__/database.cpython-310.pyc | Bin 0 -> 1269 bytes .../__pycache__/settings.cpython-310.pyc | Bin 0 -> 1371 bytes backend/config/database.py | 36 ++++++++++++++++++ backend/config/settings.py | 29 ++++++++++++++ backend/requirements.txt | 9 +++++ 7 files changed, 86 insertions(+) create mode 100644 backend/config/__init__.py create mode 100644 backend/config/__pycache__/__init__.cpython-310.pyc create mode 100644 backend/config/__pycache__/database.cpython-310.pyc create mode 100644 backend/config/__pycache__/settings.cpython-310.pyc create mode 100644 backend/config/database.py create mode 100644 backend/config/settings.py create mode 100644 backend/requirements.txt 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 0000000000000000000000000000000000000000..ab6cf7e2e7bad04abe0c349749a5cef67068ea19 GIT binary patch literal 393 zcmZ{gJ5B^K42F|=hSjVDJr|gUX(mogMm~0kbuMPlSA5MTMf5j&;S4c literal 0 HcmV?d00001 diff --git a/backend/config/__pycache__/database.cpython-310.pyc b/backend/config/__pycache__/database.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbe433aa2edb0129c8ccba90ba3ef618ead1ad66 GIT binary patch literal 1269 zcmah|OK%iM5bo}I?Cg5HUayHEQVs~ohYiw>kT_Yq)_94Lh>dn^NaiwXPZ#Sk^DsSQ z@LC{2oMZ9_Kp;4B<3I2da_cK6{z2qJO!e#<42ndLy53XW^;LB~J>4L<{(AQ?{>LEX zgH}#17nN(ci&sbl5i}tw4QR>&mKuRUwT&faY6TX`hAZ^ zk=K#ekT)j!6mkc37kM4|^b7LR4Vu89iQ0^4h^fDgpallBfC^Vkqc#f`=533nnE8_g zbD||?k)IN6pLFIv;vGrHP;RdnWswg>5$BnjizM(8LavP=WWzWE)gEibI40%yL3XHW z35XIdc^N;1aFZACk?M?8xkD(!0?IPZhQBApeY& zsVeKYY;a+hQ?CMnryfugVS8ehDBkVhDSf0$ov zne(--BLp$=J21xQ=`Q=^!sLu%yCAIM#|RR5}P_%aRv!{+M*`4X`8yVNf~ATv7>WV_g|@<{|o$k z{p)W?p3$;`_cQeKPc(e2G`7uc>kT~y=sS=td<&VJ!Q>rV*^_y+HUZ}n(b>&HJ*UcC z!eW$@LdkV$s&PEUNrI4>SanvRH72Jqo2tcGtm{6fFYh2>Pup~!c8}y)R8~7bsCgV) zoVtB`*+s{ z%awIy&0nvC+iQcdu-f~zuNoM4eWf?>`|HYG?ydKhdVW9L7~E3Ua(`*#7x|+;zop4f zn&{qC7e7&^?x?J4buOj3*iGPyek#S!NKO$K+iSD7VN&zx^JXSCyJa(GQ~Ss^9m91$ E0i%RK5dZ)H literal 0 HcmV?d00001 diff --git a/backend/config/__pycache__/settings.cpython-310.pyc b/backend/config/__pycache__/settings.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa592d1e9b9830491e2945ac40880a2e68ad2178 GIT binary patch literal 1371 zcmZux&2Jk;6rcUDy>>QnzSA_MJ#p~CA1R-TB8cOx605|vyiN;q8Etka_ELM-%&r6R z)fJasxO0FWxl~Ai5bA}$W3EWG%7H(C6Ys5)P(j9;-~Qg4H}mFwc*6Pl9D(ud#|!^2 zm5@JBcys6=?8A(90X*UOiBKLXL>1dHPf0>0Fs;ROi}+cquRaluQ(w z@-j9l7_VVJDJarBa3XH=IQD~X1ah`7M$C2G9(U2=&7py?4>S55fD@{CgsP`-2dZ(M zr#y8J{L*y7b>JzQ;Rfi_z%w+P=nddmn&Wez&jFvKW}-KN&(ryYF96Teg@i8xU!wVh zF9TnpiwR!^zDAc4z7BkYE+=Q+0lw+o?W%NzuX25pfS;{B%*b2bHe_UbqS7_*9%SIY zG_J!Q-GP8!{qpOppP#*c{@e817tP#k#nec zWVP*jv(b^ML+jx52=W%XPQMpMvCJGEu;ZrP@&7alNu*Y@-I2No!`b4gZMCI|;?Rkr zFGJzUIoQ*x+Vb`rHTYt6RJ;P9h*!~S18DUkGin9(Z0bvt1*c`DUC4N9bs^VcOR)xzN1?~e5n z4=y^5LP{Ep1UD~GQtYN8Unf(8vs)8`*1wE|2N7RyN5b_LvThY<%p>yKlSR1Qo>i&Wi_$AwQ@B) z0Ph=<34vNEje?R`-{w-9T^>XBXRpi_ZiUBVzcTpC__P7wR$PnLQr` jZVb7I1U^4A54h=8H^$zq5kA7+iZF2|gtw^b8w<)m9->nJ literal 0 HcmV?d00001 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