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 00000000..41c5464d
Binary files /dev/null and b/frontend/src/assets/img/error.png differ
diff --git a/frontend/src/assets/img/none.png b/frontend/src/assets/img/none.png
new file mode 100644
index 00000000..358dfdd8
Binary files /dev/null and b/frontend/src/assets/img/none.png differ
diff --git a/frontend/src/assets/img/nothing-input.png b/frontend/src/assets/img/nothing-input.png
new file mode 100644
index 00000000..7b1fa548
Binary files /dev/null and b/frontend/src/assets/img/nothing-input.png differ
diff --git a/frontend/src/assets/img/nothing-none.png b/frontend/src/assets/img/nothing-none.png
new file mode 100644
index 00000000..d686a36b
Binary files /dev/null and b/frontend/src/assets/img/nothing-none.png differ
diff --git a/frontend/src/assets/img/nothing-select.png b/frontend/src/assets/img/nothing-select.png
new file mode 100644
index 00000000..90e62512
Binary files /dev/null and b/frontend/src/assets/img/nothing-select.png differ
diff --git a/frontend/src/assets/img/nothing-table.png b/frontend/src/assets/img/nothing-table.png
new file mode 100644
index 00000000..700664ed
Binary files /dev/null and b/frontend/src/assets/img/nothing-table.png differ
diff --git a/frontend/src/assets/img/nothing-tree.png b/frontend/src/assets/img/nothing-tree.png
new file mode 100644
index 00000000..6eb9b2ba
Binary files /dev/null and b/frontend/src/assets/img/nothing-tree.png differ
diff --git a/frontend/src/assets/svg/dashboard-info.svg b/frontend/src/assets/svg/dashboard-info.svg
new file mode 100644
index 00000000..ba5b1330
--- /dev/null
+++ b/frontend/src/assets/svg/dashboard-info.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ name }}
+
+
+
+
+
+
+ Cancel
+ Confirm
+
+
+
+
+
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 @@
+
- this is dashboard page
-
\ 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 @@