# 首页 Banner / 广告位 跳转现状梳理

> 状态：现状分析（仅梳理，代码未改）。日期：2026-06-03
> 范围：小程序 `pages/index/index.vue` 首页各广告位的点击跳转逻辑，对照后端配置。

---

## 一、后端是怎么配置跳转的

每条 banner/广告（表 `home_banner_region`）、金刚位（表 `home_button_region`）都有统一的跳转配置字段，核心是 **`promotion_type`（推广类型）**：

| promotion_type | 含义 | 配套字段 |
|---|---|---|
| 1 | 无跳转 | — |
| 2 | 选择活动 | 关联 `advertisement_goods`（按 banner id） |
| 3 | 跳转本程序页面 | `link_url` |
| 4 | 跳转其他小程序 | `appid` + `link_url` |
| 5 | 选择商品 | `advertisement_goods[].goods_id` |

- 后台创建/编辑接口（`api/admin/v2/crud_home_banner_region.go`）用 `promotion_type` + `required-if` 校验对应字段，例如 type=4 必填 appid、type=3/4 必填 link_url。
- `home_button_region`（金刚位）字段相同，也有 `promotion_type` / `link_url` / `appid`。
- type=2/5 的落地：`/packages/advertising/index/index?id=<banner.id>` 是“广告聚合落地页”，传 banner 自身 id 进去，页面内部拉该 banner 关联的 `advertisement_goods` 商品列表展示，并可进入 `goodsDetail`。

---

## 二、前端实际怎么跳的（问题所在）

首页有 4 个不同的点击处理函数各管一片，**几乎都没读 `promotion_type`**：

### 1. `headerServerClick`（金刚位 tabList、homeLeftList 用）
- 文件：`pages/index/index.vue`（搜 `headerServerClick(e)`）
- 只看 `link_url` 和 `appid`，**完全忽略 `promotion_type`**。
- 逻辑：无 `link_url` → 弹“此功能暂未开通”；有 `appid` → 跳小程序；否则当本程序路径 `NavgateTo`。
- **后果**：type=2（活动）、type=5（商品）的配置它不认 → 落到“没 link_url”分支 → 弹“暂未开通”。

### 2. `toAdvertisingView`（广告横幅 serverLeft、serverRight[0] 用）
- 文件：`pages/index/index.vue:357` 附近
- **写死**跳 `/packages/advertising/index/index?id=xxx`，不看 `promotion_type`，一律进广告落地页。

### 3. `goToPurify`（serverRight 非首个用，模板 `index.vue:101`）
- 文件：`pages/index/index.vue:363` 附近
- **彻底写死**：固定跳净水小程序 `appId=wx77b22c0a0018e580`，path/appId 全硬编码，传入的 `item` 没用到，与后台配置零关系。
- 模板：`@tap="index === 0 ? toAdvertisingView(serverRightList) : goToPurify(item)"` —— serverRight 第一个跳广告页，其余全跳净水小程序。

### 4. `headerServerClick2`（中部 serverItem / homeRightList1,2 用）
- 文件：`pages/index/index.vue`（搜 `headerServerClick2(e)`）
- 不跳外链，只按 `title` 匹配商家分类做筛选，或固定跳本地生活页。**注意：这一处可能是“按分类筛选”的有意设计，不一定算 bug。**

### 5. 顶部轮播 Banner（位置 1，模板 `index.vue:68`）
- 点击事件被**注释掉了**（`<!-- <swiper-item ... @click="headerServerClick(item)"> -->`），顶部 banner 现在点击无反应。

---

## 三、根因

后台用统一的 `promotion_type` 模型配跳转，前端却是早期“按位置分别写死”的处理函数拼起来的：既没统一读 `promotion_type`，部分位置还硬编码了目标（广告页、净水小程序）。所以出现“很多跳转和后台配置不符”——不是数据错，是前端没按配置解析。

---

## 四、建议修法（未实施，待决策）

做一个统一跳转函数 `handleAdJump(item)`，严格按 `promotion_type` 分发：

```
switch promotion_type:
  1: 不跳
  2: NavgateTo('/packages/advertising/index/index?id=' + item.id)  // 活动
  3: link_url 跳本程序页面（兼容 shopEnter 特例 / H5 / APP webview）
  4: navigateToMiniProgram(appid, link_url)                         // 其他小程序
  5: NavgateTo('/packages/advertising/index/index?id=' + item.id)  // 商品（同活动，落地页内展示）
  其他: 弹“暂未开通”
```

然后把首页所有广告位的 `@click`/`@tap` 都换成 `handleAdJump(item)`：
- 顶部轮播 banner：取消注释，改 `handleAdJump`
- 金刚位 tabList、homeLeftList：`headerServerClick` → `handleAdJump`
- serverLeft、serverRight：`toAdvertisingView` / `goToPurify` → `handleAdJump`

### 实施前需确认的点
1. `headerServerClick2`（中部 serverItem 按 title 筛分类）是否要保留分类筛选语义？还是也改成按 `promotion_type` 跳？
2. 净水小程序跳转：是想**保留写死**，还是改由后台某条 banner 配 `type=4 + 该 appid` 来控制（更灵活，去掉硬编码）？
3. type=2/5 是否都统一进广告落地页 `/packages/advertising/index/index?id=banner.id`（当前分析结论是“是”）。

> 相关：`promotion_type` 字段定义见 `huichang-server/internal/model/entity/home_banner_region.go`、`home_button_region.go`；广告落地页 `uniapp-ZHSQ/packages/advertising/index/index.vue`。
