From 4ff951180f5a206d019cbeabf800d1239aab4114 Mon Sep 17 00:00:00 2001 From: junjun Date: Tue, 24 Jun 2025 18:10:47 +0800 Subject: [PATCH] feat: export --- backend/apps/api.py | 6 ++--- backend/apps/datasource/api/export.py | 39 +++++++++++++++++++++++++++ backend/pyproject.toml | 2 ++ frontend/src/api/datasource.ts | 1 + frontend/src/views/ds/index.vue | 14 ++++++++++ 5 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 backend/apps/datasource/api/export.py diff --git a/backend/apps/api.py b/backend/apps/api.py index f23205fe..fdfb5b0a 100644 --- a/backend/apps/api.py +++ b/backend/apps/api.py @@ -2,18 +2,16 @@ from fastapi import APIRouter from apps.system.api import login, user, aimodel from apps.settings.api import terminology -from apps.datasource.api import datasource +from apps.datasource.api import datasource, export from apps.chat.api import chat from apps.dashboard.api import dashboard_api - api_router = APIRouter() api_router.include_router(login.router) api_router.include_router(user.router) api_router.include_router(aimodel.router) api_router.include_router(terminology.router) api_router.include_router(datasource.router) +api_router.include_router(export.router) api_router.include_router(chat.router) api_router.include_router(dashboard_api.router) - - diff --git a/backend/apps/datasource/api/export.py b/backend/apps/datasource/api/export.py new file mode 100644 index 00000000..e8f493eb --- /dev/null +++ b/backend/apps/datasource/api/export.py @@ -0,0 +1,39 @@ +# Author: Junjun +# Date: 2025/6/24 + +import time + +from fastapi import APIRouter +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait + +from common.core.deps import SessionDep + +router = APIRouter(tags=["export"], prefix="/export") + + +@router.get("/png") +async def export(session: SessionDep): + driver = webdriver.Chrome() # 或者使用webdriver.Firefox()等 + print('init done') + # 打开网页 + driver.get('https://g2.antv.antgroup.com/examples/general/interval/#bar-basic') + driver.set_window_size(width=1920, height=1080) + + # 等待页面加载完成(根据需要调整时间) + + try: + # 等待直到某个元素加载完成,例如某个具体的元素或者某个时间(例如10秒) + print("started driver") + WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "canvas"))) + time.sleep(2) + except: + print("Timeout") + + # 获取整个页面的截图并保存为图片文件 + driver.save_screenshot('screenshot.png') + + # 关闭浏览器 + driver.quit() diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 41aaea6a..13cb12ec 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -35,6 +35,8 @@ dependencies = [ "oracledb (>=3.1.1,<4.0.0)", "pyyaml (>=6.0.2,<7.0.0)", "fastapi-mcp (>=0.3.4,<0.4.0)", + "selenium (>=4.33.0,<5.0.0)", + "pillow (>=11.2.1,<12.0.0)", ] [[tool.uv.index]] url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" diff --git a/frontend/src/api/datasource.ts b/frontend/src/api/datasource.ts index 74ca09ea..e38b3217 100644 --- a/frontend/src/api/datasource.ts +++ b/frontend/src/api/datasource.ts @@ -19,4 +19,5 @@ export const datasourceApi = { saveTable: (data: any) => request.post('/datasource/editTable', data), saveField: (data: any) => request.post('/datasource/editField', data), getDs: (id: number) => request.post(`/datasource/get/${id}`), + exportFromServer: () => request.get('/export/png'), } diff --git a/frontend/src/views/ds/index.vue b/frontend/src/views/ds/index.vue index 41563894..c2d332f0 100644 --- a/frontend/src/views/ds/index.vue +++ b/frontend/src/views/ds/index.vue @@ -25,6 +25,9 @@ @click="editDs(undefined)" >{{ t('ds.add') }} + export
@@ -75,6 +78,17 @@ const allDsList = ref([]) // all ds list const router = useRouter() const loading = ref(false) +const exportPng = () => { + datasourceApi + .exportFromServer() + .then(() => { + console.log('export success') + }) + .catch((e) => { + console.log(e) + }) +} + function searchHandle() { if (searchValue.value) { dsList.value = JSON.parse(JSON.stringify(allDsList.value)).filter((item: any) => {