👥 用户管理

用户列表展示、筛选搜索、角色/状态管理、密码重置、导出CSV、清除游客。

页面结构

  • 顶部:用户总数 + 刷新/导出/清除游客按钮
  • 筛选栏:注册时间范围 + 角色下拉 + 状态下拉 + 是否游客下拉
  • 搜索栏:按昵称/手机号/邮箱实时搜索(400ms 防抖,本地过滤)
  • 用户表格:头像+昵称 / 手机号 / 邮箱 / 角色 / 状态 / 注册时间 / 操作
  • 操作按钮:改密🔑 / 角色🛡️ / 详情👁 / 封禁🚫
  • 弹窗:用户详情 Modal / 重置密码 Modal / 切换角色 Modal

触发时机详解

1. 页面加载 → GET /api/admin/users

触发条件:进入页面 / 刷新按钮 / 任意筛选条件变化
GET /api/admin/users
✅ 页面加载时触发,筛选条件变化后自动重新请求
参数类型必填说明
start_datestring选填注册时间起始(YYYY-MM-DD)
end_datestring选填注册时间截止(YYYY-MM-DD)
rolestring选填角色筛选:admin | developer | user
statusstring选填状态筛选:active | banned
is_gueststring选填游客筛选: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(模糊匹配,不区分大小写)

5. 点击「改密」🔑 → POST /api/admin/users/:userId/reset-password

触发条件:点击改密按钮 → 弹出密码 Modal → 输入密码点击确认
POST /api/admin/users/:userId/reset-password
✅ 点击"确认修改"按钮触发
参数类型必填说明
passwordstring必填新密码(至少6位)

响应: {"success": true}

6. 点击「角色」🛡️ → PUT /api/admin/users/:userId/role

触发条件:点击角色按钮 → 弹出角色选择 Modal → 选择角色点击确认
PUT /api/admin/users/:userId/role
✅ 点击"确认修改"按钮触发
参数类型必填说明
rolestring必填admin | developer | user

响应: {"success": true}

7. 点击「封禁/解封」🚫 → PUT /api/admin/users/:userId/status

触发条件:点击封禁按钮(当前状态=active)或解封按钮(当前状态=banned)→ 直接发送请求,无需确认弹窗
PUT /api/admin/users/:userId/status
✅ 点击封禁/解封按钮直接触发,无需确认弹窗
参数类型必填说明
statusstring必填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(数据来自列表,无额外请求)