1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
| // src/main/ipc-handlers.ts import { ipcMain, dialog, app, BrowserWindow } from 'electron'; import { writeFile, readFile } from 'fs/promises'; import { ConnectionManager } from './db/connection-manager';
const connectionManager = new ConnectionManager();
export function registerIpcHandlers(): void { // ── 数据库连接 ── ipcMain.handle('db:connect', async (_event, config) => { try { const connectionId = await connectionManager.connect(config); return { success: true, connectionId }; } catch (error: any) { return { success: false, error: error.message }; } });
ipcMain.handle('db:disconnect', async (_event, connectionId) => { await connectionManager.disconnect(connectionId); return { success: true }; });
ipcMain.handle('db:execute-query', async (_event, connectionId, sql) => { try { const result = await connectionManager.executeQuery(connectionId, sql); return { success: true, ...result }; } catch (error: any) { return { success: false, error: error.message }; } });
ipcMain.handle('db:get-databases', async (_event, connectionId) => { try { const databases = await connectionManager.getDatabases(connectionId); return { success: true, databases }; } catch (error: any) { return { success: false, error: error.message }; } });
ipcMain.handle('db:get-tables', async (_event, connectionId, database) => { try { const tables = await connectionManager.getTables(connectionId, database); return { success: true, tables }; } catch (error: any) { return { success: false, error: error.message }; } });
ipcMain.handle('db:get-table-schema', async (_event, connectionId, tableName) => { try { const columns = await connectionManager.getTableSchema(connectionId, tableName); return { success: true, columns }; } catch (error: any) { return { success: false, error: error.message }; } });
// ── 文件操作 ── ipcMain.handle('file:save', async (_event, content, defaultName) => { const result = await dialog.showSaveDialog({ defaultPath: defaultName, filters: [{ name: 'SQL 文件', extensions: ['sql'] }], }); if (!result.canceled && result.filePath) { await writeFile(result.filePath, content, 'utf-8'); return result.filePath; } return null; });
ipcMain.handle('file:open', async (_event, filters) => { const result = await dialog.showOpenDialog({ properties: ['openFile'], filters, }); if (!result.canceled && result.filePaths.length > 0) { const content = await readFile(result.filePaths[0], 'utf-8'); return { path: result.filePaths[0], content }; } return null; });
ipcMain.handle('file:export-csv', async (_event, data, filename) => { const result = await dialog.showSaveDialog({ defaultPath: filename, filters: [{ name: 'CSV 文件', extensions: ['csv'] }], }); if (!result.canceled && result.filePath) { const csvContent = data.map((row: any[]) => row.map((cell) => { if (cell === null) return ''; const str = String(cell); return str.includes(',') || str.includes('"') || str.includes('\n') ? `"${str.replace(/"/g, '""')}"` : str; }).join(',') ).join('\n'); await writeFile(result.filePath, '\uFEFF' + csvContent, 'utf-8'); return true; } return false; });
// ── 应用操作 ── ipcMain.handle('app:get-version', () => app.getVersion());
ipcMain.on('app:minimize', () => { BrowserWindow.getFocusedWindow()?.minimize(); });
ipcMain.on('app:maximize', () => { const win = BrowserWindow.getFocusedWindow(); if (win?.isMaximized()) { win.unmaximize(); } else { win?.maximize(); } });
ipcMain.on('app:close', () => { BrowserWindow.getFocusedWindow()?.close(); });
ipcMain.handle('dialog:save', async (_event, options) => { const result = await dialog.showSaveDialog(options); return result.canceled ? null : result.filePath; }); }
|