diff --git a/frontend/pc/IM/src/main/index.js b/frontend/pc/IM/src/main/index.js
index 00e3911..1471672 100644
--- a/frontend/pc/IM/src/main/index.js
+++ b/frontend/pc/IM/src/main/index.js
@@ -27,6 +27,11 @@ function createWindow() {
mainWindow.show()
})
+ mainWindow.on('close', (event) => {
+ event.preventDefault();
+ mainWindow.hide()
+ })
+
mainWindow.webContents.setWindowOpenHandler((details) => {
shell.openExternal(details.url)
return { action: 'deny' }
@@ -75,9 +80,10 @@ app.whenReady().then(() => {
// explicitly with Cmd + Q.
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
- app.quit()
+ //app.quit()
}
})
+
// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.
diff --git a/frontend/pc/IM/src/main/ipcHandlers/window.js b/frontend/pc/IM/src/main/ipcHandlers/window.js
index 828cb62..2b71798 100644
--- a/frontend/pc/IM/src/main/ipcHandlers/window.js
+++ b/frontend/pc/IM/src/main/ipcHandlers/window.js
@@ -1,15 +1,68 @@
-import { ipcMain, BrowserWindow } from "electron";
+import { ipcMain, BrowserWindow } from 'electron'
+import icon from '../../../resources/icon.png?asset'
+import { join } from 'path'
+import { is } from '@electron-toolkit/utils'
+
+export function registerWindowHandler() {
+ const windowMapData = new Map()
-export function registerWindowHandler(){
ipcMain.on('window-action', (event, action) => {
- const win = BrowserWindow.fromWebContents(event.sender);
- if (!win) return;
+ const win = BrowserWindow.fromWebContents(event.sender)
+ if (!win) return
const actions = {
minimize: () => win.minimize(),
maximize: () => (win.isMaximized() ? win.unmaximize() : win.maximize()),
close: () => win.hide(),
+ closeThis: () => {
+ const mainWin = BrowserWindow.fromId(1); // 假设 ID 1 是主窗口
+ const win = BrowserWindow.fromWebContents(event.sender)
+ if(win.id != mainWin?.id){
+ win.destroy()
+ }
+ },
isMaximized: () => win.isMaximized()
- };
- actions[action]?.();
+ }
+ actions[action]?.()
+ })
+ ipcMain.on('window-new', (event, { route, data }) => {
+ const win = new BrowserWindow({
+ width: 900,
+ height: 670,
+ show: true,
+ autoHideMenuBar: true,
+ frame: false,
+ ...(process.platform === 'linux' ? { icon } : {}), // Linux 必须在这里设
+ icon: join(__dirname, '../../../resources/icon.png'), // Windows 开发环境预览
+ webPreferences: {
+ preload: join(__dirname, '../preload/index.js'),
+ sandbox: false
+ }
+ })
+
+ const winId = win.id
+ windowMapData.set(winId, data)
+
+ // 窗口关闭时,记得清理内存,防止内存泄漏
+ win.on('closed', () => {
+ windowMapData.delete(winId)
+ })
+
+ // 构建 Query 参数
+ const queryStr = `?winId=${winId}`
+
+ if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
+ // 开发环境:通常使用 Hash 路由 (如 http://localhost:5173/#/your-route?winId=1)
+ win.loadURL(`${process.env['ELECTRON_RENDERER_URL']}#/${route}${queryStr}`)
+ } else {
+ // 生产环境:loadFile 必须通过 hash 参数来传递路由和参数
+ // 注意:join 会合并路径,hash 部分需要单独传给 options
+ win.loadFile(join(__dirname, '../../renderer/index.html'), {
+ hash: `${route}${queryStr}`
+ })
+ }
+})
+ // 3. 增加数据索要接口
+ ipcMain.handle('get-window-data', (event, winId) => {
+ return windowMapData.get(Number(winId))
})
}
diff --git a/frontend/pc/IM/src/preload/index.js b/frontend/pc/IM/src/preload/index.js
index 737bed4..923143a 100644
--- a/frontend/pc/IM/src/preload/index.js
+++ b/frontend/pc/IM/src/preload/index.js
@@ -7,7 +7,10 @@ const api = {
minimize: () => ipcRenderer.send('window-action', 'minimize'),
maximize: () => ipcRenderer.send('window-action', 'maximize'),
close: () => ipcRenderer.send('window-action', 'close'),
- isMaximized: () => ipcRenderer.send('window-action', 'isMaximized')
+ closeThis: () => ipcRenderer.send('window-action', 'closeThis'),
+ isMaximized: () => ipcRenderer.send('window-action', 'isMaximized'),
+ newWindow: (route, data) => ipcRenderer.send('window-new', { route, data }),
+ getWindowData: (winId) => ipcRenderer.invoke('get-window-data', winId)
}
}
diff --git a/frontend/pc/IM/src/renderer/src/App.vue b/frontend/pc/IM/src/renderer/src/App.vue
index 103066d..1290f45 100644
--- a/frontend/pc/IM/src/renderer/src/App.vue
+++ b/frontend/pc/IM/src/renderer/src/App.vue
@@ -10,15 +10,6 @@ import Alert from '@/components/messages/Alert.vue';
import { onMounted } from 'vue';
import { useAuthStore } from './stores/auth';
//import { useSignalRStore } from './stores/signalr';
-
-onMounted(async () => {
- const { useSignalRStore } = await import('./stores/signalr');
- const authStore = useAuthStore();
- const signalRStore = useSignalRStore();
- if(authStore.token){
- signalRStore.initSignalR();
- }
-})
diff --git a/frontend/pc/IM/src/renderer/src/router/index.js b/frontend/pc/IM/src/renderer/src/router/index.js
index 0810e24..7544bdb 100644
--- a/frontend/pc/IM/src/renderer/src/router/index.js
+++ b/frontend/pc/IM/src/renderer/src/router/index.js
@@ -70,6 +70,9 @@ const routes = [
meta: { requiresAuth: true }
},
{ path: '/test', component: TestView },
+ {
+ path: '/imgpre', component: () => import('@/components/electron/ImagePreview.vue')
+ }
]
const router = createRouter({
diff --git a/frontend/pc/IM/src/renderer/src/stores/signalr.js b/frontend/pc/IM/src/renderer/src/stores/signalr.js
index 3b4f66d..d6badf1 100644
--- a/frontend/pc/IM/src/renderer/src/stores/signalr.js
+++ b/frontend/pc/IM/src/renderer/src/stores/signalr.js
@@ -6,8 +6,6 @@ import { useChatStore } from "./chat";
import { authService } from "@/services/auth";
import { generateSessionId } from "@/utils/sessionIdTools";
import { messageHandler } from "@/handler/messageHandler";
-import { useBrowserNotification } from "@/services/useBrowserNotification";
-import { useConversationStore } from "./conversation";
import { SignalRMessageHandler } from "@/utils/signalr/SignalMessageHandler";
import { signalRConnectionEventHandler } from "@/utils/signalr/signalRConnectionEventHandler";
diff --git a/frontend/pc/IM/src/renderer/src/views/Main.vue b/frontend/pc/IM/src/renderer/src/views/Main.vue
index 8bfe2ea..cfc15a3 100644
--- a/frontend/pc/IM/src/renderer/src/views/Main.vue
+++ b/frontend/pc/IM/src/renderer/src/views/Main.vue
@@ -20,7 +20,7 @@
diff --git a/frontend/pc/IM/src/renderer/src/views/messages/messageContent/MessageContent.vue b/frontend/pc/IM/src/renderer/src/views/messages/messageContent/MessageContent.vue
index 192f833..63d17fc 100644
--- a/frontend/pc/IM/src/renderer/src/views/messages/messageContent/MessageContent.vue
+++ b/frontend/pc/IM/src/renderer/src/views/messages/messageContent/MessageContent.vue
@@ -4,120 +4,108 @@