From 39b0c36d08bc75aad314dc0a316dc3684642dd9c Mon Sep 17 00:00:00 2001 From: rosercode Date: Wed, 14 Oct 2026 01:21:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=A7=84=E5=88=99/=E5=88=86=E7=B1=BB/?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E7=AE=A1=E7=90=86=E6=89=B9=E9=87=8F=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=A8=A1=E5=BC=8F=E4=B8=8E=E9=82=AE=E7=AE=B1=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E8=BF=9B=E5=BA=A6=E6=97=B6=E9=97=B4=E6=88=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 规则、分类、标签三个管理页统一为「批量操作模式」:默认不显示勾选框,点右上角「批量操作」进入后再勾选与批量操作,退出即清空选择;同时补齐标签、分类的批量删除能力,并把规则「应用规则到匹配账单」的预览弹窗加宽以容纳全部列。此外为邮箱账单「立即检查」的实时进度加上行首时间戳,便于判断进度先后与是否停滞。 变更内容: - 规则管理:默认隐藏勾选列,进入批量模式后方可勾选;「应用匹配账单」「批量删除」移入批量模式,「AI 生成规则」在批量模式下隐藏。 - 标签管理:新增批量操作模式与批量删除,同时清理交易-标签、规则-标签关联(DELETE /api/tag/batch)。 - 分类管理:新增批量操作模式与批量删除,收入/支出两表勾选合并处理(DELETE /api/category/batch)。 - 应用预览弹窗(RuleApplyPreviewModal)宽度由 min(1200px,94vw) 改为 min(1400px,96vw),表格 max-height 由 420 改为 560。 - 邮箱账单「立即检查」:SSE 推送的进度行与提示、前端追加的结果/失败提示行,统一加 [HH:mm:ss] 行首时间戳。 - 新增 tag/category 批量文案(zh/en/ja)与前端 API 封装 batchDeleteTags / batchDeleteCategories。 说明: - 标签删除会从所有交易记录中移除该标签,分类删除仅移除分类本身(账单显示为未分类),与原有单条删除行为一致。 - 后端批量删除均按 userId 过滤归属,仅删除属于当前用户的记录,返回实际删除数。 - 邮箱时间戳为纯展示改动,不影响业务逻辑与数据。 --- frontend/src/api/category.ts | 5 ++ frontend/src/api/tag.ts | 5 ++ .../src/components/RuleApplyPreviewModal.vue | 4 +- frontend/src/locales/messages.ts | 38 +++++++++++ frontend/src/views/CategoryManage.vue | 67 ++++++++++++++++++- frontend/src/views/EmailBillManage.vue | 12 +++- frontend/src/views/RuleManage.vue | 35 +++++++--- frontend/src/views/TagManage.vue | 56 +++++++++++++++- .../controller/CategoryController.java | 14 ++++ .../ledgerly/controller/TagController.java | 14 ++++ .../ledgerly/service/CategoryService.java | 9 +++ .../service/EmailBillCheckStreamService.java | 18 ++++- .../ledgerly/service/TagService.java | 9 +++ .../service/impl/CategoryServiceImpl.java | 27 ++++++++ .../ledgerly/service/impl/TagServiceImpl.java | 32 +++++++++ 15 files changed, 326 insertions(+), 19 deletions(-) diff --git a/frontend/src/api/category.ts b/frontend/src/api/category.ts index 3909b3f..624becb 100644 --- a/frontend/src/api/category.ts +++ b/frontend/src/api/category.ts @@ -25,3 +25,8 @@ export function updateCategory(id: number, data: { name: string; type: string; i export function deleteCategory(id: number) { return request.delete(`/category/${id}`) } + +/** 批量删除分类,返回实际删除数量 */ +export function batchDeleteCategories(ids: number[]) { + return request.delete('/category/batch', { data: { ids } }) +} diff --git a/frontend/src/api/tag.ts b/frontend/src/api/tag.ts index 8647bcc..7256dc5 100644 --- a/frontend/src/api/tag.ts +++ b/frontend/src/api/tag.ts @@ -25,3 +25,8 @@ export function updateTag(id: number, data: { name: string; color?: string; sort export function deleteTag(id: number) { return request.delete(`/tag/${id}`) } + +/** 批量删除标签,返回实际删除数量 */ +export function batchDeleteTags(ids: number[]) { + return request.delete('/tag/batch', { data: { ids } }) +} diff --git a/frontend/src/components/RuleApplyPreviewModal.vue b/frontend/src/components/RuleApplyPreviewModal.vue index c47e399..ed5b69d 100644 --- a/frontend/src/components/RuleApplyPreviewModal.vue +++ b/frontend/src/components/RuleApplyPreviewModal.vue @@ -128,7 +128,7 @@ async function handleApply() {