diff --git a/frontend/electron/main.ts b/frontend/electron/main.ts index 6252a69..8580a50 100644 --- a/frontend/electron/main.ts +++ b/frontend/electron/main.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow, ipcMain, dialog } from 'electron' +import { app, BrowserWindow, ipcMain, dialog, shell } from 'electron' import * as path from 'path' import * as fs from 'fs' import { spawn } from 'child_process' @@ -74,7 +74,6 @@ function createWindow() { }) mainWindow.setMenuBarVisibility(false) - const devServer = process.env.VITE_DEV_SERVER_URL if (devServer) { mainWindow.loadURL(devServer) @@ -121,6 +120,17 @@ ipcMain.handle('select-file', async (event, filters = []) => { return result.canceled ? null : result.filePaths[0] }) +// 在系统默认浏览器中打开URL +ipcMain.handle('open-url', async (event, url: string) => { + try { + await shell.openExternal(url) + return { success: true } + } catch (error) { + console.error('打开链接失败:', error) + return { success: false, error: error.message } + } +}) + // 环境检查 ipcMain.handle('check-environment', async () => { const appRoot = getAppRoot() diff --git a/frontend/electron/preload.ts b/frontend/electron/preload.ts index 3ccc9d1..4db6e31 100644 --- a/frontend/electron/preload.ts +++ b/frontend/electron/preload.ts @@ -9,6 +9,7 @@ contextBridge.exposeInMainWorld('electronAPI', { openDevTools: () => ipcRenderer.invoke('open-dev-tools'), selectFolder: () => ipcRenderer.invoke('select-folder'), selectFile: (filters?: any[]) => ipcRenderer.invoke('select-file', filters), + openUrl: (url: string) => ipcRenderer.invoke('open-url', url), // 初始化相关API checkEnvironment: () => ipcRenderer.invoke('check-environment'), diff --git a/frontend/src/components/NoticeModal.vue b/frontend/src/components/NoticeModal.vue index 2252562..360010d 100644 --- a/frontend/src/components/NoticeModal.vue +++ b/frontend/src/components/NoticeModal.vue @@ -23,7 +23,12 @@ class="notice-tab-pane" >
-
+
@@ -116,6 +121,33 @@ const confirmNotices = async () => { } } +// 处理链接点击 +const handleLinkClick = async (event: MouseEvent) => { + const target = event.target as HTMLElement + if (target.tagName === 'A') { + event.preventDefault() + const url = target.getAttribute('href') + if (url) { + try { + // 检查是否在Electron环境中 + if (window.electronAPI && window.electronAPI.openUrl) { + const result = await window.electronAPI.openUrl(url) + if (!result.success) { + console.error('打开链接失败:', result.error) + message.error('打开链接失败,请手动复制链接地址') + } + } else { + // 如果不在Electron环境中,使用普通的window.open + window.open(url, '_blank') + } + } catch (error) { + console.error('打开链接失败:', error) + message.error('打开链接失败,请手动复制链接地址') + } + } + } +} + // 监听公告数据变化,设置默认选中第一个公告 watch( () => props.noticeData, diff --git a/frontend/src/types/electron.d.ts b/frontend/src/types/electron.d.ts index 3497e38..caa2227 100644 --- a/frontend/src/types/electron.d.ts +++ b/frontend/src/types/electron.d.ts @@ -2,7 +2,8 @@ export interface ElectronAPI { openDevTools: () => Promise selectFolder: () => Promise selectFile: (filters?: any[]) => Promise - + openUrl: (url: string) => Promise<{ success: boolean; error?: string }> + // 初始化相关API checkEnvironment: () => Promise<{ pythonExists: boolean diff --git a/frontend/src/views/Home.vue b/frontend/src/views/Home.vue index 0fb28fb..edfdf34 100644 --- a/frontend/src/views/Home.vue +++ b/frontend/src/views/Home.vue @@ -1,6 +1,21 @@