From 4e340633730bdf33cdd855a758b7878b3999a7f6 Mon Sep 17 00:00:00 2001 From: kjqwer <2990346238@qq.com> Date: Fri, 10 Oct 2025 12:14:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=85=E7=9C=8B=E5=90=8D=E5=8D=95=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=A6=86=E7=9B=96=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/services/download-registry.js | 2 +- ui/src/components/common/WatchlistWidget.vue | 33 ++++++- .../components/common/watchlist/AddModal.vue | 92 ++++++++++++++++++- .../common/watchlist/WatchlistPanel.vue | 81 +++++++++++++++- ui/src/stores/watchlist.ts | 33 +++++-- 5 files changed, 227 insertions(+), 14 deletions(-) diff --git a/backend/services/download-registry.js b/backend/services/download-registry.js index 1831d2e..aa8f95d 100644 --- a/backend/services/download-registry.js +++ b/backend/services/download-registry.js @@ -35,7 +35,7 @@ class DownloadRegistry { // 加载现有注册表 await this.loadRegistry(); - logger.info(`下载记录注册表初始化完成,总共包含${Object.keys(this.registry.artists).length}个作者,${this.getTotalArtworkCount()}个工作品`); + logger.info(`下载记录注册表初始化完成,总共包含${Object.keys(this.registry.artists).length}个作者,${this.getTotalArtworkCount()}个作品`); } catch (error) { logger.error('下载记录注册表初始化失败:', error); throw error; diff --git a/ui/src/components/common/WatchlistWidget.vue b/ui/src/components/common/WatchlistWidget.vue index 76f7b02..d0d251d 100644 --- a/ui/src/components/common/WatchlistWidget.vue +++ b/ui/src/components/common/WatchlistWidget.vue @@ -56,11 +56,13 @@ :batch-urls="batchUrls" :auto-generate-title="autoGenerateTitle" :parsed-urls="parsedUrls" + :import-mode="importMode" @update:mode="addMode = $event" @update:title="addTitle = $event" @update:url="addUrl = $event" @update:batchUrls="batchUrls = $event" @update:autoGenerateTitle="autoGenerateTitle = $event" + @update:importMode="importMode = $event" @quickAdd="fillQuickAdd" @save="saveAdd" @cancel="cancelAdd" @@ -92,6 +94,7 @@ const addUrl = ref(''); const addMode = ref<'single' | 'batch'>('single'); const batchUrls = ref(''); const autoGenerateTitle = ref(true); +const importMode = ref<'merge' | 'overwrite'>('merge'); // 搜索和排序 const searchQuery = ref(''); @@ -401,7 +404,29 @@ const saveAdd = async () => { } } else { // 批量添加模式 - const urlsToAdd = parsedUrls.value.filter(item => !item.isDuplicate); + let urlsToAdd = parsedUrls.value; + + if (importMode.value === 'merge') { + // 重合模式:只添加不重复的URL + urlsToAdd = urlsToAdd.filter(item => !item.isDuplicate); + } else if (importMode.value === 'overwrite') { + // 覆盖模式:删除所有现有项目,然后添加所有新项目 + if (urlsToAdd.length === 0) return; + + // 确认覆盖操作 + if (!confirm('覆盖模式将删除所有现有的待看项目并导入新的项目。确定要继续吗?')) { + return; + } + + // 删除所有现有项目 + const allItems = items.value; + for (const item of allItems) { + await watchlistStore.deleteItem(item.id); + } + + console.log(`已删除 ${allItems.length} 个现有项目`); + } + if (urlsToAdd.length === 0) return; // 依次添加每个URL @@ -422,7 +447,11 @@ const saveAdd = async () => { if (successCount > 0) { cancelAdd(); - console.log(`成功添加 ${successCount} 个项目`); + if (importMode.value === 'overwrite') { + console.log(`覆盖导入完成:成功添加 ${successCount} 个项目`); + } else { + console.log(`重合导入完成:成功添加 ${successCount} 个项目`); + } } } }; diff --git a/ui/src/components/common/watchlist/AddModal.vue b/ui/src/components/common/watchlist/AddModal.vue index d5aef1b..c296d54 100644 --- a/ui/src/components/common/watchlist/AddModal.vue +++ b/ui/src/components/common/watchlist/AddModal.vue @@ -52,6 +52,35 @@