diff --git a/backend/app/config/init.json b/backend/app/config/init.json index 8cfcddf..0b5a6b6 100644 --- a/backend/app/config/init.json +++ b/backend/app/config/init.json @@ -1,11 +1,16 @@ { "is_init": true, - "db_type": "sqlite_3", + "db_type": "sqlite", "mysql": { "host": "", "port": "", "user": "", "password": "", "db_name": "" - } + }, + "db_host": "string", + "db_port": "string", + "db_user": "string", + "db_password": "string", + "db_name": "your_workflow" } \ No newline at end of file diff --git a/backend/app/core/__init__.py b/backend/app/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/core/db.py b/backend/app/core/db.py new file mode 100644 index 0000000..bbf30ee --- /dev/null +++ b/backend/app/core/db.py @@ -0,0 +1,24 @@ +from tortoise.contrib.fastapi import Tortoise + +async def init_tortoise(db_type: str, db_config: dict): + if db_type == "mysql": + db_url = ( + f"mysql://{db_config['db_user']}:{db_config['db_password']}" + f"@{db_config['db_host']}:{db_config['db_port']}/{db_config['db_name']}" + ) + elif db_type == "sqlite": + db_url = f"sqlite://{db_config['db_name']}" + else: + raise ValueError("Unsupported db_type") + try: + await Tortoise.init( + db_url=db_url, + modules={"models": ["models.db"]}, # 这里写你模型所在路径 + ) + await Tortoise.generate_schemas() + return True + except Exception as e: + raise e + +async def close_tortoise(): + await Tortoise.close_connections() diff --git a/backend/app/main.py b/backend/app/main.py index 6e23629..371e831 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -1,10 +1,28 @@ import uvicorn -import os -import json from fastapi import FastAPI -from pathlib import Path from models.schemas.system import InitStatusResponse, InitConfigRequest from core.config import load_init_config, save_init_config +from core.db import init_tortoise, close_tortoise +from contextlib import asynccontextmanager +import logging + +async def is_init(): + init_config = await load_init_config() + init_status = init_config.get("is_init") + return init_status + + +@asynccontextmanager +async def lifespan(app: FastAPI): + + if await is_init(): + app.logger.info("初始化数据库") + await init_tortoise() + + yield + + app.logger.info("关闭数据库") + await close_tortoise() def create_app(): @@ -21,9 +39,7 @@ def create_app(): response_model=InitStatusResponse, ) async def check_init(): - init_config = await load_init_config() - is_init = init_config.get("is_init") - return InitStatusResponse(data=is_init) + return InitStatusResponse(data=await is_init()) @app.post( "/init_system", @@ -32,20 +48,35 @@ def create_app(): response_model=InitStatusResponse, ) async def init_system(request: InitConfigRequest): - init_config = await load_init_config() - if init_config.get('is_init'): - return InitStatusResponse(data=True) - init_config["db_type"] = request.db_type - if request.db_type == "mysql": - pass - init_config["is_init"] = True - await save_init_config(init_config) - return InitStatusResponse(data=True) + app.logger.info("init_system") + try: + init_config = await load_init_config() + if init_config.get('is_init'): + return InitStatusResponse(data=True) + # 保存配置 + init_config["db_type"] = request.db_type + init_config["db_host"] = request.db_host + init_config["db_port"] = request.db_port + init_config["db_user"] = request.db_user + init_config["db_password"] = request.db_password + init_config["db_name"] = request.db_name + init_config["is_init"] = True + init_success = await init_tortoise(request.db_type, init_config) + + if init_success: + await save_init_config(init_config) + return InitStatusResponse(data=True) + + return InitStatusResponse(success=False, message="初始化数据库失败") + except Exception as e: + return InitStatusResponse(success=False, message=str(e)) return app app = create_app() +app.logger = logging.getLogger("workflow") +app.logger.setLevel(logging.INFO) if __name__ == "__main__": uvicorn.run("main:app", host="0.0.0.0", port=8080, reload=True) diff --git a/backend/app/models/__init__.py b/backend/app/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/models/db/__init__.py b/backend/app/models/db/__init__.py new file mode 100644 index 0000000..db523d3 --- /dev/null +++ b/backend/app/models/db/__init__.py @@ -0,0 +1,2 @@ +from .system import * +from .user import * diff --git a/backend/app/models/db/system.py b/backend/app/models/db/system.py new file mode 100644 index 0000000..57ee63e --- /dev/null +++ b/backend/app/models/db/system.py @@ -0,0 +1,20 @@ +from tortoise import fields +from tortoise.models import Model + +class BaseModel(Model): + id = fields.IntField(pk=True) + create_time = fields.DatetimeField(auto_now_add=True) + update_time = fields.DatetimeField(auto_now=True) + + def json(self, del_columns=None): + user_json = dict(self) + if del_columns is not None: + for column in del_columns: + try: + del user_json[column] + except Exception: + pass + return user_json + + class Meta: + abstract = True diff --git a/backend/app/models/db/user.py b/backend/app/models/db/user.py new file mode 100644 index 0000000..3e8006a --- /dev/null +++ b/backend/app/models/db/user.py @@ -0,0 +1,10 @@ +from tortoise import fields +from .system import BaseModel + +class User(BaseModel): + username = fields.CharField(max_length=50, unique=True) + password = fields.CharField(max_length=128) + level = fields.IntField(default=1, null=True, description="0:超级用户 1:普通用户") + + class Meta: + table = "tb_users" diff --git a/backend/app/models/schemas/__init__.py b/backend/app/models/schemas/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/models/schemas/system.py b/backend/app/models/schemas/system.py index 4373d6c..ecd3468 100644 --- a/backend/app/models/schemas/system.py +++ b/backend/app/models/schemas/system.py @@ -17,4 +17,4 @@ class InitConfigRequest(BaseModel): class InitStatusResponse(BaseResponse): - data: bool = False + data: dict | bool = False diff --git a/backend/requirements.txt b/backend/requirements.txt index dced152..c300cb5 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,2 +1,4 @@ fastapi==0.116.1 -uvicorn==0.35,0 \ No newline at end of file +uvicorn==0.35.0 +tortoise-orm==0.25.1 +aiomysql==0.2.0