🔑 API Keys(管理员视角)
Admin 管理员集中管理所有用户的 AI API Key(OpenAI/Claude 等),包括查看、创建、禁用/启用、撤销。页面展示 Key 列表、关联账单、使用统计,支持按供应商/状态/账单筛选、关键词搜索。
路由:/api-keys
页面初始化触发
1. 进入页面 → 并发请求 2 个
触发条件:组件首次挂载
GET
/admin/api-keys
✅ 页面加载时自动触发
请求头:Authorization: Bearer {token}
Query 参数(可选):provider, is_active, bill_id
响应:[{id, provider, model, api_key, bill_id, bill_name, is_shared, priority, expires_at, is_active, total_usage, created_at}]
GET
/admin/bills
✅ 页面加载时自动触发(并发)
Query:limit=1000
用途:填充"所属账单"下拉筛选器
筛选操作触发
2. 切换供应商筛选 → GET /admin/api-keys(provider)
触发条件:选择供应商下拉框(OpenAI / Claude / 其他)
3. 切换状态筛选 → GET /admin/api-keys(is_active)
触发条件:选择状态下拉框(全部/启用/停用)
4. 切换账单筛选 → GET /admin/api-keys(bill_id)
触发条件:选择账单下拉框
5. 清空筛选 → 重置所有 → 重新请求
搜索操作
6. 搜索 → 本地筛选(非请求)
触发条件:搜索框输入 → 400ms 防抖 → 本地过滤(匹配 provider、model、bill_name)
创建操作
7. 点击"新建"按钮 → 弹出 Modal
触发条件:点击"新建"按钮(Key 图标)
- 显示
showModal=true - 表单初始值:
{ provider: '', model: '', api_key: '', bill_id: '', is_shared: false, priority: '', expires_at: '' }
8. 填写表单 → POST /admin/api-keys
触发条件:Modal 内点击"创建"按钮
POST
/admin/api-keys
✅ 点击"创建"按钮触发(需 provider + api_key 非空)
请求头:Authorization: Bearer {token}
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
provider | string | 必填 | 供应商名称(如 OpenAI、Claude) |
api_key | string | 必填 | API Key 值 |
model | string | 可选 | 模型名称 |
bill_id | integer | 可选 | 关联账单 ID |
is_shared | boolean | 可选 | 是否共享(默认 false) |
priority | integer | 可选 | 优先级(数字越小越优先) |
expires_at | string | 可选 | 过期时间(YYYY-MM-DD) |
副作用:创建成功后 → setShowModal(false) → 清空表单 → doFetchKeys() 刷新列表
前端校验:provider 或 api_key 为空时直接 return,不发送请求。
撤销操作
9. 点击"撤销"按钮 → PUT /admin/api-keys/:id/revoke
触发条件:点击某行的撤销按钮 →
confirm() 确认框
PUT
/admin/api-keys/:id/revoke
✅ 点击"撤销"按钮 + 用户确认后触发
请求头:Authorization: Bearer {token}
Body:{}(空对象)
副作用:成功后 → doFetchKeys() 刷新列表(is_active 变为 0)
不可恢复:撤销后 Key 失效,前端弹出
confirm() 确认框告知用户"撤销后不可恢复"。复制操作
10. 点击"复制"按钮 → 复制 API Key 到剪贴板
触发条件:点击某行的复制按钮
实现:
navigator.clipboard.writeText(key.api_key)(纯前端,无请求)