📊 预算预警

Admin 管理员查看所有用户的预算预警规则。页面展示预警规则列表、使用率进度条、触发状态,支持按账单/状态筛选、关键词搜索、CSV导出。

路由/budget-alerts(在 Admin 侧边栏无独立入口,属隐藏页面)

页面初始化触发

1. 进入页面 → 并发请求 2 个

触发条件:页面组件首次挂载(useEffect 依赖为空数组)
GET /admin/budget-alerts
✅ 页面加载时自动触发(无参数)

请求头Authorization: Bearer {token}

Query 参数(可选):

参数类型必填说明
bill_idinteger可选按账单ID筛选
is_activeinteger可选1=启用中,0=已停用

响应[{id, bill_id, bill_name, category_id, category_name, user_nickname, threshold_pct, budget_amount, spent, is_active, last_triggered_at, created_at}]

GET /admin/bills
✅ 页面加载时自动触发(并发,无需等待)

请求头Authorization: Bearer {token}

Query 参数limit=1000

响应[{id, name, ...}]

用途:填充"所属账单"下拉筛选器

并发说明:两个请求同时发出,互不依赖。bills 数据用于填充筛选下拉框,budget-alerts 数据用于渲染表格。

筛选操作触发

2. 切换账单筛选 → GET /admin/budget-alerts(bill_id)

触发条件:选择账单下拉框值变化 → handleBillChange(val)billRef.current = valdoFetchAlerts()
GET /admin/budget-alerts
✅ 切换账单筛选下拉框触发

Query?bill_id={val}(其他激活的筛选也一并附上)

3. 切换状态筛选 → GET /admin/budget-alerts(is_active)

触发条件:选择状态下拉框值变化 → handleStatusChange(val)statusRef.current = valdoFetchAlerts()
GET /admin/budget-alerts
✅ 切换状态筛选下拉框触发

Query?is_active={1|0}

映射"true" → 1(启用中),"false" → 0(已停用)

4. 点击"清空"按钮 → 重置所有筛选 + 重新请求

触发条件:账单或状态筛选有值时显示"清空"按钮 → 点击清空 → 所有 ref 置空 → doFetchAlerts()
  • 清空 billFilterstatusFiltersearch
  • 对应 ref 也置空
  • 调用 doFetchAlerts()(无参数,取全量)

搜索操作

5. 输入搜索词 → 本地筛选(非请求)

触发条件:搜索框输入 → 300ms 防抖 → debouncedSearch 更新 → filteredAlerts 本地过滤
搜索方式:纯前端本地过滤,不发请求。匹配字段:账单名(bill_name)、类目名(category_name)、用户名(user_nickname)。大小写不敏感。

操作按钮

6. 点击"刷新"按钮 → 重新请求 budget-alerts

触发条件:点击刷新按钮(loading 时禁用)
  • 调用 doFetchAlerts()(保留当前筛选状态)
  • 按钮显示 spin 动画直到请求完成

7. 点击"导出 CSV" → 客户端生成并下载

触发条件:点击"导出 CSV"按钮
导出方式:纯前端实现,无后端请求。根据当前 filteredAlerts(已筛选数据)生成 CSV,包含字段:账单、类目、用户、预警阈值、预算金额、当前使用、使用率、状态、最近触发、创建时间。

统计卡片(纯前端计算)

  • 预警规则alerts.length(全部加载数量)
  • 启用中alerts.filter(a => a.is_active === 1).length
  • 已触发alerts.filter(a => a.last_triggered_at).length

使用率颜色规则

  • ≥ 90%:红色
  • ≥ 75%:橙色
  • < 75%:绿色