From e0fa1abec5bf59a8fc523a9cc1d7ead86ed98143 Mon Sep 17 00:00:00 2001 From: rosercode Date: Wed, 23 Sep 2026 10:20:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=A1=A8=E6=A0=BC=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=BB=9F=E4=B8=80=E9=85=8D=E7=BD=AE=E5=B9=B6?= =?UTF-8?q?=E8=AE=B0=E5=BF=86=E5=90=84=E8=A1=A8=E6=A0=BC=E6=AF=8F=E9=A1=B5?= =?UTF-8?q?=E6=9D=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 后端新增聚合用户偏好 paginationPrefs(每页条数候选列表与默认每页条数),提供 GET/PUT /api/setting/pagination-prefs,默认候选 [10,20,50,100]、默认每页 20,非法值自动过滤并回退 - 后端新增 /category/page、/tag/page、/channel/page、/email-bill/configs/page、/email-bill/sender-rules/page 分页接口,原全量接口保持不变以免影响下拉、筛选、AI 与导出 - 前端新增共享 composables/usePageSizeOptions.ts 与 useTablePageSize.ts,所有表格统一取用候选列表并记住各自上次选择的每页条数,优先级为表格记忆 > 全局默认 > 20 - 各表格上次选择以聚合偏好 finance.pagination.tablePageSizes 存于本机 localStorage,收支记录页旧的 filterPrefs.pageSize 自动迁移 - 设置页外观设置新增「表格每页条数选项」分组,可增删候选值并配置默认每页条数,保存后全局即时生效 - 路由守卫在已登录时预加载分页偏好,保证表格页首次渲染即使用配置值 - 前端分类、标签、渠道、邮箱配置、发件人规则表格接入后端分页 - 补充中文、英文、日文三语文案 --- frontend/src/api/category.ts | 5 + frontend/src/api/channel.ts | 5 + frontend/src/api/emailBill.ts | 10 ++ frontend/src/api/setting.ts | 10 ++ frontend/src/api/tag.ts | 5 + .../src/components/DisplayConfigPanel.vue | 88 ++++++++++++- .../TransactionRelationEditorModal.vue | 18 ++- .../src/composables/usePageSizeOptions.ts | 59 +++++++++ frontend/src/composables/useTablePageSize.ts | 20 +++ frontend/src/locales/messages.ts | 7 ++ frontend/src/router/index.ts | 10 +- frontend/src/utils/storageKeys.ts | 2 + frontend/src/utils/tablePageSizePrefs.ts | 34 +++++ frontend/src/views/CategoryManage.vue | 118 ++++++++++++++++-- frontend/src/views/ChannelManage.vue | 52 +++++++- frontend/src/views/EmailBillManage.vue | 101 +++++++++++++-- frontend/src/views/Logs.vue | 13 +- frontend/src/views/RuleManage.vue | 13 +- frontend/src/views/TagManage.vue | 52 +++++++- frontend/src/views/TransactionList.vue | 19 ++- .../controller/CategoryController.java | 19 +++ .../finance/controller/ChannelController.java | 17 +++ .../controller/EmailBillController.java | 32 +++++ .../finance/controller/TagController.java | 18 +++ .../controller/UserSettingController.java | 34 ++++- .../finance/dto/PaginationPrefsRequest.java | 20 +++ .../finance/service/CategoryService.java | 12 ++ .../finance/service/ChannelService.java | 11 ++ .../service/EmailBillConfigService.java | 11 ++ .../service/EmailBillSenderRuleService.java | 11 ++ .../rosercode/finance/service/TagService.java | 11 ++ .../service/UserPreferenceService.java | 18 +++ .../service/impl/CategoryServiceImpl.java | 24 ++++ .../service/impl/ChannelServiceImpl.java | 46 ++++++- .../impl/EmailBillConfigServiceImpl.java | 22 ++++ .../impl/EmailBillSenderRuleServiceImpl.java | 23 ++++ .../finance/service/impl/TagServiceImpl.java | 22 ++++ .../impl/UserPreferenceServiceImpl.java | 92 ++++++++++++++ .../finance/vo/PaginationPrefsVO.java | 20 +++ 39 files changed, 1042 insertions(+), 62 deletions(-) create mode 100644 frontend/src/composables/usePageSizeOptions.ts create mode 100644 frontend/src/composables/useTablePageSize.ts create mode 100644 frontend/src/utils/tablePageSizePrefs.ts create mode 100644 src/main/java/cn/rosercode/finance/dto/PaginationPrefsRequest.java create mode 100644 src/main/java/cn/rosercode/finance/vo/PaginationPrefsVO.java diff --git a/frontend/src/api/category.ts b/frontend/src/api/category.ts index 3c57c44..3909b3f 100644 --- a/frontend/src/api/category.ts +++ b/frontend/src/api/category.ts @@ -6,6 +6,11 @@ export function getCategoryList(type?: string) { return request.get('/category/list', { params: type ? { type } : {} }) } +/** 分页获取分类列表,可按类型筛选 */ +export function getCategoryPage(params: { type?: string; page?: number; size?: number }) { + return request.get('/category/page', { params }) +} + /** 创建新分类 */ export function createCategory(data: { name: string; type: string; icon?: string; sortOrder?: number }) { return request.post('/category', data) diff --git a/frontend/src/api/channel.ts b/frontend/src/api/channel.ts index 9b510c6..9ad6277 100644 --- a/frontend/src/api/channel.ts +++ b/frontend/src/api/channel.ts @@ -14,6 +14,11 @@ export function getChannelList() { return request.get('/channel') } +/** 分页查询当前用户的自定义渠道列表(含使用账单数) */ +export function getChannelPage(params: { page?: number; size?: number }) { + return request.get('/channel/page', { params }) +} + /** 新建自定义渠道 */ export function createChannel(name: string) { return request.post('/channel', { name }) diff --git a/frontend/src/api/emailBill.ts b/frontend/src/api/emailBill.ts index 0a39877..ac75042 100644 --- a/frontend/src/api/emailBill.ts +++ b/frontend/src/api/emailBill.ts @@ -99,6 +99,11 @@ export function listEmailBillConfigs() { return request.get('/email-bill/configs') } +/** 分页查询邮箱配置列表 */ +export function pageEmailBillConfigs(params: { page?: number; size?: number }) { + return request.get('/email-bill/configs/page', { params }) +} + /** 新增邮箱配置 */ export function createEmailBillConfig(data: EmailBillConfigPayload) { return request.post('/email-bill/configs', data) @@ -134,6 +139,11 @@ export function listEmailBillSenderRules() { return request.get('/email-bill/sender-rules') } +/** 分页查询发件人规则列表 */ +export function pageEmailBillSenderRules(params: { page?: number; size?: number }) { + return request.get('/email-bill/sender-rules/page', { params }) +} + /** 新增发件人规则 */ export function createEmailBillSenderRule(data: EmailBillSenderRulePayload) { return request.post('/email-bill/sender-rules', data) diff --git a/frontend/src/api/setting.ts b/frontend/src/api/setting.ts index 2fb308a..a47d50c 100644 --- a/frontend/src/api/setting.ts +++ b/frontend/src/api/setting.ts @@ -30,3 +30,13 @@ export function getShowHiddenData() { export function updateShowHiddenData(show: boolean) { return request.put('/setting/show-hidden-data', { show }) } + +/** 查询当前用户配置的表格分页偏好(每页条数候选列表与默认每页条数) */ +export function getPaginationPrefs() { + return request.get('/setting/pagination-prefs') +} + +/** 更新当前用户配置的表格分页偏好 */ +export function updatePaginationPrefs(data: { options: number[]; defaultSize: number }) { + return request.put('/setting/pagination-prefs', data) +} diff --git a/frontend/src/api/tag.ts b/frontend/src/api/tag.ts index 92a0ec1..8647bcc 100644 --- a/frontend/src/api/tag.ts +++ b/frontend/src/api/tag.ts @@ -6,6 +6,11 @@ export function getTagList() { return request.get('/tag/list') } +/** 分页获取标签列表 */ +export function getTagPage(params: { page?: number; size?: number }) { + return request.get('/tag/page', { params }) +} + /** 创建新标签 */ export function createTag(data: { name: string; color?: string; sortOrder?: number }) { return request.post('/tag', data) diff --git a/frontend/src/components/DisplayConfigPanel.vue b/frontend/src/components/DisplayConfigPanel.vue index 48d7f3f..ea0ebce 100644 --- a/frontend/src/components/DisplayConfigPanel.vue +++ b/frontend/src/components/DisplayConfigPanel.vue @@ -1,12 +1,16 @@ @@ -147,6 +214,21 @@ onMounted(() => { +
+
{{ t('display.pageSizeLabel') }}
+ {{ t('display.pageSizeHint') }} + + + + + {{ t('display.defaultPageSizeLabel') }} + + + {{ t('display.pageSizeSave') }} + + +
+