From 5a3ab02ee1a283eb60ccf2f28e64d6119290e83a Mon Sep 17 00:00:00 2001 From: lqtmcstudio Date: Fri, 6 Feb 2026 14:57:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=BF=81=E7=A7=BB=E6=9E=B6=E6=9E=84&?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=8A=9F=E8=83=BD=20-=20=E6=8C=81=E4=B9=85?= =?UTF-8?q?=E5=8C=96=E9=9F=B3=E9=87=8F=E8=AE=BE=E7=BD=AE=20-=20=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E9=A1=B5=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E6=AF=8F=E9=A1=B5=E6=98=BE=E7=A4=BA=E6=95=B0=E9=87=8F(?= =?UTF-8?q?=E6=8C=81=E4=B9=85=E5=8C=96)=20-=20vite-electron-plugin?= =?UTF-8?q?=E8=BF=81=E7=A7=BBelectron-vite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/preload/index.ts | 44 +++++++++++++++++++++++ src/renderer/src/components/PlayerBar.vue | 1 + src/renderer/src/components/Sidebar.vue | 1 + src/renderer/src/layout/MainLayout.vue | 3 +- src/renderer/src/stores/player.ts | 9 +---- src/renderer/src/views/Home.vue | 3 ++ src/renderer/src/views/Playlist.vue | 13 +++---- src/renderer/src/views/Search.vue | 3 +- 8 files changed, 60 insertions(+), 17 deletions(-) create mode 100644 src/preload/index.ts diff --git a/src/preload/index.ts b/src/preload/index.ts new file mode 100644 index 0000000..3f64011 --- /dev/null +++ b/src/preload/index.ts @@ -0,0 +1,44 @@ +import { contextBridge, ipcRenderer } from 'electron' + +contextBridge.exposeInMainWorld('electronAPI', { + // 窗口控制 + minimizeWindow: () => ipcRenderer.send('window-minimize'), + maximizeWindow: () => ipcRenderer.send('window-maximize'), + closeWindow: () => ipcRenderer.send('window-close'), + isMaximized: () => ipcRenderer.invoke('window-is-maximized'), + + // qzplayer Control + qzplayer: { + load: (url: string) => ipcRenderer.invoke('qzplayer-load', url), + play: () => ipcRenderer.invoke('qzplayer-play'), + pause: () => ipcRenderer.invoke('qzplayer-pause'), + togglePause: () => ipcRenderer.invoke('qzplayer-toggle-pause'), + stop: () => ipcRenderer.invoke('qzplayer-stop'), + setVolume: (vol: number) => ipcRenderer.invoke('qzplayer-set-volume', vol), + seek: (time: number) => ipcRenderer.invoke('qzplayer-seek', time), + onEvent: (callback: (event: any, data: any) => void) => ipcRenderer.on('qzplayer-event', callback) + }, + + // Plugin System + plugin: { + call: (pluginId: string, method: string, args: any[]) => ipcRenderer.invoke('plugin:call', pluginId, method, args), + search: (pluginId: string, query: string, page: number, limit: number) => ipcRenderer.invoke('plugin:call', pluginId, 'search', [query, page, limit]), + getLyric: (pluginId: string, id: string) => ipcRenderer.invoke('plugin:call', pluginId, 'getLyric', [id]), + }, + + // Cache Control + getCacheInfo: () => ipcRenderer.invoke('cache:getInfo'), + setCachePersist: (persist: boolean) => ipcRenderer.invoke('cache:setPersist', persist), + openCacheFolder: () => ipcRenderer.invoke('cache:openFolder'), + clearCache: () => ipcRenderer.invoke('cache:clear'), + + // Settings + settings: { + getAll: () => ipcRenderer.invoke('settings:getAll'), + set: (settings: any) => ipcRenderer.invoke('settings:set', settings), + getTheme: () => ipcRenderer.invoke('settings:getTheme'), + setTheme: (theme: 'dark' | 'light') => ipcRenderer.invoke('settings:setTheme', theme), + getAccentColor: () => ipcRenderer.invoke('settings:getAccentColor'), + setAccentColor: (color: string) => ipcRenderer.invoke('settings:setAccentColor', color) + } +}) \ No newline at end of file diff --git a/src/renderer/src/components/PlayerBar.vue b/src/renderer/src/components/PlayerBar.vue index af7cee6..10b5d1e 100644 --- a/src/renderer/src/components/PlayerBar.vue +++ b/src/renderer/src/components/PlayerBar.vue @@ -190,6 +190,7 @@ const formatTime = (seconds2: number) => {