docs(changelog): 配房行程逐日城市改区县(后端 #4264 已上线) 字段契约 cityName=区县/cityCode=市级

这个提交包含在:
API Changelog Bot 2026-06-23 10:50:51 +08:00
父节点 2f8156e0ff
当前提交 c3060cc10a
共有 4 个文件被更改,包括 163 次插入0 次删除

查看文件

@ -0,0 +1,33 @@
# 🔴 安全热修:小程序相册接口横向越权(IDOR)修复 — 小程序
> 变更类型:安全修复(后端归属校验加固,**正常使用无影响**,无契约变更)
> 端类型:小程序(相册)
> 日期2026-06-17
> 服务hl-order-service-v2相册域
> PRhttps://git.1814.love:8443/wx/HL/pulls/3911
---
## 说明
`api-contract-audit` 审计小程序 BFF 时发现:相册的 4 个接口存在**横向越权(IDOR)**——后端收到当前用户 userId 后未做归属校验,任意登录用户改 URL 里的 orderId/folderId/albumFileId 即可读取/操作他人订单的相册。本次已修复:后端强制校验"相册所属订单归属当前登录用户",越权一律返回"不存在"。
涉及接口(小程序相册):
- 订单文件夹列表、文件夹文件列表、文件下载地址获取、文件夹公开授权(写)。
## 前端影响:无需改动
- **正常使用完全不受影响**:用户访问自己订单的相册照常工作。
- 仅"访问他人订单相册"这种越权请求会被拒(返回资源不存在)——前端正常逻辑不会触发。
- 接口路径、入参、返回结构均未变。
> 如果前端有任何调试/测试代码用了非当前用户的 orderId/folderId 访问相册,请改为只访问当前用户自己的资源(之前能拿到是 bug,现已封堵
## 校验
| 项目 | 信息 |
|---|---|
| PR | https://git.1814.love:8443/wx/HL/pulls/3911squash 合并 dev-v3,via api-contract-audit workflow |
| 部署 | 已部署测试服,order-v2 双实例健康(滚动重启 uptime 刷新) |
| 测试 | 相册模块单测全绿(新增越权拒绝反例:非本人订单/null-userId/订单缺失 + happy path + 防穿透 verify |
| 后端负责人 | wx |

查看文件

@ -0,0 +1,85 @@
# 小程序 BFF 接口契约审计修复(金额 String + 字段映射 + 可见性 + 缓存)— 修改接口 — 小程序
> 变更类型:⚠️ 多项修复(金额类型 / 字段补全 / 可见性收紧 / 缓存行为,多数前端正向受益)
> 端类型小程序hl-mp-service BFF
> 日期2026-06-17
> 服务hl-mp-service
> PRhttps://git.1814.love:8443/wx/HL/pulls/3915
---
## ⚠️ 关键说明
`api-contract-audit` 全量审计小程序 BFF 40 个核心 Controller,对抗复核实锤 100 项契约偏差。mp 是聚合层,本次修复 **mp BFF 自身的 67 处**;另有约 40 项根因在下游服务(订单/用户/资源服务),列在文末「待修清单」,会在后续审计中处理。已合并 dev-v3、部署测试服、双实例健康。
最影响前端的是第 1 节(金额→字符串)和第 2 节(原本恒 null 的字段现已修复)。
---
## 1. 金额字段统一为 JSON 字符串
多个 mp 响应 VO 的金额BigDecimal此前输出成 JSON 数字,本次统一改为**字符串**(与平台口径一致)。涉及:退款(退款预览/进度/详情)、发票、订单详情/列表、票务、价格明细(含按人群/优惠/附加费的逐项明细)、保费、推荐产品起价等。
> 前端处理:相关金额字段一律按**字符串**接收;若做过数字运算需先转数值。非金额(里程/经纬度/评分)不变。
---
## 2. 原本恒为 null 的字段已修复(前端可正常取值)
以下字段此前因 BFF 与下游字段名不一致(反序列化失败)或 BFF 未填充而恒为 null,现已修复
| 模块 | 字段 |
|---|---|
| 相册文件 | thumbnailUrl、fileName、fileSize、createdAt |
| 相册订单 | coverUrl、fileCount |
| 发票详情 | invoiceTitle、taxNumber、createdAt |
| 合同 | 状态日志 *Label、出行人证件类型标签 |
| 出行人 | race、roomGroupNo订单出行人、travelerTypeLabel |
| 到达计划 | updateTime |
> 前端处理:这些字段现在会返回真实值,可直接使用(之前拿到的是 null
---
## 3. 行为收紧(前端需配合)
### 3.1 下架资源详情不再返回(可见性收紧)
景点 / 酒店 / 餐厅 / 活动 详情接口在 BFF 层补了「是否上架」校验,**下架status=0的资源详情不再返回**给小程序(之前会原样返回)。前端访问已下架资源详情会得到「不存在/不可见」,请正常处理空态。
### 3.2 浏览量统计 / 错误不再被缓存
- 探索/百科详情的「浏览量+1」此前在缓存命中时不执行统计失真,现已修复浏览量正确累加
- BFF 缓存不再缓存下游降级错误(避免 TTL 内持续返回陈旧错误)。
- 前端无感,仅数据更准确。
### 3.3 定制需求状态字典修正
定制(/mp/custom相关接口的状态字典此前文档值有误,实际枚举为 `PENDING/PROCESSING/REPLIED/CONVERTED/CANCELLED`,请前端按此映射。
---
## 4. 待修清单(根因在下游服务,本次未修,后续处理)
以下问题审计已发现,但根因在下游服务,不在本 PR;记录在此供前端知晓暂仍按现状
- **订单服务order-v2相关 ~21 项**:部分字段缺失/状态机/错误码等(其中相册 4 个越权 P0 已由 PR #3911 安全热修修复)。
- **用户服务相关 ~11 项**出行人默认删除守卫、token 轮转、资料完善校验、足迹 HOTEL 等 — 将在用户服务审计时在源头修复。
- **资源服务相关 ~3 项**:百科推荐排序、足迹等 — 将在资源服务审计时修复。
---
## 5. 前端 Action 清单
1. 第 1 节金额字段按字符串解析。
2. 第 2 节字段现在有值,可接入使用。
3. 下架资源详情做空态处理(第 3.1)。
4. 定制状态映射用真实枚举(第 3.3)。
---
## 6. 关联
| 项目 | 信息 |
|---|---|
| PR | https://git.1814.love:8443/wx/HL/pulls/3915squash 合并 dev-v3,via api-contract-audit + mp-internal-fix workflow |
| 部署 | 已部署测试服,mp 双实例健康(滚动重启 uptime 刷新);公开端点 /mp/banner/active 等返 code:200 |
| 测试 | 963 单测,本次改动 add 0 新失败(另有 3 个 dev-v3 预存红与本次无关,已单独反馈后端) |
| 后端负责人 | wx |

查看文件

@ -0,0 +1,37 @@
# 用户服务接口契约审计修复mp 侧字段/契约对齐)— 修改接口 — 小程序
> 变更类型:字段/契约对齐(无破坏性删除),小程序侧影响较小
> 端类型:小程序(用户中心/首页配置/收藏足迹/出行人 OCR
> 日期2026-06-17
> 服务hl-user-service
> PRhttps://git.1814.love:8443/wx/HL/pulls/3924
> 说明:本文件随 user-service 契约审计一并产出,**暂缓推送**与小程序侧统一节奏。admin 侧见 changelogs-v2/2026-06/17_3924_*.md。
---
## 关键说明
用接口契约语义审计工作流扫描 hl-user-service 全部 Controller,mp小程序 BFF侧修复一批字段名/null 语义/响应结构与 Swagger 契约不符项。已合并 dev-v3、部署测试服、本地全量 2793 单测零新增回归。下面列 mp 侧对接相关变更。
---
## 1. 收藏 / 足迹FavoriteRespVO / FootprintRespVO
- 响应 VO 字段名/缺字段与契约对齐;金额类字段(如有)补 `@JsonSerialize(ToStringSerializer)` 输出字符串。
- 字段语义不变,前端按现有字段名接收即可;如此前对金额字段做数字运算,改为先转数值。
## 2. 首页配置MpHomeConfig / MpHomeScreen2VO
- 响应结构与 Swagger 契约对齐(字段名/层级稳定化),无破坏性删除。
## 3. 出行人 OCR / 内容安全MpTravelerOcr / MpContentSecurity
- 入参校验(`@Valid` / 校验分组)与错误码规范化;正常路径返回结构不变。
## 4. 站内信InternalMpMessage / 未读数 UnreadCountRespVO
- 未读数等响应改强类型 VO,字段名不变。
---
> 待小程序侧统一接线时一并对照本文件;如需提前对接某一节请单独知会。

查看文件

@ -66,6 +66,14 @@ DAY2 俄式标准房 ×1 ¥280candidates = [恩和瓦西里民宿, 呼伦贝
**前端**:操作人只渲染 `operator.name`(→「腰苏图」/「by 腰苏图」),**别 `JSON.stringify(operator)`、别直接把对象插进模板**。`operator.userId` 仅用于跳详情/排查,不展示。其余照常:`summary` 后端已拼好直接显示、`opTypeLabel` 当中文徽标、`time` 当时间。 **前端**:操作人只渲染 `operator.name`(→「腰苏图」/「by 腰苏图」),**别 `JSON.stringify(operator)`、别直接把对象插进模板**。`operator.userId` 仅用于跳详情/排查,不展示。其余照常:`summary` 后端已拼好直接显示、`opTypeLabel` 当中文徽标、`time` 当时间。
## 7. 配房行程逐日城市改显区县(✅ 后端 #4264 已上线,前端无需改动)
**现状/变更**:配房行程 Tab 每天行的城市原来显**市级**(呼伦贝尔市),现后端改为返**区县**(海拉尔区/陈巴尔虎旗)。来源 = 订单产品快照 `dismissalPlace.districtName`(下单冻结)→ 资源酒店 `district` 兜底 → 市级 city 兜底。
**字段契约**`itinerary[].cityName` = **区县**(解析得到时;否则回退市级,绝不空);`itinerary[].cityCode` = **市级**(向后兼容,若前端某处按市级筛选/分组用这个)。
**前端**:继续渲染 `cityName` 即自动得区县,**无需改动**。实测(`GET /admin/house/orders/{orderId}`DAY1 cityName=海拉尔区、DAY2 cityName=陈巴尔虎旗,cityCode 均=呼伦贝尔市。
--- ---
## 说明(非 bug ## 说明(非 bug