From 83844328606568ca1b9e78300a6132f317f866d6 Mon Sep 17 00:00:00 2001 From: junjun Date: Wed, 7 May 2025 16:55:09 +0800 Subject: [PATCH] feat: datasource --- backend/apps/datasource/api/datasource.py | 12 ++++- backend/apps/datasource/crud/datasource.py | 31 ++++++++--- backend/apps/datasource/models/datasource.py | 12 ++--- frontend/src/api/datasource.ts | 4 +- frontend/src/utils/request.ts | 3 +- frontend/src/views/ds/form.vue | 57 ++++++++++++++++---- frontend/src/views/ds/index.vue | 37 ++++++++++--- 7 files changed, 123 insertions(+), 33 deletions(-) diff --git a/backend/apps/datasource/api/datasource.py b/backend/apps/datasource/api/datasource.py index 0dd88949..cdc5aa9e 100644 --- a/backend/apps/datasource/api/datasource.py +++ b/backend/apps/datasource/api/datasource.py @@ -1,5 +1,5 @@ from fastapi import APIRouter, HTTPException -from ..crud.datasource import get_datasource_list, check_status, create_ds +from ..crud.datasource import get_datasource_list, check_status, create_ds, update_ds, delete_ds from common.core.deps import SessionDep from ..models.datasource import DatasourceConf, CoreDatasource @@ -14,5 +14,13 @@ def check(session: SessionDep, conf: DatasourceConf): return check_status(session, conf) @router.post("/add", response_model=CoreDatasource) -def check(session: SessionDep, ds: CoreDatasource): +def add(session: SessionDep, ds: CoreDatasource): return create_ds(session, ds) + +@router.post("/update", response_model=CoreDatasource) +def update(session: SessionDep, ds: CoreDatasource): + return update_ds(session, ds) + +@router.post("/delete/{id}", response_model=CoreDatasource) +def delete(session: SessionDep, id: int): + return delete_ds(session, id) \ No newline at end of file diff --git a/backend/apps/datasource/crud/datasource.py b/backend/apps/datasource/crud/datasource.py index 0881a640..3a2a3519 100644 --- a/backend/apps/datasource/crud/datasource.py +++ b/backend/apps/datasource/crud/datasource.py @@ -1,14 +1,15 @@ -from sqlmodel import Session, select +from sqlmodel import select from ..models.datasource import CoreDatasource, DatasourceConf import pyodbc import datetime +from common.core.deps import SessionDep -def get_datasource_list(session: Session) -> CoreDatasource: - statement = select(CoreDatasource) +def get_datasource_list(session: SessionDep) -> CoreDatasource: + statement = select(CoreDatasource).order_by(CoreDatasource.create_time.desc()) datasource_list = session.exec(statement).fetchall() return datasource_list -def check_status(session: Session, conf: DatasourceConf): +def check_status(session: SessionDep, conf: DatasourceConf): conn_str = ( "DRIVER={MySQL ODBC 9.3 Unicode Driver};" # todo driver config f"SERVER={conf.host};" @@ -30,10 +31,28 @@ def check_status(session: Session, conf: DatasourceConf): if conn is not None: conn.close() -def create_ds(session: Session, ds: CoreDatasource): +def create_ds(session: SessionDep, ds: CoreDatasource): record = CoreDatasource(**ds.model_dump()) record.create_time = datetime.datetime.now() record.status = "Success" # todo check status session.add(record) session.commit() - return record \ No newline at end of file + return record + +def update_ds(session: SessionDep, ds: CoreDatasource): + ds.id = int(ds.id) + term = session.exec(select(CoreDatasource).where(CoreDatasource.id == ds.id)).first() + update_data = ds.model_dump(exclude_unset=True) + for field, value in update_data.items(): + setattr(term, field, value) + session.add(term) + session.commit() + return ds + +def delete_ds(session: SessionDep, id: int): + term = session.exec(select(CoreDatasource).where(CoreDatasource.id == id)).first() + session.delete(term) + session.commit() + return { + "message": f"Datasource with ID {id} deleted successfully." + } \ No newline at end of file diff --git a/backend/apps/datasource/models/datasource.py b/backend/apps/datasource/models/datasource.py index 1b0d5ae3..6e57ce9e 100644 --- a/backend/apps/datasource/models/datasource.py +++ b/backend/apps/datasource/models/datasource.py @@ -15,9 +15,9 @@ class CoreDatasource(SQLModel, table=True): status: str = Field(max_length=64, nullable=True) class DatasourceConf(BaseModel): - host: str - port: int - username: str - password: str - database: str - driver: str \ No newline at end of file + host: str = '' + port: int = 0 + username: str = '' + password: str = '' + database: str = '' + driver: str = '' \ No newline at end of file diff --git a/frontend/src/api/datasource.ts b/frontend/src/api/datasource.ts index d43fe5b4..88aa5ce5 100644 --- a/frontend/src/api/datasource.ts +++ b/frontend/src/api/datasource.ts @@ -3,5 +3,7 @@ import { request } from '@/utils/request' export const datasourceApi = { check: (data: any) => request.post('/datasource/check', data), add: (data: any) => request.post('/datasource/add', data), - list: () => request.get('/datasource/list') + list: () => request.get('/datasource/list'), + update: (data: any) => request.post('/datasource/update', data), + delete: (id: Number) => request.post(`/datasource/delete/${id}`) } \ No newline at end of file diff --git a/frontend/src/utils/request.ts b/frontend/src/utils/request.ts index b7d31333..bd94be0e 100644 --- a/frontend/src/utils/request.ts +++ b/frontend/src/utils/request.ts @@ -164,7 +164,8 @@ class HttpService { // ElMessage.error(errorMessage) ElMessage({ message: errorMessage, - type: 'error' + type: 'error', + showClose: true }) } diff --git a/frontend/src/views/ds/form.vue b/frontend/src/views/ds/form.vue index c1e22618..ae280112 100644 --- a/frontend/src/views/ds/form.vue +++ b/frontend/src/views/ds/form.vue @@ -9,7 +9,7 @@ - + @@ -37,26 +37,29 @@ - +
+ Cancel Test Connect Save - +