diff --git a/index.html b/index.html index 2c07717..4a68247 100644 --- a/index.html +++ b/index.html @@ -19,7 +19,7 @@
- +
diff --git a/src/IpcMainHandler.ts b/src/IpcMainHandler.ts index 62090ea..8d1a136 100644 --- a/src/IpcMainHandler.ts +++ b/src/IpcMainHandler.ts @@ -1,4 +1,4 @@ -import { BrowserWindow, ipcMain, screen, session } from "electron"; +import { BrowserWindow, ipcMain, screen, session, app } from "electron"; import http from 'http'; import https from 'https'; import os from 'os'; @@ -8,6 +8,11 @@ import { ApiResponse, MenuItem, TagResolutionConfig, EIACDesktopApi, SpecialPUrl const memoryCache = new Map(); export function initialize(): void { + // Close app + ipcMain.handle('app:close', (): void => { + app.exit(0); // 使用 exit 而不是 quit,确保立即退出 + }); + // Set cache ipcMain.handle('cache:set', (_event, key: string, value: any): void => { memoryCache.set(key, value); diff --git a/src/index.css b/src/index.css index 535c544..4c7c48d 100644 --- a/src/index.css +++ b/src/index.css @@ -44,7 +44,7 @@ body { gap: 20px; } -.logout-btn { +.exit-btn { padding: 8px 16px; background-color: #f44336; color: white; @@ -53,7 +53,7 @@ body { cursor: pointer; } -.logout-btn:hover { +.exit-btn:hover { background-color: #d32f2f; } diff --git a/src/index.ts b/src/index.ts index 0e2c4f8..2dfac4b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -274,14 +274,14 @@ function bindLogoClickEvent(tabGroup: TabGroup, menuItem: MenuItem): void { } /** - * 绑定登出事件 + * 绑定退出事件 */ -function bindLogoutEvent(): void { - const logoutBtn: HTMLButtonElement = document.getElementById('btnLogout') as HTMLButtonElement; - if (logoutBtn) { - logoutBtn.addEventListener('click', () => { +function bindExitEvent(): void { + const exitBtn: HTMLButtonElement = document.getElementById('btnExit') as HTMLButtonElement; + if (exitBtn) { + exitBtn.addEventListener('click', async () => { window.electronAPI.removeSessionStorage('cookies'); - window.location.href = 'login.html'; + await window.electronAPI.closeApp(); }); } } @@ -412,8 +412,8 @@ async function initialize(): Promise { const logoMenuItem: MenuItem = menuList[menuList.length - 1]; bindLogoClickEvent(tabGroup, logoMenuItem); - // Bind logout event - bindLogoutEvent(); + // Bind exit event + bindExitEvent(); // Bind error modal event bindErrorModalEvent(); diff --git a/src/preload.ts b/src/preload.ts index c9c8b94..08797cb 100644 --- a/src/preload.ts +++ b/src/preload.ts @@ -5,43 +5,48 @@ import { contextBridge, ipcRenderer } from 'electron'; import { ApiResponse, MenuItem, TagResolutionConfig } from './EIAC_Desktop_Api'; contextBridge.exposeInMainWorld('electronAPI', { + /** + * 关闭应用程序 + */ + closeApp: (): Promise => ipcRenderer.invoke('app:close'), + /** * 获取缓存 * @param key 键 * @returns 缓存 */ - getCacheAsync: (key: string) => ipcRenderer.invoke('cache:get', key) as Promise, + getCacheAsync: (key: string): Promise => ipcRenderer.invoke('cache:get', key), /** * 设置缓存 * @param key 键 * @param value 值 */ - setCacheAsync: (key: string, value: any) => ipcRenderer.invoke('cache:set', key, value) as Promise, + setCacheAsync: (key: string, value: any): Promise => ipcRenderer.invoke('cache:set', key, value), /** * 获取菜单缓存 * @returns 菜单缓存 */ - getMenuCacheAsync: () => ipcRenderer.invoke('get-menu-cache') as Promise>, + getMenuCacheAsync: (): Promise> => ipcRenderer.invoke('get-menu-cache'), /** * 获取帮助描述 * @param code 帮助描述代码 * @returns 帮助描述 */ - getHelperDescripAsync: (code: string) => ipcRenderer.invoke('get-helper-descrip', code) as Promise, + getHelperDescripAsync: (code: string): Promise => ipcRenderer.invoke('get-helper-descrip', code), /** * 获取指定URL的缩放比例 * @param url 要获取缩放比例的URL * @returns 缩放比例 */ - getZoomFactorByUrl: (url: string) => ipcRenderer.invoke('get-zoom-factor-by-url', url) as Promise, + getZoomFactorByUrl: (url: string): Promise => ipcRenderer.invoke('get-zoom-factor-by-url', url), /** * 在新标签页打开URL * @param callback 回调函数,参数为webContentId和url。其中webContentId是请求打开URL的webview的id。 */ - onOpenTab: (callback: (webContentId: number, url: string) => void) => { + onOpenTab: (callback: (webContentId: number, url: string) => void): void => { ipcRenderer.on('webview-new-window', (_event, webContentId, url) => callback(webContentId, url)); }, @@ -50,14 +55,14 @@ contextBridge.exposeInMainWorld('electronAPI', { * @param url 要检查的URL * @returns 是否可用 */ - checkUrlAvailable: (url: string) => ipcRenderer.invoke('check-url-available', url) as Promise, + checkUrlAvailable: (url: string): Promise => ipcRenderer.invoke('check-url-available', url), /** * 设置webview的cookie * @param url 要设置cookie的URL * @param cookie cookie字符串 */ - setWebviewCookie: (url: string, cookie: string) => ipcRenderer.invoke('set-webview-cookie', url, cookie) as Promise, + setWebviewCookie: (url: string, cookie: string): Promise => ipcRenderer.invoke('set-webview-cookie', url, cookie), /** * 故障上报 @@ -65,14 +70,14 @@ contextBridge.exposeInMainWorld('electronAPI', { * @param message 要上报的消息 * @param status 要上报的状态 */ - faultReporting: (url: string, message: string, status: number) => ipcRenderer.invoke('fault-reporting', url, message, status) as Promise<{ ok: boolean; status: number; message?: string }>, + faultReporting: (url: string, message: string, status: number): Promise<{ ok: boolean; status: number; message?: string }> => ipcRenderer.invoke('fault-reporting', url, message, status), /** * 按键将值设置到sessionStorage * @param key 键 * @param value 值 */ - setSessionStorage: (key: string, value: string) => { + setSessionStorage: (key: string, value: string): void => { window.sessionStorage.setItem(key, value); }, @@ -81,7 +86,7 @@ contextBridge.exposeInMainWorld('electronAPI', { * @param key 键 * @returns 值 */ - getSessionStorage: (key: string) => { + getSessionStorage: (key: string): string | null => { return window.sessionStorage.getItem(key); }, @@ -89,14 +94,14 @@ contextBridge.exposeInMainWorld('electronAPI', { * 从sessionStorage中删除指定键的值 * @param key 键 */ - removeSessionStorage: (key: string) => { + removeSessionStorage: (key: string): void => { window.sessionStorage.removeItem(key); }, /** * 清空sessionStorage */ - clearSessionStorage: () => { + clearSessionStorage: (): void => { window.sessionStorage.clear(); } }); \ No newline at end of file diff --git a/src/types/electron.d.ts b/src/types/electron.d.ts index 6d91353..f2e5d97 100644 --- a/src/types/electron.d.ts +++ b/src/types/electron.d.ts @@ -1,6 +1,10 @@ import { ApiResponse, MenuItem, TagResolutionConfig } from '../EIAC_Desktop_Api'; export interface ElectronAPI { + /** + * 关闭应用程序 + */ + closeApp: () => Promise; /** * 获取缓存 * @param key 键