# 小程序首页第二屏 - 主题卡片去掉"链接类型"字段

- **日期**: 2026-04-18
- **PR**: [#829](https://git.1814.love:8443/wx/HL/pulls/829) (Closes #828)
- **类型**: 契约变更（减字段）
- **状态**: 已合并到 dev + 测试环境部署中

> 本次改动紧随同日的 [#823 首页第二屏 v2](./2026-04-18_home-screen2-v2.md)。v2 设计的"卡片链接跳转"能力产品决定取消，卡片回归纯展示。

---

## 受影响接口

### 管理端
- `PUT /admin/home-config/brand-story`（保存品牌故事）
- `GET /admin/home-config/brand-story`（查询品牌故事）

### 小程序端
- `GET /mp/home-config/screen2`（首页第二屏聚合）

## 删除字段（每张卡片 `cards[i]`）

| 字段 | 类型 | 原含义 |
|---|---|---|
| ~~`linkType`~~ | String | 链接类型（NONE/PRODUCT/PRODUCT_LINE/ARTICLE/URL/MINI_PAGE） |
| ~~`linkTarget`~~ | String | 链接目标（产品/产品线 ID / URL / 小程序页面路径） |
| ~~`linkTargetType`~~ | String | 响应回填的产品类型（CORE/GROUP） |

## 保留字段（每张卡片 `cards[i]`）

| 字段 | 类型 | 说明 |
|---|---|---|
| `title` | String | 卡片标题（必填，≤100 字符） |
| `subtitle` | String | 卡片副标题（可选，≤200 字符） |
| `coverUrl` | String | 封面图 URL（必填，https CDN 直链，≤500 字符） |

## 请求示例（PUT /admin/home-config/brand-story）

```json
{
  "title": "每一条线路，我们都亲自走过。",
  "subtitle": null,
  "description": "整个呼伦贝尔...",
  "coverUrl": "https://cdn.hulalv.com/home/brand.jpg",
  "cards": [
    {
      "title": "季节之旅",
      "subtitle": "夏·秋·冬三季体验",
      "coverUrl": "https://cdn.hulalv.com/cards/1.jpg"
    },
    {
      "title": "亲子研学",
      "subtitle": "边玩边学·深度体验",
      "coverUrl": "https://cdn.hulalv.com/cards/2.jpg"
    }
  ],
  "publish": true
}
```

## 响应示例（GET /mp/home-config/screen2）

```json
{
  "code": 200,
  "data": {
    "brandStory": {
      "title": "每一条线路，我们都亲自走过。",
      "description": "...",
      "coverUrl": "https://cdn.hulalv.com/home/brand.jpg"
    },
    "cards": [
      {
        "title": "季节之旅",
        "subtitle": "夏·秋·冬三季体验",
        "coverUrl": "https://cdn.hulalv.com/cards/1.jpg"
      }
    ]
  }
}
```

## 前端 Action

### 管理端（必改）
1. 移除卡片编辑区底部"链接类型 *"下拉框组件
2. 移除卡片编辑区"链接目标"相关组件（如产品选择器 / URL 输入框 / 小程序页面选择）
3. 请求体中 `cards[i]` 不再传 `linkType` / `linkTarget`

### 小程序端（必改）
1. 主题卡片点击事件去除（卡片不再支持跳转）
2. 如果之前读了 `cards[i].linkType` / `.linkTarget` / `.linkTargetType` 的逻辑，一并删除

## 向后兼容说明

- DB 存量数据中的 JSON 字段 `linkType/linkTarget/linkTargetType` 不删，反序列化时被后端 `@JsonIgnoreProperties(ignoreUnknown=true)` 安全忽略
- 前端如果旧请求仍传了这三个字段，后端也会被 `@JsonIgnoreProperties(ignoreUnknown=true)` 忽略（不会 400）
- 但**不推荐继续传**，清理前端代码更彻底

## 校验规则变化

| 字段 | 变化 |
|---|---|
| `cards[i].linkType` | 原 `@NotBlank + @Pattern(NONE/PRODUCT/PRODUCT_LINE/ARTICLE/URL/MINI_PAGE)` → **字段删除** |
| `cards[i].linkTarget` | 原 `@Length(max=500)` → **字段删除** |
| `cards` 数组 | 保留 `@Size(max=2)` |

## 回归验证

部署后调 `GET /mp/home-config/screen2`，确认 `data.cards[i]` 只包含 title / subtitle / coverUrl 即可。
