From 42adca73b6c7deb49b05321011a79e24273ecac9 Mon Sep 17 00:00:00 2001 From: dingjiahuichina Date: Wed, 3 Dec 2025 00:57:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20DevStore=E8=BD=AF=E4=BB=B6=E5=95=86?= =?UTF-8?q?=E5=BA=97=E5=89=8D=E7=AB=AF=E7=BE=8E=E5=8C=96=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=A4=9A=E9=A1=B5=E7=AD=BE=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/electron/main.js | 31 +- frontend/electron/preload.js | 5 +- frontend/src/layout/index.vue | 278 +++++++++++++++++- frontend/src/stores/tabStore.ts | 117 ++++++++ frontend/src/types.d.ts | 13 + frontend/src/views/Detail.vue | 98 ++++-- frontend/src/views/Home.vue | 241 ++++++++++----- frontend/src/views/components/GridDisplay.vue | 20 +- 8 files changed, 690 insertions(+), 113 deletions(-) create mode 100644 frontend/src/stores/tabStore.ts diff --git a/frontend/electron/main.js b/frontend/electron/main.js index 75fa164..46a81fa 100644 --- a/frontend/electron/main.js +++ b/frontend/electron/main.js @@ -10,18 +10,22 @@ * Create: 2025-07-30 * =================================================================================================================== */ -const { app, BrowserWindow, shell } = require('electron') +const { app, BrowserWindow, shell, ipcMain } = require('electron') const path = require('path') const { registerIpcListeners } = require('./ipc.js') app.disableHardwareAcceleration() +let mainWindow = null + function createWindow() { const win = new BrowserWindow({ width: 1200, height: 800, backgroundColor: '#00000000', icon: path.join(__dirname, '../src/assets/logo.png'), + frame: true, + titleBarStyle: 'hidden', webPreferences: { nodeIntegration: false, contextIsolation: true, @@ -33,6 +37,8 @@ function createWindow() { } }) + mainWindow = win + registerIpcListeners(); if (process.env.NODE_ENV === 'development') { @@ -76,6 +82,29 @@ function createWindow() { } } +// 窗口控制 IPC 处理 +ipcMain.on('minimize-window', () => { + if (mainWindow) { + mainWindow.minimize() + } +}) + +ipcMain.on('toggle-maximize', () => { + if (mainWindow) { + if (mainWindow.isMaximized()) { + mainWindow.unmaximize() + } else { + mainWindow.maximize() + } + } +}) + +ipcMain.on('close-window', () => { + if (mainWindow) { + mainWindow.close() + } +}) + app.whenReady().then(createWindow) app.on('window-all-closed', () => { diff --git a/frontend/electron/preload.js b/frontend/electron/preload.js index 669a4f0..6e7a9fe 100644 --- a/frontend/electron/preload.js +++ b/frontend/electron/preload.js @@ -15,5 +15,8 @@ const { contextBridge, ipcRenderer } = require('electron') contextBridge.exposeInMainWorld('electronAPI', { invoke: (channel, ...args) => ipcRenderer.invoke(channel, ...args), closeApp: () => ipcRenderer.send('close-app'), - getUsername: () => ipcRenderer.invoke('get-username') + getUsername: () => ipcRenderer.invoke('get-username'), + minimizeWindow: () => ipcRenderer.send('minimize-window'), + toggleMaximize: () => ipcRenderer.send('toggle-maximize'), + closeWindow: () => ipcRenderer.send('close-window') }) diff --git a/frontend/src/layout/index.vue b/frontend/src/layout/index.vue index c13c3a0..da6c555 100644 --- a/frontend/src/layout/index.vue +++ b/frontend/src/layout/index.vue @@ -12,13 +12,50 @@ diff --git a/frontend/src/views/Home.vue b/frontend/src/views/Home.vue index 7337c6a..308a9b3 100644 --- a/frontend/src/views/Home.vue +++ b/frontend/src/views/Home.vue @@ -12,7 +12,7 @@ - + @@ -72,7 +72,7 @@ diff --git a/frontend/src/views/components/GridDisplay.vue b/frontend/src/views/components/GridDisplay.vue index e3f8f21..ce6c0f5 100644 --- a/frontend/src/views/components/GridDisplay.vue +++ b/frontend/src/views/components/GridDisplay.vue @@ -70,10 +70,11 @@ import { useRouter } from 'vue-router'; import { useI18n } from 'vue-i18n'; import { Tag } from '@/api/index.ts'; import { generateIconBgColor } from '@/utils/index.ts'; +import { useTabStore } from '@/stores/tabStore'; -// 待完善注释 const router = useRouter(); const {t} = useI18n(); +const { addTab } = useTabStore(); const props = withDefaults( defineProps<{ @@ -86,9 +87,20 @@ const props = withDefaults( } ); -// 跳转至详情页 tag, key -const goToDetail = (key) => { - router.push(`/${props.tag}/${key}`); +// 跳转至详情页 tag, key - 新增页签 +const goToDetail = (key: string) => { + const item = props.itemList.find((i: any) => i.key === key); + const detailPath = `/${props.tag}/${key}`; + + // 添加新页签 + addTab({ + id: `${props.tag}-${key}`, + title: item?.name || key, + route: { path: detailPath } + }); + + // 跳转到详情页 + router.push(detailPath); }; -- Gitee