📊 预算预警
Admin 管理员查看所有用户的预算预警规则。页面展示预警规则列表、使用率进度条、触发状态,支持按账单/状态筛选、关键词搜索、CSV导出。
路由:/budget-alerts(在 Admin 侧边栏无独立入口,属隐藏页面)
页面初始化触发
1. 进入页面 → 并发请求 2 个
触发条件:页面组件首次挂载(useEffect 依赖为空数组)
GET
/admin/budget-alerts
✅ 页面加载时自动触发(无参数)
请求头:Authorization: Bearer {token}
Query 参数(可选):
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
bill_id | integer | 可选 | 按账单ID筛选 |
is_active | integer | 可选 | 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 = val → doFetchAlerts()
GET
/admin/budget-alerts
✅ 切换账单筛选下拉框触发
Query:?bill_id={val}(其他激活的筛选也一并附上)
3. 切换状态筛选 → GET /admin/budget-alerts(is_active)
触发条件:选择状态下拉框值变化 →
handleStatusChange(val) → statusRef.current = val → doFetchAlerts()
GET
/admin/budget-alerts
✅ 切换状态筛选下拉框触发
Query:?is_active={1|0}
映射:"true" → 1(启用中),"false" → 0(已停用)
4. 点击"清空"按钮 → 重置所有筛选 + 重新请求
触发条件:账单或状态筛选有值时显示"清空"按钮 → 点击清空 → 所有 ref 置空 →
doFetchAlerts()- 清空
billFilter、statusFilter、search - 对应 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%:绿色