diff --git a/components.d.ts b/components.d.ts index 37d0b42..18778eb 100644 --- a/components.d.ts +++ b/components.d.ts @@ -21,6 +21,7 @@ declare module 'vue' { DiagramCanvas: typeof import('./src/components/LabCanvas/DiagramCanvas.vue')['default'] Dialog: typeof import('./src/components/Dialog.vue')['default'] ETH: typeof import('./src/components/equipments/ETH.vue')['default'] + FunctionBar: typeof import('./src/components/FunctionBar.vue')['default'] HDMI: typeof import('./src/components/equipments/HDMI.vue')['default'] IpInputField: typeof import('./src/components/InputField/IpInputField.vue')['default'] LabCanvas: typeof import('./src/components/LabCanvasNew/LabCanvas.vue')['default'] @@ -42,6 +43,11 @@ declare module 'vue' { RekaSplitterGroup: typeof import('reka-ui')['SplitterGroup'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] + ScrollAreaCorner: typeof import('reka-ui')['ScrollAreaCorner'] + ScrollAreaRoot: typeof import('reka-ui')['ScrollAreaRoot'] + ScrollAreaScrollbar: typeof import('reka-ui')['ScrollAreaScrollbar'] + ScrollAreaThumb: typeof import('reka-ui')['ScrollAreaThumb'] + ScrollAreaViewport: typeof import('reka-ui')['ScrollAreaViewport'] SD: typeof import('./src/components/equipments/SD.vue')['default'] SevenSegmentDisplay: typeof import('./src/components/equipments/SevenSegmentDisplay.vue')['default'] SFP: typeof import('./src/components/equipments/SFP.vue')['default'] @@ -52,6 +58,11 @@ declare module 'vue' { SplitterPanel: typeof import('reka-ui')['SplitterPanel'] SplitterResizeHandle: typeof import('reka-ui')['SplitterResizeHandle'] Switch: typeof import('./src/components/equipments/Switch.vue')['default'] + TabsContent: typeof import('reka-ui')['TabsContent'] + TabsIndicator: typeof import('reka-ui')['TabsIndicator'] + TabsList: typeof import('reka-ui')['TabsList'] + TabsRoot: typeof import('reka-ui')['TabsRoot'] + TabsTrigger: typeof import('reka-ui')['TabsTrigger'] ThemeControlButton: typeof import('./src/components/ThemeControlButton.vue')['default'] ThemeControlToggle: typeof import('./src/components/ThemeControlToggle.vue')['default'] TutorialCarousel: typeof import('./src/components/TutorialCarousel.vue')['default'] diff --git a/src/components/FunctionBar.vue b/src/components/FunctionBar.vue new file mode 100644 index 0000000..b5db5ae --- /dev/null +++ b/src/components/FunctionBar.vue @@ -0,0 +1,70 @@ + + + + diff --git a/src/components/Navbar.vue b/src/components/Navbar.vue index 1c11536..e49cb1b 100644 --- a/src/components/Navbar.vue +++ b/src/components/Navbar.vue @@ -50,18 +50,6 @@ 测试功能 -
  • - - -
  • -
  • - - - 示波器 - -
  • diff --git a/src/router/index.ts b/src/router/index.ts index f9761e5..723c3d4 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -19,8 +19,6 @@ const router = createRouter({ { path: "/test", name: "test", component: TestView }, { path: "/user", name: "user", component: UserView }, { path: "/admin", name: "admin", component: AdminView }, - { path: "/video-stream", name: "videoStream", component: VideoStreamView }, - { path: "/oscilloscope", name: "oscilloscope", component: OscilloscopeView }, ], }); diff --git a/src/views/ProjectView.vue b/src/views/ProjectView.vue index 50f432a..fdc9519 100644 --- a/src/views/ProjectView.vue +++ b/src/views/ProjectView.vue @@ -1,41 +1,89 @@ @@ -46,16 +94,19 @@ import DiagramCanvas from "@/components/LabCanvas/DiagramCanvas.vue"; import ComponentSelector from "@/components/LabCanvas/ComponentSelector.vue"; import PropertyPanel from "@/components/PropertyPanel.vue"; import MarkdownRenderer from "@/components/MarkdownRenderer.vue"; +import FunctionBar from "@/components/FunctionBar.vue"; import { useProvideComponentManager } from "@/components/LabCanvas"; -import type { DiagramData, DiagramPart } from "@/components/LabCanvas"; +import type { DiagramData } from "@/components/LabCanvas"; +import { useAlertStore } from "@/components/Alert"; -// 获取路由参数 import { useRoute } from "vue-router"; const route = useRoute(); // 提供组件管理服务 const componentManager = useProvideComponentManager(); +const alert = useAlertStore(); + // --- 文档面板控制 --- const showDocPanel = ref(false); const documentContent = ref(""); @@ -106,34 +157,6 @@ async function loadDocumentContent() { const showComponentsMenu = ref(false); const diagramCanvas = ref(null); -// --- 页面动画和通知 --- -const showNotification = ref(false); -const notificationMessage = ref(""); -const notificationType = ref<"success" | "error" | "info">("info"); - -function showToast( - message: string, - type: "success" | "error" | "info" = "info", - duration = 3000, -) { - const canvasInstance = diagramCanvas.value as any; - if (canvasInstance && canvasInstance.showToast) { - canvasInstance.showToast(message, type, duration); - } else { - // 后备方案:使用原来的通知系统 - notificationMessage.value = message; - notificationType.value = type; - showNotification.value = true; - - // 设置自动消失 - setTimeout(() => { - showNotification.value = false; - }, duration); - } -} - -// --- 事件处理器(委托给组件管理器) --- - function openComponentsMenu() { showComponentsMenu.value = true; } @@ -155,7 +178,7 @@ async function handleAddTemplate(templateData: { }) { const result = await componentManager.addTemplate(templateData); if (result) { - showToast(result.message, result.success ? "success" : "error"); + alert?.show(result.message, result.success ? "success" : "error"); } }