diff --git a/electron-vue-template/src/main/main.ts b/electron-vue-template/src/main/main.ts index fd29209..1401919 100644 --- a/electron-vue-template/src/main/main.ts +++ b/electron-vue-template/src/main/main.ts @@ -1,4 +1,4 @@ -import {app, BrowserWindow, ipcMain, Menu, screen} from 'electron'; +import {app, BrowserWindow, ipcMain, Menu, screen, dialog} from 'electron'; import { existsSync, createWriteStream, promises as fs, statSync } from 'fs'; import {join, dirname} from 'path'; import {spawn, ChildProcessWithoutNullStreams} from 'child_process'; @@ -178,7 +178,7 @@ WshShell.Run Chr(34) & "${helperPath.replace(/\\/g, '\\\\')}" & Chr(34) & " " & }); setTimeout(() => app.quit(), 1000); - } catch (error) { + } catch (error: unknown) { console.error('[UPDATE] 更新失败:', error); } } @@ -245,7 +245,7 @@ ipcMain.handle('download-update', async (event, downloadUrl: string) => { isDownloading = false; return { success: true, filePath: updateFilePath }; - } catch (error) { + } catch (error: unknown) { isDownloading = false; downloadedFilePath = null; @@ -304,7 +304,7 @@ WshShell.Run Chr(34) & "${helperPath.replace(/\\/g, '\\\\')}" & Chr(34) & " " & }, 500); return { success: true }; - } catch (error) { + } catch (error: unknown) { return { success: false, error: error instanceof Error ? error.message : '重启失败' }; } }); @@ -321,6 +321,37 @@ ipcMain.handle('get-update-status', () => { return { downloadedFilePath, isDownloading, downloadProgress, isPackaged: app.isPackaged, isDev }; }); +// 添加文件保存对话框处理器 +ipcMain.handle('show-save-dialog', async (event, options) => { + if (!mainWindow) { + return { canceled: true }; + } + + try { + const result = await dialog.showSaveDialog(mainWindow, options); + return result; + } catch (error) { + console.error('文件保存对话框错误:', error); + return { canceled: true, error: error instanceof Error ? error.message : '对话框打开失败' }; + } +}); + +// 添加文件夹选择对话框处理器 +ipcMain.handle('show-open-dialog', async (event, options) => { + if (!mainWindow) { + return { canceled: true }; + } + + try { + const result = await dialog.showOpenDialog(mainWindow, options); + return result; + } catch (error) { + console.error('文件夹选择对话框错误:', error); + return { canceled: true, error: error instanceof Error ? error.message : '对话框打开失败' }; + } +}); + + async function downloadFile(url: string, filePath: string, onProgress: (progress: any) => void): Promise { return new Promise((resolve, reject) => { const protocol = url.startsWith('https') ? https : http; diff --git a/electron-vue-template/src/main/preload.ts b/electron-vue-template/src/main/preload.ts index 2b127f7..6d66293 100644 --- a/electron-vue-template/src/main/preload.ts +++ b/electron-vue-template/src/main/preload.ts @@ -9,6 +9,11 @@ const electronAPI = { cancelDownload: () => ipcRenderer.invoke('cancel-download'), getUpdateStatus: () => ipcRenderer.invoke('get-update-status'), + // 添加文件保存对话框 API + showSaveDialog: (options: any) => ipcRenderer.invoke('show-save-dialog', options), + // 添加文件夹选择对话框 API + showOpenDialog: (options: any) => ipcRenderer.invoke('show-open-dialog', options), + onDownloadProgress: (callback: (progress: any) => void) => { ipcRenderer.on('download-progress', (event, progress) => callback(progress)) }, diff --git a/electron-vue-template/src/renderer/App.vue b/electron-vue-template/src/renderer/App.vue index 8341625..a614251 100644 --- a/electron-vue-template/src/renderer/App.vue +++ b/electron-vue-template/src/renderer/App.vue @@ -426,9 +426,13 @@ onUnmounted(() => { SSEManager.disconnect() }) + +