From 744e533ed3f5a43ad44eb0f086286d77b46d2d31 Mon Sep 17 00:00:00 2001 From: digua Date: Sun, 12 Apr 2026 21:35:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/main/worker/workerManager.ts | 60 +++++++++++++++++++++++++++ src/components/UI/ThemeCard.vue | 2 +- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/electron/main/worker/workerManager.ts b/electron/main/worker/workerManager.ts index 181e0840..d2c2c695 100644 --- a/electron/main/worker/workerManager.ts +++ b/electron/main/worker/workerManager.ts @@ -6,6 +6,7 @@ import { Worker } from 'worker_threads' import { app } from 'electron' import * as path from 'path' +import * as fs from 'fs' import type { ParseProgress } from '../parser' import type { StreamImportResult } from './import' import { openDatabase } from '../database/core' @@ -54,6 +55,63 @@ function getWorkerPath(): string { } } +/** + * 清空 cache/query/ 下所有 .cache.json 文件 + */ +function clearAnalysisCacheFiles(queryCacheDir: string): void { + if (!fs.existsSync(queryCacheDir)) return + const files = fs.readdirSync(queryCacheDir) + for (const file of files) { + if (file.endsWith('.cache.json')) { + fs.unlinkSync(path.join(queryCacheDir, file)) + } + } +} + +/** + * 启动时检查是否需要清除分析缓存: + * - 开发模式:每次启动都清空(代码随时可能变更,避免旧缓存误导) + * - 生产模式:版本号变更时清空(兜底查询逻辑变更导致的缓存过时) + */ +function checkAndResetAnalysisCache(): void { + const queryCacheDir = path.join(getCacheDir(), 'query') + const isDev = !app.isPackaged + + if (isDev) { + console.log('[WorkerManager] Dev mode: clearing analysis cache on startup') + try { + clearAnalysisCacheFiles(queryCacheDir) + } catch (err) { + console.error('[WorkerManager] Failed to clear analysis cache:', err) + } + return + } + + const versionFile = path.join(queryCacheDir, '.cache_version') + const currentVersion = app.getVersion() + + let lastVersion: string | null = null + try { + if (fs.existsSync(versionFile)) { + lastVersion = fs.readFileSync(versionFile, 'utf-8').trim() + } + } catch { + // ignore read errors + } + + if (lastVersion === currentVersion) return + + console.log(`[WorkerManager] Version changed (${lastVersion ?? 'none'} → ${currentVersion}), clearing analysis cache`) + + try { + clearAnalysisCacheFiles(queryCacheDir) + ensureDir(queryCacheDir) + fs.writeFileSync(versionFile, currentVersion, 'utf-8') + } catch (err) { + console.error('[WorkerManager] Failed to reset analysis cache:', err) + } +} + /** * 初始化 Worker */ @@ -63,6 +121,8 @@ export function initWorker(): void { return } + checkAndResetAnalysisCache() + const workerPath = getWorkerPath() console.log('[WorkerManager] Initializing worker at:', workerPath) diff --git a/src/components/UI/ThemeCard.vue b/src/components/UI/ThemeCard.vue index a9989739..5c4fbdf8 100644 --- a/src/components/UI/ThemeCard.vue +++ b/src/components/UI/ThemeCard.vue @@ -32,7 +32,7 @@ const variantClasses: Record = { } const containerClass = computed(() => { - const base = `relative overflow-hidden ${variantClasses[props.variant]}` + const base = `relative isolate overflow-hidden ${variantClasses[props.variant]}` return props.capturable ? `group/card ${base}` : base })