From b8a6f0c649e56863f0efdf5134e8a099c1e8cabc Mon Sep 17 00:00:00 2001 From: cat-shark Date: Sat, 20 Jun 2026 18:37:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=BF=90=E8=A1=8C=E6=97=B6?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E6=9F=A5=E6=89=BE=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/lib/browser-path.ts | 5 ++- electron/lib/resource-path.ts | 32 +++++++++++++++++-- electron/mapi/aliyun/voicePreCache.ts | 2 +- electron/mapi/fontManager/main.ts | 15 +++++++-- electron/mapi/ipAgent/main.ts | 10 ++++-- electron/mapi/soundEffect/builtinEffects.ts | 4 +-- src/components/Setting/SettingFontManager.vue | 6 ++-- .../Setting/SettingSystemTemplates.vue | 2 +- src/config/systemSubtitleTemplates.ts | 2 +- src/service/ZimuShengcheng.ts | 2 +- 10 files changed, 60 insertions(+), 20 deletions(-) diff --git a/electron/lib/browser-path.ts b/electron/lib/browser-path.ts index 283374a..13e4240 100644 --- a/electron/lib/browser-path.ts +++ b/electron/lib/browser-path.ts @@ -59,9 +59,8 @@ export function getPlaywrightChromiumPath(): string | undefined { const runtimePath = getRuntimeBundlePath('playwright'); const basePaths = [ runtimePath, - path.join(process.resourcesPath || app.getAppPath(), 'extra/common/playwright'), - path.join(app.getAppPath(), 'resources/extra/common/playwright'), - path.join(app.getAppPath(), 'electron/resources/extra/common/playwright'), + path.join(app.getAppPath(), 'packaging/vendor/playwright'), + path.join(process.cwd(), 'packaging/vendor/playwright'), ].filter(Boolean); const chromiumVersions = ['chromium-1200']; diff --git a/electron/lib/resource-path.ts b/electron/lib/resource-path.ts index ce8801f..978cc6d 100644 --- a/electron/lib/resource-path.ts +++ b/electron/lib/resource-path.ts @@ -19,11 +19,15 @@ export function isDevelopment(): boolean { return false; } // 🔧 修复:不硬编码项目文件夹名,改用检查开发目录结构是否存在 - // 开发环境特征:项目根目录有 electron/resources/extra 目录 - const devResourcePath = path.join(appRoot, 'electron', 'resources', 'extra'); + // 开发环境特征:项目根目录有 packaging/resources 目录 + const devResourcePath = path.join(appRoot, 'packaging', 'resources'); if (fs.existsSync(devResourcePath)) { return true; } + const legacyDevResourcePath = path.join(appRoot, 'electron', 'resources', 'extra'); + if (fs.existsSync(legacyDevResourcePath)) { + return true; + } // 回退:检查旧的文件夹名(兼容) return appRoot.includes('aigcpanel-main'); } @@ -35,8 +39,12 @@ export function getResourceRoot(): string { const isDev = isDevelopment(); if (isDev) { - // 开发环境:项目根目录/electron/resources/extra + // 开发环境:项目根目录/packaging/resources const appRoot = process.env.APP_ROOT || process.cwd(); + const devResourcePath = path.join(appRoot, 'packaging', 'resources'); + if (fs.existsSync(devResourcePath)) { + return devResourcePath; + } return path.join(appRoot, 'electron', 'resources', 'extra'); } else { // 生产环境:使用 process.resourcesPath 获取 resources 目录 @@ -142,6 +150,10 @@ export function getPythonExecutablePath(): string { if (fs.existsSync(runtimePath)) { return runtimePath; } + const devPath = path.join(process.env.APP_ROOT || process.cwd(), 'packaging', 'vendor', 'python-runtime', pythonFileName); + if (fs.existsSync(devPath)) { + return devPath; + } return getCommonResourcePath(path.join('python', pythonFileName)); } @@ -160,6 +172,11 @@ export function getFFmpegExecutablePath(): string { return runtimePath; } + const devPath = path.join(process.env.APP_ROOT || process.cwd(), 'packaging', 'vendor', 'ffmpeg', ffmpegFileName); + if (fs.existsSync(devPath)) { + return devPath; + } + return getPlatformResourcePath(ffmpegFileName); } @@ -178,6 +195,11 @@ export function getFFprobeExecutablePath(): string { return runtimePath; } + const devPath = path.join(process.env.APP_ROOT || process.cwd(), 'packaging', 'vendor', 'ffmpeg', ffprobeFileName); + if (fs.existsSync(devPath)) { + return devPath; + } + return getPlatformResourcePath(ffprobeFileName); } @@ -190,6 +212,10 @@ export function getModelPath(modelFileName: string): string { if (fs.existsSync(runtimePath)) { return runtimePath; } + const devPath = path.join(process.env.APP_ROOT || process.cwd(), 'packaging', 'vendor', 'models', modelFileName); + if (fs.existsSync(devPath)) { + return devPath; + } return getCommonResourcePath(path.join('models', modelFileName)); } diff --git a/electron/mapi/aliyun/voicePreCache.ts b/electron/mapi/aliyun/voicePreCache.ts index 22e4b8b..5daee2f 100644 --- a/electron/mapi/aliyun/voicePreCache.ts +++ b/electron/mapi/aliyun/voicePreCache.ts @@ -251,7 +251,7 @@ export async function copyPreCacheFromResources(): Promise { path.join(app.getAppPath(), 'voice-preview-cache'), path.join(app.getAppPath().replace(/\.asar$/, '.asar.unpacked'), 'voice-preview-cache'), // 开发环境 - path.join(process.cwd(), 'electron/resources/voice-preview-cache'), + path.join(process.cwd(), 'packaging/resources/voice-preview-cache'), // 备选路径 path.join(process.resourcesPath, 'voice-preview-cache'), path.join(process.resourcesPath, '../voice-preview-cache'), diff --git a/electron/mapi/fontManager/main.ts b/electron/mapi/fontManager/main.ts index 1cbbc1a..233ab02 100644 --- a/electron/mapi/fontManager/main.ts +++ b/electron/mapi/fontManager/main.ts @@ -144,8 +144,12 @@ function getZitiDir(): string { console.warn('[FontManager] 所有 ziti 路径都不存在,返回默认路径'); return path.join(fallbackRoot, 'resources-bundles', 'ziti'); } else { - // 开发环境:ziti 在项目根目录 + // 开发环境:ziti 在 packaging/vendor/ziti const appRoot = getAppRoot(); + const devZitiDir = path.join(appRoot, 'packaging', 'vendor', 'ziti'); + if (fs.existsSync(devZitiDir)) { + return devZitiDir; + } return path.join(appRoot, 'ziti'); } } @@ -251,7 +255,11 @@ function scanZitiFonts(): any[] { */ function getBundledFonts(): any[] { const appRoot = getAppRoot(); - const metadataFile = path.join(appRoot, 'fonts', 'bundled', 'fonts_metadata.json'); + const metadataCandidates = [ + path.join(appRoot, 'packaging', 'vendor', 'fonts', 'bundled', 'fonts_metadata.json'), + path.join(appRoot, 'fonts', 'bundled', 'fonts_metadata.json'), + ]; + const metadataFile = metadataCandidates.find(file => fs.existsSync(file)) || metadataCandidates[0]; try { if (!fs.existsSync(metadataFile)) { @@ -554,6 +562,9 @@ function getBundledFontDirs(): string[] { pushIfExists(path.join(bundleRoot, 'fonts', 'ziti')); } + pushIfExists(path.join(appRoot, 'packaging', 'vendor', 'ziti')); + pushIfExists(path.join(appRoot, 'packaging', 'vendor', 'fonts')); + pushIfExists(path.join(appRoot, 'packaging', 'vendor', 'fonts', 'ziti')); pushIfExists(path.join(appRoot, 'ziti')); pushIfExists(path.join(appRoot, 'resources-bundles', 'ziti')); pushIfExists(path.join(appRoot, 'resources-bundles', 'fonts')); diff --git a/electron/mapi/ipAgent/main.ts b/electron/mapi/ipAgent/main.ts index 95d3302..c8968c2 100644 --- a/electron/mapi/ipAgent/main.ts +++ b/electron/mapi/ipAgent/main.ts @@ -79,6 +79,7 @@ function getBundledZitiDirs(): string[] { }; if (isDev) { + pushIfExists(path.join(process.env.APP_ROOT || process.cwd(), 'packaging', 'vendor', 'ziti')); pushIfExists(path.join(process.env.APP_ROOT || process.cwd(), 'ziti')); return dirs; } @@ -4875,14 +4876,17 @@ ${subtitleText} let defaultPath = ""; // 尝试查找bgm目录 - // 开发环境: 项目根目录/bgm - // 生产环境: resources/app.asar.unpacked/bgm (由asarUnpack解压) + // 开发环境: packaging/vendor/bgm + // 生产环境: resources-bundles/bgm const possiblePaths = [ + path.join(process.cwd(), 'packaging', 'vendor', 'bgm'), + AppEnv.resourceBundleRoot ? path.join(AppEnv.resourceBundleRoot, 'bgm') : '', + path.join(process.cwd(), 'resources-bundles', 'bgm'), path.join(process.cwd(), 'bgm'), path.join(process.resourcesPath, 'app.asar.unpacked', 'bgm'), path.join(process.resourcesPath, 'bgm'), path.join(app.getAppPath(), 'bgm') - ]; + ].filter(Boolean); for (const p of possiblePaths) { try { diff --git a/electron/mapi/soundEffect/builtinEffects.ts b/electron/mapi/soundEffect/builtinEffects.ts index 2ef5259..fbd91d7 100644 --- a/electron/mapi/soundEffect/builtinEffects.ts +++ b/electron/mapi/soundEffect/builtinEffects.ts @@ -10,7 +10,7 @@ import { app } from 'electron'; /** * 音效 ID 到文件名的映射 - * 这些音效文件存储在 resources/extra/common/soundEffects/ 目录下 + * 这些音效文件存储在 packaging/resources/common/soundEffects/ 目录下 */ export const SOUND_EFFECT_FILES: Record = { // 原有音效 @@ -81,7 +81,7 @@ export function getSoundEffectsDir(): string { const isDev = !app.isPackaged; if (isDev) { // 开发模式:使用 app.getAppPath() 获取项目根目录 - return path.join(app.getAppPath(), 'electron/resources/extra/common/soundEffects'); + return path.join(app.getAppPath(), 'packaging/resources/common/soundEffects'); } else { // 生产模式:使用 process.resourcesPath return path.join(process.resourcesPath, 'extra/common/soundEffects'); diff --git a/src/components/Setting/SettingFontManager.vue b/src/components/Setting/SettingFontManager.vue index a19fcb9..2f851ef 100644 --- a/src/components/Setting/SettingFontManager.vue +++ b/src/components/Setting/SettingFontManager.vue @@ -161,10 +161,10 @@ - fonts/bundled/ + packaging/vendor/fonts/bundled/ - ziti/ + packaging/vendor/ziti/