From 04721c9d273ad53dfb5d8cc018d754024dd84524 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Thu, 5 Jun 2025 16:09:45 +0800 Subject: [PATCH] refactor: dashboard preview --- backend/apps/api.py | 2 + backend/apps/dashboard/api/dashboard_api.py | 16 +- .../apps/dashboard/crud/dashboard_service.py | 22 +- .../apps/dashboard/models/dashboard_model.py | 19 +- frontend/components.d.ts | 4 + frontend/src/api/dashboard.ts | 1 + frontend/src/assets/img/error.png | Bin 0 -> 3459 bytes frontend/src/assets/img/none.png | Bin 0 -> 1683 bytes frontend/src/assets/img/nothing-input.png | Bin 0 -> 3061 bytes frontend/src/assets/img/nothing-none.png | Bin 0 -> 1713 bytes frontend/src/assets/img/nothing-select.png | Bin 0 -> 3354 bytes frontend/src/assets/img/nothing-table.png | Bin 0 -> 2585 bytes frontend/src/assets/img/nothing-tree.png | Bin 0 -> 2330 bytes frontend/src/assets/svg/dashboard-info.svg | 12 + .../src/assets/svg/icon_edit_outlined.svg | 3 + .../src/assets/svg/icon_file-add_outlined.svg | 6 + .../src/assets/svg/icon_more_outlined.svg | 3 + .../svg/icon_operation-analysis_outlined.svg | 5 + frontend/src/assets/svg/icon_pc_outlined.svg | 3 + .../svg/icon_search-outline_outlined.svg | 3 + frontend/src/assets/svg/new-folder.svg | 5 + .../dashboard/common/ResourceGroupOpt.vue | 248 ++++++++++++++++++ .../views/dashboard/common/ResourceTree.vue | 177 +++++++------ frontend/src/views/dashboard/index.vue | 8 +- .../views/dashboard/preview/SQPreviewHead.vue | 6 +- 25 files changed, 450 insertions(+), 93 deletions(-) create mode 100644 frontend/src/assets/img/error.png create mode 100644 frontend/src/assets/img/none.png create mode 100644 frontend/src/assets/img/nothing-input.png create mode 100644 frontend/src/assets/img/nothing-none.png create mode 100644 frontend/src/assets/img/nothing-select.png create mode 100644 frontend/src/assets/img/nothing-table.png create mode 100644 frontend/src/assets/img/nothing-tree.png create mode 100644 frontend/src/assets/svg/dashboard-info.svg create mode 100644 frontend/src/assets/svg/icon_edit_outlined.svg create mode 100644 frontend/src/assets/svg/icon_file-add_outlined.svg create mode 100644 frontend/src/assets/svg/icon_more_outlined.svg create mode 100644 frontend/src/assets/svg/icon_operation-analysis_outlined.svg create mode 100644 frontend/src/assets/svg/icon_pc_outlined.svg create mode 100644 frontend/src/assets/svg/icon_search-outline_outlined.svg create mode 100644 frontend/src/assets/svg/new-folder.svg create mode 100644 frontend/src/views/dashboard/common/ResourceGroupOpt.vue diff --git a/backend/apps/api.py b/backend/apps/api.py index e11cd90b..f23205fe 100644 --- a/backend/apps/api.py +++ b/backend/apps/api.py @@ -4,6 +4,7 @@ from apps.system.api import login, user, aimodel from apps.settings.api import terminology from apps.datasource.api import datasource from apps.chat.api import chat +from apps.dashboard.api import dashboard_api api_router = APIRouter() @@ -13,5 +14,6 @@ api_router.include_router(aimodel.router) api_router.include_router(terminology.router) api_router.include_router(datasource.router) api_router.include_router(chat.router) +api_router.include_router(dashboard_api.router) diff --git a/backend/apps/dashboard/api/dashboard_api.py b/backend/apps/dashboard/api/dashboard_api.py index 57c1fc0f..6f73f6c8 100644 --- a/backend/apps/dashboard/api/dashboard_api.py +++ b/backend/apps/dashboard/api/dashboard_api.py @@ -1,11 +1,9 @@ -import hashlib -import os -import uuid -from typing import List + from fastapi import APIRouter, File, UploadFile, HTTPException -from apps.dashboard.crud.dashboard_service import get_dashboard_list, preview_with_id -from common.core.deps import SessionDep +from apps.dashboard.crud.dashboard_service import get_dashboard_list, preview_with_id,create_dashboard +from apps.dashboard.models.dashboard_model import CreateDashboard +from common.core.deps import SessionDep, CurrentUser router = APIRouter(tags=["dashboard"], prefix="/dashboard") @@ -15,4 +13,8 @@ async def datasource_list(session: SessionDep): @router.get("/preview_dashboard/{id}") async def preview_dashboard(session: SessionDep,id:str): - return preview_with_id(session=session,dashboard_id=id) \ No newline at end of file + return preview_with_id(session=session,dashboard_id=id) + +@router.post("/add", response_model=CreateDashboard) +async def add(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard): + return create_dashboard(session, user, dashboard) diff --git a/backend/apps/dashboard/crud/dashboard_service.py b/backend/apps/dashboard/crud/dashboard_service.py index 278600ea..abd43257 100644 --- a/backend/apps/dashboard/crud/dashboard_service.py +++ b/backend/apps/dashboard/crud/dashboard_service.py @@ -1,13 +1,23 @@ from select import select - -from apps.dashboard.models.dashboard_model import CoreDashboard -from common.core.deps import SessionDep - - +from apps.dashboard.models.dashboard_model import CoreDashboard, CreateDashboard +from common.core.deps import SessionDep, CurrentUser +import uuid def get_dashboard_list(session: SessionDep): statement = select(CoreDashboard).order_by(CoreDashboard.create_time.desc()) dashboard_list = session.exec(statement).fetchall() return dashboard_list def preview_with_id(session: SessionDep, dashboard_id: str): - return session.query(CoreDashboard).filter(CoreDashboard.id == id).first() \ No newline at end of file + return session.query(CoreDashboard).filter(CoreDashboard.id == id).first() + + +def create_dashboard(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard): + new_id = uuid.uuid4().hex + record = CoreDashboard(**dashboard.model_dump()) + record.id = new_id + record.create_by = user.id + session.add(record) + session.flush() + session.refresh(record) + session.commit() + return record diff --git a/backend/apps/dashboard/models/dashboard_model.py b/backend/apps/dashboard/models/dashboard_model.py index 183f728b..da2cd599 100644 --- a/backend/apps/dashboard/models/dashboard_model.py +++ b/backend/apps/dashboard/models/dashboard_model.py @@ -1,5 +1,7 @@ from sqlmodel import SQLModel, Field -from sqlalchemy import String, Column, Text, SmallInteger, BigInteger, Integer +from sqlalchemy import String, Column, Text, SmallInteger, BigInteger, Integer,DateTime +from pydantic import BaseModel +from datetime import datetime class CoreDashboard(SQLModel, table=True): @@ -121,3 +123,18 @@ class CoreDashboard(SQLModel, table=True): max_length=50, sa_column=Column(String(50), nullable=True) ) + +# dashboard create obj +class CreateDashboard(BaseModel): + id: str = '' + name: str = '' + pid: str = '' + workspace_id: str = '' + org_id: str = '' + description: str = '' + type: str = '' + node_type: str = '' + canvas_style_data: str ='' + component_data: str = '' + configuration: str = '' + create_by: int = 0 \ No newline at end of file diff --git a/frontend/components.d.ts b/frontend/components.d.ts index be1c720b..4e313e22 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -21,6 +21,7 @@ declare module '@vue/runtime-core' { ElDropdown: typeof import('element-plus-secondary/es')['ElDropdown'] ElDropdownItem: typeof import('element-plus-secondary/es')['ElDropdownItem'] ElDropdownMenu: typeof import('element-plus-secondary/es')['ElDropdownMenu'] + ElEmpty: typeof import('element-plus-secondary/es')['ElEmpty'] ElFooter: typeof import('element-plus-secondary/es')['ElFooter'] ElForm: typeof import('element-plus-secondary/es')['ElForm'] ElFormItem: typeof import('element-plus-secondary/es')['ElFormItem'] @@ -32,6 +33,7 @@ declare module '@vue/runtime-core' { ElMenuItem: typeof import('element-plus-secondary/es')['ElMenuItem'] ElOption: typeof import('element-plus-secondary/es')['ElOption'] ElPagination: typeof import('element-plus-secondary/es')['ElPagination'] + ElPopover: typeof import('element-plus-secondary/es')['ElPopover'] ElRadio: typeof import('element-plus-secondary/es')['ElRadio'] ElRadioGroup: typeof import('element-plus-secondary/es')['ElRadioGroup'] ElRow: typeof import('element-plus-secondary/es')['ElRow'] @@ -46,6 +48,8 @@ declare module '@vue/runtime-core' { ElTabPane: typeof import('element-plus-secondary/es')['ElTabPane'] ElTabs: typeof import('element-plus-secondary/es')['ElTabs'] ElTooltip: typeof import('element-plus-secondary/es')['ElTooltip'] + ElTree: typeof import('element-plus-secondary/es')['ElTree'] + ElTreeSelect: typeof import('element-plus-secondary/es')['ElTreeSelect'] ElUpload: typeof import('element-plus-secondary/es')['ElUpload'] Icon: typeof import('./src/components/icon-custom/src/Icon.vue')['default'] Layout: typeof import('./src/components/layout/index.vue')['default'] diff --git a/frontend/src/api/dashboard.ts b/frontend/src/api/dashboard.ts index a861821d..6ea2c07a 100644 --- a/frontend/src/api/dashboard.ts +++ b/frontend/src/api/dashboard.ts @@ -5,4 +5,5 @@ export const dashboardApi = { getDashboardInfo: (params:any) => request.post(`/dashboard/get_dashboard/${params.id}`,params), sqNameCheck: (data: any) => request.post('/dashboard/name_check',data), moveResource: (data: any) => request.post('/dashboard/move',data), + addResource: (data: any) => request.post('/dashboard/add',data) } \ No newline at end of file diff --git a/frontend/src/assets/img/error.png b/frontend/src/assets/img/error.png new file mode 100644 index 0000000000000000000000000000000000000000..41c5464d3d44b35075f1192514535768e2c18a3c GIT binary patch literal 3459 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 O5CHO|7renODDf|gUOR~Z literal 0 HcmV?d00001 diff --git a/frontend/src/assets/img/nothing-input.png b/frontend/src/assets/img/nothing-input.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1fa548bf76deb8ac4fbce166a93047d199bb97 GIT binary patch literal 3061 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 DtS&l(f}q z714*+bhoUAjUsH(+A6UUVd^az(oiA@@oKKl&fLBC%bmF&&iT*z&73d)ne#t%jIS41 z!%zbN0DzHa5!gMY?N!WOEA$N+$*?&ksm9+nyGK_D6H$_}=H;La4cDI`D zgOJ3J{E*8_$fLlnw+QJ218q;;p?qioJ>a0W2?C^Z%2vGZn|`9R2M z31zY*K9Z?~MD-R+l35*aQ|T%<*-k|jNDKra{vmVANO|nihA|^pAAsoP>T7gsstU9I z!pBfMukIJ(7VxD$n=1<^kCh|n^?1~pBy#GOjn^a$$wS^%j1Zh$teh3seO?}N9X<=A z>nL|vXnuRsAy|Zg{6sFAK&A*4m#AV6<1NVc2oG7Nuzu1We4^+_otI^zT4(v@Qsp*& z!4#!J*BkH~D1(y=J9*KP{HgIa&wUqZ4u_oFLie5N3RW&z*&`KlEe^@-GkRT$*c~0U zlXMQ!wzexIw}P?N83;zK)e(7uNm_-kk%LdvSA)WHPiU*XO~3chsyy4o5CZC4<4O8d zWeH-)^gHSu_|~#P6}>xOTUQPP8xCkPsU#(51PRX6TVA9%g9$0J0#~Dt>B8xdFwv-4 zTxF;;JTHl(Z?rhz^wctIdo2LS_l@@Lo?c6v>9okZ6Wvrv%^k5R2tV^tJy)fMp#E1#Yc`iZXgoua7*ttErbw_i(IP zXX%f8A52mI&_GGbniuq%GuUj0uT{dMENkkCM-O(i6YmW}l&&t?V=q3)dWLHQ4U7f9 z#rd%aJm1ZRJTdjtyRAbl)U^C-CYu-Ht;?mmUlgr`dCM>K3=nq8s96rojY+vtg8^gysDNLydTbgJ->E0w%{R0jM9-l|y&Tnb0l2yMR=m)`0 z^ZW-ogB<^?X~5J7W-aUn#TF`*YD{XH>+c~hjcC=#* zT`CuCyH-s%bCpWNTl_`rg=K4sQLykOGjlnya)Y{&p0i6srx~ZEcas4fHiQt_?x&Cx zl^MwyhG+B7Ci$f7H{c1kBwvpmMN?{s%&%<8+<3&iB`0W_um#OD=LA81mObwnb}4eO zPn!E^pG0UzwMC4D2c6D}u&k)c>W!UVeD88l>eljYA=;SS8+Hv%iu-LQ=~q6P=re_^Xb99n_z?_eFX6YfGQu;p zJrDe6@Y8cUwBRSDcb)_w!}a+(4Tv*;2*WR2)qQ|! zX0m>K$7^*=!I;rB=q=2vKp76?MR|&UOo}QNstGCdoO;WHkxmo7 zqnWeycg5NFHO2%L5#RJzG-`&bw37cvRR3j=61bdWgAcsd&)fSj0HlX6qRuVk`o93* CuRxsu literal 0 HcmV?d00001 diff --git a/frontend/src/assets/img/nothing-select.png b/frontend/src/assets/img/nothing-select.png new file mode 100644 index 0000000000000000000000000000000000000000..90e625123840e0147e1de4342d305d29d79c8057 GIT binary patch literal 3354 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 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/img/nothing-table.png b/frontend/src/assets/img/nothing-table.png new file mode 100644 index 0000000000000000000000000000000000000000..700664ed24bce25c0a3834dc841b3d6730166005 GIT binary patch literal 2585 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 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/img/nothing-tree.png b/frontend/src/assets/img/nothing-tree.png new file mode 100644 index 0000000000000000000000000000000000000000..6eb9b2ba9aa944223a1d9ff035358056f3b7ea5c GIT binary patch literal 2330 zcmV+#3FY>QP)}Km#N+35a0R7@D*_Gl}v#9yZ2a*~$

(p^E)m8hr{7; zI2;a#!{Kl^91h0<0T^)eZhR~GF(!cY5v(9|fJ@ zt*AyIAi>b;eqvtf1enjKXCb$g2U@h0$r8ode@=T_h?*EkXcgTH%@sj3T?4Nm3f{g3 zT`^gi%mU~&Oo>zSs!H9SHv?A$K^sfc&bBfB{BOC@nWKvuaYc~MjtKKS1jnDxW_|D2xykYvEtQ98ns@RYySQSqQmJ{!1QviLD2B#3*Kq?^ z1Su4Y#=)r#_aPpG3*s?6nTHgKd7DYj!AiuldC1&+rX`AnjlxZq$M9?((h50+9jKTr zS(c-UqF8q8HJXRCN={)1$AZZ6)~GJ#uFLYKudH6f^N{*+Y_b$(A|*)Tm@Wy|(&=;* zIF6v=LzH{BCImq{clz|Ht-x^vHK(rJ|L5$`(3*+!=YIn)1*sL{Mj{b7bLLk#b?O&5apET!92~4V9=3J% z^>h&-+6*zQ=!VFv$8+f{q|zBj;&`7u>k)S#> zVrEv?6ayXQ(vk|9?4sc(@Nq3VBki!Bm@tW9tC1T}{r0!+KDvh6xy+tJGqrL38cQ)y zgqdX85MW_3SMfZ)ud|~aqFo(T{S7+&r->P8HaciWK6rQJA~c9A>mdj_U@I|Zlk+e& zJ6E;Bi_hW7#sg==;Obro1}YsoI(!U~aZEqrO8LE?INe~tT>HdS5)#wNhRW^p#FRaJ zlCU&o1H`BJ)pXT0LooLs9)KJoIkeXWL`jriJr?xn<=-#M-yAyh#(U9J;R!MW#h6Xm zyOObW6h*gtd-NcdU2*apGm>cK+hY$$63-%0syC?yA4yPj;6%ScN7a6Ie~pZ6Oso(`PRW+ zQj%$7xcgTlANqWHhH5>FsUVSd^OJ#JKM^1#-i@-YLFME!HhX>V(zTJdEXWra*C zs(3ZAST8RWE62ncBl;}bVk*e0VC4j4$3{|aNMQ8-q62lUi>;g>9*uI@q zRj_hgPBJ|Y^BH!X_rAQ7!*aBu=4wZx+n?tYrh*hrvhNO3kCG(%A8X|+qTQVk35S6N zzKgPo#Y#c2{-g%zHyTKixjPgD5dsYVN?%1;OD4;t0&%he14kP$5d?D+zqOMHaHuI`1%tU`Hda%g|_|BVJPJ3`*C*2FwM)la5QXW}PAZFV{)zh=Ma? zc+G%m@e-@a(+yUW7jx9^Sfq%89^18hy8(^V3W0vWee@Iv8WCgL1USUiO`mv@ zQ53a~$Op|4&ICN_5d+6=PW#UbF%HH)aV!Sn`Yzm(DD^bIH9|>1H^I_=XIJD1EisHS zp$VY*`uEYKaYd^X^MtiSeXh3ukOcS0?(JKy0!5m-PaSRk{rG=|F!gRNFghGbZeupX z(6kNoxwOqu*N=R*d*?-_?%Q<{7~ly(N?>j1MQ?BIlZnD$LTQ$8qUnl1oMh6IB}vk; z&-d)O2#oOctu?F?PFAK%l%$hH45t6E#`pI+u?lt3bkU5u$m-z91ABIi17mzINXc}W zK`ZJ)F}~clYaCplCGG~q(sa2g2GTOOXJTQx+!h0A89`{9u4agVP!&Yii+?~9p=G+7 zB?dxOko+n*s~dYrnunF?3K@5Ys69&rNj%pqF%YVPY%~7ls1_p+6=)LWrVC3gxKj%Y znza%|QXRPT#h#ttLla?EiMx3>K1K%Ls)N*&UHzLz*X<>x7)5#fOj*d)t}N%479W26 z;d|r2VFOu` + + + + + + + + + + + diff --git a/frontend/src/assets/svg/icon_edit_outlined.svg b/frontend/src/assets/svg/icon_edit_outlined.svg new file mode 100644 index 00000000..817c15c2 --- /dev/null +++ b/frontend/src/assets/svg/icon_edit_outlined.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/assets/svg/icon_file-add_outlined.svg b/frontend/src/assets/svg/icon_file-add_outlined.svg new file mode 100644 index 00000000..669ede90 --- /dev/null +++ b/frontend/src/assets/svg/icon_file-add_outlined.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/frontend/src/assets/svg/icon_more_outlined.svg b/frontend/src/assets/svg/icon_more_outlined.svg new file mode 100644 index 00000000..f6fec929 --- /dev/null +++ b/frontend/src/assets/svg/icon_more_outlined.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/assets/svg/icon_operation-analysis_outlined.svg b/frontend/src/assets/svg/icon_operation-analysis_outlined.svg new file mode 100644 index 00000000..6a792ff4 --- /dev/null +++ b/frontend/src/assets/svg/icon_operation-analysis_outlined.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/assets/svg/icon_pc_outlined.svg b/frontend/src/assets/svg/icon_pc_outlined.svg new file mode 100644 index 00000000..b5ce9a28 --- /dev/null +++ b/frontend/src/assets/svg/icon_pc_outlined.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/assets/svg/icon_search-outline_outlined.svg b/frontend/src/assets/svg/icon_search-outline_outlined.svg new file mode 100644 index 00000000..67bf6003 --- /dev/null +++ b/frontend/src/assets/svg/icon_search-outline_outlined.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/assets/svg/new-folder.svg b/frontend/src/assets/svg/new-folder.svg new file mode 100644 index 00000000..ebe4f9a9 --- /dev/null +++ b/frontend/src/assets/svg/new-folder.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/frontend/src/views/dashboard/common/ResourceGroupOpt.vue b/frontend/src/views/dashboard/common/ResourceGroupOpt.vue new file mode 100644 index 00000000..072e6e4c --- /dev/null +++ b/frontend/src/views/dashboard/common/ResourceGroupOpt.vue @@ -0,0 +1,248 @@ + + + + + diff --git a/frontend/src/views/dashboard/common/ResourceTree.vue b/frontend/src/views/dashboard/common/ResourceTree.vue index 1c1317c0..6df47504 100644 --- a/frontend/src/views/dashboard/common/ResourceTree.vue +++ b/frontend/src/views/dashboard/common/ResourceTree.vue @@ -1,22 +1,24 @@ + \ No newline at end of file + + diff --git a/frontend/src/views/dashboard/preview/SQPreviewHead.vue b/frontend/src/views/dashboard/preview/SQPreviewHead.vue index 08eddf12..875fdb16 100644 --- a/frontend/src/views/dashboard/preview/SQPreviewHead.vue +++ b/frontend/src/views/dashboard/preview/SQPreviewHead.vue @@ -1,5 +1,5 @@