diff --git a/internal-plugins/setting/src/env.d.ts b/internal-plugins/setting/src/env.d.ts index 3f2dcccd..b0cceaaf 100644 --- a/internal-plugins/setting/src/env.d.ts +++ b/internal-plugins/setting/src/env.d.ts @@ -301,6 +301,7 @@ declare global { add: (type: 'file' | 'folder') => Promise<{ success: boolean; error?: string }> addByPath: (filePath: string) => Promise<{ success: boolean; error?: string }> delete: (id: string) => Promise<{ success: boolean; error?: string }> + deleteWhenNotExist: () => Promise<{ success: boolean; error?: string }> open: (path: string) => Promise<{ success: boolean; error?: string }> updateAlias: (id: string, alias: string) => Promise<{ success: boolean; error?: string }> } diff --git a/internal-plugins/setting/src/views/LocalLaunchSetting/LocalLaunchSetting.vue b/internal-plugins/setting/src/views/LocalLaunchSetting/LocalLaunchSetting.vue index f003693f..f68feb03 100644 --- a/internal-plugins/setting/src/views/LocalLaunchSetting/LocalLaunchSetting.vue +++ b/internal-plugins/setting/src/views/LocalLaunchSetting/LocalLaunchSetting.vue @@ -257,6 +257,31 @@ async function handleDelete(shortcut: LocalShortcut): Promise { } } +//删除失效项目 +async function handleInvalidItemDelete(): Promise { + if (isDeleting.value) return + const confirmed = await confirm({ + message: '确定要清除所有失效的本地启动项吗?', + type: 'warning' + }) + if (!confirmed) return + isDeleting.value = true + try { + const result = await window.ztools.internal.localShortcuts.deleteWhenNotExist() + if (result.success) { + success('删除成功') + } else { + error(result.error || '删除失败') + } + } catch (err) { + console.error('删除失败:', err) + error('删除失败') + } finally { + await loadShortcuts() + isDeleting.value = false + } +} + // 获取类型标签 function getTypeLabel(type: string): string { switch (type) { @@ -322,6 +347,9 @@ onMounted(() => { + diff --git a/resources/preload.js b/resources/preload.js index 443c26b7..9bb7c107 100644 --- a/resources/preload.js +++ b/resources/preload.js @@ -818,6 +818,8 @@ window.ztools = { addByPath: async (filePath) => await electron.ipcRenderer.invoke('local-shortcuts:add-by-path', filePath), delete: async (id) => await electron.ipcRenderer.invoke('local-shortcuts:delete', id), + deleteWhenNotExist: async () => + await electron.ipcRenderer.invoke('local-shortcuts:delete-when-not-exist'), open: async (path) => await electron.ipcRenderer.invoke('local-shortcuts:open', path), updateAlias: async (id, alias) => await electron.ipcRenderer.invoke('local-shortcuts:update-alias', id, alias) diff --git a/src/main/api/renderer/localShortcuts.ts b/src/main/api/renderer/localShortcuts.ts index 910a165d..e6862985 100644 --- a/src/main/api/renderer/localShortcuts.ts +++ b/src/main/api/renderer/localShortcuts.ts @@ -43,6 +43,9 @@ export class LocalShortcutsAPI { this.addShortcutByPath(filePath) ) ipcMain.handle('local-shortcuts:delete', (_event, id: string) => this.deleteShortcut(id)) + ipcMain.handle('local-shortcuts:delete-when-not-exist', (_event) => + this.deleteNotExistShortcut() + ) ipcMain.handle('local-shortcuts:open', (_event, shortcutPath: string) => this.openShortcut(shortcutPath) ) @@ -390,6 +393,45 @@ export class LocalShortcutsAPI { return { success: false, error: error instanceof Error ? error.message : '未知错误' } } } + + private async deleteNotExistShortcut(): Promise<{ success: boolean; error?: string }> { + try { + const shortcuts = this.getAllShortcuts() + const checks = await Promise.all( + shortcuts.map(async (cur) => { + try { + await fs.access(cur.path) + return { shortcut: cur, exists: true } + } catch { + return { shortcut: cur, exists: false } + } + }) + ) + + const existShortcuts: LocalShortcut[] = [] + const notExistShortcuts: string[] = [] + + for (const check of checks) { + if (check.exists) { + existShortcuts.push(check.shortcut) + } else { + notExistShortcuts.push(check.shortcut.id) + } + } + + databaseAPI.dbPut(LOCAL_SHORTCUTS_KEY, existShortcuts) + + console.log('[LocalShortcut] 删除失效本地启动项成功:', notExistShortcuts.toString()) + + // 通知渲染进程刷新本地启动项 + this.mainWindow?.webContents.send('local-shortcuts-changed') + + return { success: true } + } catch (error) { + console.error('[LocalShortcut] 删除失效本地启动项失败:', error) + return { success: false, error: error instanceof Error ? error.message : '未知错误' } + } + } } export default new LocalShortcutsAPI() diff --git a/src/preload/index.ts b/src/preload/index.ts index a9c51ab0..868a418d 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -332,6 +332,7 @@ const api = { getAll: () => ipcRenderer.invoke('local-shortcuts:get-all'), add: (type: 'file' | 'folder') => ipcRenderer.invoke('local-shortcuts:add', type), delete: (id: string) => ipcRenderer.invoke('local-shortcuts:delete', id), + deleteWhenNotExist: () => ipcRenderer.invoke('local-shortcuts:delete-when-not-exist'), open: (path: string) => ipcRenderer.invoke('local-shortcuts:open', path), updateAlias: (id: string, alias: string) => ipcRenderer.invoke('local-shortcuts:update-alias', id, alias) diff --git a/src/renderer/src/env.d.ts b/src/renderer/src/env.d.ts index a2cc0582..659f7e21 100644 --- a/src/renderer/src/env.d.ts +++ b/src/renderer/src/env.d.ts @@ -346,6 +346,7 @@ declare global { > add: (type: 'file' | 'folder') => Promise<{ success: boolean; error?: string }> delete: (id: string) => Promise<{ success: boolean; error?: string }> + deleteWhenNotExist: () => Promise<{ success: boolean; error?: string }> open: (path: string) => Promise<{ success: boolean; error?: string }> updateAlias: (id: string, alias: string) => Promise<{ success: boolean; error?: string }> }