👥 用户管理
用户列表展示、筛选搜索、角色/状态管理、密码重置、导出CSV、清除游客。
页面结构
- 顶部:用户总数 + 刷新/导出/清除游客按钮
- 筛选栏:注册时间范围 + 角色下拉 + 状态下拉 + 是否游客下拉
- 搜索栏:按昵称/手机号/邮箱实时搜索(400ms 防抖,本地过滤)
- 用户表格:头像+昵称 / 手机号 / 邮箱 / 角色 / 状态 / 注册时间 / 操作
- 操作按钮:改密🔑 / 角色🛡️ / 详情👁 / 封禁🚫
- 弹窗:用户详情 Modal / 重置密码 Modal / 切换角色 Modal
触发时机详解
1. 页面加载 → GET /api/admin/users
触发条件:进入页面 / 刷新按钮 / 任意筛选条件变化
GET
/api/admin/users
✅ 页面加载时触发,筛选条件变化后自动重新请求
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
start_date | string | 选填 | 注册时间起始(YYYY-MM-DD) |
end_date | string | 选填 | 注册时间截止(YYYY-MM-DD) |
role | string | 选填 | 角色筛选:admin | developer | user |
status | string | 选填 | 状态筛选:active | banned |
is_guest | string | 选填 | 游客筛选:true | false(与 URL searchParams 同步) |
响应:
[{
"id": "string", "phone": "string", "nickname": "string",
"email": "string", "role": "user|admin|developer",
"status": "active|banned", "subscription_plan": "free|pro",
"subscription_expires_at": "ISO8601|null", "last_login_at": "ISO8601|null",
"created_at": "ISO8601", "is_guest": 0|1
}]
2. 点击「刷新」按钮
触发条件:点击刷新按钮 → 重新调用 GET /api/admin/users(保留当前筛选状态)
3. 修改筛选条件
触发条件:修改时间范围 / 角色 / 状态 / 游客筛选任意一项 → 立即重新请求 GET /api/admin/users
4. 搜索框输入(本地过滤,不发请求)
触发条件:搜索框输入 → 400ms 防抖后本地 JS 过滤(不回发请求)
过滤字段:nickname / phone / email(模糊匹配,不区分大小写)
过滤字段:nickname / phone / email(模糊匹配,不区分大小写)
5. 点击「改密」🔑 → POST /api/admin/users/:userId/reset-password
触发条件:点击改密按钮 → 弹出密码 Modal → 输入密码点击确认
POST
/api/admin/users/:userId/reset-password
✅ 点击"确认修改"按钮触发
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
password | string | 必填 | 新密码(至少6位) |
响应: {"success": true}
6. 点击「角色」🛡️ → PUT /api/admin/users/:userId/role
触发条件:点击角色按钮 → 弹出角色选择 Modal → 选择角色点击确认
PUT
/api/admin/users/:userId/role
✅ 点击"确认修改"按钮触发
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
role | string | 必填 | admin | developer | user |
响应: {"success": true}
7. 点击「封禁/解封」🚫 → PUT /api/admin/users/:userId/status
触发条件:点击封禁按钮(当前状态=active)或解封按钮(当前状态=banned)→ 直接发送请求,无需确认弹窗
PUT
/api/admin/users/:userId/status
✅ 点击封禁/解封按钮直接触发,无需确认弹窗
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
status | string | 必填 | active | banned |
响应: {"success": true}
8. 点击「清除游客」→ POST /api/admin/users/clear-guests
触发条件:点击清除游客按钮 → 浏览器 confirm() 确认 → 发送请求 → 刷新列表
POST
/api/admin/users/clear-guests
✅ 确认提示后触发
响应: {"success": true, "deleted": 5}
9. 点击「导出」→ 本地生成 CSV(无需后端 API)
触发条件:点击导出按钮 → 纯前端 JS 根据筛选后本地数据生成 CSV 文件并触发下载
注意:导出为纯前端实现,无需后端。包含昵称/手机/邮箱/角色/状态/订阅计划/注册时间/最后登录/是否游客字段。
10. 点击「详情」👁 → 本地展示 Modal(无需后端请求)
触发条件:点击详情按钮 → 本地 setSelectedUser(user) → 渲染详情 Modal(数据来自列表,无额外请求)