# My Page Overview API

本文定义 App 底部 `我的` 页首屏聚合接口。首屏只返回设计稿可直接展示的轻量摘要：基础资料、顶部计数、金币卡片、VIP 卡片、身份入口和固定功能入口。

## Endpoint

```http
GET /api/v1/users/me/overview
Authorization: Bearer <access_token>
```

响应使用 gateway `/api/v1` envelope：

```json
{
  "code": "OK",
  "message": "ok",
  "request_id": "req_01",
  "data": {
    "profile": {
      "user_id": "10001",
      "display_user_id": "163000",
      "default_display_user_id": "163000",
      "display_user_id_kind": "default",
      "display_user_id_expires_at_ms": 0,
      "username": "Alice",
      "avatar": "https://cdn.example.com/avatar.png",
      "language": "en",
      "profile_completed": true,
      "onboarding_status": "completed",
      "profile_bg_img": "https://cdn.example.com/profile-bg.png"
    },
    "profile_stats": {
      "visitors_count": 12,
      "following_count": 34,
      "friends_count": 56,
      "updated_at_ms": 1777996800000
    },
    "wallet": {
      "coin_amount": 12000,
      "updated_at_ms": 1777996800000
    },
    "vip": {
      "level": 3,
      "name": "VIP3",
      "active": true,
      "started_at_ms": 1777392000000,
      "expires_at_ms": 1777996800000
    },
    "roles": {
      "is_host": true,
      "is_agency": false,
      "is_manager": false,
      "is_bd": false,
      "is_bd_leader": false,
      "is_coin_seller": false,
      "host_status": "active",
      "agency_id": 0,
      "bd_id": 0,
      "pending_role_invitations": 0
    },
    "entries": [
      {
        "key": "store",
        "visible": true,
        "enabled": true,
        "route": "/store",
        "icon_key": "store",
        "badge_count": 0,
        "order": 10
      },
      {
        "key": "apply_host",
        "visible": false,
        "enabled": false,
        "route": "/host/apply",
        "icon_key": "apply_host",
        "badge_count": 0,
        "order": 70
      },
      {
        "key": "host_center",
        "visible": true,
        "enabled": true,
        "route": "/host",
        "icon_key": "host_center",
        "badge_count": 0,
        "order": 80
      }
    ],
    "server_time_ms": 1777996800000
  }
}
```

## Field Sources

| Field | Source | Rule |
| --- | --- | --- |
| `profile` | `user-service.GetUser` | 只取头像、昵称、展示 ID、语言等基础资料 |
| `profile.profile_bg_img` | `user-service.GetUser` | 取用户资料里的主页背景图；和 `profile_card` 装扮资源无关，未设置返回空字符串 |
| `profile_stats` | `user-service.GetMyProfileStats` | 读 `user_profile_stats` 计数表，不实时扫访问、关注、好友大表 |
| `wallet` | `wallet-service.GetWalletValueSummary` | 首屏只返回金币余额，不返回钻石和美元余额 |
| `vip` | `wallet-service.GetMyVip` | 只取等级、名称、有效期和 active 状态 |
| `roles` | `user-service.GetUserRoleSummary` | 所有身份统一判断，避免 gateway 多 RPC fanout |
| `entries` | gateway composition | 根据 `roles` 生成入口显隐；标题由 App 按 key 做多语言 |
| `server_time_ms` | gateway | 当前服务端毫秒时间 |

`我的` 页首屏不调用 `ListMessageTabs`，不返回系统消息红点、活动消息红点、邀请码、钻石、美元余额，也不返回钱包操作开关。充值、提现、兑换能力在钱包二级页取。

## Entry Rules

| Entry Key | Visible Rule |
| --- | --- |
| `store` | always true |
| `bag` | always true |
| `level` | always true |
| `task` | always true |
| `apply_host` | `roles.is_host == false` |
| `host_center` | `roles.is_host == true` |
| `agency_center` | `roles.is_agency == true` |
| `manager_center` | `roles.is_manager == true` |
| `bd_center` | `roles.is_bd == true` |
| `superadmin_center` | `roles.is_bd_leader == true` |
| `coin_seller_center` | `roles.is_coin_seller == true` |
| `settings` | always true |
| `language` | always true |

同一个用户可能同时拥有多个身份。角色必须用 bool flags 表达，不要用互斥枚举。

## Excluded From Overview

这些内容不能放进首屏接口：

| Field | Reason | Replacement |
| --- | --- | --- |
| 消息 tab、系统消息、活动消息 | 我的页设计稿不展示消息红点 | 消息 tab 页面接口 |
| 邀请码入口和邀请统计 | 截图首屏没有邀请码入口 | 邀请页或活动入口 |
| `wallet.recharge_enabled` / `diamond_exchange_enabled` | 首屏卡片不需要操作开关 | `GET /api/v1/wallet/me/overview` |
| `DIAMOND` / `HOST_SALARY_USD`, `AGENCY_SALARY_USD`, `BD_SALARY_USD`, `ADMIN_SALARY_USD` | 首屏钱包卡片只展示金币 | 钱包二级页余额接口 |
| 邀请用户列表、钱包流水、工资明细、团队成员、背包完整列表、任务列表 | 都需要分页或聚合 | 对应二级页接口 |

## Performance Budget

- 聚合超时预算：`200ms`。
- 必须并行请求 profile、profile stats、wallet value summary、VIP、role summary。
- 允许 wallet、VIP、profile stats、role summary 降级并返回 `unavailable=true`。
- `user-service.GetUser` 失败时整体失败，因为基础资料是首屏主数据。
- 首屏不得实时 `COUNT(*)`、不得扫流水、不得扫成员、不得查完整背包、不得现算工资。

```mermaid
sequenceDiagram
  participant C as Client
  participant G as gateway-service
  participant U as user-service
  participant W as wallet-service

  C->>G: GET /api/v1/users/me/overview
  par profile
    G->>U: GetUser(user_id)
  and stats
    G->>U: GetMyProfileStats(user_id)
  and roles
    G->>U: GetUserRoleSummary(user_id)
  and wallet
    G->>W: GetWalletValueSummary(user_id)
    G->>W: GetMyVip(user_id)
  end
  G->>G: compose entries
  G-->>C: overview
```

## Secondary Endpoints

| Endpoint | Purpose |
| --- | --- |
| `GET /api/v1/users/me/visitors` | 访问记录列表 |
| `GET /api/v1/users/me/following` | 关注列表 |
| `GET /api/v1/users/me/friends` | 好友列表 |
| `GET /api/v1/users/me/friend-requests` | 好友申请列表 |
| `GET /api/v1/users/me/role-summary` | 单独刷新身份摘要 |
| `GET /api/v1/wallet/me/overview` | 钱包二级页余额和操作开关 |
| `GET /api/v1/wallet/recharge/products` | 当前区域充值渠道和档位 |
| `GET /api/v1/wallet/diamond-exchange/config` | 钻石兑换金币/余额配置 |
| `GET /api/v1/wallet/transactions` | 钱包流水分页 |
| `GET /api/v1/vip/me` | 当前 VIP 状态 |
| `GET /api/v1/vip/packages` | 可购买 VIP 包 |
| `POST /api/v1/vip/purchase` | 购买、续期或升级 VIP |
