From e5ae9b5ceb6f856220eaa49cd97d0ae115701eb2 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Mon, 9 Jun 2025 15:06:08 +0800 Subject: [PATCH] refactor: canvas save --- backend/apps/dashboard/api/dashboard_api.py | 12 ++-- .../apps/dashboard/crud/dashboard_service.py | 3 +- .../apps/dashboard/models/dashboard_model.py | 12 ++-- frontend/src/api/dashboard.ts | 4 +- frontend/src/stores/dashboard/dashboard.ts | 9 ++- .../src/views/dashboard/canvas/CanvasCore.vue | 8 +++ .../dashboard/common/ResourceGroupOpt.vue | 67 ++++++++++--------- .../dashboard/editor/DashboardEditor.vue | 10 +++ .../src/views/dashboard/editor/Toolbar.vue | 35 ++++++++-- frontend/src/views/dashboard/editor/index.vue | 32 ++++++++- .../src/views/dashboard/utils/canvasUtils.ts | 23 +++++++ 11 files changed, 161 insertions(+), 54 deletions(-) diff --git a/backend/apps/dashboard/api/dashboard_api.py b/backend/apps/dashboard/api/dashboard_api.py index a8a92744..9bcd16c6 100644 --- a/backend/apps/dashboard/api/dashboard_api.py +++ b/backend/apps/dashboard/api/dashboard_api.py @@ -3,7 +3,7 @@ from fastapi import APIRouter, File, UploadFile, HTTPException from apps.dashboard.crud.dashboard_service import get_dashboard_list, preview_with_id, \ create_resource, create_canvas -from apps.dashboard.models.dashboard_model import CreateDashboard +from apps.dashboard.models.dashboard_model import CreateDashboard,BaseDashboard from common.core.deps import SessionDep, CurrentUser router = APIRouter(tags=["dashboard"], prefix="/dashboard") @@ -16,18 +16,18 @@ async def datasource_list(session: SessionDep): async def preview_dashboard(session: SessionDep,id:str): return preview_with_id(session=session,dashboard_id=id) -@router.post("/add", response_model=CreateDashboard) +@router.post("/add", response_model=BaseDashboard) async def add(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard): return create_resource(session, user, dashboard) -@router.post("/update", response_model=CreateDashboard) +@router.post("/update", response_model=BaseDashboard) async def update(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard): return create_resource(session, user, dashboard) -@router.post("/add_dashboard", response_model=CreateDashboard) -async def add_dashboard(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard): +@router.post("/add_canvas", response_model=BaseDashboard) +async def add_canvas(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard): return create_canvas(session, user, dashboard) -@router.post("/update_dashboard", response_model=CreateDashboard) +@router.post("/update_canvas", response_model=BaseDashboard) async def update(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard): return \ No newline at end of file diff --git a/backend/apps/dashboard/crud/dashboard_service.py b/backend/apps/dashboard/crud/dashboard_service.py index a4c398bc..43df2d32 100644 --- a/backend/apps/dashboard/crud/dashboard_service.py +++ b/backend/apps/dashboard/crud/dashboard_service.py @@ -27,8 +27,6 @@ def create_resource(session: SessionDep, user: CurrentUser, dashboard: CreateDas session.commit() return record - - def update_resource(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard): record = session.query(CoreDashboard).filter(CoreDashboard.id == dashboard.id).first() record.name = dashboard.name @@ -44,6 +42,7 @@ def create_canvas(session: SessionDep, user: CurrentUser, dashboard: CreateDashb record.canvas_style_data = dashboard.canvas_style_data session.add(record) session.flush() + return record def update_canvas(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard): record = session.query(CoreDashboard).filter(CoreDashboard.id == dashboard.id).first() \ No newline at end of file diff --git a/backend/apps/dashboard/models/dashboard_model.py b/backend/apps/dashboard/models/dashboard_model.py index 31507cb6..30eedec3 100644 --- a/backend/apps/dashboard/models/dashboard_model.py +++ b/backend/apps/dashboard/models/dashboard_model.py @@ -131,17 +131,19 @@ class DashboardBaseResponse(BaseModel): create_time: Optional[int] = None update_time: Optional[int] = None -# dashboard create obj -class CreateDashboard(BaseModel): +class BaseDashboard(BaseModel): id: str = '' name: str = '' pid: str = '' workspace_id: str = '' org_id: str = '' - description: str = '' type: str = '' node_type: str = '' + create_by: int = 0 + + +# dashboard create obj +class CreateDashboard(BaseDashboard): canvas_style_data: str ='' component_data: str = '' - configuration: str = '' - create_by: int = 0 \ No newline at end of file + description: str = '' diff --git a/frontend/src/api/dashboard.ts b/frontend/src/api/dashboard.ts index 04242a30..c6e20ef9 100644 --- a/frontend/src/api/dashboard.ts +++ b/frontend/src/api/dashboard.ts @@ -7,6 +7,6 @@ export const dashboardApi = { moveResource: (data: any) => request.post('/dashboard/move',data), addResource: (data: any) => request.post('/dashboard/add',data), updateResource: (data: any) => request.post('/dashboard/update',data), - saveCanvas: (data: any) => request.post('/dashboard/save_canvas',data), - updateCanvas: (data: any) => request.post('/dashboard/update_canvas',data) + saveCanvas: (data: any) => request.post('/dashboard/add_canvas',data), + updateCanvas: (data: any) => request.post('/dashboard/update_',data) } \ No newline at end of file diff --git a/frontend/src/stores/dashboard/dashboard.ts b/frontend/src/stores/dashboard/dashboard.ts index e6062664..9d244e30 100644 --- a/frontend/src/stores/dashboard/dashboard.ts +++ b/frontend/src/stores/dashboard/dashboard.ts @@ -17,6 +17,7 @@ export const dashboardStore = defineStore('dashboard', { pid: null, workspaceId: null, status: null, + dataState: null, type: null, creatorName: null, updateName: null, @@ -51,7 +52,13 @@ export const dashboardStore = defineStore('dashboard', { setTabMoveInActiveId(tabId: any) { this.tabMoveInActiveId = tabId }, - canvasDataInit(){ + updateDashboardInfo(params: any) { + Object.keys(params).forEach((key: string) => { + // @ts-ignore + this.dashboardInfo[key] = params[key] + }) + }, + canvasDataInit() { } diff --git a/frontend/src/views/dashboard/canvas/CanvasCore.vue b/frontend/src/views/dashboard/canvas/CanvasCore.vue index 360cc031..710f40ca 100644 --- a/frontend/src/views/dashboard/canvas/CanvasCore.vue +++ b/frontend/src/views/dashboard/canvas/CanvasCore.vue @@ -23,6 +23,14 @@ const props = defineProps({ type: Object as PropType, required: false }, + dashboardInfo: { + type: Object, + required: false + }, + canvasStyleData: { + type: Object, + required: false + }, canvasComponentData: { type: Array as PropType, required: true diff --git a/frontend/src/views/dashboard/common/ResourceGroupOpt.vue b/frontend/src/views/dashboard/common/ResourceGroupOpt.vue index ac98016e..78dd22ee 100644 --- a/frontend/src/views/dashboard/common/ResourceGroupOpt.vue +++ b/frontend/src/views/dashboard/common/ResourceGroupOpt.vue @@ -2,11 +2,13 @@ import folder from '@/assets/svg/folder.svg' import {type SQTreeNode} from '@/views/dashboard/utils/treeNode' import {ref, reactive, computed} from 'vue' -import {dashboardApi} from "@/api/dashboard.ts"; - +import {saveDashboardResource} from "@/views/dashboard/utils/canvasUtils.ts"; +const emits = defineEmits(['finish']) const state = reactive({ - placeholder:'', - showParentSelected: false, + opt: null, + placeholder: '', + nodeType: 'folder', + parentSelect: false, resourceFormNameLabel: 'Name', dialogTitle: '', tData: [], @@ -17,8 +19,8 @@ const state = reactive({ let tData: any = [] -const getTitle = (cmd: string) => { - switch (cmd) { +const getTitle = (opt: string) => { + switch (opt) { case 'newLeaf': return 'New Dashboard' case 'newFolder': @@ -28,8 +30,8 @@ const getTitle = (cmd: string) => { } } -const getResourceNewName = (cmd: string) => { - switch (cmd) { +const getResourceNewName = (opt: string) => { + switch (opt) { case 'newLeaf': return 'New Dashboard' case 'newFolder': @@ -41,19 +43,21 @@ const getResourceNewName = (cmd: string) => { const optInit = (params: any) => { // @ts-ignore - state.dialogTitle = getTitle(params.cmd) - state.showParentSelected = params.parentSelect + state.dialogTitle = getTitle(params.opt) + state.opt = params.opt + state.parentSelect = params.parentSelect state.targetInfo = params.data + state.nodeType = params.nodeType || 'folder' resourceDialogShow.value = true - // @ts-ignore - resourceForm.name = getResourceNewName(params.cmd) + // @ts-ignore + resourceForm.name = params.name || getResourceNewName(params.opt) } const resourceDialogShow = ref(false) const loading = ref(false) const pid = ref() const id = ref() -const cmd = ref('') +const opt = ref('') const resourceForm = reactive({ pid: '', pName: '', @@ -105,29 +109,31 @@ const editeInit = (param: SQTreeNode) => { const propsTree = { label: 'name', children: 'children', - // @ts-ignore + // @ts-ignore isLeaf: node => !node.children?.length } const showPid = computed(() => { - return ['newLeaf', 'copy', 'newLeafAfter'].includes(cmd.value) && state.showParentSelected + return ['newLeaf'].includes(opt.value) && state.parentSelect }) const saveResource = () => { - const params = { - nodeType: 'folder', - name: resourceForm.name, - type: 'dashboard' - } - // @ts-ignore - dashboardApi.addResource(params).then(res => { - ElMessage({ - type: 'success', - message: 'Save Success', - }) - - resetForm() + const params = { + nodeType: state.nodeType, + name: resourceForm.name, + opt: state.opt, + type: 'dashboard' + } + saveDashboardResource(params, function (rsp:any) { + ElMessage({ + type: 'success', + message: 'Save Success', }) + if (state.opt === 'newLeaf') { + emits('finish', {opt: state.opt, resourceId: rsp.id}) + } + resetForm() + }) } const nodeClick = (data: SQTreeNode) => { @@ -135,8 +141,8 @@ const nodeClick = (data: SQTreeNode) => { resourceForm.pName = data.name as string } -const filterMethod = (value:any) => { - // @ts-ignore +const filterMethod = (value: any) => { + // @ts-ignore state.tData = [...tData].filter(item => item.name.includes(value)) } @@ -145,7 +151,6 @@ defineExpose({ editeInit }) -const emits = defineEmits(['finish']) @@ -78,6 +102,7 @@ const saveCanvasWithCheck = () =>{ left: 50%; transform: translateX(-50%); } + .right-toolbar { display: flex; position: absolute; diff --git a/frontend/src/views/dashboard/editor/index.vue b/frontend/src/views/dashboard/editor/index.vue index 94504ea7..97b90536 100644 --- a/frontend/src/views/dashboard/editor/index.vue +++ b/frontend/src/views/dashboard/editor/index.vue @@ -1,5 +1,5 @@