# 团队/分销成员列表 API 接口文档

本文档描述了获取团队成员列表（直推用户）的后端接口规范，用于支持前端正确显示成员的会员身份（如倾听会员、陪伴会员、守护会员、心伴会员）。

## 接口基本信息

- **URL**: `/api/commission`
- **Method**: `GET`
- **Query Parameters**:
  - `action`: 固定为 `referrals`
  - `page`: 页码（从1开始）
  - `pageSize`: 每页数量

## 响应结构

接口应返回 JSON 格式数据。

### 成功响应示例

```json
{
  "success": true,
  "data": {
    "list": [
      {
        "userId": 12345,
        "userName": "用户昵称",
        "userAvatar": "https://example.com/avatar.jpg",
        "userRole": "soulmate", 
        "userRoleName": "心伴会员",
        "boundAt": "2025-02-04 10:00:00",
        "totalContribution": 100.00
      },
      {
        "userId": 67890,
        "userName": "普通用户A",
        "userRole": "",
        "userRoleName": "",
        "boundAt": "2025-02-03 15:30:00"
      }
    ],
    "total": 100,
    "page": 1,
    "pageSize": 20
  }
}
```

### 关键字段说明 (`list` 数组项)

| 字段名 | 类型 | 必填 | 说明 |
| :--- | :--- | :--- | :--- |
| `userId` | Number/String | 是 | 用户唯一标识 |
| `userName` | String | 否 | 用户昵称，如果为空前端会显示默认名称 |
| `userAvatar` | String | 否 | 用户头像URL |
| `userRole` | String | **推荐** | 用户会员身份标识（枚举值见下表）。前端会优先根据此字段映射显示中文名称。 |
| `userRoleName` | String | **可选** | 直接返回显示的会员名称（如“心伴会员”）。如果提供了此字段，前端将直接显示此值，不再进行映射。 |
| `boundAt` | String/Number | 是 | 绑定时间/注册时间 |
| `totalContribution` | Number | 否 | 贡献收益金额 |

### 会员身份枚举值 (`userRole`)

前端已内置以下映射关系，请后端返回对应的英文标识：

| 英文标识 (`userRole`) | 对应显示的名称 | 说明 |
| :--- | :--- | :--- |
| `listener` | **倾听会员** | |
| `companion` | **陪伴会员** | |
| `guardian` | **守护会员** | |
| `soulmate` | **心伴会员** | |
| `partner` | **城市合伙人** | |
| `(空字符串)` | **普通用户** | 未开通任何会员 |

**注意：**
1. 如果用户未开通任何会员，`userRole` 应返回空字符串 `""` 或 `null`，前端将显示为“普通用户”。
2. 如果用户有多个身份，请返回最高级别的身份标识。
3. 如果后端返回了 `userRoleName` 字段（例如 "超级VIP"），前端将直接显示该字段的值，忽略 `userRole` 的映射。这可用于支持未来新增的会员类型而无需修改前端代码。

## 常见问题排查

如果前端显示“普通用户”但不正确：
1. 检查后端是否返回了 `userRole` 字段。
2. 检查 `userRole` 的值是否在上述枚举表中（区分大小写，前端期望全小写）。
3. 检查是否误传了 `isDistributor` 字段导致前端误判（新版前端代码已移除对 `isDistributor` 的依赖，改为默认显示“普通用户”）。

如果前端显示“undefined”或空白：
1. 检查 `userRole` 和 `userRoleName` 是否都为空。
