diff --git a/changelogs/2026-07/12_feat_grassland_guide_admin_mp_oss.md b/changelogs/2026-07/12_feat_grassland_guide_admin_mp_oss.md index 2db8ee7..b3d7a5f 100644 --- a/changelogs/2026-07/12_feat_grassland_guide_admin_mp_oss.md +++ b/changelogs/2026-07/12_feat_grassland_guide_admin_mp_oss.md @@ -2,9 +2,9 @@ > 日期:2026-07-12 > -> 后端 Issue:[HL #4919](https://git.1814.love:8443/wx/HL/issues/4919)、[HL #4922](https://git.1814.love:8443/wx/HL/issues/4922)、[HL #4927](https://git.1814.love:8443/wx/HL/issues/4927)、[HL #4940](https://git.1814.love:8443/wx/HL/issues/4940) +> 后端 Issue:[HL #4919](https://git.1814.love:8443/wx/HL/issues/4919)、[HL #4922](https://git.1814.love:8443/wx/HL/issues/4922)、[HL #4927](https://git.1814.love:8443/wx/HL/issues/4927)、[HL #4940](https://git.1814.love:8443/wx/HL/issues/4940)、[HL #4949](https://git.1814.love:8443/wx/HL/issues/4949) > -> 后端 PR:[HL #4921](https://git.1814.love:8443/wx/HL/pulls/4921)、[HL #4924](https://git.1814.love:8443/wx/HL/pulls/4924)、[HL #4929](https://git.1814.love:8443/wx/HL/pulls/4929)、[HL #4930](https://git.1814.love:8443/wx/HL/pulls/4930)、[HL #4946](https://git.1814.love:8443/wx/HL/pulls/4946)、[HL #4948](https://git.1814.love:8443/wx/HL/pulls/4948) +> 后端 PR:[HL #4921](https://git.1814.love:8443/wx/HL/pulls/4921)、[HL #4924](https://git.1814.love:8443/wx/HL/pulls/4924)、[HL #4929](https://git.1814.love:8443/wx/HL/pulls/4929)、[HL #4930](https://git.1814.love:8443/wx/HL/pulls/4930)、[HL #4946](https://git.1814.love:8443/wx/HL/pulls/4946)、[HL #4948](https://git.1814.love:8443/wx/HL/pulls/4948)、[HL #4953](https://git.1814.love:8443/wx/HL/pulls/4953) > > 测试分支:`dev-v3` > @@ -25,6 +25,9 @@ - 相关推荐由后端自动计算,并提供独立分页接口供前端滑动加载;后台不再手工选择推荐内容。 - 视频时长和首次发布时间均为只读字段:时长从视频素材派生,发布时间在首次发布时由后端生成。 - 原型没有“呼籁出品”角标开关,管理端和小程序端均不提供 `showProducedBadge` 字段;前端不要提交、读取或展示该字段。 +- 管理端可以通过 `loginRequired` 控制单条视频是否要求小程序用户登录;未设置时默认为 `false`。 +- 草原指南内容可以绑定产品;小程序卡片返回 `linkedProductId` 和后端聚合出的 `linkedProductType`。 +- 前端不参与数据库乐观锁,创建、更新、发布、下架均不提交 `version`;发布和下架接口没有请求体。 前端必须删除旧版草原指南 VOD 方案中的以下内容: @@ -175,7 +178,7 @@ OSS 自动封面格式: | `GET` | `/admin/grassland-guide/videos` | 分页列表 | | `GET` | `/admin/grassland-guide/videos/{videoId}` | 详情 | | `POST` | `/admin/grassland-guide/videos` | 创建草稿 | -| `PUT` | `/admin/grassland-guide/videos/{videoId}` | 全量更新,必须传当前 `version` | +| `PUT` | `/admin/grassland-guide/videos/{videoId}` | 全量更新,不传 `version` | | `PUT` | `/admin/grassland-guide/videos/{videoId}/publish` | 发布/重新发布 | | `PUT` | `/admin/grassland-guide/videos/{videoId}/offline` | 下线 | @@ -191,12 +194,12 @@ OSS 自动封面格式: "contentImageMaterialIds": [], "featured": true, "sortWeight": 3, - "linkedProductId": null, - "version": 2 + "linkedProductId": "2076196082752155649", + "loginRequired": false } ``` -`version` 只在更新时必填。创建草稿允许内容暂时不完整,发布时必须满足: +创建和更新使用同一组业务字段,均不提交 `version`。创建时不传 `loginRequired` 按 `false` 处理;更新时不传则保留原值。`publish`、`offline` 只传路径参数 `videoId`,不要发送空对象或版本请求体。创建草稿允许内容暂时不完整,发布时必须满足: - 标题、视频素材和有效封面完整。 - 视频素材为正常状态的 `grassland_guide` OSS MP4。 @@ -220,7 +223,9 @@ OSS 自动封面格式: "coverSource": "CUSTOM", "effectiveCoverUrl": "https://.../cover.jpg", "durationSeconds": 61, - "publishTime": "2026-07-12 14:44:56" + "publishTime": "2026-07-12 14:44:56", + "linkedProductId": "2076196082752155649", + "loginRequired": false } ``` @@ -256,10 +261,27 @@ OSS 自动封面格式: "durationSeconds": 61, "coverSource": "CUSTOM", "coverUrl": "https://.../cover.jpg", - "contentHtml": "

正文内容

" + "contentHtml": "

正文内容

", + "linkedProductId": "2076196082752155649", + "linkedProductType": "CORE", + "loginRequired": false } ``` +首页、列表、详情和推荐卡片均返回以下业务字段: + +- `linkedProductId`:字符串,可空;绑定的产品 ID。 +- `linkedProductType`:`CORE`、`GROUP`、`CUSTOM` 之一,可空。未绑定、产品不存在或产品服务暂时不可用时为空,草原指南内容仍正常返回。 +- `loginRequired`:布尔值;为 `true` 时必须先登录才能读取详情和播放。 + +鉴权规则: + +- 首页、分页列表、相关推荐分页继续允许匿名访问,卡片只返回展示字段,不返回正文和播放地址。 +- 详情接口使用可选登录:`loginRequired=false` 时匿名返回 `200`;为 `true` 时匿名返回业务码 `401`,合法用户 JWT 返回 `200`。 +- 前端遇到详情业务码 `401` 时拉起小程序登录,成功后携带新 token 重试原详情请求。 +- 客户端提交的 `X-User-Id`、`X-User-Type`、`X-Auth-Level` 和管理员身份头均不可信,网关会删除后仅依据有效 JWT 重建身份。 +- MP 详情不使用跨用户缓存,防止受保护视频的详情或 `videoUrl` 被匿名请求复用。 + 详情不再返回固定数组 `relatedVideos`。进入相关推荐区域时,请求独立分页接口: ```json @@ -337,6 +359,8 @@ OSS 自动封面格式: - 4K 内容使用独立上传的 JPEG 封面,详情返回 `coverSource=CUSTOM`;推荐分页返回 3 条上架内容且排除了当前视频。 - 当前测试桶默认域名同时返回 `Content-Disposition: attachment` 和 `x-oss-force-download: true`。HTTP Range 能正常工作,但小程序仍须做真机播放验收。2026-07-13 最终决定保持默认 OSS 域名,不切换自定义域名;前端不得自行改写域名,若原生 `