# 弹窗配置 Flutter 对接

## 地址

`GET /api/v1/app/popups`

公开接口，不需要登录。返回后台 `APP配置 -> 弹窗配置` 中当前有效的弹窗列表。

## 参数

| 参数 | 位置 | 必填 | 说明 |
| --- | --- | --- | --- |
| `X-App-Code` | Header | 否 | App 编码，默认 `lalu`。 |
| `X-App-Package` | Header | 否 | 包名或 Bundle ID，用于服务端解析 App。 |

示例：

```http
GET /api/v1/app/popups
X-App-Code: lalu
```

## 返回值

```json
{
  "code": "OK",
  "message": "ok",
  "request_id": "req_abc",
  "data": {
    "items": [
      {
        "id": 21,
        "code": "new-user-popup",
        "name": "新人活动",
        "image_url": "https://cdn.example.com/popup.png",
        "jump_type": "h5",
        "jump_url": "https://h5.example.com/new-user",
        "display_period_days": 1,
        "sort_order": 1,
        "starts_at_ms": 1700000000000,
        "ends_at_ms": 1800000000000,
        "updated_at_ms": 1700000004000
      }
    ],
    "total": 1
  }
}
```

| 字段 | 说明 |
| --- | --- |
| `items` | 当前可展示的弹窗配置列表，已按 `sort_order DESC, id DESC` 排序。 |
| `code` | 弹窗编码，同一个 App 下唯一，用于 Flutter 本地频控和埋点识别。 |
| `name` | 弹窗名字。 |
| `image_url` | 弹窗图片地址，可能为空。 |
| `jump_type` | `h5` 或 `app`。 |
| `jump_url` | `jump_type=h5` 时是 H5 链接；`jump_type=app` 时由 Flutter 解释。 |
| `display_period_days` | 展示周期。`0` 表示每次打开 App 都展示；`1` 表示 1 天展示一次；`2`、`3`、`4` 同理。 |
| `starts_at_ms` / `ends_at_ms` | 弹窗生效时间。`0` 表示不限。 |

Flutter 处理规则：

1. 调接口后按 `items` 顺序取第一个满足本地频控的弹窗。
2. 用 `popup_last_show:{code}:{updated_at_ms}` 记录本地最后展示时间。
3. `display_period_days=0` 不读本地间隔，每次打开都可以展示。
4. `display_period_days>0` 时，距离上次展示满对应天数后再展示。
5. 用户点击弹窗时，`jump_type=h5` 打开 H5；`jump_type=app` 走 App 内路由。

## 相关 IM

无。
