🔄 定期账单
Admin 管理员查看所有用户的定期记账规则(周/双周/月/年周期自动生成交易记录)。页面展示定期规则列表、频率分布、预计总金额,支持按账单/状态筛选、关键词搜索、CSV导出。
路由:/recurring
页面初始化触发
1. 进入页面 → 并发请求 2 个
触发条件:组件首次挂载(useEffect 依赖为空数组)
GET
/admin/recurring
✅ 页面加载时自动触发(无参数)
请求头:Authorization: Bearer {token}
Query 参数(可选):
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
bill_id | integer | 可选 | 按账单ID筛选 |
is_active | string | 可选 | "true"=启用中,"false"=已停用 |
响应:[{id, name, bill_id, bill_name, category_id, category_name, amount, tx_type, frequency, next_due_at, is_active, created_at}]
GET
/admin/bills
✅ 页面加载时自动触发(并发)
请求头:Authorization: Bearer {token}
Query:limit=1000
用途:填充"所属账单"下拉筛选器
筛选操作触发
2. 切换账单筛选 → GET /admin/recurring
触发条件:选择账单下拉框 →
handleBillChange(val) → 更新 ref → doFetchRecurring()3. 切换状态筛选 → GET /admin/recurring
触发条件:选择状态下拉框(启用中/已停用)→
handleStatusChange(val)4. 清空筛选 → 重置所有 ref → 重新请求
触发条件:点击"清空"按钮(仅在有激活筛选时显示)
搜索操作
5. 输入搜索词 → 本地筛选(非请求)
触发条件:搜索框输入 → 400ms 防抖 →
debouncedSearch 更新 → 本地过滤搜索方式:纯前端本地过滤。匹配字段:名称(name)、账单名(bill_name)、类目名(category_name)。大小写不敏感。
操作按钮
6. 点击"刷新"按钮 → 保留筛选重新请求
触发条件:点击刷新按钮(loading 时禁用)
7. 点击"导出 CSV" → 客户端生成并下载
触发条件:点击"导出 CSV"按钮
导出方式:纯前端实现。根据当前
filteredRecurring 生成 CSV,包含字段:名称、账单、类目、金额、类型、频率、下次执行、状态、创建时间。频率字段映射:daily→每天、weekly→每周、bi-weekly→双周、monthly→每月、yearly→每年。统计卡片(纯前端计算)
- 定期规则:
recurring.length - 启用中:
recurring.filter(r => r.is_active === 1).length - 每月预估:
recurring.reduce((sum, r) => sum + r.amount, 0)
表格底部合计行
当
!loading && filteredRecurring.length > 0 时,显示合计行:合计金额 = filteredRecurring.reduce((s, r) => s + (r.amount || 0), 0)频率映射
| 值 | 显示 |
|---|---|
daily | 每天 |
weekly | 每周 |
bi-weekly | 双周 |
monthly | 每月 |
yearly | 每年 |