# TicketHome 首页接口接入设计 ## 目标 在 `src/pages-service/tickets/index.vue` 中调用 `scenicProductHome`,使用固定参数: ```js { scenicId: 20260811 } ``` 以接口返回的数据替换票务首页现有的 `SCENIC_SPOT`、`GROUPS` 和 `ticketStore.products` 静态数据。本次只接入首页接口,不修改商品详情、预订、订单等后续页面的数据来源。 ## 数据流与组件边界 - `index.vue` 负责请求、保存首页数据以及加载和失败状态。 - 请求成功且 `code === 0`、`data` 为对象时,将 `data` 原样保存,不创建字段映射或首页 DTO 适配器。 - `TicketHome.vue` 直接使用接口字段,不再依赖静态数据字段名: - 景区:`scenicId`、`scenicName`、`subtitle`、`levelText`、`address`、`phone`、`longitude`、`latitude`、`coverImage`、`mediaList` - 分类:`categories` 中的 `categoryId`、`categoryName`、`title`、`subtitle`、`defaultFlag` - 商品:`products.records` 中的 `commodityId`、`categoryId`、`saleTargetKey`、`title`、`image`、`tags`、`displayPrice`、`salesText`、`detailRouteType`、`bookingFeatureFlags` - 默认分类:`selectedCategoryId` - `index.vue` 通过单个 `homeData` prop 将接口 `data` 传给 `TicketHome.vue`,避免将接口结果拆分或转换成旧的 `scenicSpot/groups/products` props。 - `TicketHome.vue` 按商品的 `categoryId` 过滤每个分类下的首屏商品,并以 `commodityId` 作为商品点击事件参数。 ## 展示规则 - 景区头图使用 `coverImage`,景区名称使用 `scenicName`。 - 等级和副标题使用 `levelText` 与 `subtitle`;任一字段为空时不渲染多余分隔符。 - 分类导航和分组标题使用 `categoryName`,分类说明使用分类 `subtitle`;分类 `title` 作为辅助标签,仅在非空时展示。 - 商品卡展示 `image`、`title`、`tags`、`displayPrice` 和 `salesText`。 - 接口中的字段为空时使用空态或隐藏对应可选内容,不回填旧静态文案或图片。 - 电话和导航继续使用现有交互;经纬度为空或非法时沿用“暂无导航坐标”提示。 - 左右分类滚动联动保持不变。初始高亮优先使用 `selectedCategoryId`,无有效匹配时使用第一个分类。 ## 加载、失败与空数据 - 页面首次加载时请求一次 `scenicProductHome`。 - 加载期间显示明确的加载状态,不渲染静态首页。 - 请求失败、业务 `code !== 0` 或 `data` 无效时显示错误状态和重试入口,并使用接口 `msg` 或通用错误文案说明失败原因。 - 请求成功但分类或商品为空时,仍渲染景区信息,由 `TicketHome.vue` 展示对应空状态。 - 重试只重新请求首页接口,不重复导航或重置其他票务 store 状态。 ## 测试与验证 - 先扩展 `view-contract.test.mjs`,验证: - `index.vue` 调用 `scenicProductHome({ scenicId: 20260811 })`。 - 首页不再导入或传入 `SCENIC_SPOT`、`GROUPS`、`ticketStore.products`。 - `TicketHome.vue` 使用接口原始字段及 `products.records`。 - 分类商品通过 `categoryId` 关联,商品事件使用 `commodityId`。 - 页面包含加载、失败和重试状态。 - 确认新增测试先因功能未实现而失败,再实施最小代码使其通过。 - 实现后运行: ```bash node --test src/pages-service/tickets/view-contract.test.mjs node --test src/pages-service/tickets/model.test.mjs git diff --check ``` 本次变更不涉及依赖、配置或微信小程序编译能力,因此不默认运行生产构建。 ## 非目标 - 不调用 `scenicCategoryProductsList` 或 `scenicProductCardContext`。 - 不把首页卡片数据写入现有 Pinia 票务 store。 - 不把首页简略商品数据转换为详情页所需的旧商品模型。 - 不调整商品详情、预订、订单、退款和凭证页的数据结构。 - 不修改接口文件或当前客户配置。