背景接令:波波 D2 §7 真机位性能基线(staging-baseline-2026-09-14.json)中 GET /api/miniapp/products 为全站唯一离群点——P95 26.6ms / MAX 66.6ms(抖动 2.5 倍)/ 响应 26,057B,三项均为全站最高,约为次高端(guides 5.0KB)5 倍、其余端点(1-4ms)10-20 倍。
本包只裁决,不动代码;不含 a 端 /api/admin/products(admin_backend.py:667,鉴权控制台路径+offset 分页,非 C 端热路径,明确排除在离群修复范围外)。
list_products(:79-89,默认 limit=50、上限 200)每次请求的查询构成:
| # | 查询 | 位置 | 说明 |
|---|---|---|---|
| 1 | packages 全行(含 description TEXT) | :81-84 | 一次取 50 行 |
| 2 | site_config.default_leader(领队) | :34-35 | 每请求 1 次 |
| 3..N | package_components(含 description TEXT) | :96-102 循环内 await _components_of(p["id"]) | 每产品 1 次 → N+1 |
_map_product(:43-70)返回字段:id/title/cover/description/leader/includes[](每项含 description)/price/duration/difficulty(硬编码 medium)/dailySchedule(恒空)/tags/status(恒 published)/addons(恒空)/originalPrice(恒 null)。
description TEXT NOT NULL DEFAULT ''):packages.description(产品级富文本,管理端自由录入,理论无上限)package_components.description(每个 includes 项一份)CACHE_TTL_MS=60_000,bff-map.ts:68 products 路由已标 cache:'public' → 选项 C 的代码已存在/api/miniapp/*),未经过 BFF(perf_probe.py docstring 明示不测 BFF 转发层)→ BFF 缓存对基线数字无贡献,对 C 端 v2 流量是否实际生效待 staging 验证Package(列表项)无 description 字段,PackageDetail extends Package 才有 → 后端列表超量返回是实现偏离契约,不是契约要求descText = r.description 渲染在列表卡(wxml:17 有 wx:if 守卫,description 缺失时块隐藏不报错)内容:list_products(连带 featured/curated/search 三个同源端点,均走 _map_product)增加列表态映射:
description 与 includes[].description(详情页 GET /products/{id} 本就返回全量 description+images,契约不动)SUBSTRING(description,1,120) 作摘要保留在列表(前端零改动,descText 仍显示 teaser)SELECT ... FROM package_components WHERE package_id = ANY($1) ORDER BY package_id, sort_order 内存分组,N+1 → 3 次往返(packages+leader+components 各 1)。改动就在同一函数、同一测试面预估收益:
改动面:后端 1 个文件(miniapp_products.py,列表态开关+rider);前端 0-1 个页面(A1 需 category-package 视觉确认);契约零变更(Package 列表本无 description)。
内容:默认 limit 50→20、cap 200→50;白名单化响应字段(剔除 originalPrice/difficulty/status/dailySchedule/addons 等恒定恒空字段)。
预估收益:
改动面:后端 1 文件 + typings 1 文件 + 前端多页面核对(category-package/category-hotel/home 等全部消费 products 列表的页面)。
内容:代码已存在(见 1.4)。剩余工作是验证+登记,不是开发:
/api/v2/products 二次请求返回 cached:true预估收益:
改动面:零代码(除非 staging 验证发现 BFF 缓存失效 → 另计 0.5-1 人日修复)。缓存口径完全符合既有政策:docs/contracts/backend-info-pack-v2.md:152「缓存只许 site-texts/产品公开只读数据(TTL≤60s)」。
裁决理由:
反对意见(如实记录,均不推翻裁决):
| 选项 | 内容 | 后端 | 前端 | 验证/回归 | 合计 |
|---|---|---|---|---|---|
| 前置 | staging 字节分账(拉真实响应逐字段计量) | — | — | 0.5 | 0.5 |
| A1+rider | 列表裁剪两级 description + 组件批查(N+1→3 查询) | 1.0 | 0.5(category-package 视觉适配) | 0.5(perf_probe 复测) | 2.0 |
| A2 变体 | 截断 120 字替代硬裁剪(前端零改动) | 0.5 | 0 | 0.5 | 1.5(替代 A1 时) |
| B | 分页收紧+字段白名单+契约同步 | 1.0 | 1.0(多页面核对) | 0.5 | 2.5(收益最低,已否决) |
| C | BFF 缓存 staging 验证+登记 | 0(已实现) | 0 | 0.5 | 0.5(验证失败另计 0.5-1) |
| R1=A+C | A1+rider + C 验证(含前置分账) | 1.0 | 0.5 | 1.5 | ≈2.5-3.0 人日 |
products P95:26.6ms → ≤5ms(rider 后 3 次往返口径)products 包体:26,057B → A1 ≤12KB / A2 ≤14KB(以分账实测校准)featured:4.5ms / 3.8KB 不劣化(同函数改动,回归护栏)/api/v2/products:二次请求 cached:true 命中,命中延迟 ≤2ms产物:本文件(裁决包,不含代码改动)。执行待刘总/派工岗按 R1 放行后另开工单。
依据链:staging-baseline-2026-09-14.json(波波实测)→ miniapp_products.py / bff.service.ts / bff-map.ts / api.d.ts / 005_packages.sql(读码)→ backend-info-pack-v2.md:152(缓存政策)。