diff --git a/backend/apps/datasource/api/datasource.py b/backend/apps/datasource/api/datasource.py index 9d821b24..07bb019d 100644 --- a/backend/apps/datasource/api/datasource.py +++ b/backend/apps/datasource/api/datasource.py @@ -1,7 +1,10 @@ from fastapi import APIRouter -from ..crud.datasource import get_datasource_list, check_status, create_ds, update_ds, delete_ds, getTables, getFields, execSql +from ..crud.datasource import get_datasource_list, check_status, create_ds, update_ds, delete_ds, getTables, getFields, \ + execSql, update_table_and_fields, getTablesByDs from common.core.deps import SessionDep -from ..models.datasource import CoreDatasource, CreateDatasource +from ..models.datasource import CoreDatasource, CreateDatasource, EditObj +from ..crud.table import get_tables_by_ds_id +from ..crud.field import get_fields_by_table_id router = APIRouter(tags=["datasource"], prefix="/datasource") @@ -36,6 +39,11 @@ async def get_tables(session: SessionDep, id: int): return getTables(session, id) +@router.post("/getTablesByConf") +async def get_tables_by_conf(session: SessionDep, ds: CoreDatasource): + return getTablesByDs(session, ds) + + @router.post("/getFields/{id}/{table_name}") async def get_tables(session: SessionDep, id: int, table_name: str): return getFields(session, id, table_name) @@ -44,3 +52,18 @@ async def get_tables(session: SessionDep, id: int, table_name: str): @router.post("/execSql/{id}/{sql}") async def exec_sql(session: SessionDep, id: int, sql: str): return execSql(session, id, sql) + + +@router.get("/tableList/{id}") +async def table_list(session: SessionDep, id: int): + return get_tables_by_ds_id(session, id) + + +@router.get("/fieldList/{id}") +async def field_list(session: SessionDep, id: int): + return get_fields_by_table_id(session, id) + + +@router.post("/editLocalComment") +async def edit_local(session: SessionDep, data: EditObj): + update_table_and_fields(session, data) diff --git a/backend/apps/datasource/crud/datasource.py b/backend/apps/datasource/crud/datasource.py index 20f2af62..a79bb93d 100644 --- a/backend/apps/datasource/crud/datasource.py +++ b/backend/apps/datasource/crud/datasource.py @@ -1,13 +1,13 @@ from sqlmodel import select -from ..models.datasource import CoreDatasource, CreateDatasource, CoreTable, CoreField, ColumnSchema +from ..models.datasource import CoreDatasource, CreateDatasource, CoreTable, CoreField, ColumnSchema, EditObj import datetime from common.core.deps import SessionDep from apps.db.db import get_session, get_tables, get_fields, exec_sql from sqlalchemy import text, and_ from common.utils.utils import deepcopy_ignore_extra from typing import List -from ..crud.table import delete_table_by_ds_id -from ..crud.field import delete_field_by_ds_id +from ..crud.table import delete_table_by_ds_id, update_table +from ..crud.field import delete_field_by_ds_id, update_field def get_datasource_list(session: SessionDep) -> CoreDatasource: @@ -80,6 +80,11 @@ def getTables(session: SessionDep, id: int): return tables +def getTablesByDs(session: SessionDep, ds: CoreDatasource): + tables = get_tables(ds) + return tables + + def getFields(session: SessionDep, id: int, table_name: str): ds = session.exec(select(CoreDatasource).where(CoreDatasource.id == id)).first() fields = get_fields(ds, table_name) @@ -151,3 +156,9 @@ def sync_fields(session: SessionDep, ds: CoreDatasource, table: CoreTable, field if len(id_list) > 0: session.query(CoreField).filter(and_(CoreField.table_id == table.id, CoreField.id.not_in(id_list))).delete( synchronize_session=False) + + +def update_table_and_fields(session: SessionDep, data: EditObj): + update_table(session, data.table) + for field in data.fields: + update_field(session, field) diff --git a/backend/apps/datasource/crud/field.py b/backend/apps/datasource/crud/field.py index 84c4fafc..d36b58a0 100644 --- a/backend/apps/datasource/crud/field.py +++ b/backend/apps/datasource/crud/field.py @@ -1,7 +1,18 @@ from common.core.deps import SessionDep from ..models.datasource import CoreDatasource, CreateDatasource, CoreTable, CoreField, ColumnSchema +from sqlalchemy import and_ def delete_field_by_ds_id(session: SessionDep, id: int): session.query(CoreField).filter(CoreField.ds_id == id).delete(synchronize_session=False) session.commit() + + +def get_fields_by_table_id(session: SessionDep, id: int): + return session.query(CoreField).filter(CoreField.table_id == id).order_by( + CoreField.field_name.asc()).all() + + +def update_field(session: SessionDep, item: CoreField): + session.add(item) + session.commit() diff --git a/backend/apps/datasource/crud/table.py b/backend/apps/datasource/crud/table.py index 7a84a478..23ba567d 100644 --- a/backend/apps/datasource/crud/table.py +++ b/backend/apps/datasource/crud/table.py @@ -1,7 +1,18 @@ from common.core.deps import SessionDep from ..models.datasource import CoreDatasource, CreateDatasource, CoreTable, CoreField, ColumnSchema +from sqlalchemy import and_ def delete_table_by_ds_id(session: SessionDep, id: int): session.query(CoreTable).filter(CoreTable.ds_id == id).delete(synchronize_session=False) session.commit() + + +def get_tables_by_ds_id(session: SessionDep, id: int): + return session.query(CoreTable).filter(CoreTable.ds_id == id).order_by( + CoreTable.table_name.asc()).all() + + +def update_table(session: SessionDep, item: CoreTable): + session.add(item) + session.commit() diff --git a/backend/apps/datasource/models/datasource.py b/backend/apps/datasource/models/datasource.py index e8af9f3b..a571a3ec 100644 --- a/backend/apps/datasource/models/datasource.py +++ b/backend/apps/datasource/models/datasource.py @@ -20,7 +20,7 @@ class CoreDatasource(SQLModel, table=True): class CoreTable(SQLModel, table=True): __tablename__ = "core_table" id: int = Field(sa_column=Column(Integer, Identity(always=True), nullable=False, primary_key=True)) - ds_id:int = Field(sa_column=Column(BigInteger())) + ds_id: int = Field(sa_column=Column(BigInteger())) checked: bool = Field(default=True) table_name: str = Field(sa_column=Column(Text)) table_comment: str = Field(sa_column=Column(Text)) @@ -52,6 +52,13 @@ class CreateDatasource(BaseModel): tables: List[CoreTable] = [] +# edit local saved table and fields +class EditObj(BaseModel): + table: CoreTable = None + fields: List[CoreField] = [] + + +# datasource config info class DatasourceConf(BaseModel): host: str = '' port: int = 0 diff --git a/frontend/src/api/datasource.ts b/frontend/src/api/datasource.ts index 1fb27de9..961178cd 100644 --- a/frontend/src/api/datasource.ts +++ b/frontend/src/api/datasource.ts @@ -7,6 +7,7 @@ export const datasourceApi = { update: (data: any) => request.post('/datasource/update', data), delete: (id: Number) => request.post(`/datasource/delete/${id}`), getTables: (id: Number) => request.post(`/datasource/getTables/${id}`), + getTablesByConf: (data: any) => request.post('/datasource/getTablesByConf', data), getFields: (id: Number, table_name: string) => request.post(`/datasource/getFields/${id}/${table_name}`), execSql: (id: Number, sql: string) => request.post(`/datasource/execSql/${id}/${sql}`), } \ No newline at end of file diff --git a/frontend/src/style.less b/frontend/src/style.less index 2043cc0d..7ac20dd3 100644 --- a/frontend/src/style.less +++ b/frontend/src/style.less @@ -50,19 +50,9 @@ body { min-height: 100vh; } -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -.card { - padding: 2em; -} - #app { width: 100%; margin: 0; - text-align: center; } @media (prefers-color-scheme: light) { diff --git a/frontend/src/views/ds/form.vue b/frontend/src/views/ds/form.vue index eecca175..ccf05074 100644 --- a/frontend/src/views/ds/form.vue +++ b/frontend/src/views/ds/form.vue @@ -4,46 +4,58 @@ title="Add Datasource" width="500" :destroy-on-close="true" + :close-on-click-modal="false" + @closed="close" > - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Cancel - Test Connect - Save -
-
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ 222 +
+
+ Cancel + Test Connect + Next + Preview + Save +
\ No newline at end of file