01文档信息
1.1 修订记录
| 版本 | 日期 | 交付范围 | 评审结论 |
|---|---|---|---|
| V1.1-r2 | 2026-09-17 | 同步播放、字幕、末集推荐和福利入口;更新后台合集、榜单、推荐分发及首页配置;保留线上剧集四状态,修复目录定位,补充待决策建议与验收边界。 | 待评审 |
| V1.1-r1 | 2026-09-15 | 覆盖 H5 / Web 前台与后台:账号身份、播放、字幕语言、选集、付费解锁、充值、会员与支付回流;内容分发(首页、题材、排行榜);后台运营(剧集管理、资源草稿箱、题材管理、标签管理、排行榜设置、推荐位/Banner、首页板块设置、操作日志)。 | 待评审 |
02版本概述
2.1 核心结果
打开落地页即按设备 ID 分配账号与身份卡,直接可看;绑定登录方式不阻断首次内容消费。
进入、切集、解锁、返回与再次进入均保持内容及进度对应。
免费、金币与 VIP 按剧集权限分流,付费结果回到目标内容。
绑定前后身份与资产一致,互动与观看记录归属同一 userId。
2.2 本期需求范围
| 模块 | 交付范围 | 需求编号 | 端 | 优先级 |
|---|---|---|---|---|
| 播放模块 · 全站共用 | 界面语言、术语、集数、互动计数 | V01–V02 | H5Web | P0 |
| 播放模块 · H5 登录注册 | 游客身份、身份卡、账号绑定、切换登录 | H5-A01–H5-A04 | H5 | P0 |
| 播放模块 · Web 登录注册 | 个人中心账号区、身份卡、绑定与切换弹层 | PC-A01–PC-A04 | Web | P0 |
| 播放模块 · H5 播放 | 首页推荐、本剧连播、选集、付费、清屏、设置、字幕(字幕入口、语言选择、关闭、预览、播放同步与本地记忆:H5-P07–P08) | H5-P01–H5-P08 | H5 | P0 |
| 播放模块 · Web 播放 | 封面直达、播放页、金币解锁、充值与 VIP 回流、字幕(PC-P04) | PC-P01–PC-P04 | Web | P0 |
| 播放模块 · 互动修复 | 评论提交后前端展示与评论计数修复(现网 bug);其余互动模块需求不纳入 | INT-01(互动模块 PRD 3.1,仅修复项) | H5Web | P0 |
| 支付模块 | 海外支付渠道与展示,充值档位与优惠,付费墙与账号承接,剧集解锁权益,会员订阅,支付会话与结果,支付后接续、订单与恢复 | P01–P07(含细则 PAY-01–PAY-03、4.2.4–4.2.14) | WebH5服务端 | P0 |
| 内容分发模块 · 首页 | 首页内容板块、完整片单、向左连续滚动、左右切换、手动滑动、适用板块的栏目详情、内容点击交接、Hero 读取 Banner 配置 | FE-HOME-01–11 | Web | P1 |
| 内容分发模块 · 题材 | 题材与标签分行、内容集合、交集筛选、数量、展开收起、选中与空态、两端差异 | FE-CATEGORY-01–10 | WebH5 | P1 |
| 内容分发模块 · 排行榜 | 四榜切换、展示次序、榜内标签、保留名次、时间信息、空态与后台配置对应 | FE-RANK-01–10 | WebH5 | P1 |
| 后台运营模块 · 优化 5 项 | 剧集管理(含合集新建/追加/集序);排行榜设置(列表内人工调序,目标数量不限);推荐与分发(仅 Web Banner,拖拽排序,最多 12 条);首页板块设置(数量不限、无展示样式选项、手选片单拖拽);操作日志。三处拖拽列表统一悬停高亮和手形。 | BE-DRAMA-01–09 / BE-COLLECTION-01–06 / BE-RANK-01–08 / BE-BANNER-01–08 / BE-HOME-01–09 / BE-LOG-01–05 | 后台 | P1 |
现网已有功能,本版只按原型优化 UI 交互,规则与数值沿用现网(原型数值仅为演示):福利页(签到 / 任务 / 邀请 / 兑换码,Web 顶部导航「福利」进入)、H5 推荐流观看奖励金币、Web「下载 App」悬浮入口;H5 推荐流观看奖励金币挂件的领取规则沿用现网。本版新增的交互调整见 4.1.8:H5 顶部下载 App 提示条、福利中心「全部领取」、观看奖励领满后点击挂件进入任务中心及返回规则。
2.3 内容与付费方式
| 内容类型 | 观看与转化方式 | 适用说明 |
|---|---|---|
| 短剧 | 免费试看 → 单集解锁 / 整剧购买 / VIP | 首页推荐流只投放免费集;播放页可进入本剧全部剧集并按权限分流。 |
2.4 统一业务约束
- 统一用户身份。打开落地页即按设备 ID 分配账号与身份卡,拥有唯一 userId(未绑定登录方式的账号为“游客”,已绑定的为“正式账号”)——支付模块称「账号ID」、埋点字段 account_id、服务依赖 user_id 均指同一标识,账号类型 account_type=guest|registered 对应游客 / 正式账号;按身份卡区分用户,不同身份卡即不同用户,资产不互通;金币、VIP、已购短剧、历史、收藏、点赞、评论与任务进度均绑定该身份。
- 绑定不等于换号。绑定只是为当前账号增加快速登录方式,除首次通过第三方授权(Google / Facebook / Apple / X)绑定成功赠送 50 金币(每 userId 一次;账号密码绑定不赠送,见支付模块 4.2.5)外不产生其他效果,成功后回到来源页面;切换账号登录成功后进入首页。
- 金币与 VIP 各有用途。金币同时作为福利激励资产和轻付费计价单位,VIP 承接高频消费。VIP 即支付模块的“会员”(权益类型 membership,周期由后台会员计划配置,按周期生效、不自动续费、到期后需重新获取观看权限)。用户可见文案(卡片标题、摘要、按钮、toast、购买须知)统一用「VIP」,正文术语、接口与埋点枚举保留「会员 / membership / premium」;现网商品名「单日 / 3 天 / 7 天 / 30 天全场免费」即该商品。
- 权限与页面内容一致。免费内容可直接观看;未解锁内容进入对应解锁流程;VIP 到期需重新获取当前观看权限。
- 端口径。视口宽度 ≥ 1024px 渲染 Web(桌面浏览器端;播放 PRD 原称 Web,需求编号 PC-xx 保留不改),< 1024px 渲染 H5(移动浏览器端,以 375–428px 为设计基准,429–1023px 内容区居中限宽 480px);以首次加载时的视口宽度判定,窗口缩放跨过 1024px 时切换布局,但保留当前路由与播放进度;本版不含 APP。
2.5 支付模块版本概览与核心业务链路
| 项目 | 内容 |
|---|---|
| 产品名称 | DramaRush / 狂飙短剧 |
| 版本范围 | 支付模块 7 项及所需前端与服务端埋点 |
| 适用终端 | 视口宽度 ≥ 1024px 渲染 Web,< 1024px 渲染 H5(以 375–428px 为设计基准,429–1023px 内容区居中限宽 480px,兼容窄屏和安全区);以首次加载时的视口宽度判定,窗口缩放跨过 1024px 时切换布局并保留当前路由与播放进度 |
| 默认语言与币种 | 界面语言支持简体中文、繁体中文、英语、泰语、越南语、日语、韩语 7 种,默认跟随用户系统语言,系统语言不在支持范围内时默认英语;用户可手动切换,选择在本地记住。币种与金额按后台商品报价配置返回(后台可配),不按渠道硬绑定币种;USDT 必须明确标识为数字资产 |
| 放行原则 | P0 链路必须端到端通过;关键支付、绑定、到账、解锁、回流事件 100% 上报且可对账 |
2.6 内容分发与后台增量优化范围基线
本次目标
让用户在首页发现内容,在题材中筛选内容,在排行榜中查看推荐、热播、收藏和点赞榜;让运营通过本轮新增或优化的后台模块维护内容、编排展示并完成配置保存。
前端范围
| 模块 | 本次覆盖 | 范围边界 |
|---|---|---|
| 首页 | 首页内容板块、完整片单、向左连续滚动、左右切换、手动滑动、适用板块的栏目详情、内容点击交接 | Hero 本期接入后台 Banner 配置(后台 5.2.6,Web);H5 首页为推荐流,不提供板块首页;继续观看等既有结构仅说明与首页的关系,不扩展其内部功能 |
| 题材 | 题材与标签分行、内容集合、交集筛选、数量、展开收起、选中与空态、两端差异 | 顶部导航只说明进入题材的上下文,不重写各内容频道;标签作为题材筛选的一部分 |
| 排行榜 | 四榜切换、展示次序、榜内标签、保留名次、时间信息、空态与后台配置对应 | Web 首页按后台 5.2.7 首页板块设置展示,「热门榜单/TOP」等板块的内容来源与引用的榜单由首页板块设置配置,不等同独立排行榜频道;H5 首页为推荐流 |
后台范围清单
| 标记 | 菜单 | 本次需求 |
|---|---|---|
| 优化 | 剧集管理 | 既有编辑/上下架/资源维护;新增合集功能,复制源剧单集到新剧或已有剧并排序。 |
| 优化 | 排行榜设置 | 四榜规则与直接保存;人工操作放在候选范围与当前榜单列表;上榜数量手动填写,不设上限。 |
| 优化 | 推荐与分发 | 仅 Web Banner,新增/编辑/图片/投放期/启停/拖拽排序;工作列表与确认保存两层。 |
| 优化 | 首页板块设置 | 新增/编辑、不限剧集数量、取消展示样式选项;手选片单拖拽;榜单引用保持只读快照。 |
| 优化 | 操作日志 | 记录上述业务保存、合集及调序结果;历史示例与本次操作分开。 |
只保留新增/优化类型菜单;本次实际为上述 5 个优化菜单。删除资源草稿箱整体功能、金币包/支付通道和所有“保留”菜单。题材、标签不再优化,已保存字典和剧集引用继续沿用。
03页面流程
3.1 页面清单
| 终端 / 页面 | 入口 | 主要区域 | 主要操作 | 对应图示 |
|---|---|---|---|---|
| H5 · 我的(账号区域) | H5 → 我的 | 当前账号信息;查看身份卡入口;「账号绑定」入口(仅未绑定登录方式的账号展示);底部「切换账号」(仅已绑定登录方式的账号展示) | 查看身份卡、发起绑定、切换账号 | 图 4.1.3.1 |
| H5 · 身份卡弹层 | 我的 → 查看身份卡 | 身份卡、用户信息、登录凭证区域、使用说明、保存按钮 | 保存身份卡;关闭回到「我的」 | 图 4.1.3.2 |
| H5 · 账号绑定页 | 我的 → 账号绑定 | Google、Facebook、Apple、X 快捷绑定;账号密码区;确认;底部「已有账号?去登录」 | 选择绑定方式、确认;成功返回原页面 | 图 4.1.3.3 |
| H5 · 切换账号页 | 我的 → 底部「切换账号」(已绑定账号);绑定页 →「已有账号?去登录」 | 身份卡登录(相册上传为主,不做独立相机取景);快捷登录;账号密码输入区 | 完成登录后进入首页 | 图 4.1.3.4 |
| Web · 个人中心账号区域 | Web → 个人中心 | 当前账号信息、身份卡入口;未绑定登录方式的账号展示「账号绑定」入口,已绑定登录方式的账号只展示「切换账号」 | 打开身份卡 / 绑定 / 切换账号弹层 | 图 4.1.4.1 |
| Web · 身份卡弹层 | 个人中心 → 查看身份卡 | 身份信息、凭证 / 二维码区域、使用说明、保存按钮 | 保存;关闭后停留原页面 | 图 4.1.4.2 |
| Web · 账号绑定弹层 | 个人中心 → 账号绑定 | Google、Facebook、Apple、X 快捷绑定;账号密码绑定;底部「已有账号?去登录」 | 绑定成功返回原页面,账号区更新为已绑定信息 | 图 4.1.4.3-1 / 4.1.4.3-2 |
| Web · 切换账号弹层 | 点击「切换账号」(已绑定账号);绑定弹层 →「已有账号?去登录」 | 身份卡上传登录(不做独立相机取景);快捷登录;账号密码输入区 | 登录成功进入首页 | 图 4.1.4.4 |
| H5 · 首页推荐流(H5 首页默认落地页) | H5 底部导航「首页」(H5 默认落地页) | 顶部左侧「DR.」字标、右侧搜索入口,右上角推荐位次「n / N」;视频、剧名、当前集数、剧情简介、底部「查看全部剧集」入口(集数按 4.1.2.1 集数口径);右侧观看奖励金币挂件(领取沿用现网规则;今日领满后点击进入任务中心,见 4.1.8.3)、声音开关、点赞、评论、收藏、分享;底部导航 首页 / 剧场 / 我的 | 上下滑切换不同剧的免费剧集;点击画面暂停 / 继续;点击底部集数进入播放页;底部导航「剧场」进入 H5 剧场页 | 图 4.1.5.1 |
| H5 · 剧集播放页 | 首页 / 剧场等内容入口;路由沿用现网 H5 播放页路由 | 顶部当前集数;右侧互动区与声音开关;进度;底部选集 / 全屏(仅横屏剧);右上角 CC 与更多(三点);末集推荐卡 | 上下滑切本剧剧集;返回;选集;全屏;字幕;播放设置(含清屏);末集进入推荐剧 | 图 4.1.5.2 / 图 4.1.5.7-A |
| H5 · 选集面板 | 播放页 → 底部「选集」 | 剧名、总集数、分组页签(每组 20 集,可左右滑动)、分集列表(固定 4 行;当前集选中态、锁定集锁定标识) | 选可看集播放;选锁定集弹出 PAY-02 解锁弹层 | 图 4.1.5.3 |
| H5 · 锁定集解锁弹层(PAY-02 承接) | 滑动遇到锁定集 / 选集面板点锁定集 / 自动连播到锁定集 | 由支付模块 PAY-02 解锁弹层从播放页底部弹出:剧名、待解锁集数;「解锁本集」「解锁本剧剩余全集」「开通 VIP」三种方式;余额与「充值金币」入口(见支付 4.2.4) | 点击解锁方式即执行;余额不足进入金币充值弹框;成功后自动回到播放页播放该集(支付 4.2.7 / 4.2.8) | 图 4.1.5.4 |
| H5 · 清屏状态 | 播放页 → 更多 → 播放设置「清屏播放」 | 底部保留选集入口;顶部文字降低亮度;已开启字幕保留 | 退出清屏恢复原布局 | 图 4.1.5.5 / 图 4.1.5.8-B |
| H5 · 全屏播放 | 横屏剧播放页 → 底部全屏按钮 | 画面、进度、顶部按钮、字幕、右侧声音与互动;右上角「✕」 | ✕ 或返回退出全屏 | H5-P09 |
| H5 · 播放设置面板 | 播放页 → 右上角更多(三点) | 播放速度、清晰度、字幕语言(右侧显示当前值)、清屏播放、画中画(浏览器支持时) | 修改设置;点击字幕语言进入字幕面板 | 图 4.1.5.6 |
| H5 · 字幕语言面板 | 播放页 CC;或 更多 → 播放设置 → 字幕语言 | 关闭字幕 + 本集可用语种单选(默认跟随界面语言);当前播放时间字幕预览;完成 / 返回播放设置;关闭 | 选择语言即时生效;完成返回来源页面 | 图 4.1.5.7-B |
| Web · 播放页 | 任意内容封面;路由沿用现网 /{lang}/webpc/watch/{drama_id}/{集号} | 播放器(底部控制栏含 CC)、剧集介绍、选集、付费入口、点赞 / 收藏 / 评论区域 | 播放、选集、互动、进入解锁、字幕 | 图 4.1.6.1 / 图 4.1.6.4-A |
| Web · 锁定集解锁弹层(PAY-02 承接,弹层) | 播放页 → 锁定剧集 / 金币解锁入口 | 剧名、目标集数;「解锁本集」「解锁本剧剩余全集」「开通 VIP」三种方式;余额与「充值金币」入口 | 金币解锁;不足时进入金币充值弹框;开通 VIP;成功后自动回到原页面继续播放 | 图 4.1.6.2 |
| Web · 字幕语言弹窗 | 播放器底部 CC;或 播放设置 → 字幕语言 | 语言单选、预览、完成 | 选择并即时应用;完成关闭或返回设置 | 图 4.1.6.4-B |
| Web / H5 · 金币充值弹框 / VIP 弹框 | 金币充值弹框:顶部金币、「我的」钱包卡「充值金币」、解锁弹层「充值金币」或余额不足;VIP 弹框:顶部「开通 VIP」、「我的」钱包卡「开通 VIP」、解锁弹层「开通 VIP」 | 金币充值弹框:余额、金币档位卡、平铺支付方式、支付按钮;VIP 弹框:VIP 权益说明、会员计划卡、平铺支付方式、支付按钮、「关于订阅」须知 | 弹框内单选档位;选择支付方式;发起支付;关闭回到进入前页面 | 支付 PRD PAY-01 |
| Web / H5 · 解锁弹层 | 点击未拥有观看权限的集数(播放页带入 drama_id、episode_id、position_ms、return_to) | 当前剧名、待解锁集数、余额;解锁本集 / 解锁本剧剩余全集(显示金币价格与范围)/ 开通 VIP | 点击即执行:余额足够扣金币解锁并播放,不足进入金币充值弹框;开通 VIP 进入 VIP 弹框;关闭回到原播放页不扣款 | 支付 PRD PAY-02 |
| Web / H5 · 支付结果层 | 点击主按钮提交后 | 商品、渠道、金额、订单号;处理中 / 成功 / 失败 / 取消 / 过期状态 | 完成 / 查看充值记录 / 重新支付 / 更换支付方式(独立充值来源);剧集来源支付成功不展示结果层,自动回原集播放并 toast 提示 | 支付模块 4.2.8 |
| Web / H5 · 订单记录 | 账户钱包卡的订单记录图标 | 「充值记录」「消费记录」两个页面,列均为金额、金币、交易、时间、状态;充值交易为充值档位或 VIP 档位(含「绑定奖励」),消费交易为解锁的剧名,消费金额显示「—」 | 查询订单状态;支持状态补偿 | 支付 PRD P07 |
| Web / H5 · 福利页(现网已有,本版只改 UI) | Web 顶部导航「福利」;H5 推荐流右侧「金币任务」入口 | 金币余额、每日签到与连签奖励、看剧任务、邀请好友、兑换码(规则与数值沿用现网,原型数值仅为演示) | 签到、领取任务奖励、兑换 | 原型 #/rewards |
| Web · 板块首页 | Web #/(H5 不提供板块首页,H5 首页为推荐流) | Hero(Web 读取后台 5.2.6 Banner 配置轮播,空时回退底稿);当前端启用的首页板块,按保存顺序排列;Hero 下「按题材找剧」题材选项与查看全部入口 | 板块内容连续横滚、两侧按钮、鼠标拖动 / 触控板横滑 / 触摸横滑;点击栏目标题或查看全部进入栏目详情;点击题材进入题材结果;点击卡片交接 drama_id 与 episode_id | 第 04 章 4.3.1 首页 |
| Web · 栏目详情 | 首页板块标题 / 查看全部;路由 #/section/<sectionId>?page=<n> | 栏目标题、总数;横向信息卡每页 12 部含页码 | 翻页与前后页切换;进入内容;面包屑返回首页 | 第 04 章 4.3.1 首页 |
| H5 · 剧场页 | 底部导航「剧场」 | 顶部品牌、搜索与语言入口;「剧集 / 排行榜」分段;剧集分段为题材行与标签行(各最多两行,超出收进「更多」)及三列剧集卡(封面 3:4、状态角标、剧名、题材 · 集数),每页 9 部,底部页码翻页;排行榜分段为榜单切换项与双列名次卡 | 切换分段;按题材 / 标签筛选;翻页;点击卡片进入播放页 | 第 04 章 4.3.2 / 4.3.3 |
| Web / H5 · 题材结果页 | #/channel/<context>(home / short / long / movie / variety / anime / ranking,可带 category、tag);来自首页题材入口、既有类型入口、排行榜 | 题材行(单选,H5 可横滑);题材内标签行(单选,超过 30 个显示展开更多);选中条件摘要与结果数;结果卡片(海报下显示题材与标签) | 选题材、选标签、展开 / 收起标签、重置筛选、查看全部、点击卡片交接内容入口 | 第 04 章 4.3.2 题材 |
| Web / H5 · 排行榜 | #/channel/ranking(可带 list、category、tag) | 当前端启用的四榜切换项(H5 可横滑);榜单口径说明(统计窗口、指标类型、快照更新时间、人工调整提示);带名次的结果卡片;题材 / 标签筛选 | 切榜、榜内题材 / 标签筛选(保留原名次)、重置筛选、点击内容交接 | 第 04 章 4.3.3 排行榜 |
| 后台 · 剧集管理 | 内容与片源 → 剧集管理 | 列表:搜索、组合筛选、状态汇总、批量操作及合集、表格 / 紧凑卡片切换、显示字段设置;编辑页四区:基础信息、多语言资料、集数资源、收费与预览 | 新增剧集;合集新建/追加与集序调整;单条 / 批量上下架(确认弹窗);编辑资料与封面 / 横图;「编辑资源」弹窗(集号、标题、状态、HLS、按需字幕);「调整集数」弹窗;保存剧集;预览 | 第 05 章 5.2.1 剧集管理 |
| 后台 · 剧集合集(剧集管理内) | 剧集管理勾选后 → 合集 | 新建/已有目标、来源队列、原有/新增/重复数与顺序 | 勾选、选择目标、拖拽/上下移/目标集号、确认合并并保存 | 第 05 章 5.2.2 合集 |
| 后台 · 排行榜设置 | 独立菜单 | 总览:四榜卡(榜名及状态、指标与统计窗口、当前排名预览、候选 / 上榜数量、更新时间)、启用数与人工调整数;单榜编辑页(中文标题、启停与终端、目标数量(不限)、候选范围、统计窗口、门槛、权重、更新方式、候选列表逐剧拖拽/目标名次/恢复自动/排除) | 编辑设置、按当前规则重新计算、保存设置、刷新榜单、Web / H5 已保存预览 | 第 05 章 5.2.5 排行榜设置 |
| 后台 · 推荐与分发:推荐位/Banner | 推荐与分发 → 推荐位/Banner | 仅 Web 开关与 Banner 列表,最多 12 条;新增/编辑弹窗维护目标、标题、图片及投放起止时间 | 拖拽/上下移/编辑/预览/移除;加入工作列表;保存配置及 Web 差异确认;查看与撤销 | 第 05 章 5.2.6 推荐位/Banner |
| 后台 · 首页板块设置 | 左侧独立菜单 | 板块列表(顺序、名称、启停、展示终端、内容预览、所选剧集数(不限));新增 / 编辑弹窗(主编辑无展示样式选项;候选选剧视图每页 16 部) | 新增 / 编辑板块;选剧(跨页勾选、全选当前搜索结果、清空);拖拽/上下移调整片单顺序与移除;创建 / 保存板块;总览上移 / 下移(立即保存);Web 已保存预览 | 第 05 章 5.2.7 首页板块设置 |
| 后台 · 操作日志 | 独立菜单 | 记录数与无记录空态;按新近在前的记录(时间、操作、对象与变更、操作人) | 查看四个业务模块(含合集)的成功/失败记录;固定历史样例与本次操作分开 | 第 05 章 5.2.8 操作日志 |
3.2 用户主流程
| 步骤 | 用户动作 | 前端行为 | 服务端行为 | 产生的标识 / 数据 |
|---|---|---|---|---|
| 1 | 首次访问 | 按设备 ID 分配账号与身份卡(未绑定登录方式即“游客”),未绑定即可观看免费内容;「我的」提供身份卡与绑定入口 | 分配唯一 userId;按身份卡区分用户,不同身份卡为不同用户 | userId;account_type=guest(未绑定登录方式) |
| 2 | 首页观看并进入播放页 | 点击底部集数区域进入播放页,保留当前剧、当前集及播放进度 | 退出后再次进入时恢复到原剧、原集、原进度(进度保存口径见 H5-P02) | drama_id / episode_id / position_ms |
| 3 | 播放页上下滑切集 | 本剧内切集,当前集数随实际 episodeId 更新;遇到收费且未解锁剧集从底部弹出 PAY-02 解锁弹层 | 返回目标集观看权限(accessState);VIP 到期重新鉴权 | episodeId;accessState |
| 4 | 解锁弹层选择方式 | 展示「解锁本集」「解锁本剧剩余全集」「开通 VIP」及余额;余额不足时进入金币充值弹框(默认档位按支付 4.2.12) | 返回当前用户有效报价(商品ID、报价ID、配置版本、权益范围、实际解锁集数、金额、币种、优惠资格) | offer_id / quote_id / config_version |
| 5 | 点击解锁方式或支付按钮 | 禁用重复提交;金币解锁直接扣钱包金币;金币充值 / VIP 在弹框内直接创建支付会话并拉起渠道,不新增确认订单页 | 重新核价、查余额与资格;一次购买动作生成一个 request_id,重试复用;扣金币与授予权益同一事务 | request_id / order_id / purchase_intent_id |
| 6 | 支付处理 | 展示商品、渠道、金额、订单号;未知结果显示「正在确认支付结果」,前端查询兜底 | 接收 Webhook 回调并确认最终状态;同一订单至多成功入账 / 授予一次 | 订单状态:处理中 / 成功 / 失败 / 取消 / 过期 |
| 7 | 到账与授权益 | 刷新余额、会员状态、选集锁标与订单 | 金币订单确认后仅入账;会员订单确认后授权益;限时权益记录到期时间 | wallet_credit_result / entitlement_unlock_result |
| 8 | 返回原剧继续播放 | 金币充值成功后不展示结果层,自动按充值前选中的解锁方式扣币解锁并播放目标集,toast 提示「解锁成功」;会员开通成功不展示结果层,自动返回原集播放,toast 提示「订阅成功」;金币解锁成功直接播放目标集 | return_to 只允许站内白名单路径 | return_to / purchase_intent_id |
内容分发与后台运营主流程
04前台需求
播放模块
4.1.1 全站文字
4.1.1.1 界面国际化与无中断切换
H5WebP0功能与业务规则
- 文案资源:界面文字统一读取语言资源。动态集号、金额和错误提示使用参数化文案,不使用中文字符串拼接或整页 DOM 文本替换。
- 状态覆盖:加载、无网、超时、已删除、禁言、余额不足、第三方授权取消等状态均提供 7 种界面语言文案。
- H5 入口位置:语言选择器只出现在剧场页与个人中心的顶栏右上角(与搜索入口同在固定顶栏);首页推荐流、榜单、福利、搜索结果等页面顶栏,以及播放设置、选集、充值等全部弹窗头部均不放语言选择器。
- H5 切换:切换语言时,已打开的播放/评论弹层保持当前状态;当前剧集、播放进度及评论草稿不重置。
- Web 切换:导航、简介、侧栏、弹窗及无障碍名称同步切换;不刷新媒体、不重新加载当前视频。
- 内容与界面分离:片名、简介和海报使用内容多语言资源;用户评论保留原文,不随界面语言切换而翻译。海报内文字缺少本地化素材,不计入 UI 硬编码扫描。
- 金额保持:语言切换不改变金额、币种、Coins 等原始业务数值,不进行汇率换算。
- 界面语言与字幕语言独立:界面语言只影响菜单、按钮和提示;字幕语言只影响播放器中的可切换字幕。切换中文 / 英文界面不得覆盖用户选择的字幕语言,切换字幕也不得修改界面语言、音频或评论原文。字幕选择与显示分别见 4.1.5.7、4.1.5.8。
操作流程
异常与边界
| 触发情况 | 处理要求 |
|---|---|
| 翻译资源未命中 | 回退默认语言并记录缺失 key;不得展示原始 key 或服务端堆栈。 |
验收标准
- V01-AT01:中→英→中切换,逐一打开评论、选集、登录及错误状态,界面文案覆盖率 100%,中文硬编码为 0。
- V01-AT02:播放到 23.2 秒时切换语言,媒体进度连续,评论草稿不丢失。
- V01-AT03:中文评论在英文界面仍保留原文;缺失翻译有回退且不显示裸 key。
- V01-AT04:选择英语字幕后切换界面语言,字幕仍为英语;面板标题、按钮和状态提示随界面语言更新,视频与草稿不重置。
4.1.2 语言一致性
4.1.2.1 术语、集数与互动计数规范
H5WebP0全站术语
| 业务含义 | 英文表达 | 使用规则 |
|---|---|---|
| 金币 | Coin / Coins | 按数量处理单复数,不混用 Gold 或 Credits。 |
| VIP | VIP | 保持同一业务称谓,不混用 Membership;支付模块文案中的“会员”与 VIP 同义(权益类型 membership),见 §02 2.4。 |
| 选集 / 剧集 | Episodes | 数量为 1 时使用 1 Episode,其余使用 n Episodes。 |
| 收藏 | Favorite | 收藏状态独立维护。 |
| 字幕语言 | Subtitle language | 区别于 Interface language(界面语言),不可共用同一个业务设置。 |
| 关闭字幕 | Off | 仅关闭可切换字幕层,不关闭声音或视频。 |
功能与业务规则
- H5 表达:右侧互动按钮可采用图标与数字组合;点击名称和无障碍名称完整可读,切换语言后不得遮挡字幕。
- Web 表达:按钮使用图标与完整文字;计数悬停可显示精确值。简介的更新状态与选集总数使用同一数据来源。
- 集数口径:完结(is_completed=true)显示「共 {total_count} 集」;连载与暂停显示「更新至 {updated_count} 集 / 共 {total_count} 集」,total_count 为空时只显示「更新至 {updated_count} 集」。首页推荐流底部入口、选集面板、Web 简介统一使用此口径;当前集数必须对应实际 episodeId。
- 计数口径:区分原始整数与展示缩写。数据尚未返回时展示加载占位;接口失败不得用 0 代替失败状态。
- 关系与反馈:本版无追剧功能,收藏状态独立维护,Favorite 去重。相同错误码使用同一文案 key 和提示短语。
- 排版与币种:过长英文优先按词换行或调整容器,不裁掉动作词、不缩到不可读。法币展示 ISO 币种,语言切换不重算金额。
沿用字段:glossary_version、count_value、count_status(服务端返回 ok / failed,failed 时显示“—”并可重试;loading 为前端请求中的本地状态)、favorited;剧集信息补 total_count、updated_count、is_completed(接口定义见第 06 章「多语言与术语资源」行);新增语言 key 需经产品与本地化确认。
验收标准
- V02-AT01:同一剧在首页、详情、播放、历史中的用词与集数一致。
- V02-AT02:覆盖 0、1、2、1000 条评论的显示;接口失败不显示为 0。
4.1.3 H5 注册、登录与账号绑定
4.1.3.1 游客账号与身份卡入口
H5P0已确认补充:身份初始化失败采用保留原身份、1 秒/3 秒重试与手动恢复,见 10.2 对应规则。此项为正式接入要求,不能以 demo 画面替代故障场景验收。
功能与业务规则
- 账号创建:每个用户打开落地页时按设备 ID 分配账号与身份卡,拥有唯一 userId;按身份卡区分用户,不同身份卡即不同用户,资产不互通,系统不判断是否为同一自然人。
- 核心口径:DAU / UV 按身份卡去重统计用户数,不同身份卡计为不同用户。
- 入口位置:在“我的”账号区域增加“查看身份卡”入口,展示位置见右侧红框。
- 账号入口:未绑定登录方式的账号只展示“绑定”入口,不展示“切换账号”;已绑定任一登录方式的账号只展示“切换账号”入口,不再展示绑定入口。
- 操作结果:点击身份卡入口打开身份卡弹层,具体展示与保存规则见 4.1.3.2。
- 资产归属:金币、VIP、已购短剧、观看历史、收藏、点赞、评论及任务进度均归属该 userId;不能因尚未绑定而使用另一套资产身份。
- 设备身份持久化:首次访问由服务端生成设备 ID(UUID),同时写入一方 cookie(有效期 1 年)和 localStorage,任一存在即复用。登录态:登录或切换成功后服务端下发会话(有效期 30 天,滑动续期),当前 userId 以会话为准、优先于设备 ID;会话失效后回落到该设备 ID 的设备账号;本版不提供退出登录。本地设备 ID 丢失(清除缓存、换浏览器)后,用身份卡或已绑定登录方式登录找回账号(此时设备上的新账号未绑定,从绑定页底部“已有账号?去登录”进入登录),两者都没有则无法找回,平台不负责。
操作流程
验收标准
- 未注册、未绑定的用户可观看免费内容,并能进入“我的”查看身份卡。
- 当前账号与身份卡指向同一 userId,后续互动与消费继续使用该身份。
流程说明图 · 游客自动注册与后续账号入口
H5-A01 / FLOW4.1.3.2 身份卡查看与保存
H5P0功能与业务规则
- 弹层内容:展示身份卡、用户信息、登录凭证区域、使用说明及保存按钮;身份卡与当前账号对应。
- 保存操作:点击“保存身份卡”,前端生成 PNG(含二维码与使用说明)。桌面浏览器直接下载;移动浏览器优先调用 Web Share(navigator.share 分享图片文件),不支持时全屏展示图片并提示「长按图片保存到相册」,内嵌浏览器同样降级。任一保存动作被触发即视为保存成功,同步调用服务端回写 identity_card_saved_at,并上报 identity_card_save_click(result=success);保存后的身份卡可用于后续恢复登录。
- 跨端用途:用户可使用保存的身份卡实现跨端登录;上传或拍照识别入口见 4.1.3.4。
- 关闭操作:关闭身份卡弹层后回到“我的”,不改变当前账号和资产。
- 凭证内容:身份卡凭证包含 userId 与账号昵称(「剧迷」+ userId 后 6 位)。
- 保存失败:可重新保存。
操作流程
身份卡弹层曝光(identity_card_show);“保存身份卡”按钮点击(identity_card_save_click)。事件定义见 7.2 / 7.7;保存点击记录用于运营统计身份卡下载用户数;充值 / 订阅 / 解锁成功后是否再弹「保存身份卡 / 绑定登录方式」提示,以服务端账号字段 identity_card_saved_at 与 identity_reminder_shown_at 判断,不依赖埋点(见支付模块 4.2.5)。
验收标准
- 身份卡信息与当前账号一致,保存内容不是其他账号的凭证。
- 保存后的身份卡可进入身份卡登录流程;曝光与保存点击均有埋点。
流程说明图 · 身份卡查看、保存与恢复登录
H5-A02 / FLOW4.1.3.3 账号绑定与资产保留
H5P0功能与业务规则
- 绑定方式:提供 Google、Facebook、Apple、X 及账号密码绑定方式。账号密码绑定:账号不限格式,密码至少 6 位;登录失败锁定规则见 4.1.3.4。
- 绑定含义:绑定只给当前账号增加快速登录方式,除首次通过第三方授权(Google / Facebook / Apple / X)绑定成功赠送 50 金币(每 userId 一次;账号密码绑定不赠送,规则见支付模块 4.2.5)外不产生其他效果,不创建替代账号,也不切走当前 userId;已绑定的每种登录方式都可登录该账号(同一 userId)。每个账号每种登录方式(Google、Facebook、Apple、X 与账号密码)最多绑定一个。
- 资产与行为:绑定后账号资产与行为数据不受影响。
- 完成回流:完成绑定确认并成功后,返回发起绑定前的页面,不统一跳转首页。
- 绑定冲突:已绑定到其他账号的登录方式不能重复绑定,绑定失败并提示;不自动迁移或合并资产。
- 内嵌浏览器:在 Instagram / TikTok / FBAN 等内嵌浏览器(按 UA 识别)中,点击 Google 按钮时提示「请在系统浏览器中打开以使用 Google 登录」并提供复制链接,跳出前提醒先保存身份卡;其余渠道在内嵌浏览器中是否展示以 spike 实测结果为准(见 10.2 第 2 项)。
- 去登录:绑定页底部提供“已有账号?去登录”,点击进入切换账号页(4.1.3.4)登录已有账号,登录成功按 4.1.3.4 进入首页。
- 取消授权:在第三方授权页取消后回到绑定页,保持未绑定,可直接重新发起,不弹错误提示。
- 提交异常:提交失败时由用户再次点击提交,直至绑定成功(绑定冲突按上方“绑定冲突”处理);服务端按数据库中的绑定记录识别重复提交,避免重复绑定;处理中关闭绑定页时,已提交且未取消的绑定继续完成。
操作流程
绑定页曝光;每个第三方快捷按钮点击;确认按钮点击。
验收标准
- 成功绑定后仍为原 userId;除首次绑定发放的 50 赠币(bonus_balance +50,reward_grant_result rule_id=bind_reward)外,金币、已购集、VIP 到期时间、收藏 / 点赞 / 评论条数与绑定前一致,一致率 100%。
- 绑定完成返回来源页面;不丢失历史、已购内容、收藏或点赞。
- 各渠道入口与确认操作可触发相应埋点;绑定成功率 ≥ 99%(口径见 9.1)。
流程说明图 · 账号绑定双路径与完成回流
H5-A03 / FLOW4.1.3.4 切换账号与身份卡登录
H5P0已确认补充:登录失败统一文案;相册权限拒绝与未选择图片分别处理,见 10.2 对应规则。此项为正式接入要求,不能以 demo 画面替代故障场景验收。
功能与业务规则
- 身份卡登录:使用
<input type="file" accept="image/*">,不加 capture 属性,由系统选择器同时提供相册与拍照;本期不做独立相机取景页。相机不可用或授权被拒绝(IG / TikTok 等内嵌浏览器、无摄像头)时只显示上传入口。身份卡无法识别时可重新识别;相册读取失败时提示“读取失败,请重试”。 - 快捷登录:支持 Google、Facebook、Apple、X 快捷登录;内嵌浏览器中的 Google 按钮规则同 4.1.3.3「内嵌浏览器」。第三方登录取消授权后返回切换账号页。
- 账号密码入口:提供账号与密码输入区登录;账号不限格式,密码至少 6 位,与已绑定的账号密码匹配即登录成功;登录时同一账号连续失败 5 次锁定 5 分钟,同一 IP 每分钟最多 20 次;不提供找回流程;匹配失败时提示“账号或密码错误”。
- 切换前确认:当前账号未绑定任何登录方式,且金币余额 > 0、有已购集或有效 VIP 时,点击任一登录方式前弹窗「切换后当前账号将无法找回,请先保存身份卡或把登录方式绑定到当前账号」,按钮为「保存身份卡」「绑定到当前账号」「仍要切换」;用未绑定过的第三方账号登录会新建空账号,弹窗中同时说明。
- 成功去向:登录成功后进入首页,后续观看与资产展示对应登录后的账号。
- 操作区分:切换账号不是给原账号追加登录方式;页面标题、主按钮与绑定页区分表达。
- 未绑定过的第三方账号:用未绑定过任何账号的第三方账号登录时直接登录成功,系统新建一个正式账号并将该登录方式绑定到新账号、分配身份卡;新账号无原账号资产,不赠送绑定奖励(见支付模块 4.2.5)。已绑定过的第三方账号登录则进入其绑定的账号。
操作流程
切换账号页面曝光;第三方快捷按钮点击;确认按钮点击。
验收标准
- 身份卡相册上传及第三方快捷入口符合需求;相机不可用时只显示上传入口。
- 登录成功跳转首页,而不是绑定流程的原页返回。
- 登录后的用户身份与所登录账号一致。
- 未绑定账号的“我的”不展示“切换账号”,可从绑定页“已有账号?去登录”进入本页;已绑定账号展示“切换账号”。
- 用未绑定过的第三方账号登录新建账号,新账号无原资产、不发绑定奖励。
流程说明图 · 三种登录入口与完成后的账号状态
H5-A04 / FLOW4.1.4 Web 注册、登录与账号绑定
4.1.4.1 个人中心账号区域与身份卡入口
WebP0已确认补充:身份初始化失败采用保留原身份、1 秒/3 秒重试与手动恢复,见 10.2 对应规则。此项为正式接入要求,不能以 demo 画面替代故障场景验收。
功能与业务规则
- 账号区域:改造原登录/账号区域,按图中红框位置设置当前账号信息、账号绑定和身份卡相关入口。
- 账号入口:未绑定登录方式的账号只展示“绑定”入口,不展示“切换账号”;已绑定任一登录方式的账号只展示“切换账号”入口,不再展示绑定入口。
- 身份卡入口:增加身份卡查看按钮,点击打开当前账号的身份卡弹层。
- 身份与资产:不同设备初始账号的区分、统一 userId 与资产归属遵循 4.1.3.1;Web 不另建一套游客资产规则。
操作流程
验收标准
- 个人中心中可找到身份卡与绑定入口,布局对应图示红框。
- 游客可查看自己的身份卡,当前资产与账号身份一致。
流程说明图 · 游客自动注册与个人中心入口
PC-A01 / FLOW4.1.4.2 身份卡弹层与保存
WebP0功能与业务规则
- 弹层内容:在当前页面打开身份卡弹层,展示当前用户身份信息、凭证/二维码区域、使用说明与保存按钮。
- 保存用途:保存当前账号身份卡,后续可用于恢复或跨端登录,不改变当前账号或资产。
- 关闭去向:关闭弹层后仍停留在原页面。
- 凭证方案:与 H5 共用,凭证内容与保存失败处理见 4.1.3.2。
身份卡弹层曝光(identity_card_show);保存身份卡按钮点击(identity_card_save_click)。事件定义见 7.2 / 7.7。
验收标准
- 身份卡弹层展示当前账号信息,可执行保存操作。
- 曝光与保存点击完成埋点;关闭弹层不触发账号切换。
流程说明图 · 身份卡弹层、保存与后续恢复
PC-A02 / FLOW4.1.4.3 账号绑定弹层与绑定后展示
WebP0功能与业务规则
- 绑定方式:支持 Google、Facebook、Apple、X,以及账号密码绑定;已绑定的登录方式都可登录该账号(同一 userId)。账号密码绑定:账号不限格式,密码至少 6 位;登录失败锁定规则见 4.1.4.4。
- 资产保持:绑定后账号资产与行为数据不受影响;绑定只增加登录方式,首次通过第三方授权或已验证邮箱绑定成功赠送 50 金币(每 userId 一次;账号密码绑定不赠送,规则见支付模块 4.2.5)。
- 成功回流:成功确认后返回原页面;账号区域更新为已绑定的账号信息。
- 账号区展示:绑定后显示“当前账号”、绑定渠道、账号信息及“切换账号”入口,具体位置见下方局部图。
- 去登录:绑定弹层底部提供“已有账号?去登录”,点击打开切换账号弹层(4.1.4.4)登录已有账号,登录成功按 4.1.4.4 进入首页。
- 冲突与异常:绑定冲突、取消授权与提交异常的处理与 H5 相同(见 4.1.3.3);取消授权后回到绑定弹层并保持未绑定,处理中关闭弹层时已提交且未取消的绑定继续完成。
操作流程
绑定弹层曝光;每个快捷绑定按钮点击;确认按钮点击。
验收标准
- 成功绑定后仍为原 userId;除首次绑定发放的 50 赠币(bonus_balance +50,reward_grant_result rule_id=bind_reward)外,金币、已购集、VIP 到期时间、收藏 / 点赞 / 评论条数与绑定前一致,一致率 100%。
- 绑定成功后关闭流程并更新当前账号区域;不误跳首页。
- 绑定页、渠道按钮与确认按钮埋点齐全。
流程说明图 · 账号绑定弹层与绑定完成展示
PC-A03 / FLOW4.1.4.4 切换账号弹层与登录回流
WebP0已确认补充:登录失败统一文案;相册权限拒绝与未选择图片分别处理,见 10.2 对应规则。此项为正式接入要求,不能以 demo 画面替代故障场景验收。
功能与业务规则
- 承载方式:在当前页面弹出切换账号层。
- 登录方式:支持身份卡相册上传登录(不做独立相机取景,无摄像头或权限拒绝时只显示上传入口),以及 Google、Facebook、Apple、X 快捷登录。身份卡识别失败时可重新识别;相册读取失败时提示“读取失败,请重试”;第三方登录取消授权后返回切换账号弹层。
- 账号密码入口:提供账号与密码输入区登录;账号不限格式,密码至少 6 位,与已绑定的账号密码匹配即登录成功;登录时同一账号连续失败 5 次锁定 5 分钟,同一 IP 每分钟最多 20 次;不提供找回流程;匹配失败时提示“账号或密码错误”。
- 切换前确认:与 H5 相同(见 4.1.3.4「切换前确认」)。
- 成功去向:登录成功进入首页,当前用户身份切换为登录账号。
- 与绑定区分:绑定成功返回原页面;切换登录成功进入首页。两条路径不得混用。
- 未绑定过的第三方账号:用未绑定过任何账号的第三方账号登录时直接登录成功,系统新建一个正式账号并将该登录方式绑定到新账号、分配身份卡;新账号无原账号资产,不赠送绑定奖励(见支付模块 4.2.5)。已绑定过的第三方账号登录则进入其绑定的账号。
操作流程
弹层曝光;快捷登录按钮点击;确认按钮点击。
验收标准
- 点击切换账号可打开对应弹层,登录方式与需求一致。
- 登录成功进入首页,后续展示对应登录账号的数据。
- 未绑定账号的个人中心不展示“切换账号”,可从绑定弹层“已有账号?去登录”打开本弹层;已绑定账号展示“切换账号”。
- 用未绑定过的第三方账号登录新建账号,新账号无原资产、不发绑定奖励。
流程说明图 · 切换账号弹层与登录完成回流
PC-A04 / FLOW4.1.5 H5 端播放功能
4.1.5.1 首页推荐播放与进入播放页
H5P0功能与业务规则
- 页面信息:视频下方依次展示剧名、当前集数、剧情简介;底部按 4.1.2.1 集数口径展示集数及进入播放页的入口。当前集数必须对应正在播放的 episodeId。
- 推荐范围:上下滑动用于切换不同剧的随机免费剧集;候选池为已上架短剧中 accessState=free 的单集,每部剧只取 1 集(优先第 1 集);每次进入首页由服务端随机生成 20 条序列,同一会话内不重复出现同一部剧;刷到第 20 条后继续请求下一批。本版不提供后台配置,候选规则由服务端实现。收费剧集不进入首页免费推荐流。
- 播放控制:点击视频画面执行暂停,支持继续播放;不能只显示/隐藏控制开关而未改变实际播放状态。增加声音开关,默认开启声音(Web 播放器、H5 首页推荐流与播放页相同);浏览器拦截有声自动播放时降级为静音播放,并在画面上显示「点击开启声音」,用户点击后恢复声音。
- 进度衔接:点击底部集数区域进入该剧播放页时,保留当前剧、当前集及播放进度,不重新从第 1 集或 0 秒开始。
- 互动入口:首页提供评论、点赞和收藏入口;评论提交后展示与计数的修复见播放模块 4.1.7(INT-01);点赞 / 收藏反馈与个人中心同步沿用现有规则,本版不改(其余互动模块需求不纳入本版,见 §02 2.2 来源说明)。右侧观看奖励金币挂件的领取规则沿用现网;今日领满后点击挂件进入任务中心,见 4.1.8.3;推荐流观看奖励金币为现网已有功能,本版只按原型优化 UI,规则与数值沿用现网。
操作流程
验收标准
- 首页上下滑动仅出现符合免费范围的剧集,不将锁定集混入推荐流。
- 标题、当前集数、简介、底部总集数分别显示,当前集数与实际播放内容一致。
- 点击画面可暂停并继续播放;首次进入默认开启声音(被浏览器拦截时静音并提示「点击开启声音」),声音开关有效。
- 首页进入播放页后剧、集、进度连续;播放/暂停交互时延 ≤300ms。
4.1.5.2 本剧连续播放与返回进度恢复
H5P0功能与业务规则
- 返回行为:点击返回回到上一个页面。上一页是首页推荐流时,当前集若为免费集,首页该位置切换为当前集并从当前进度继续播放;当前集若为收费集,首页恢复进入播放页前的免费集及其原进度,当前进度只按观看进度上报保存。没有上一页(外链 / 广告落地直达)时,返回进入首页推荐流。
- 本剧滑动:播放页上下滑动用于切换本剧剧集;本剧未结束时不得误跳其他短剧。
- 集数更新:切集后当前集数随实际 episodeId 更新,不能固定显示某一集;集数展示更新时延 ≤300ms。
- 权限分流:切到可观看剧集时播放该集;遇到收费且未解锁剧集时从底部弹出 PAY-02 解锁弹层(见 H5-P04),不能直接播放锁定内容。
- 解锁回流:解锁成功后回到对应播放页并自动播放刚刚解锁的目标剧集;已购内容和 VIP 权益按当前权限判断。
- 退出恢复:用户退出后再次进入时,应恢复到原剧、原集、原进度;不能只保存剧名而丢失集号或 position_ms(上报时机与恢复误差见第 06 章「观看进度上报 / 恢复」)。
操作流程
异常与边界
| 触发情况 | 处理要求 |
|---|---|
| 本剧最后一集(完结剧,下一集不存在) | 末集剩余 10 秒时,在底部选集入口下方弹出推荐卡:左侧为推荐剧封面,右侧三行依次为「本剧已看完,接下来看」、推荐剧名(最多两行,超出省略)、推荐剧集数;卡片最右为「上滑继续看」按钮(带上滑提示动效)。播完后自动进入推荐剧第 1 集;末集播放中上滑、点击推荐卡同样进入该推荐剧第 1 集(与自动进入同一目标)。推荐剧 = 与当前剧任一标签相同的随机剧的第 1 集,排除第 1 集收费的剧集;没有同标签剧时,在 4.3.3 热播榜当前快照中随机选择一部(同样排除第 1 集收费的剧集),不弹付费墙。不再出现「已到最后一集」停止提示。见 8.1。 |
| 连载 / 暂停剧看到最新更新集 | 与完结剧一致:最新集剩余 10 秒时弹出推荐卡,三行依次为「本剧更新至 N 集,接下来看」、推荐剧名(最多两行)、推荐剧集数;卡片最右为「去看看」按钮(无动效)。播完或上滑自动进入推荐剧第 1 集,点击推荐卡同样进入;推荐剧规则同上一行。推荐不到剧时停留在当前集,在选集入口下方显示「已更新至第 N 集,敬请期待」。见 8.1。 |
| 锁定集网络失败 | 处理同 H5-P04(4.1.5.4)「锁定集网络失败」行。 |
验收标准
- 完结剧末集与连载剧最新集:剩余 10 秒出现推荐卡,文案与按钮分别为「本剧已看完,接下来看 / 上滑继续看」「本剧更新至 N 集,接下来看 / 去看看」;播完、上滑、点击推荐卡均进入同一部推荐剧第 1 集;长剧名最多两行显示。
- 本剧中途切集不跳外部短剧,显示集数与实际播放一致。
- 返回首页后仍为原剧原集,并衔接当前进度。
- 锁定集触发 PAY-02 解锁弹层,成功解锁后播放目标集。
- 切集和退出恢复的量化目标及上线门槛见 9.1。
末集推荐卡曝光 end_recommend_card_show(to_drama_id, series_status);进入推荐剧 episode_next(next_type=end_recommend, end_trigger=auto|swipe|card);事件定义见 7.2。
4.1.5.3 选集面板与可看/锁定状态
H5P0功能与业务规则
- 面板内容:点击选集打开面板,展示剧名、总集数和分集列表;当前播放集需有明确选中态。
- 观看状态:可观看集与未解锁集须有可区分的状态;锁定集使用锁定标识,不能只展示相同的普通序号。
- 点击可看集:选择可观看剧集后进入该集播放,集数标识与实际内容同步更新。
- 点击锁定集:选择付费且未解锁剧集后弹出支付模块 PAY-02 解锁弹层(承接规则见 H5-P04),解锁对象为用户刚选择的剧集。
- 数据一致:选集面板、播放器和剧集介绍中的集数信息保持一致,免费集范围由剧集配置决定。
- 分组与下架集:选集面板按每组 20 集分页签(1–20、21–40……),每行 5 集、固定 4 行高度,当前组不足 20 集时面板高度不变;分页签一行放不下时可左右滑动;切换分页签只替换下方集数格子,面板本身不刷新、不闪动(Web 选集侧栏仍按每组 30 集,不在本条调整范围);下架单集不展示,其余集号保持原值(允许断号);上下滑与自动连播跳过下架集;面板「共 N 集」取可展示集数。
操作流程
验收标准
- 当前集有选中态,锁定集有可辨识的锁定标识。
- 点击已可看的集进入该集;点击未解锁集进入正确目标的解锁流程。
- 面板集数、当前播放集和剧情内容对应一致。
- 每组 20 集、固定 4 行高;不足 20 集的组高度不变;分页签可横滑;切换分页签时面板不重建。
待确认规则本稿不指定全站固定的免费集数。
4.1.5.4 锁定集付费墙触发与解锁回流
H5P0功能与业务规则
- 解锁弹层承接:锁定集统一由支付模块 PAY-02 解锁弹层承接,从播放页底部弹出,播放页带入 drama_id、episode_id、position_ms、return_to;弹层提供「解锁本集」「解锁本剧剩余全集」「开通 VIP」三种方式及余额,价格、点击结果与余额不足的充值规则见支付 4.2.4 / 4.2.6 / 4.2.10 / 4.2.12。
- 触发时机:滑动切到锁定集、选集面板点击锁定集、自动连播到锁定集时触发;触发时不播放锁定内容。服务端鉴权:剧集信息 / 选集接口对 accessState=locked 的单集不返回播放地址;播放地址按 userId + episode_id 签发短时效签名 URL(有效期 ≤ 2 小时),HLS 分片同样校验签名或使用 CDN token 鉴权;限时权益到期后拒绝新的签发请求。
- 解锁成功:成功获得目标集权限后关闭解锁流程,自动回到播放页播放该集,toast 提示「解锁成功」。金币充值成功后不展示支付结果层,自动按充值前选中的解锁方式扣币解锁并播放目标集,toast 提示「解锁成功」;开通 VIP 成功同样不展示结果层,自动回到播放页继续播放,toast 提示「订阅成功」(规则见支付模块 4.2.7 / 4.2.8)。起播位置:目标集有历史进度(按第 06 章恢复规则)就从该进度起播,否则从 0 秒起播;position_ms 只用于关闭解锁弹层(未购买)时恢复原集原进度。回到播放页后,若当前账号未绑定任何登录方式,且服务端账号字段
identity_card_saved_at与identity_reminder_shown_at均为空,在 toast 之后显示一次提示(不暂停播放):“为避免换设备或清除缓存后丢失金币与已购内容,请保存身份卡或绑定登录方式”,提供“保存身份卡”“绑定登录方式”入口与“稍后再说”;提示展示时由服务端写入 identity_reminder_shown_at(点「稍后再说」同样视为已展示),每个账号终身只提示一次;已绑定任一登录方式或该字段已有值的账号不提示。 - 已获权益:已购内容或具有对应 VIP 权益的用户,不应被当作未解锁用户反复拦截。客户端在以下时机重新请求 accessState:进入播放页、切集(滑动 / 选集 / 自动连播)、页面从后台恢复或刷新、以及服务端返回的 expiresAt 到点;expiresAt 到点时当前正在播放的集播完前不打断,切下一集时按新结果处理;客户端不自行计算到期,只信服务端时间。VIP 到期后权益保留规则按支付模块 4.2.7(pass_until 到期降级)。
操作流程
异常与边界
| 触发情况 | 处理要求 |
|---|---|
| 锁定集网络失败 | ① accessState 或报价请求失败——不播放,解锁弹层显示「加载失败,重试」;② 解锁 / 扣币请求超时或断网——按钮保持禁用,用同一 request_id 查询结果(最多 3 次,间隔 2 秒):服务端已扣币授权则按解锁成功回流播放;确认未扣币则提示「网络异常,未扣币,请重试」;查询仍失败则提示「结果确认中」,刷新后按 accessState 恢复。 |
| VIP 到期 | 重新请求 accessState,不沿用本地 VIP 缓存。 |
验收标准
- 付费墙指向实际锁定的目标集,不发生剧集错配。
- 解锁弹层展示的「解锁本集」「解锁本剧剩余全集」「开通 VIP」与支付 4.2.4 一致,解锁范围与价格可被区分。
- 成功解锁后自动播放目标集;网络失败按「锁定集网络失败」行处理,确认未扣币才提示未扣币,不播放锁定内容。
待确认规则单集金币、全剧折扣、VIP 定价与周期的具体值待后台配置确认(见 10.2);图中金额不作为生产价格。
4.1.5.5 清屏播放
H5P0功能与业务规则
- 清屏入口:在播放设置中打开「清屏播放」开关进入清屏状态,关闭开关退出;播放页底部不再提供清屏按钮。
- 保留内容:底部保留选集入口;顶部文字保留但降低亮度,不全部隐藏。
- 隐藏内容:收起影响观看的其他叠加信息与互动内容,视觉状态按右图执行。
- 播放连续:清屏用于改变界面展示,不改变当前剧集或播放进度。
- 清屏保留已开启字幕:字幕属于观看内容,不随互动按钮和剧情简介一并隐藏。进入清屏后保留当前字幕语言和开关状态;退出清屏后恢复原位置。清屏字幕示意与具体规则见 4.1.5.8。
操作流程
验收标准
- 进入清屏后底部选集入口仍可见,可在播放设置中关闭清屏退出。
- 顶部文字变暗,而不是与底部选集一起消失。
- 清屏操作不将播放内容重置为其他剧集或起始进度。
- 字幕开启时,进入与退出清屏均继续显示当前时间对应字幕;选集入口可操作,字幕不遮挡按钮。
4.1.5.6 播放设置面板
H5P0功能与业务规则
- 面板开启:点击右上角三点入口打开功能设置面板。
- 播放速度:提供播放速度设置入口,并展示当前选中的速度。
- 清晰度:提供清晰度设置入口,并展示当前选中项。
- 字幕语言:在清晰度之后增加“字幕语言”设置项,右侧展示当前值(关闭字幕或本集可用语种名,见 4.1.5.7)与进入箭头。点击打开字幕选择面板。选择后立即更新当前字幕;点击“完成”返回播放设置,并同步该行的当前值。详细交互见 4.1.5.7。
- 展示与模式:本期不含弹幕功能,设置面板不展示“弹幕显示”;清晰度默认「自动」(ABR);可用 hls.js(MSE / ManagedMediaSource)的环境列出 master playlist 各码率层,按分辨率高度命名(如 1080p / 720p / 480p);iOS 原生 HLS 等不支持手动切换的环境及单码率时该行显示「自动」且不可点,后台不配置;开发前做 spike,确认 iOS 17.1 以下用户占比与播放方案;画中画在浏览器不支持(document.pictureInPictureEnabled=false 或 iOS)时隐藏该行;播放速度档位固定 0.75 / 1.0 / 1.25 / 1.5 / 2.0,速度与清晰度选择本地记忆;清屏展示遵循 4.1.5.5。
- 自动连播:自动连播是固定播放流程,不提供开关,设置面板不展示“自动连播”:本集播完自动播放下一集;解锁成功后自动播放目标集;上下滑或选集切换后自动播放;自动连播到锁定集时按 4.1.5.4 触发付费墙。H5 与 Web 相同。
操作流程
验收标准
- 更多入口可打开面板,播放速度、清晰度、字幕语言、清屏、画中画(浏览器支持时)入口齐全,不展示弹幕显示。
- 实际设置结果与当前选中态一致。
- 从设置进入字幕面板选择英语,点击“完成”返回设置;“字幕语言”右侧显示英语,与 CC 入口及实际字幕一致。
4.1.5.7 字幕入口与语言选择
H5P0功能与业务规则
- 快捷入口:播放页右上角增加 CC 字幕按钮,位于“更多(三点)”左侧。点击打开“字幕语言”面板;关闭字幕时显示默认态,选择任一语言后显示开启态。按钮的可访问名称包含当前字幕状态。
- 设置入口:路径为“播放页 → 更多 → 播放设置 → 字幕语言”。该入口与 CC 共用同一选中状态与同一面板,不能维护两份字幕设置。首页推荐流不增加字幕入口,本版不显示字幕;首页推荐池只放含烧录英文字幕或无对白门槛的免费集,由内容侧确认。
- 语言选项与默认值:字幕默认跟随当前界面语言——没有历史选择时,本集
subtitles[]含当前界面语言的字幕则默认开启并选中该语种,不含则默认“关闭字幕”;当前已保存的选择存在时优先恢复该项,用户手动选择后不再随界面语言变化(见 4.1.5.8「界面语言独立」)。面板固定首项“关闭字幕”,其余按subtitles[]顺序列出本集实际可用语种,显示名取语言资源;本集无任何字幕时按 8.2 显示“暂无可用字幕”。语言代码使用 BCP-47,与后台 5.2.1 字幕语种字典一致。 - 单选与即时生效:每次仅选中一项,使用选中描边与勾选标识。点击语言后立即应用到当前播放时间,并更新预览;面板保持打开。“完成”只负责返回或收起面板,不是第二次保存,不要求重播或切集才能生效。
- 字幕预览:面板展示当前播放时间及对应字幕文本。关闭字幕时显示关闭状态提示;当前时间没有字幕条目时显示等待 / 暂无字幕提示,不显示上一条字幕。未解锁内容不预览其字幕正文。
- 完成、返回与关闭:从 CC 进入时,点击“完成”收起面板回到播放页;从播放设置进入时,点击“完成”或“返回播放设置”回到设置面板并同步当前值。点击关闭按钮或面板外遮罩关闭弹层;已即时生效的选择不撤销。
- 与视频点击互不干扰:点击 CC、语言项、完成或设置返回按钮,只执行相应字幕操作,不触发视频区域的播放 / 暂停。面板开关及字幕切换均不主动改变视频播放状态。
语言选项
| 显示名称 | 状态标识 | 结果 |
|---|---|---|
| 关闭字幕 | off | 不显示可切换字幕 |
| 简体中文 | zh-Hans | 显示简体字幕 |
| 英语 | en | 显示英语字幕 |
| 繁体中文 | zh-Hant |
显示繁体字幕 |
操作流程
路径一 · CC 快捷入口
路径二 · 播放设置入口
验收标准
- H5-P07-AT01:无历史设置时,本集含当前界面语言字幕则默认选中该语种、CC 为开启态;不含则 CC 为关闭态,字幕面板仅“关闭字幕”选中。
- H5-P07-AT02:从 CC 和设置进入同一面板,选中态一致;面板列出“关闭字幕”与本集 subtitles[] 全部语种(后台配了日语则显示日语,未配英语则不列英语),始终只有一项选中。
- H5-P07-AT03:在当前时间存在字幕时选择语言,预览和画面对应更新;不点击“完成”也已生效。
- H5-P07-AT04:CC 路径点击完成回播放页;设置路径点击完成回播放设置,设置行的当前值同步。
- H5-P07-AT05:选择新语言后关闭弹层,再次进入仍保留选择;关闭弹层不回滚。
- H5-P07-AT06:播放中和暂停中分别打开、选择、关闭字幕面板,均保持操作前的播放 / 暂停状态,且不触发画面点击事件。
字幕面板曝光 subtitle_panel_show及语言变更 subtitle_language_change(entry=quick|settings, from_language, to_language, result),定义见 7.2。
4.1.5.8 字幕显示、记忆与播放同步
H5P0功能与业务规则
- 字幕与视频时间同步:每条字幕按起止时间显示:开始时间 ≤ 当前视频时间 < 结束时间。播放过程中自动切换对应文本;无字幕条目的时间段隐藏字幕,不延用上一句。暂停时保持当前画面及对应文本。
- 切换语言不中断播放:切换字幕不更换视频源、不重置播放进度、不改变倍速、音量、静音或播放 / 暂停状态。新语言按当前视频时间定位,不从该语言第一句重新开始。
- 进度拖动与倍速:拖动进度后按目标时间重新显示字幕;在字幕间隙应隐藏文本。倍速改变时继续以视频当前时间为准,不能用一套独立计时器累计字幕进度。
- 显示区域与点击穿透:普通播放状态下,字幕位于画面约 70% 高度处(剧名与简介区域上方)左右居中显示,宽度收窄以避让右侧声音及互动按钮,不贴底也不居于画面正中;末集出现推荐卡时随推荐卡高度整体上移,始终在剧名上方;全屏播放时下移至画面底部约 9% 处并放开宽度(见 4.1.5.9)。浅色文字配深色半透明底。每条字幕按容器宽度自动换行;两行是内容制作规范而不是前端限制,超过两行时前端完整显示(向上扩展),不截断、不缩小字号;验收以字幕文件抽检不超过两行为准。字幕层不拦截画面点击;点击字幕所在的视频区域仍可播放 / 暂停。
- 关闭字幕与声音独立:选择“关闭字幕”后立即移除可切换字幕层,并保留视频、声音原有状态。声音静音不自动关闭字幕,开启声音也不自动打开字幕。视频素材中已烧录的文字不属于该开关控制范围。
- 清屏状态:清屏不关闭字幕。当前语言开启时继续显示字幕,位置下移至底部选集入口上方、宽度放开,避让底部选集与全屏按钮;退出清屏后回到正常布局。
- 选择记忆与回流:在本地存储可用的同一浏览器中保存上次字幕选择,包括“关闭字幕”。切集、返回播放页或刷新后恢复;不因从不同入口打开而重置。首页推荐流本次不显示可切换字幕,返回首页不清除选择;再次进入播放页后继续使用。字幕选择不随账号同步:同一浏览器切换账号后仍沿用本地记住的选择;换设备或换浏览器时无记忆,按 4.1.5.7 默认规则(本集有界面语言字幕则开启该语种,没有则关闭字幕)。
- 切集与付费权限:切到新集时,保留字幕语言偏好,但字幕内容必须对应新集,不能沿用上一集的文本或时间轴。目标集缺少偏好语种时,当前集按默认规则显示(本集有界面语言字幕则开启该语种,没有则关闭字幕)并提示“该语种不可用”;偏好保留,后续集有该语种时恢复。未解锁集不显示字幕正文;解锁后从实际恢复的播放时间显示当前集字幕。
- 界面语言独立:切换界面语言只更新控件和提示,不自动切换字幕,也不翻译用户评论。反向切换字幕不改变界面语言或配音。
状态说明
| 触发状态 | 显示与处理 |
|---|---|
| 关闭字幕 | 字幕层隐藏;CC 关闭态;设置与面板显示关闭字幕。 |
| 开启且当前时间有字幕 | 显示所选语言的当前条目;CC 开启态。 |
| 开启但处于字幕间隙 | 画面不留上一句;语言选择保持开启,不误判为加载失败。 |
| 视频暂停 | 字幕停在同一时间对应的条目,选择其他语言可就地更新。 |
| 未解锁 | 不显示字幕正文;仅保留语言设置,不通过字幕暴露付费内容。 |
| 返回首页推荐流 | 不显示播放页字幕层,已保存的选择保留。 |
操作流程
验收标准
- H5-P08-AT01:在同一有字幕时间点,依次选择本集 subtitles[] 中的每个语种,展示对应字幕;视频源不变,进度不回到 0。
- H5-P08-AT02:跨字幕开始、结束及间隙时显示 / 隐藏正确;拖动到其他条目或间隙后没有上一句残留。
- H5-P08-AT03:播放中切换字幕继续播放;暂停中切换字幕仍暂停。倍速、音量和静音状态不被改动。
- H5-P08-AT04:选择关闭字幕后立即隐藏;静音 / 开声与字幕开关互不影响。
- H5-P08-AT05:开启字幕后进入清屏,字幕继续显示且不遮挡底部入口;退出清屏后位置恢复。
- H5-P08-AT06:切至有同语种字幕的下一集,保持语言但匹配新集时间轴;返回播放页及刷新后恢复选择。另测关闭字幕的记忆。
- H5-P08-AT07:未解锁集不显示字幕正文;解锁回流后字幕与目标剧、目标集、实际进度对应。
- H5-P08-AT08:中文界面 + 英语字幕、英文界面 + 简体字幕均可组合;界面与字幕互不覆盖。
- H5-P08-AT09:点击字幕覆盖的视频区域可播放 / 暂停;点击字幕入口和面板控件不误触。
正式内容随集信息返回 subtitles[](字段见第 06 章「字幕资源」行),每条字幕的起止时间与文本由 WebVTT 文件承载。生产口径:字幕与视频时间同步误差 ≤ 250ms;语种按本集 subtitles[] 清单全部展示,不限 3 种。原生全屏 / 画中画规则见 4.1.6.4;字幕加载失败等生产异常的补充建议见 8.2。
4.1.5.9 全屏播放
H5P1功能与业务规则
- 按钮展示:是否显示全屏按钮取决于画面当前是否已铺满屏幕——竖屏剧在播放页本来就铺满,不显示全屏按钮;横屏剧竖屏观看时画面未铺满,显示全屏按钮;进入全屏后隐藏全屏按钮。
- 全屏内容:全屏时保留画面、进度条、顶部按钮(返回、当前集数、CC、更多)、字幕,以及右侧声音、点赞、评论、收藏、分享;观看奖励金币挂件、剧名与简介、底部选集入口隐藏。全屏状态下打开的播放设置、字幕、评论等弹层及 toast 与画面同方向展示,可正常操作。
- 退出全屏:点击右上角「✕」退出全屏;点击左上角返回在全屏时只退出全屏、回到竖屏观看,不离开播放页(非全屏时返回规则同 4.1.5.2);离开播放页时自动退出全屏。退出后保持当前剧、当前集与播放进度。
操作流程
验收标准
- H5-P09-AT01:竖屏剧播放页不显示全屏按钮;横屏剧显示;进入全屏后全屏按钮隐藏,右上角出现「✕」。
- H5-P09-AT02:全屏时右侧声音、点赞、评论、收藏、分享均可点击;打开播放设置、评论弹层可正常操作,不被画面遮挡。
- H5-P09-AT03:全屏时点击左上角返回,回到竖屏且仍在当前播放页;再次点击返回才离开播放页。
- H5-P09-AT04:进入与退出全屏前后,当前剧、当前集与播放进度不变。
进入 / 退出全屏 fullscreen_toggle(action, trigger, content_orientation, position_ms);事件定义见 7.2。
4.1.6 Web 端播放功能
4.1.6.1 封面直达播放页
WebP0功能与业务规则
- 页面去向:从任意封面点击后直接进入对应内容播放页。
- 页面结构:页面布局与操作以已提供的 Web 播放页交互原型为依据,涵盖播放器、剧集介绍、选集、付费入口及互动区域。
- 进入与恢复:点击封面进入该剧最近观看集及进度,没有记录进入第 1 集 0 秒,恢复误差口径同第 06 章。
- 自动连播:自动连播是固定播放流程,不提供开关(同 4.1.5.6):本集播完自动进入下一集,遇锁定集弹出 PAY-02 解锁弹层;本剧末集规则同 H5-P02 异常表。
- 状态一致:当前剧名、集数、选集状态与实际播放内容一致;免费/可观看内容和锁定内容采用不同的处理路径。
- 互动保留:点赞、收藏和评论沿用现有业务规则,不因页面布局改造而删除或变更;详见 4.1.6.3;评论提交后展示与计数的修复见 4.1.7(INT-01),其余互动模块规则不纳入本版。
操作流程
验收标准
- 各封面入口均指向对应播放页,不进入错误剧目。
- 播放页可进行播放、选集及原有互动操作。
- 收费集展示锁定状态,不能作为免费集直接播放。
4.1.6.2 金币解锁、充值与 VIP 开通回流
WebP0功能与业务规则
- 解锁弹层承接:点击锁定集或金币解锁入口弹出支付模块 PAY-02 解锁弹层(Web 以当前页弹层承载),展示目标集数、「解锁本集」「解锁本剧剩余全集」「开通 VIP」与余额;规则见支付 4.2.4 / 4.2.6 / 4.2.10。
- 金币解锁:用户点击解锁方式;金币不足时按支付模块 4.2.6 ④ 进入金币充值弹框,默认选中到账总金币 ≥ 差额的最小档(4.2.12),不能直接把目标集标记为已解锁。
- 充值回流:充值成功后不展示支付结果层,自动按充值前选中的解锁方式扣币解锁目标剧集并播放(起播位置同 4.1.5.4),toast 提示「解锁成功」;余额仍不足时停留解锁弹层回显原方案并提示仍差金额。
- 保存提醒:金币解锁、充值或开通 VIP 成功回到原页面后,若当前账号未绑定任何登录方式,且服务端账号字段
identity_card_saved_at与identity_reminder_shown_at均为空,在 toast 之后显示一次提示(不暂停播放):“为避免换设备或清除缓存后丢失金币与已购内容,请保存身份卡或绑定登录方式”,提供“保存身份卡”“绑定登录方式”入口与“稍后再说”;提示展示时由服务端写入 identity_reminder_shown_at(点「稍后再说」同样视为已展示),每个账号终身只提示一次;已绑定任一登录方式或该字段已有值的账号不提示。 - VIP 回流:点击开通 VIP 进入 VIP 弹框,成功后不展示支付结果层,自动返回原页面继续播放,toast 提示「订阅成功」。
- 权益判断:已购内容或具有相应 VIP 权益的用户按权限观看。客户端在以下时机重新请求 accessState:进入播放页、切集(选集 / 自动连播)、页面从后台恢复或刷新、以及服务端返回的 expiresAt 到点;expiresAt 到点时当前正在播放的集播完前不打断,切下一集时按新结果处理;客户端不自行计算到期,只信服务端时间,不能依赖本地缓存继续放行。VIP 到期后权益保留规则按支付模块 4.2.7(pass_until 到期降级)。
操作流程
异常与边界
| 触发情况 | 处理要求 |
|---|---|
| 金币不足 | 进入金币充值弹框,默认选中可补足缺口的最小金币档(支付模块 4.2.6 ④ / 4.2.12);充值成功后自动解锁并返回原页面继续播放。 |
| 锁定集网络失败 | 处理同 H5-P04(4.1.5.4)「锁定集网络失败」行。 |
| VIP 刚到期 | 重新获取 accessState。 |
验收标准
- 付费墙的集号与用户选择的目标集一致。
- 余额不足进入金币充值弹框并默认选中可补足差额的最小档,充值成功后自动解锁并回到原内容页面继续播放,而非停留结果层或无关页面。
- 开通 VIP 成功后同样自动回到原页面继续播放;观看权限与当前结果一致。
- 网络失败按 4.1.5.4「锁定集网络失败」行处理,确认未扣币才提示未扣币,不播放锁定内容。
待确认规则具体商品价格待后台配置确认(见 10.2);支付失败 / 取消处理按支付模块 4.2.8。
4.1.6.3 播放页互动保留
WebP0功能与业务规则
- 行为延续:点赞、收藏和评论保持现有业务行为,页面改造不新增另一套互动关系。
- 账号归属:互动数据归属当前 userId;账号绑定后不变化。
- 收藏:本版无追剧功能,收藏状态独立维护。
- 展示一致:按钮状态、计数和个人中心数据保持对应;异常计数不得用 0 掩盖请求失败。
验收标准
- 播放页点赞、收藏、评论入口可用,操作不丢失既有业务能力。
- 收藏状态独立维护,互动数据与当前账号一致。
4.1.6.4 字幕入口与设置联动
WebP0功能与业务规则
- Web 快捷入口:在播放器底部控制栏增加 CC 字幕按钮,与倍速、画质、声音等播放控制并列。点击打开字幕语言弹窗;开启态、关闭态与当前字幕选择一致。不要使用 H5 的右上角位置覆盖 Web 控制栏布局。
- Web 播放设置入口:通过播放器右上角更多,或现有播放设置入口进入设置。在清晰度之后增加“字幕语言”行,右侧显示当前值,点击打开与 CC 相同的字幕弹窗。
- 选择与返回:沿用 4.1.5.7 的语种清单(“关闭字幕”+ 本集 subtitles[] 可用语种,默认跟随界面语言)与单选、即时生效及预览规则。CC 路径完成后关闭弹窗;播放设置路径完成后返回设置并更新当前值。关闭弹窗不撤销已生效的选择。
- 播放、权限与状态一致:共用 4.1.5.7–4.1.5.8 的关闭、时间同步、播放状态保持、本地记忆、界面语言独立及付费权限规则,不另建 Web 专属字幕业务状态。
- 布局与可操作性:字幕居于视频画面内部、左右居中,位于画面底部约 18% 高度处并避让底部控制栏,不延伸到右侧选集或评论区域。CC、语言项和完成按钮具有完整可访问名称;键盘聚焦后可触发,与鼠标点击结果一致。
- 全屏与画中画:全屏一律对播放器容器调用 Fullscreen API,字幕层随容器进入全屏;iOS H5 使用 playsinline 自绘全屏,不调用原生全屏;画中画模式下字幕不显示,进入画中画时提示“画中画不显示字幕”,退出后恢复。兼容性实测终端:Chrome / Edge / Safari 最新版(桌面)、iOS Safari、Android Chrome。
操作流程
验收标准
- PC-P04-AT01:底部 CC 与播放设置中的字幕语言都可进入;两处选中状态一致。
- PC-P04-AT02:本集全部可用语种与关闭字幕的切换均可操作,预览与画面使用同一语言和当前时间。
- PC-P04-AT03:播放中、暂停中、拖动后切换字幕,不重载视频、不回到起点、不改音量、倍速或界面语言。
- PC-P04-AT04:弹窗返回路径、关闭不撤销和本地记忆与 H5 一致;字幕不遮挡控制栏或侧栏。
- PC-P04-AT05:鼠标与键盘激活字幕相关控件均不误触视频播放 / 暂停。
4.1.7 互动模块(本版仅修复评论展示与计数)
4.1.7.1 评论提交后展示与计数修复
H5WebP0功能与业务规则
- 提交后即时显示:用户提交评论成功后,该条评论立即出现在当前内容的评论列表中(新近在前),内容、昵称、时间与提交一致;不得出现「提交成功但列表无该条」。
- 评论计数:入口与列表显示正确的评论数;提交成功后计数 +1,与列表实际条数一致,计数准确率 100%。修复现网「计数与实际评论未展示」的问题。
- 打开评论:点击评论入口展示对应内容的评论列表,修复点击后没有任何评论展示的问题。
- 加载与错误:计数未返回时显示加载占位;接口失败不能以 0 伪装为空评论(count_status 见 4.1.2.1)。评论加载、已删除、禁言等提示遵循全站多语言文案要求。
- 用户输入:评论内容保留原文;切换界面语言不翻译用户评论、不丢失输入草稿。
- 账号归属:评论归属当前 userId,绑定账号后保留原有评论数据。
- 不新增机制:评论排序、分页、回复、审核状态流转及发布限制等由互动模块 PRD 定义,本条不新增评论机制。
操作流程
异常与边界
| 触发情况 | 处理要求 |
|---|---|
| 提交接口失败 / 超时 | 提示失败并保留输入草稿,可重试;列表与计数不变,不出现「假成功」。 |
| 评论提交成功 | 评论提交后直接展示在列表中,不进入待审状态;计数同步 +1。 |
| 计数接口失败 | 显示“—”并可重试,不显示 0。 |
验收标准
- INT-01-AT01:在首页及 H5 / Web 播放页提交评论后,列表立即出现该条且内容一致;刷新后仍存在。
- INT-01-AT02:提交前后评论计数差为 1,计数与列表条数一致;加载、失败与真实 0 条评论可被区分。
- INT-01-AT03:点击评论入口均有实际展示,不再出现点击无内容。
- INT-01-AT04:切换语言不改写评论内容、不丢失草稿;绑定账号不丢失评论。
评论提交结果 comment_submit_result(result=success|fail, error_code, drama_id, episode_id);事件定义见 7.2。
4.1.8 H5 全站提示与福利入口
4.1.8.1 顶部下载 App 提示条
H5P1功能与业务规则
- 展示范围:除播放页外,每个页面顶部都显示悬浮提示条;有顶栏的页面显示在顶栏下方,首页推荐流(无顶栏)贴顶显示;普通页面内容顶部留出提示条高度,避免首屏内容被遮挡。弹窗打开时提示条位于弹窗之下。
- 内容:左侧下载图标,文案「下载 App · 随时开刷」,右侧「下载」按钮与「✕」关闭按钮;文案按界面语言展示。
- 下载:点击「下载」按现网下载逻辑处理(原型中以 toast「原型演示,按现网功能实现」示意)。
- 关闭:点击「✕」后本次会话内所有页面不再显示;刷新或重新打开页面后重新出现。
验收标准
- H5-G01-AT01:首页、剧场、个人中心、福利等页面均显示提示条,播放页不显示;首屏内容不被遮挡。
- H5-G01-AT02:关闭后切换页面不再出现;刷新后重新出现。
- H5-G01-AT03:7 种界面语言下文案单行完整显示,不被省略号截断。
提示条曝光 app_banner_show(page_route);点击 app_banner_click(action=download|close);事件定义见 7.2。
4.1.8.2 福利中心「全部领取」
H5WebP1功能与业务规则
- 按钮:「当前金币」旁的按钮统一为「全部领取」。
- 领取范围:点击后一次领取当前所有未领取的金币,包括任务中心中所有「可领取」状态的任务奖励(含每日签到,签到按现网规则计入连续签到奖励)及其他待领取奖励;「未完成」的任务不领取。
- 结果反馈:领取完成后刷新金币余额与各任务状态,toast 提示「已领取 N 金币」,N 为本次实际到账总数。按钮上不预告总额(连续签到加成须实际领取后才能确定)。
- 置灰:没有任何可领取金币时,按钮置灰、不可点击;单独领取某项任务后若仍有其他可领项,按钮保持可点。
验收标准
- H5-G02-AT01:存在多项可领奖励时,点击一次全部到账,余额增加值 = toast 中的 N,各任务变为「已领取」。
- H5-G02-AT02:无可领奖励时按钮置灰且点击无响应;只领部分后仍有可领项时按钮可点。
领取结果 task_claim_result(claim_mode=all, claimed_task_ids[], total_reward_coins, result);事件定义见 7.2。
4.1.8.3 观看奖励领满后进入任务中心与返回
H5P1功能与业务规则
- 点击挂件:有待领取金币时点击即领取(现网规则);本轮尚未攒满时点击只提示还需观看的时长,不跳转;今日观看奖励已领满(无金币可领)时点击,先提示「今日观看奖励已达上限」,随后进入任务中心(福利中心)。
- 任务中心返回:任务中心左上角返回键回到进入前的上一层页面——从播放页进入则回到原剧、原集的播放页,从个人中心进入则回到个人中心,其他入口同理;无法识别来源时回到个人中心。
操作流程
验收标准
- H5-G03-AT01:今日观看奖励领满后点击挂件进入任务中心;未领满时点击不跳转。
- H5-G03-AT02:从播放页进入任务中心后点返回,回到原剧原集播放页;从个人中心进入后点返回,回到个人中心。
进入任务中心 task_center_view(entry=watch_reward_capped);页面浏览仍以 route_view 计;事件定义见 7.2。
支付模块
4.2.1 功能需求清单(7 项)
| ID | 需求 | 问题与目标 | Web / H5 交互方案 | 服务端与数据规则 | 量化验收 | 优先级 / 端 |
|---|---|---|---|---|---|---|
| P01 | 海外支付渠道与展示 | 渠道覆盖与页面宣传不一致;需保证目标市场存在可用支付路径。 | 金币充值弹框与 VIP 弹框内支付方式直接平铺,不使用下拉。本版沿用现网已接入的微信、支付宝、USDT、VISA 四种渠道及其支付流程,不新增流程;Apple Pay、Google Pay、PayPal 计划新增,接入方式待与技术确认(见 10.2),接入确认前前台不展示。先选档位、再选渠道:所选档位不支持的渠道置灰不可点并说明,不隐藏。 | 渠道列表由国家、设备、后台开关与所选档位的可用渠道共同决定(现网后台已有配置);订单金额与展示币种取服务端商品报价配置结果,不按渠道硬绑定币种。 | 首发市场(后台可配置)至少 2 种可用路径;展示渠道可用率、金额与币种一致率 100%。 | P0 WebH5服务端 |
| P02 | 充值档位与优惠 | 充值档位与优惠需按配置统一展示。 | 金币充值弹框的档位、售价、基础及赠送金币均读取后台配置。「首充」角标仅对后台确认具有首充资格的账号展示,详见 4.2.7。 | 前端只提交 offer_id(金币档);金额、基础金币、赠送金币由服务端生成订单快照。到账总金币=基础+赠送。 | 至少 1 个低门槛首充档(门槛由后台配置);商品、订单和到账金币一致率 100%;重复回调不重复入账。 | P0 WebH5服务端 |
| P03 | 付费墙与账号承接 | 统一游客及正式账号购买路径。 | 锁定集弹出解锁弹层,三种解锁方式点击即执行(见 4.2.4 / 4.2.10)。两类账号直接解锁或支付,无绑定拦截。 | 账号ID、购买意图、剧集和报价关联;绑定只增加登录方式,资产不变。 | 两类账号购买流程验收通过率100%,绑定前后资产一致率100%。 | P0 WebH5服务端 |
| P04 | 剧集解锁权益 | 单集、全剧与会员权益边界需要明确。 | 解锁弹层展示「解锁本集 · {单集金币}」「解锁本剧剩余全集 · {全剧金币}」(本剧剩余未购收费集多于 1 集时展示)「开通 VIP」三项,各项显示解锁范围与金币价格;余额不足时进入金币充值弹框。 | 权益类型(埋点与接口统一用 7.1 枚举字典的 offer_type / entitlement_type):单集→episode、全剧→drama、会员→membership;已拥有权益不重复授予;全剧价格按 4.2.6 公式计算;会员记录到期时间。 | 扣款前权益范围、价格覆盖率 100%;重复解锁扣费率 0;过期判断准确率 100%。 | P0 WebH5服务端 |
| P05 | 会员订阅 | 会员周期与解锁范围表达不足。 | VIP 弹框展示 VIP 权益说明(全平台畅看 / 免单集金币解锁 / 到期无自动续费)与后台返回的全部可售会员计划,按 sort 升序,点击卡片直接选择;档位数不写死。会员订阅解锁全平台剧集,不自动续费。 | 会员订单保存 offer_id/plan_id/duration_days/start_at/end_at/auto_renew;同账号多笔会员按 4.2.7 顺延规则处理。 | 周期、价格、权益范围一致率 100%;到期时间误差≤1分钟;自动续费状态清晰可核验。 | P0 WebH5服务端 |
| P06 | 支付会话与结果 | 到账延迟、重复点击和中间页停滞造成不信任。 | 点击支付后直接拉起支付服务商会话,不新增确认订单页。统一处理处理中、成功、失败、取消、过期;处理中禁用重复提交,失败可重试或换渠道。 | 每次购买动作生成唯一 request_id,重试复用;服务端确认最终状态,前端查询兜底;过期时间取渠道返回值,详细规则见4.2.8。 | 创建订单接口重复调用不重复建单;到账 P95≤5秒(仅统计法币渠道金币充值,USDT 单独统计);五种结果态通过率 100%。 | P0 WebH5服务端 |
| P07 | 支付后接续、订单与恢复 | 支付后停留在第三方完成页,返回时丢失原集和选项。 | 支付成功后刷新余额/会员状态;从解锁弹层进入的金币充值到账后自动按原解锁方式扣币解锁并播放目标集,toast 提示「解锁成功」;从解锁弹层进入的 VIP 开通成功后自动返回原集播放,toast 提示「订阅成功」;失败、取消和刷新均保留可重试入口。订单记录从账户钱包卡的图标入口进入,分「充值记录」「消费记录」两个页面。 | 金币订单确认后仅入账,会员订单确认后授权益;金币解锁另行扣金币和授权益;return_to 只允许站内白名单路径;订单可查询并支持状态补偿。 | 剧集来源、主动执行回流的验收用例成功率 100%;权益到账和订单对账一致率 100%;开放重试后无重复扣款。 | P0 WebH5服务端 |
4.2.2 商品与权益口径
| 商品类型 | 报价 / 配置 | 用户获得 | 操作与支付方式 | 到期/重复购买 |
|---|---|---|---|---|
| 单集解锁 | 该剧在后台剧集管理「收费」中配置的单集金币 | 当前集永久权益 | 解锁弹层「解锁本集」:余额足够直接扣金币解锁并播放;不足进入金币充值弹框 | 已拥有集不重复扣费 |
| 全剧解锁(本剧剩余全集) | 单集金币 ×(总集数 − 免费集数 − 已购集数)× 全剧折扣,向上取整(全剧折扣见 5.2.1) | 当前剧全部未拥有集及购买后新上线集的永久权益(按剧授予) | 解锁弹层「解锁本剧剩余全集」:同上 | 后续进入及新上线集不再扣费 |
| 会员(后台返回的全部可售计划) | 后台所选周期售价 | 所选周期内解锁全平台剧集 | VIP 弹框内选择计划与支付渠道后开通 | 不自动续费;有效期内再次购买顺延 |
| 金币充值 | 档位数量及赠送由后台配置 | 金币进入账户钱包 | 金币充值弹框内选择档位与支付渠道后充值 | 充值本身不自动消耗金币(从解锁弹层进入的充值除外,见 4.2.7) |
4.2.3 支付页面交互细则(P01–P07 执行细则)
本节 4.2.4–4.2.14 为 P01–P07 的执行细则,覆盖入口、账号承接、核价扣币、充值会员、订单恢复与默认选择。
4.2.4 页面入口、默认选择与展示范围
| 规则 ID / 页面 | 进入条件 | 默认展示 | 选择与离开规则 |
|---|---|---|---|
| PAY-01 金币充值弹框 / VIP 弹框 | 金币充值弹框:顶部金币、「我的」钱包卡「充值金币」、解锁弹层余额行「充值金币」、解锁时余额不足。VIP 弹框:顶部「开通 VIP」、「我的」钱包卡「开通 VIP」、解锁弹层「开通 VIP」。两个弹框相互独立,不做类型切换。 | 金币充值弹框:当前余额、「选择套餐」档位卡(金额、到账金币;后台默认推荐项显示「推荐」角标)、平铺支付方式、支付按钮。VIP 弹框:VIP 权益说明、「选择套餐」会员计划卡(周期、金额)、平铺支付方式、支付按钮、「关于订阅」购买须知。默认选中档位按 4.2.14;由余额不足进入金币充值弹框时按 4.2.12。 | 点击卡片只更新所选档位与金额,保留可用渠道,不产生订单。支付方式按 4.2.13 默认选择,无可用方式时按钮禁用并显示原因。关闭弹框回到进入前的页面(解锁弹层或原页面),不扣款。 |
| PAY-02 解锁弹层 | 点击未拥有观看权限的集数(滑动切到锁定集、选集面板点击锁定集、自动连播到锁定集),由播放页带入 drama_id、episode_id、position_ms、return_to;PAY-02 为锁定集的唯一承接页,播放模块 H5-P04 / PC-P02 仅定义触发与回流。承载地址为现网播放页路由 /{lang}/webpc/watch/{drama_id}/{集号}?paywall=1&offer={offer_id}&channel={channel}(H5 沿用现网 H5 播放页路由),H5 从播放页底部弹出,Web 以当前页弹层承载;所选商品和渠道同步写入 URL 参数,刷新 / 外链 / 返回时按 URL 恢复;URL 没有选择参数时按 4.2.12 / 4.2.14 重新确定默认项。 | 剧集封面、剧名、「第 {n} 集 · 待解锁」;「选择观看方式」下依次为「解锁本集」(仅本集,购买权益保留;显示单集金币)、「解锁本剧剩余全集」(包含第 {起始}–{结束} 集中尚未购买的内容 · 剩余 {n} 集;显示全剧金币;剩余未购收费集多于 1 集时展示)、「开通 VIP」(VIP 有效期内畅看全平台剧集;点击进入 VIP 弹框);底部当前余额与「充值金币」入口。 | 三种方式点击即执行,不设默认选中与二次确认主按钮:金币足够时直接扣金币解锁并播放目标集;金币不足时进入金币充值弹框;「开通 VIP」进入 VIP 弹框。主动关闭/返回回到原播放页,不扣款。切到另一集需重新核价并更新解锁范围与价格。 |
| PAY-03 上下文校验 | 外部打开链接、刷新、浏览器返回或账号会话恢复。 | 有效剧集上下文恢复原页;地址无效、内容不存在时给出提示并提供返回内容页入口。 | 独立入口打开的充值 / VIP 弹框不得继承历史剧集上下文。恢复时保留原集、解锁方式、所选档位或会员计划与渠道;刷新后重新读取身份、余额和报价。新购买金额变化需回显新金额,由用户再次点击。 |
4.2.5 游客账号与正式账号规则
首次使用按设备 ID 自动建立具有唯一账号ID(userId)的账号并分配身份卡;“游客”指尚未绑定登录方式的账号,“正式账号”指已绑定登录方式(Google、Facebook、Apple、X 与账号密码)的账号。两类账号均可充值、购买会员、使用金币解锁、查询订单及领取符合资格的奖励,触发付费墙后未绑定账号同样可以充值后付费解锁剧集,权益与已绑定账号完全相同;支付链路不以绑定账号为前置条件。绑定不改变原有资产归属。
| 场景 | 未绑定登录方式的账号(游客) | 已绑定登录方式的账号 | 处理规则 |
|---|---|---|---|
| 金币充值 / 会员购买 | 直接选择档位与支付方式并提交 | 同游客账号 | 不显示身份认证拦截按钮。 |
| 金币解锁 | 使用账号实际余额判断 | 同左 | 已拥有→继续播放;余额足够→扣金币解锁并播放;不足→进入金币充值弹框。身份类型不影响报价判断。 |
| 绑定账号 | 个人中心展示「账号绑定」入口,支持 Google、Facebook、Apple、X 与账号密码;不展示「切换账号」,绑定页底部提供「已有账号?去登录」 | 只展示「切换账号」入口,不再展示「账号绑定」入口 | 验证成功仅为当前账号增加该登录方式,账号ID不变、不建立映射;已绑定的每种登录方式都可登录该账号(同一 userId);账号资产不受影响。绑定奖励:账号首次通过第三方授权(Google / Facebook / Apple / X)成功绑定即刻赠送 50 金币(入赠币桶),每个 userId 仅一次;账号密码绑定不赠送;通过「切换账号」用未绑定的第三方账号直接新建账号并绑定的(见 H5-A04 / PC-A04)不赠送;发放走 reward_grant_result(rule_id=bind_reward),按 userId 幂等,重复回调不重复发放;发放成功在「充值记录」中记一条,交易名「绑定奖励」。防刷:同一第三方身份(provider + provider_uid)终身只能触发一次绑定奖励(换绑后也不再发);同一设备指纹 / IP 每 24 小时最多发放 N 次(N 后台可配,默认 3);命中防刷时绑定照常成功,奖励记 result=fail、error_code=RISK_BLOCKED。现网注册送 50 金币改为本规则。 |
| 保存身份卡 | 展示保存身份卡入口 | 同左(正式账号用于跨端登录) | 保存属于账号保存操作,不扣款、不创建支付订单、不改变身份;规则见播放模块 4.1.3.2 / 4.1.4.2。保存动作由前端同步调用服务端回写账号字段 identity_card_saved_at(不依赖埋点),按钮点击另上报 identity_card_save_click 仅用于统计;充值 / 订阅 / 解锁成功后,未绑定任何登录方式、identity_card_saved_at 与 identity_reminder_shown_at 均为空的账号弹出一次「保存身份卡 / 绑定登录方式」提示,展示即写入 identity_reminder_shown_at(点「稍后再说」或关闭同样视为已展示),每个账号终身一次;提示在 toast 之后出现,不暂停播放;已绑定任一登录方式或上述任一字段已有值的账号不提示,H5 与 Web 相同。 |
| 绑定取消 / 失败 | 维持原账号,可继续购买 | 不适用 | 保留资产与当前商品选择;已有订单继续查询,不因绑定失败被取消。 |
| 账号会话或网络异常 | 优先恢复原账号会话 | 同左 | 恢复期间显示重试状态,不伪造余额0、不新建账号承接旧订单;服务端确认原身份后恢复原购买意图。 |
4.2.6 剧集解锁、核价与扣金币规则
剧集解锁方式为单集金币购买、全剧金币购买与会员订阅(解锁全平台剧集)。金币解锁创建消费订单(Order.type=EPISODE / PAYWALL_PACK,amount=0,cost_coins=最终金币成本,创建即记 PAID;订单类统计指标按 amountCents>0 过滤掉消费订单,见 7.4),订单号即 order_id;扣金币流水 unlock_transaction_id 与该 order_id 一一关联;消费订单进入「消费记录」。单集金币与全剧折扣按剧在后台剧集管理「收费」中配置(见第 05 章 5.2.1「收费」行),下表配置示例仅作说明。
| 解锁方式 | 价格与展示规则 | 配置示例(非固定定价) | 权益生效规则 |
|---|---|---|---|
| 解锁本集 | 价格 = 该剧单集金币。展示在「解锁本集」右侧。 | 单集金币配置 50,显示 50 金币。 | 扣金币与授予当前集永久权益在同一事务完成;订单记录集ID与金币成本。 |
| 解锁本剧剩余全集 | 价格 = 单集金币 ×(总集数 − 免费集数 − 已购集数)× 全剧折扣,结果向上取整;由服务端按当前账号已购范围计算并返回最终报价,前端只展示。说明显示「包含第 {起始}–{结束} 集中尚未购买的内容 · 剩余 {n} 集」。本剧剩余未购收费集不多于 1 集时不展示该项。 | 单集 50、总集数 20、免费 5 集、已购 2 集、全剧折扣 80%:50 ×(20 − 5 − 2)× 80% = 520 金币。 | 按剧授予永久权益:覆盖本剧尚未拥有的集及购买后新上线的集(连载剧同样适用);已拥有集不重复授予或生成第二笔购买明细。全部已拥有时直接继续播放。 |
| 开通 VIP | 进入 VIP 弹框按 4.2.7 购买,不在解锁弹层扣金币。 | — | 会员有效期内全平台收费剧集可看。 |
| 已有有效观看权限 | 服务端明确返回已授权状态;不以报价缺失或请求失败等同于已解锁。 | — | 直接继续播放,不扣金币、不创建消费订单,不将会员限时权限转换为永久权限。 |
| 判断顺序 | 界面状态 | 点击结果 |
|---|---|---|
| ① 读取当前账号与报价 | 加载中 / 重试 | 游客与正式账号使用相同判断链;成功后按权益及余额判断,不跳转绑定。 |
| ② 当前账号,服务端确认已授权 | 不弹解锁弹层 | 校验当前集可播后直接播放,不扣款。 |
| ③ 当前账号,余额≥所选方式成本且成本>0 | 点击「解锁本集」/「解锁本剧剩余全集」 | 禁用重复提交→服务端重新核价/查余额→扣金币并授权益→刷新余额、选集锁标及订单→播放目标集,toast 提示「解锁成功」。 |
| ④ 当前账号,余额<所选方式成本 | 点击后进入金币充值弹框 | 差额=成本−余额;金币充值弹框默认选中按 4.2.12,并保存所选解锁方式(pending_unlock);不自动建单。 |
| ⑤ 核价后余额变化或商品失效 | 按最新状态更新价格 | 不足时进入④;涨价或解锁范围变化时先回显新价格再由用户点击确认;不扣部分金币、不授部分权益。 |
并发与原子扣减:服务端对同一 userId 的金币消费请求串行处理(账户行锁,或基于钱包 version 的条件更新);以 coin_balance + bonus_balance ≥ cost_coins 为条件原子扣减;两桶扣减、权益授予、消费订单与 CoinTransaction 在同一数据库事务提交,失败整体回滚;余额任何时刻不得为负;同一 request_id 重放返回首次结果;授予前按 userId + episode_id 唯一约束去重,重叠集已拥有时服务端重新校验范围与报价,仍有待解锁集时返回新价格由用户重新确认,全部已拥有时直接继续播放。
4.2.7 金币充值与会员选择规则
offer_id 为所有可售商品(金币档、会员、单集、全剧)的唯一商品标识;tier_id、plan_id 仅为金币档 / 会员商品的 offer_id 别名,接口与埋点一律传 offer_id 并附 offer_type。
充值基础金币、赠送金币、到账总金币、支付金额、币种、会员周期与售价均由后台配置,前端不得固定赠送数量或比例。档位卡、按钮、订单和实际到账统一采用当前用户的同一有效报价。实际赠送为0时不展示“+0赠送”角标;活动赠送与普通赠送应由后台返回最终合计值,前端不得重复相加。
| 配置字段 | 展示与计算规则 | 配置示例 |
|---|---|---|
| 基础金币 base_coins | 后台配置每档基础金币。 | 某档配置1,000基础金币。 |
| 赠送 bonus_coins | 后台根据活动规则及用户资格计算实际赠送。若采用百分比,比例、计费基数及取整方式由后台计算,返回最终整数金币;前端仅展示。 | 后台对当前用户返回赠送100,则显示“+100赠送”;返回300则显示“+300赠送”。此处数值仅作配置示例。 |
| 到账总金币 total_coins | 等于基础金币加当前用户实际可得赠送。支付成功仅入账一次,不再重复叠加赠送。钱包在服务端分充值币 coin_balance 与赠币 bonus_balance 两桶(基础金币入充值币、赠送入赠币);页面只展示单一金币余额 coins = 两桶之和,埋点 balance / 余额同为两桶之和;金币解锁先扣赠币再扣充值币;本版本赠币不设有效期、可用于全部金币商品;差额与推荐档位按两桶之和计算。 | 基础1,000、赠送300时总到账1,300;无赠送资格且无普通赠送时总到账1,000。 |
| 售价 amount / currency | 后台按 offer × 渠道 × 国家分别配价(现网已有功能),服务端不做汇率换算;未配置价格的组合视为该渠道不可用(置灰);USDT 使用 usdtPriceOverride。切换渠道重新查询,不由前端换汇。 | 显示服务端返回的金额与币种。 |
| 会员 duration_days | 会员周期与售价按后台配置;会员订阅解锁全平台剧集,不配置 scope。 | 配置30天时,显示 30 天会员计划及售价。 |
首充资格判断
| 资格状态 | 角标及奖励展示 | 提交与发放规则 |
|---|---|---|
| 符合首充资格(当前账号没有任何成功的充值订单) | 金币充值弹框中关联首充奖励的档位展示“首充”角标及对应奖励。资格只按当前账号是否有过成功充值判断,由服务端返回;前端不得仅依据本地订单为空判断。 | 创建订单时再次校验资格;订单保存 campaign_id、rule_id(= CtRewardGrant.ruleCode)、奖励金额及资格快照,成功后发放一次,重复回调不重复领奖。 |
| 不符合(已有成功充值订单)/ 活动已失效 | 不展示首充角标,不计入首充奖励;仍适用的普通赠送可正常展示。「推荐」属于独立推荐标识,不代表优惠资格。 | 使用普通有效报价;首充专属档位无普通购买配置时隐藏该档位。 |
| 资格查询中或失败 | 未确认前不展示首充角标及专属奖励,可显示普通有效报价。 | 重试后刷新报价,身份类型不能替代资格判断。 |
| 场景 | 弹框与按钮 | 支付成功后的账户变化 | 后续跳转 |
|---|---|---|---|
| 从解锁弹层进入的金币充值 | 金币充值弹框,默认选中按 4.2.12;两种账号统一显示档位金额与到账金币。 | 充值入账为独立事务(只入账),余额=原余额+总到账(两桶之和)。入账成功后,前端回到解锁弹层发起一次金币解锁请求,带上建单时固化在 Order.meta 的 pending_unlock{drama_id, offer_id, target_episode_ids, quote_id}(解锁方式为单集或全剧)。服务端重新核价:价格与范围未变且余额足够→扣币与授权益在同一事务完成;价格上涨、范围变化或原 quote 失效→不扣币,停在解锁弹层回显新价格,由用户再次点击;余额不足→提示仍差金额。只有由「解锁本集」「解锁本剧剩余全集」余额不足进入的充值才写入 pending_unlock;从解锁弹层余额行「充值金币」主动充值只入账,不自动解锁。 |
支付成功后不展示结果层:自动解锁并播放目标集,toast 提示「解锁成功」;余额仍不足(报价上涨或到账少于缺口)时停留解锁弹层回显原方案并提示仍差金额,不扣部分金币。 |
| 从解锁弹层进入的 VIP 开通 | VIP 弹框,默认选中按 4.2.14;两种账号统一显示计划与金额。 | 仅授予所选天数的全平台会员;金币余额不变,不按集扣金币。售价读取所选渠道的后台报价;不自动续费。 | 支付成功后不展示结果层:读取新会员状态后自动返回原集继续播放,toast 提示「订阅成功」;不再执行金币解锁。 |
| 独立入口的金币充值 / VIP 开通 | 金币充值弹框或 VIP 弹框,默认选中按 4.2.14。 | 金币只入账;会员只授予限时权限。重复充值可以增加金币,重复回调不能重复到账。 | 成功后返回进入前的页面并刷新余额或会员信息;没有剧集上下文,不跳转剧集。 |
会员使用全平台限时权益到期时间 pass_until;在有效期内再次购买(含跨端)从当前 pass_until 顺延所购天数,已过期则从本次授予时间起计;生效时间以服务端为准,提交前显示预计到期日。到期降级:当前正在播放的集允许播完,切集 / 刷新 / 重新进入时重新请求 accessState;永久已购集不受影响;曾通过会员观看但未永久购买的集回到锁定态。
4.2.8 支付方式、订单状态与恢复
金币解锁仅扣钱包金币,不展示外部支付方式;金币充值弹框与 VIP 弹框内支付方式平铺并单选。支付渠道与流程沿用现网已接入的微信、支付宝、USDT、VISA 四种,本版不新增支付流程;Apple Pay、Google Pay、PayPal 计划新增,接入方式待确认(见 10.2),接入确认前前台不展示。各渠道展示的币种与金额由后台商品报价配置返回(如 CNY、TWD 等,后台可配),前端不按渠道硬绑定币种;USDT 单独显示资产单位。先选档位、再选渠道:所选档位不支持的渠道置灰不可点、不隐藏;切换渠道只更新当前档位在该渠道下的币种与金额,不切换档位、不创建订单。金额以服务端配置报价为准,不在前端自行换汇。本版后台不支持退款:订单状态只有处理中 / 成功 / 失败 / 取消 / 过期五态,不新增 refunded / chargeback;平台不提供任何退款与扣金币功能(含渠道拒付 / 争议通知的场景);用户侧提示文案见 4.2.10「关于订阅」购买须知。
标识层级:purchase_intent_id 在解锁弹层 / 充值弹框 / VIP 弹框每次曝光生成,贯穿该次购买意图;request_id 在每次点击解锁选项或支付按钮时生成(同一点击的网络重试复用),服务端以 request_id 去重、保留 24 小时,重复请求返回首次结果;order_id 由服务端在 request_id 首次成功建单时生成;用户点击「重新支付」或「更换支付方式」视为新购买动作,一律创建新 order_id(原订单记为 parent_order_id),生成新 request_id 与新 attempt_id;创建新订单前服务端先向渠道查询原订单,已支付则直接返回原订单成功,不再建新单。
| 阶段 / 状态 | 页面交互 | 账户及订单规则 | 下一步 |
|---|---|---|---|
| 提交 / 创建中 | 点击支付按钮,校验身份、商品、可用渠道和报价;按钮加载且禁用。直接创建支付会话,不增加独立确认订单页。 | 一次明确购买动作生成一个 request_id,网络重试复用。新购买动作生成新ID;不能仅用用户+商品永久去重。请求携带 quote_id,服务端校验报价仍有效(失效返回 QUOTE_EXPIRED 并附新报价);quote 有效期 15 分钟(后台可配),报价响应返回 quote_expires_at;有效期内配置版本、余额或资格发生变化同样判定失效;前端在到期前 30 秒或页面重新可见时静默重新报价,金额不变不打扰用户,金额变化按 4.2.6 ⑤ 回显。订单快照记录 quote_id 与 config_version。 | 创建成功后拉起钱包授权、托管收银台或支付二维码;失败保留原选择并提示重试。 |
| 等待授权 / 处理中 | 展示商品、渠道、金额及订单号;服务商授权操作在其页面完成。 | 生产先查询订单,不因关闭窗口认定未扣款。无确认结果不发金币/权益。 | 未知结果显示“正在确认支付结果”;后台继续接收回调。查询失败提供再次查询,不立即新建订单。结果查询与超时沿用现网实现,本版不另行定义。 |
| 支付确认成功、到账处理中 | 显示“支付成功,权益处理中”,不显示最终可播放成功。 | 金币订单入账,会员订单授权益;入账 / 授权失败进入补偿队列,按 1s、5s、30s、5min、30min 五次重试,仍失败转入现有后台【掉单处理】菜单处理并告警,处理复用同一 order_id 幂等。同一订单至多成功入账/授予一次。 | 到账确认后显示最终成功按钮。充值金额不可因前端页面刷新被重复处理。 |
| 最终成功 | 独立入口来源:展示实际金额、订单号、余额或会员权益,按钮“完成 / 查看充值记录”。解锁弹层来源:不展示支付结果层,直接按 4.2.7 回流并 toast 提示「解锁成功」/「订阅成功」。 | 支付状态、订单记录与钱包/权益状态一致。独立入口的充值不得自动消耗余额;解锁弹层来源的充值到账后按 4.2.7 发起金币解锁(入账与解锁为两个独立事务);金币解锁成功则直接播放目标集。 | 独立入口来源返回进入前的页面;解锁弹层来源的充值自动解锁并播放目标集;解锁弹层来源的会员自动返回原集播放。若当前账号未绑定任何登录方式,且服务端账号字段 identity_card_saved_at 与 identity_reminder_shown_at 均为空,回到原页面(播放页或「我的」)后显示一次提示:“为避免换设备或清除缓存后丢失金币与已购内容,请保存身份卡或绑定登录方式”,提供“保存身份卡”“绑定登录方式”入口与“稍后再说”;提示在 toast 之后出现、不暂停播放;提示展示时由服务端写入 identity_reminder_shown_at(点「稍后再说」同样视为已展示),每个账号终身只提示一次;已绑定任一登录方式或上述任一字段已有值的账号不提示。 |
| 失败 / 已确认取消 / 会话过期 | 展示真实失败原因及“重新支付”“更换支付方式”。仅最终确认未支付时显示未扣款。 | 保留失败订单记录和购买上下文;已终态订单不可复用付款;重试按上方「标识层级」创建新订单并记 parent_order_id。终态可逆:进入失败 / 取消 / 过期后才收到经签名校验的渠道成功回调,或主动查询结果为已支付时(晚扫码、USDT 晚到账、回调延迟),订单改为已支付并按订单快照照常入账或授予权益,记录 late_paid=true;同一购买意图已有成功入账后再收到的成功付款不入账,进入异常订单列表并告警,由客服线下与用户沟通赔偿(本版无退款功能)。USDT 少付 / 多付 / 超时到账沿用渠道现网规则,订单记录展示实际到账金额。 | 重试保留档位和渠道;更换支付方式关闭结果层回原弹框。渠道会话到期以服务商返回时间为准。 |
订单记录
「我的」钱包卡提供订单记录图标入口,分「充值记录」「消费记录」两个页面,按时间倒序展示,列均为:金额、金币、交易、时间、状态。充值记录的「交易」为充值档位或 VIP 档位,首次绑定奖励同样记入充值记录,交易名「绑定奖励」;消费记录的「交易」为解锁的剧名,「金额」列显示「—」。处理中订单提供刷新状态;无记录时显示空态。
4.2.9 典型验收场景
以下数值为测试环境后台配置示例,不作为生产固定价格。测试前必须记录配置版本、报价ID与首充资格。
| 后台配置与操作 | 预期结果 |
|---|---|
| 单集金币 50,用户余额 120,点击「解锁本集」 | 显示 50 金币;扣 50,余额 70,播放目标集并 toast「解锁成功」;订单授权当前集。修改配置后新报价同步变化。 |
| 单集 50、总集数 20、免费 5 集、已购 2 集、全剧折扣 80%,点击「解锁本剧剩余全集」 | 显示 520 金币及「包含第 {起始}–{结束} 集中尚未购买的内容 · 剩余 13 集」;余额足够时扣 520,本剧全部未购集及后续新上线集可看。 |
| 单集 50,余额 20;可用最小充值档到账 100 | 点击「解锁本集」进入金币充值弹框,默认选中到账 100 的档位;充值成功后余额 120,随即自动扣 50 解锁,余额 70,播放目标集,toast「解锁成功」;不消耗超出原方案的金币。 |
| 从解锁弹层点击「开通 VIP」并支付成功 | 不展示结果层,自动返回原集播放,toast「订阅成功」;金币余额不变。 |
| 充值基础1,000、当前用户实际赠送300 | 显示总到账1,300及“+300赠送”;订单和钱包仅到账1,300。后台更改赠送后重新报价及确认。 |
| 首充资格分别为符合、不符合、未知 | 仅服务端确认符合时展示首充角标。未知或不符合不显示;重复回调只发放一次。 |
| 支付中刷新、支付成功但到账延迟 | 恢复同一订单查询;确认前显示处理中,到账后仅发放一次;按订单快照核对价格、赠送和权益。 |
4.2.10 解锁弹层与充值 / VIP 弹框操作规则
解锁弹层展示三种解锁方式,点击即执行;金币充值弹框与 VIP 弹框各自展示后台返回的全部可售档位(档位数不写死),弹框内单选档位,选中项以高亮边框标识,点击支付按钮才创建支付订单。
| 位置 / 状态 | 展示与说明 | 操作 | 点击结果 |
|---|---|---|---|
| 解锁弹层 · 解锁本集 | 标题「解锁本集」;说明「仅本集,购买权益保留」;右侧显示单集金币。 | 点击即执行。 | 余额足够:扣金币并授予当前集权益,播放目标集,toast「解锁成功」;余额不足:进入金币充值弹框(4.2.12),保存该解锁方式。 |
| 解锁弹层 · 解锁本剧剩余全集 | 标题「解锁本剧剩余全集」;说明「包含第 {起始}–{结束} 集中尚未购买的内容 · 剩余 {n} 集」;右侧显示全剧金币(4.2.6 公式)。 | 点击即执行。 | 同上;授予按剧永久权益。 |
| 解锁弹层 · 开通 VIP | 标题「开通 VIP」;说明「VIP 有效期内畅看全平台剧集」。 | 点击进入 VIP 弹框。 | 支付成功后按 4.2.7 回流。 |
| 解锁弹层 · 余额行 | 「当前余额 · {coins}」与「充值金币」入口。 | 点击「充值金币」进入金币充值弹框。 | 主动充值只入账,不自动解锁;关闭充值弹框回到解锁弹层。 |
| 金币充值弹框 | 当前余额;「选择套餐」档位卡(金额、到账金币;赠送为 0 时不显示赠送角标);支付方式;支付按钮。 | 选择档位与支付方式后点击支付。 | 创建金币充值会话;入账钱包后,解锁弹层余额不足来源自动按原解锁方式扣币解锁并播放目标集,其余来源仅入账。 |
| VIP 弹框 | VIP 权益说明(VIP全平台畅看 / 免单集金币解锁 / 到期无自动续费);「选择套餐」会员计划卡;支付方式;支付按钮;「关于订阅」购买须知。 | 选择计划与支付方式后点击支付。 | 直接创建所选会员支付会话,成功返回规则沿用 4.2.7。 |
| 游客 / 正式账号;已拥有权益 | 两种身份展示一致。 | — | 不要求绑定;已拥有权益不弹解锁弹层、不创建消费订单。 |
H5 布局:解锁弹层从播放页底部弹出;充值与 VIP 弹框中档位、支付方式与支付按钮按顺序纵向排列,长内容可滚动,末尾档位与支付方式可完整滚动到可操作区域;按钮至少 44px 触控高度;长标题和英文说明允许换行,不能覆盖按钮;弹框打开时覆盖底部导航,避免重复操作。
Web 布局:解锁弹层与充值 / VIP 弹框均以当前页弹层承载,不能以压缩为由隐藏档位、支付渠道或截断说明。Web/H5 使用同一判断顺序:有效账号会话→权益状态→金币余额或现金商品→对应操作;两种账号购买能力一致。
「关于订阅」购买须知:VIP 弹框在支付按钮下方固定展示以下文案(多语言资源,参数化),从解锁弹层进入的 VIP 弹框同样展示;金币充值弹框与解锁弹层不展示。后台不支持退款,前端以此提示用户:
- 关于订阅:支付成功即时开通。
- 订阅到期即失效,需要继续观看请在本页重新下单;在期内再次下单为时长叠加,起始日不变。
- 会员订阅与金币消费一律不退款,未成年人充值概不负责,请在监护人知悉下操作。
4.2.11 本次变更验收
| 场景 | 验收结果 |
|---|---|
| 锁定集首次进入 | 弹出解锁弹层,展示「解锁本集」「解锁本剧剩余全集」(剩余未购收费集多于 1 集时)「开通 VIP」与余额;三项价格与后台配置及 4.2.6 公式一致。 |
| 余额充足 / 不足分别点击解锁 | 充足时直接扣币播放目标集并 toast「解锁成功」;不足时进入金币充值弹框并默认选中可补足差额的最小档,充值成功后自动解锁;两者均不出现空白按钮。 |
| 会员周期切换(VIP 弹框) | 所选计划、支付金额及订单周期同步变化;价格采用后台配置,Demo金额不作为验收固定售价。 |
| 金币充值弹框与 VIP 弹框 | 两个弹框独立打开,互不切换;「关于订阅」须知仅在 VIP 弹框出现。 |
| H5 长内容、滚动、支付方式选择 | 支付按钮至少44px触控高度;档位与支付渠道不被永久遮挡。 |
| 账号与支付承接 | 两种账号均直接购买;从解锁弹层进入的充值成功入账后自动按原解锁方式扣币解锁,会员成功只授予所选期限;两者均不展示结果层、自动返回原集继续播放,逻辑一致。 |
4.2.12 金币不足时的充值档位默认选择
在解锁弹层点击「解锁本集」或「解锁本剧剩余全集」且余额不足时进入金币充值弹框,按下表确定唯一默认选中档位;用户手动选择后,普通重绘、语言切换或支付方式切换不得覆盖其选择。已有有效观看权限时直接继续播放,不进入充值。
| 顺序 | 条件 | 默认选择 | 边界处理 |
|---|---|---|---|
| 1 | 存在到账总金币 ≥ 差额(差额 = 所选解锁方式成本 − 余额)的可售档位 | 选中到账总金币 ≥ 差额的最小可售且当前账号具备资格的档位。 | “最小”以可补足差额的最小到账金币数定义;同到账数按同币种售价、后台sort、稳定商品ID排序。充值成功后自动按保存的解锁方式扣币解锁(见 4.2.7)。 |
| 2 | 没有可补足差额的档位 | 按 4.2.14 金币充值弹框默认规则选中。 | 显示「金币不足,还差 {差额} 金币」;不虚构解锁金额,不诱导多余充值。 |
| 异常 | 报价失败或无可售档位 | 不自动选中;提示暂无可用方案及重试。 | 不创建订单。 |
4.2.13 支付方式默认选择(金币充值弹框与 VIP 弹框共用)
只有会员与金币充值需要外部支付方式;金币解锁不展示支付渠道。先选档位、再选渠道:在已选档位的可用渠道内(该档位不支持的渠道置灰不可点、不隐藏),先按接入状态、设备支持、地区过滤不可用渠道,再执行下列顺序。
| 顺序 | 条件 | 选择规则 |
|---|---|---|
| 1 | 当前账号此前主动选择过支付方式 | 恢复最近一次选择且当前可用的渠道。用户选择时即保存,不必等支付成功;绑定登录方式后偏好不变。历史渠道不可用则执行顺序 2。 |
| 2 | 无可用历史选择 | 默认 VISA,不按界面语言区分。 |
| 3 | VISA 不可用 | 按后台渠道排序选择首个可用渠道;全部不可用时不保留虚假选中态,禁用现金支付并说明原因。 |
| 4 | 选择后切换档位或刷新 | 手动选择且仍有效时保留;切换档位后在新档位可用渠道内重算,手动选过且仍可用的渠道保留。切换渠道刷新该档位在该渠道下的金额和币种,提交前展示最终报价。 |
4.2.14 充值 / VIP 弹框默认商品选择顺序
先过滤未上架、无有效报价或无购买资格的档位,再按下表顺序确定唯一默认选中项。游客账号与正式账号使用同一规则;首充资格由服务端按账号是否有过成功充值判断,不以账号身份类型代替资格判断。由余额不足进入的金币充值弹框先执行 4.2.12。
| 弹框 | 顺序 | 默认选择 | 边界处理 |
|---|---|---|---|
| 金币充值弹框 | 1 | 后台配置有效首充奖励,且当前账号符合首充资格:默认选中关联首充奖励的可售档位。 | 多个首充档位按后台sort升序、再按稳定商品ID排序。资格查询中不提前判定符合,失败提供重试,不展示首充角标。 |
| 2 | 后台配置的默认推荐档位(显示「推荐」角标)。 | 多个推荐按后台sort升序、再按稳定商品ID排序;失效推荐忽略后执行下一步。 | |
| 3 | 支付金额最低的可售档位。 | 比较本次实际支付金额(商品自身配置币种),不比较到账金币数、赠送比例或单金币价格;不同币种由服务端返回比较顺序(compare_rank)。 | |
| VIP 弹框 | 1 | 后台配置的默认推荐会员计划(显示「推荐」角标)。 | 多个推荐按后台sort升序、再按稳定商品ID排序;失效推荐忽略后执行下一步。 |
| 2 | 金额最低的可售会员计划。 | 周期不同仍按本次总支付金额比较,不按日均价;不同币种由服务端返回 compare_rank。 | |
| 异常 | — | 无可售档位、报价失败或首充资格仍待确认:不生成虚假选中态;展示加载、暂无可用商品或重试提示。 | 提交前重新核验报价及首充资格,失效时展示新金额与奖励,由用户再次确认,不沿用旧优惠扣款。 |
每次打开弹框只产生一个默认选中项;用户手动选择后,普通重绘、语言切换或支付方式切换不得覆盖其选择。所选档位失效时重新执行默认规则并明确提示变更。默认选中只决定初始选中项,不限制用户选择其他可售档位,也不自动创建订单。
支付方式默认选择
金币充值弹框与 VIP 弹框统一执行 4.2.13:在已选档位的可用渠道内恢复最近一次选择且当前可用的渠道;无可用历史选择时默认 VISA。渠道不可用及切换后的处理均沿用 4.2.13,不另设页面级规则。
内容分发模块
4.3.1 首页
优化WebH5P1已确认补充:刷新、后退恢复及失效内容返回按统一规则验收,见 10.2 对应规则。此项为正式接入要求,不能以 demo 画面替代故障场景验收。
目标与范围。 用户进入首页后,能按运营配置浏览内容板块,使用横向浏览操作找到目标剧集,并进入对应栏目查看完整片单。本模块保留现有 ReelShort 风格的 Hero、海报卡片和内容排布;新增/优化范围是全首页板块配置联动、全量选剧展示、连续横滚、内容两侧按钮、题材入口和栏目详情一致性。首页初始有 11 个板块,数量可增加,不把 11 当作业务上限。查看全部/栏目详情属于本模块子流程。H5 首页默认落地页为播放模块 H5-P01 推荐流;H5 底部导航为 首页 / 剧场 / 我的,「剧场」进入 H5 剧场页(「剧集」筛选网格与「排行榜」两个分段),H5 不提供板块首页。Web 首页即板块首页。
交互要求。
| 场景与触发 | Web 行为 | 规则与边界 |
|---|---|---|
进入首页 #/ |
Hero 读取 5.2.6 已保存且开关开启的当前端 Banner,按顺序轮播,投放期外条目不展示;空列表或开关关闭时回退原底稿。显示当前端启用的首页板块及原有卡片样式 | 首页配置全局通用,不按市场或地区过滤;仍按终端和启停控制展示 |
| 浏览已保存板块 | 按保存顺序排列板块,板块内按所选内容顺序展示 | 全部有效已选内容展示,忽略旧 count;同板块重复 ID 只展示第一次,不存在的 ID 不生成空卡片 |
| 内容向左连续移动 | 有溢出时内容从右往左循环滚动,保留原卡片尺寸和风格 | 不是间隔跳到下一页,也不把整个主页替换为同一种布局 |
| 操作左右按钮 | 按钮位于内容视窗两侧,点击约移动 80% 视窗宽度 | 按钮不聚集在标题右侧;没有溢出时两个按钮隐藏且禁用 |
| 手动浏览 | 支持鼠标横向拖动、触控板/滚轮横滑;轨道获焦后可用左右键 | 横向拖动达到阈值才作为拖动,拖动结束短暂抑制误点击 |
| 暂停与继续 | 鼠标停留、键盘焦点位于栏目或拖动期间暂停;离开后延时恢复 | 当前速度 24px/s,初次等待约 1.2 秒,手动操作后至少约 3.5 秒再恢复;若仍有其他暂停条件则继续暂停 |
| 页面隐藏或用户选择减弱动画 | 停止栏目自动滚动,保留手动浏览方式 | 返回前台或偏好变化后重算;无溢出时始终不自动移动。 |
| 点击栏目标题/查看全部 | 原可点击标题或查看全部进入该栏目详情 | 详情只显示该板块有效内容,不补其他内容;5004 样式的既有入口差异见下方版式边界 |
| 栏目详情浏览 | 路由 #/section/<sectionId>?page=<n>;显示栏目标题、总数和横向信息卡,每页 12 部;页码和前后页切换(未知 sectionId 显示栏目不可用,非法 page 收敛到合法页) |
两端信息卡保留海报、标题、简介与进入内容按钮;Web 越界页码收敛到合法页 |
| 首页“按题材找剧” | Hero 下显示题材选项与查看全部入口 | 点击进入 4.3.2 题材子流程,首页原板块不被筛选结果替换 |
| 点击内容卡片 | 交接 drama_id 与 episode_id(单集内部 ID);无本剧观看进度时 episode_id 取集号最小的已上架单集;有进度但进度所在单集已下架时,取其后第一个已上架单集,position_ms 置 0;有进度且单集可看时按播放模块 H5-P02 恢复原集与 position_ms | 本 PRD 仅要求正确交接与返回,不展开播放器、账户、解锁或支付需求 |
H5 卡片尺寸。「剧场」剧集卡与「我的」观看历史、收藏卡均一排三张,封面均为 3:4,封面比例不符时以 object-fit: cover 居中裁剪展示,不拉伸。
Web 首页版式与尺寸。 Web 首页读取后台首页配置(Hero 取 5.2.6、板块取 5.2.7);原型图只是样式示意,实际板块、Hero 条目、剧集与顺序均取后台配置。页面内容区最大宽度 1510px,左右留白 3.2%。Hero:内容区全宽,高 370px,圆角 16px,与下方板块间距 36px;左侧依次为标签、剧名(40px,视口 ≤1200px 时 34px)、简介(12px,最宽 380px)与「立即观看」「探索剧场」按钮;右下为缩略图列(58×80px,视口 ≤1200px 为 50×70px、≤850px 为 42×58px,当前项白色描边并上移 4px)与左右切换箭头;每 5 秒自动切换。板块:标题行左侧为板块名、右侧为「更多」;横向轨道内海报卡片封面 3:4、圆角 10px,卡间距 20px,1440px 视口一屏 5 张(视口 ≤1200px 为 4 张、≤850px 为 3 张);卡片下方为剧名(14px 加粗)与副行;两侧切换按钮为与轨道等高的竖条(宽 50px,视口 ≤850px 为 36px),位于轨道外侧;相邻板块间距 44px。交互按上表执行。
状态与返回规则。 已保存的首页配置实时生效:前台每次进入首页 / 打开已保存预览均读取服务端最新配置,前台与 CDN 不缓存配置,内容下架即时生效;预览读取已保存配置,不读取未保存编辑内容。板块停用或不支持当前端时不显示在首页;通过旧链接访问时显示栏目不可用并提供回首页入口。启用板块没有可展示内容时首页不渲染该板块,栏目详情旧链接显示未配置空态,不自动补片。不存在的板块 ID 不得指向其他同名栏目。
用户从卡片进入内容后,使用内容页专用返回可回到点击前的路由、页面纵向位置及首页横向位置。该上下文只在当前页面实例内保存。栏目详情的首页面包屑返回首页,不承诺恢复点击详情前的横向位置;生产待确认路由、页码及返回位置的保存策略,避免将内存恢复写成跨会话持久化。
数据关联与待接。 板块最小数据为稳定 id、多语言标题(中文必填,其余自动补充)、启停、终端范围、全局范围、内容 ID 有序数组、样式和顺序。接口字段 ids 为去重后的内容 ID 有序数组,不再下发 count。后台列表「所选剧集数」= ids 长度;前台首页与栏目详情展示的总数 = ids 中可展示内容的数量(可展示规则见第 05 章 5.3.2「可展示内容」行)。单板块片单软上限 100 部,超出时后台保存提示;首页每个板块首屏只渲染视窗内及前后各一屏卡片,其余懒加载;海报使用懒加载与占位图。初始 11 板块使用普通横排、排名样式、网格样式三种模板分支,不是 11 种不同版式,样式枚举如下表。Web 首页各板块(含「热门榜单 / TOP」)的内容来源、引用的榜单与顺序均按后台 5.2.7 首页板块设置展示:内容来源为榜单引用的板块,片单与位次直接取所引用榜的当前快照(含 5.2.5 的人工固定 / 排除),随榜单更新自动刷新,人工调整一律在 5.2.5 进行;内容来源为手选片单的板块按 5.2.7 已选剧集展示。Web 首页按 5.2.7 首页板块设置展示;H5 首页为推荐流,H5 的 4.3.3 排行榜频道同样按 5.2.5 展示。
| style | 版式 | 说明 |
|---|---|---|
| 5001 | 普通横排海报 | 含「查看全部」入口 |
| 5002 | 排名样式 | 卡片左下角显示片单位次 01…;手选片单板块的位次 = 运营排序,榜单引用板块的位次 = 所引用榜的 4.3.3 名次 |
| 5004 | 网格「更多推荐」 | 隐藏「查看全部」;Web 标题可点进入详情,H5 标题不可点 |
Hero 本期接入后台 Banner 保存结果:读取 5.2.6 已保存且开关开启的当前端列表,按顺序轮播,投放期外条目不展示,空列表或开关关闭时回退原底稿(Web 已有推荐位标识)。真实内容上下架/可展示权限、图片服务和异常占位、分发配置 API、服务失败重试及数据规模下的性能方案须在开发时接入。当前 BOOKS 有 ID 即可参与首页渲染,不能视为完成了生产可展示校验。旧单栏目兼容配置的详情仍可能按旧 count 截取,开发迁移应统一使用全首页配置,不能将兼容路径计为全量验收通过。
文案缺口与既有版式边界。 栏目不可用时显示「该栏目暂不可用」及按钮「返回首页」(EN: "This section is unavailable" / "Back to Home")。5004“更多推荐”沿用原版式隐藏查看全部,Web 可由标题进入详情,H5 标题不可点。本次未要求统一所有板块的详情入口,因此保留这一版式边界,不将新增 H5 5004 入口列为本轮需求或未完成项;详情验收针对既有可达入口及有效详情路由。
| 验收 ID | 可独立执行的验收条件 |
|---|---|
| FE-HOME-01 | 配置一个板块的 ids 含重复及不存在 ID;Web 按第一次出现顺序显示全部可展示内容,详情展示数量 = 该板块 ids 中可展示内容数,与首页同板块卡片数一致,不补片 |
| FE-HOME-02 | 将一个板块停用;Web 展示严格符合启停和 devices,旧市场字段不同不改变结果;仅勾选 APP 时保存被阻止并提示 |
| FE-HOME-03 | 分别使用 5001、5002、5004 样式且内容溢出;卡片保持各自样式,连续向左移动,两侧按钮可反向浏览,不跳回形成明显空白间隔 |
| FE-HOME-04 | 内容宽度不超过容器时,观察一段时间并改变容器宽度;无溢出不移动、不显示按钮,出现溢出后恢复横向浏览能力 |
| FE-HOME-05 | 自动移动时依次悬停、聚焦、拖动、触摸、隐藏页面及开启减弱动画;符合暂停条件不自动移动,条件全部解除且延时到达后恢复,手动浏览仍可用 |
| FE-HOME-06 | 在循环接缝点击可见卡片只进入对应内容一次;拖动结束不误跳;键盘不会重复聚焦视觉副本;离开首页再返回不会叠加滚动速度或处理器 |
| FE-HOME-07 | 用 25 部内容打开详情;Web 显示 3 页且依次 12/12/1 部,非法页码收敛,顺序与首页一致 |
| FE-HOME-08 | 从既有可达入口及有效详情路由访问板块,并分别覆盖停用、当前端不支持、未知及零有效内容;区分不可用与未配置,回首页可用;不可用提示不再提市场。不要求增加原版式未提供的入口 |
| FE-HOME-09 | 在首页横滚后点击卡片,再使用内容页专用返回;回到原首页路由、纵向位置和内容轨道位置;不能以整页刷新替代此返回用例 |
| FE-HOME-10 | 模拟配置接口失败、内容失效及图片加载失败;不得把失败显示为正常空集合或永久破图,并提供合理恢复路径 |
| FE-HOME-11 | 后台保存 3 条 Web Banner 并开启开关后,Web Hero 展示该 3 条且顺序一致,投放期外条目不展示;开关关闭或列表为空时回退原底稿 |
4.3.2 题材
优化WebH5P1已确认补充:刷新、后退恢复及失效内容返回按统一规则验收,见 10.2 对应规则。此项为正式接入要求,不能以 demo 画面替代故障场景验收。
目标与范围。 用户在首页内容集合、短剧/长剧/电影/综艺/动漫等既有类型入口的当前集合,以及排行榜当前 Top 结果中,使用同一个“题材 + 题材内标签”组件逐步缩小结果。新增/优化范围是题材与标签维度分离、准确交集和计数、移动端标签展开/收起、多语言名称与 URL 状态;包括 H5 短剧入口内的题材、标签展开和结果交互。题材内标签是本模块子流程,不单列前端页面;既有类型入口仅作为本组件的来源上下文,不将各频道扩展为独立新增模块。
| 场景与触发 | Web 行为 | H5 行为 | 规则与边界 |
|---|---|---|---|
| 从首页选择题材 | 进入 #/channel/home?category=<categoryId> 并显示选中题材 |
—(H5 无板块首页,在剧场页「剧集」分段筛选) | 首页题材基础集合是当前端有效首页板块的去重并集,不是全部片库,也不额外包含 Hero 专属内容 |
| 从既有类型入口使用题材 | 在 #/channel/short、long、movie、variety、anime 对应的当前类型片单内筛选 |
包括 H5 短剧入口;使用相同题材/标签与展开组件 | 不跨类型补内容,不将题材结果替换为首页并集;当前类型分组是固定示例,生产类型归属待接 |
| 从排行榜使用题材 | 在当前 list 已算出的 Top 结果内筛选 | 同左 | 保持 list 和榜内原名次,不从 Top 外补入内容 |
| 打开题材查看全部 | 首页入口进入 #/channel/home;当前结果页的查看全部清除题材/标签并保留其来源集合 |
同左 | 不覆盖首页配置,不更改内容绑定,不跳到全目录;榜单上下文保留 list |
| 选择题材 | 单选;按稳定 ID 过滤,更新题材内标签和结果 | 同左,选中项尽量滚入横滑区域 | 每次换题材清除原标签,避免残留一个新题材中不可用的标签 |
| 选择标签 | 单选标签,与当前题材求交集;不改变题材 | 同左 | 标签按 tagId 匹配,翻译文本只作展示,不能作为路由标识 |
| 查看数量 | 题材数量基于未筛题材的基础集合;标签数量基于已选题材集合;结果量是最终交集 | 同左 | 一个内容可属于多个题材/标签,各选项数量不能相加作为总量;同剧同标签只计一次 |
| 浏览大量标签 | 最多先展示 30 个标签,再显示展开更多;展开后全部换行 | 收起时一行横滑;展开后改成页面内多行,随页面纵向浏览 | 30 不含“全部”选项。选项不足或等于 30 不显示展开按钮 |
| 收起标签 | 收起显示前 30 项,结果与当前选中标签不变;按钮获得焦点 | 同左,尽量保持按钮收起前的屏幕位置 | 这是选项显示控制,不是结果截断或标签清除 |
| 重置筛选 | 清除 category/tag,回当前集合全部结果 | 同左 | 在榜单内复用本筛选时,重置仍保留 list |
| 查看卡片 | 海报下分别显示题材及标签;没有有效题材时不显示题材标签 | 同左,采用三列卡片及文本截断 | 卡片只交接内容入口,不在本模块新增播放流程 |
筛选、空态与状态规则。 题材结果与既有类型入口片单的默认排序:置顶优先,其次权重降序,再按更新时间降序(字段见第 05 章 5.2.1「运营展示」行)。题材选项遵循已保存字典数组顺序;题材没有前台自行推导的上下级或推荐顺序。前台标签选项只展示后台 5.2.4 标签管理中已配置的标签,展示范围由运营配置决定(原型中的标签词条仅为效果示例);标签只来自当前题材内容,不包含该题材不存在的标签;按覆盖内容数降序排列,数量相同按原标签值稳定排序。新题材没有内容绑定时保留可选的 0 计数,选中后显示该题材暂无内容;未知题材 ID 显示题材不可用和 0 结果,不静默回退全部。标签未知或与题材不相交时显示零结果。空态的查看全部/重置只能清条件,不更换基础集合或补其他剧集。题材结果按服务端分页返回,Web 每页 24、H5 每页 9 部并以底部页码翻页(切换题材 / 标签回到第 1 页,只有 1 页时不显示页码);题材/标签计数由服务端在当前来源集合上聚合返回,前端不在客户端遍历全集合。URL 不含页码,返回时恢复所在页与位置。
路由为 #/channel/<context>,context 为 home、short、long、movie、variety、anime 或 ranking 等当前来源;可带 category 和 tag,ranking 另保留 list。category 为稳定题材 ID;tag 为后台标签内部 ID(tagId);兼容期 90 天(自本版上线日起)内服务端提供「原标签值→tagId」映射接口:前端解析到旧 tag 原值时调用映射接口获取 tagId,命中则用 history.replaceState 把地址替换为 tag=<tagId> 的新链接(不新增历史记录),未命中显示零结果;兼容期结束后下线映射,旧链接按未命中处理。标签展示名按当前语言取字典译名,缺译回退中文主名称。当前选中条件显示在摘要中。切换既有类型入口或榜单时清除原题材/标签,改用新来源集合。展开状态只存当前页面内存,按集合、榜单和题材隔离;同题材切换标签保留展开状态,切来源或题材重置收起。收起后,第 31 个以后的已选标签可不在选项区,但摘要和结果必须保留,不能误显示全部。
URL 条件在重渲染时可重建;同实例切语言不清筛选。刷新后的展开状态不持久,外壳重建前台时也不保证原路由和滚动位置。通过卡片进入内容再使用专用返回,可恢复原 URL 与纵向位置。生产刷新/后退恢复规则已确认,见 10.2;此处描述的 demo 限制不代表正式交付要求已实现;
语言与数据关联。 前台界面支持简体中文、繁体中文、英语、泰语、越南语、日语、韩语 7 种语言。题材展示名按当前语言取字典译名;所需字段为空时先回退另一名称,再回退稳定 ID。标签展示名按当前语言取字典译名,缺译回退中文主名称;书名和简介仍取内容已有字段,不承诺整片库随语言切换完成翻译。
当前已实现的关联是:前台下一次打开时读取后台已保存题材字典,忽略弹窗编辑副本;题材成员来自独立示例片库的 categoryIds 绑定。不存在题材 ID 的绑定不参与结果。新增题材默认没有绑定,不凭题材名称或 raw tag 自动归类。
| 来源上下文 | 题材筛选前的基础集合 | 数量与生产边界 |
|---|---|---|
| 首页 | 当前端有效首页板块的有效内容并集,跨板块去重 | 由已保存内容配置动态决定;不是固定 123 部,也不是各板块数量相加 |
| 短剧、长剧、电影、综艺、动漫等既有类型入口 | 当前入口自己的片单,先在该片单筛题材,再筛标签 | 现有完整示例片库按位置选片:短剧 24 部,长剧/电影/综艺/动漫各 18 部。生产须接类型集合接口 |
| 排行榜 | 当前 list 已完成门槛、排序、人工调整与目标数量裁切后的 Top 结果 | 基础量为本次实际上榜数,不是全部候选量;后续筛选保持榜内原名次且不补榜外内容 |
三个来源共享计数口径:题材选项计数以当前基础集合为准;标签选项计数以已选题材集合为准;页面结果数量是题材与标签的最终交集。不同来源中同名题材的计数可以不同,不能以首页或全片库计数覆盖当前类型/榜单计数。
生产需接入题材/标签字典、真实内容类型与内容关系服务,统一来源上下文、题材 ID、标签 ID 和多语言展示名,并约定有效状态、集合总量、交集结果量、分页及错误响应。生产 tag 路由使用 tagId;兼容期 90 天内服务端维护原值→tagId 映射,前端按映射把地址栏替换为新链接(见上文路由段),不直接以翻译后的标签名替换。没有响应或接口错误不能计为 0 条正常结果。
| 验收 ID | 可独立执行的验收条件 |
|---|---|
| FE-CATEGORY-01 | 分别从首页、H5 短剧及其他既有类型入口、排行榜进入筛选:基础集合依次为首页去重并集、该类型片单、当前榜 Top;不得跨来源补片。首页停用板块和仅在 Hero 出现的内容不额外参与集合 |
| FE-CATEGORY-02 | 在上述三种来源中分别配置多题材、多标签及重复标签,核对题材计数、题材内标签计数和交集结果;切标签不改变标签选项基数。同题材在不同来源可有不同数量,榜单量不使用全候选量;结果超过一页时计数仍为集合全量 |
| FE-CATEGORY-03 | 已选题材与标签后改题材,tag 被清除;再选标签保留 category;重置不改变来源且榜单保留 list;切换既有类型入口或榜单清旧条件,并重新按新来源计数 |
| FE-CATEGORY-04 | 新增无绑定题材、输入未知题材、选择不匹配标签,分别显示正确零结果/不可用提示;不自动补片、不回退全部 |
| FE-CATEGORY-05 | 以 tagId 路由;用含空格、字面 +、中文、= 的旧原值链接访问,经映射后结果与新链接一致并把地址栏替换为新链接;翻译展示不改变链接标识 |
| FE-CATEGORY-06 | 在 H5 短剧当前类型片单及首页/榜单集合中分别构造 30 和 31 个以上标签;前者无展开按钮,后者显示剩余数量;H5 展开后多行可纵向浏览、收起恢复横滑,结果仍限于原来源且无整体横向溢出 |
| FE-CATEGORY-07 | 选择第 31 个以后的标签再收起;摘要与结果不变;同题材切标签保留展开状态,切题材收起;按钮焦点与操作位置可达 |
| FE-CATEGORY-08 | 中英文切换保留 category/tag;题材英文为空时回退中文、中文标签缺翻译时保留原值;不把未提供的其他语言当作已翻译 |
| FE-CATEGORY-09 | 修改题材字典但不保存,前台无变化;保存并重新进入前台,名称生效;新增题材仍为零绑定;不误宣称后台标签/剧集关联已同步 |
| FE-CATEGORY-10 | 从首页题材、H5 短剧题材及榜内题材结果点击内容后用专用返回,恢复原来源、category/tag、榜单 list 与页面位置 |
| FE-CATEGORY-10P | 生产环境验证刷新、浏览器后退、真实类型及字典/关系接口失败与重试 |
4.3.3 排行榜
优化WebH5P1已确认补充:刷新、后退恢复及失效内容返回按统一规则验收,见 10.2 对应规则。此项为正式接入要求,不能以 demo 画面替代故障场景验收。
目标与范围。 用户按推荐、热播、收藏、点赞四种排序目标发现内容,了解当前榜单统计口径,并通过题材/标签筛选查找榜内内容。新增/优化范围是四榜切换、共享规则结果、全局使用、筛选后保留名次与准确空态。榜单展示使用后台已保存设置,不存在前台草稿预览或等待发布步骤。
| 场景与触发 | Web 行为 | H5 行为 | 规则与边界 |
|---|---|---|---|
进入 #/channel/ranking |
显示当前端已启用的榜单切换项,切换项按后台 order 升序展示,默认选中 order 最小的、当前端可见的榜 | 相同规则,切换项支持窄屏横滑 | 全局通用,不按市场筛选;端范围和启停仍有效 |
| 点击四榜切换项 | 切换到指定稳定 list ID 的结果,清除原题材/标签 | 同左 | 默认四规则为推荐、热播、收藏、点赞;名称可定制,不能仅按显示名称定位榜单 |
| 查看榜单口径 | 显示统计窗口、指标类型、模拟指标说明;配置有人为固定名次时显示对应提示 | 同左 | 提示表示规则包含人工指定项,不保证该项在当前窗口合格;前台不展示后台全部计算明细 |
| 浏览结果 | 卡片显示当前榜单名次,顺序包含有效人工调整 | 卡片显示 01 等原名次角标 | 展示数量最多为保存的目标量,不足时保留短列表,不补不合格内容 |
| 筛选题材/标签 | 在已计算的 Top 结果内应用 4.3.2 规则 | 同左 | 保留原榜名次;原第 2、5、9 名筛出后仍为 2、5、9,不重新编号,不从 Top 外补片 |
| 重置筛选 | 清 category/tag,保留当前 list | 同左 | 与切榜清条件不同,重置不会切回默认榜 |
| 打开无效或已关闭榜链接 | 当前没有可展示结果,不静默换到其他榜 | 同左 | 未知、停用或不支持当前端的明确 list 请求当前共用空集合提示 |
| 点击内容 | 交接 drama_id 与 episode_id(单集内部 ID),取值规则与 4.3.1「点击内容卡片」相同 | 同左 | 只要求跳转准确与返回条件恢复,不展开下游流程 |
版式与尺寸。 Web 与 H5 排行榜读取后台配置(5.2.5);原型图只是样式示意,实际榜单切换项、名次、上榜数量与指标取后台配置。Web 排行榜:页面最大宽度 1350px;顶部为胶囊形榜单切换项;下方为 6 列海报网格(视口 ≤1180px 时 4 列),列间距 18px、行间距 30px;封面 3:4、圆角 8px,封面左下角叠加名次数字(完整落在封面内,前 3 名金色),悬停显示播放图标;封面下为剧名(14px 加粗)与副行「题材|标签|集数」,热播 / 点赞类榜单再加一行指标数值。H5 排行榜(剧场页「排行榜」分段):顶部榜单切换项可横滑;下方为双列横向小卡,封面宽 74px,名次以 01 形式压在封面左上角(前 3 名金色),右侧依次为剧名、题材 · 集数与指标;iPhone 15 一屏 2 列 × 5 行。
上榜与排序规则。 四榜使用同一个计算契约;前后台使用相同输入应得到相同结果。默认新榜 ID 为 rank-recommended、rank-hot、rank-favorites、rank-likes,分别对应 composite、views、favorites、likes。历史数据可保留旧稳定 ID 或自定义标题,因此识别规则依 rule,导航依实际 list ID,不强制迁移成默认名字或 ID。
| 规则环节 | 需求与边界 |
|---|---|
| 候选范围 | ids 非空时只在所选候选中计算;空时表示全目录候选。内容还需满足可展示状态、未被排除以及播放/收藏/点赞三个最低门槛 |
| 推荐榜 | 在当前窗口和合格候选范围内,三个指标分别除以该指标最大值,再按保存权重加权乘 100;某项最大值为 0 时该项贡献为 0。默认权重为播放 50%、收藏 30%、点赞 20%,权重和必须为 100%。字段统一为整数百分比 weights = { views: 50, favorites: 30, likes: 20 },每项 0—100 整数,校验 views + favorites + likes == 100;计算时以百分比/100 参与归一化 |
| 热播/收藏/点赞榜 | 按对应窗口内的播放量、收藏量、点赞量分别降序。收藏和点赞是独立指标,不可共用一个值冒充两种口径 |
| 同分排序 | 先按窗口播放量降序,再按内容内部 ID 的 UTF-8 字节序升序(同一实现用于前端引擎与服务端快照),避免相同输入出现随机跳名次 |
| 人工调整 | 已保存固定名次占据对应位置,其余由自动序列补齐;人工项继续遵守候选、可展示、门槛与排除规则。重复位置/内容、排除与固定冲突属于配置错误;不合格或实际名次不足的项不强行上榜 |
| 统计窗口与更新时间 | 支持近 1/7/14/30/90 天;更新配置支持分钟间隔或每日固定 HH:mm,前后端统一北京时间。前台展示统计窗口文字与榜单快照更新时间(前台按用户设备时区显示“更新于 MM-DD HH:mm”),不展示下次刷新时间;前台消费保存的规则和结果,不提供运营编辑表单 |
| 展示与筛选数量 | 先形成目标 Top 结果,再筛题材和标签;题材/标签计数的基础是当前 Top 结果,不是全候选。目标量大于合格量时不补足,标签过滤后也不重新补足 |
状态、语言与返回规则。 URL 允许 list、category、tag;省略 list 选择当前端第一个可见榜,明确错误 list 不静默替换。切榜清原筛选,重置筛选保留榜单。榜单无合格内容、榜内题材无绑定、标签无交集都允许零结果;配置错误 / 服务错误不能显示为正常“暂无内容”。明确错误 list 的空态“查看全部”当前仅清题材/标签,仍保留原 list;用户需点击有效榜切换项才能恢复。若所有榜均停用或不支持当前端,显示「暂无可用榜单」(EN: "No rankings available")。
默认四个中文榜名具有内置翻译,Web/H5 按当前界面语言显示;自定义中文榜名暂未获得翻译时显示中文,不把空英文替换成不对应的默认榜名。语言切换保留 list/category/tag。专用返回保留原榜和筛选及页面位置;页面实例重建、整页刷新和普通浏览器后退的恢复边界与前两模块一致。
数据关联与待接。 最小榜单数据包括 id、标题/翻译、order、启停、devices、全局范围、rule、windowDays、目标 count、候选 ids、三个最低门槛、权重、排除项、固定名次和更新时间设置;结果需要内容 ID、最终 rank、自动 baseRank、是否人工调整及可解释排序信息。前台只需消费展示必需字段,完整诊断可留在后台。
生产环境榜单由服务端按已保存规则定时计算并存快照;Web/H5 只读取快照,不在客户端计算。本地引擎仅用于原型与后台「按当前规则重新计算」预览。指标去重、防作弊、统计数据服务、服务器榜单快照、更新调度与缓存一致性均待生产接入。榜单播放量口径:PlaybackSession 中观看时长 ≥ 5 秒的会话按 dramaId 计数,不足 5 秒的会话不计,窗口按 createdAt;收藏量 = Favorite 表窗口内新增去重(userId × dramaId),点赞同理;撤销行为不回扣。游客与正式账号按 userId 统一计数;统计截点为快照计算时刻(北京时间)。
| 验收 ID | 可独立执行的验收条件 |
|---|---|
| FE-RANK-01 | 默认配置出现四种规则;停用或改变端范围仅影响相应榜可见性;旧 market 值不同不改变同端结果;迁移旧数据保留已有稳定 ID |
| FE-RANK-02 | Web/H5 读取同一服务端快照,在端可见条件相同时内容与名次一致;切换四榜进入准确 list 并清除旧筛选 |
| FE-RANK-03 | 对明确的合格候选手算归一化推荐分,分别与后台「按当前规则重新计算」预览和服务端快照核对;验证权重、零最大值和同分排序,并分别验证三单指标榜排序 |
| FE-RANK-04 | 提高任一门槛、排除内容、缩小候选范围;结果对应减少且不补不合格内容;目标数量大于合格内容时显示短列表 |
| FE-RANK-05 | 固定一个合格内容到指定名次,其余内容按自动次序补齐;将该内容改为不合格或指定超过实际榜长的位置后不强制上榜;冲突配置不产生正常结果 |
| FE-RANK-06 | 在完整榜中选中只含原第 2、5、9 名的题材/标签;两端保留 2、5、9 和原顺序,数量按 Top 集合计算,不引入榜外内容;重置仍留当前 list |
| FE-RANK-07 | 对同一示例目录切换统计窗口,验证重新累计并可改变名次;只刷新快照时间不伪造指标增长,也不声称后台已执行定时任务;前台显示的快照时间与后台最近更新时间一致 |
| FE-RANK-08 | 分别访问未知 list、当前端关闭榜、全部关闭榜、无合格内容和无交集筛选;不静默换榜或补片;生产区分不可用、正常空结果与接口/配置错误 |
| FE-RANK-09 | 默认榜名按中英文切换,自定义名无翻译时回退该中文名;保留 list/category/tag;内容页专用返回恢复原筛选榜单与页面位置 |
| FE-RANK-10 | 接入真实统计后,核对后端快照名次、前台名次、过滤基数、更新时区和失败重试;未知数据不得以零指标代替,服务失败不得伪装无上榜内容 |
05后台需求
支付模块
后台配置与报价原则
5.1 商品与报价后台配置原则
P0后台服务端功能与业务规则
单集解锁、全剧解锁、会员、充值档位的价格与赠送数量均由后台配置(现网已有功能)。全剧价格按第 04 章 4.2.6 公式由服务端计算;前端展示服务端针对当前用户返回的有效报价,不自行计算,也不使用 Demo 固定金额作为默认价格。服务端返回商品ID、报价ID、配置版本、权益范围、实际解锁集数、金币成本或支付金额、币种、有效期及优惠资格;提交订单时重新校验并保存快照。
报价失败或缺少必要配置时,显示“暂时无法购买”并提供重试;不得显示0金币或使用旧价格继续下单。报价变化时回显新金额、赠送及权益范围,用户再次确认后提交;已创建有效订单按订单快照履约。
字段与校验
配置字段的展示与计算规则见第 04 章支付模块 4.2.7(base_coins / bonus_coins / total_coins / amount / currency / duration_days)。本版沿用现网配置实体,不新建后台页面:
| 现网配置实体 | 字段 | 本版用途 |
|---|---|---|
| coin-packs(金币档 / 会员) | mode(COINS|MEMBERSHIP) / coins / bonusCoins / membershipDays / priceCents / usdtPriceOverride / isActive / sortOrder;含 coin-first-* 首充特惠包 |
4.2.7 充值档位、赠送、会员周期与售价;售价按 offer × 渠道 × 国家配置,未配置组合该渠道不可用,USDT 用 usdtPriceOverride;4.2.12 / 4.2.14 的 sort 即 sortOrder;MEMBERSHIP 模式下 coins / bonusCoins 不生效、后台置灰 |
| paywall-packs(剧集包 / 全集 / 畅看) | unlockType(UNLOCK_DRAMA|EPISODES_DELTA|TIME_PASS) / unlockValue / priceCents / badge / isActive / sortOrder;全局分档(UNLOCK_DRAMA 按总集数分档) |
本版解锁弹层不展示剧集包 / 畅看,不使用;单集金币与全剧折扣按剧配置(见后台 5.2.1「收费」行) |
| 优惠券 | coupon_type ∈ SINGLE_EPISODE / FULL_DRAMA / GOLD / VIP_DAYS / PAY_DISCOUNT / PAY_NO_THRESHOLD |
现网载体,本版不纳入:前台不展示、不核销优惠券;首充奖励不使用优惠券载体 |
| 现网后台已有配置(沿用) | 默认推荐项(4.2.12 / 4.2.14 后台默认商品与 sort)、支付渠道开关(P01)、首充活动(4.2.7)、绑定奖励规则(4.2.5,rule_id=bind_reward);4.2.8 入账失败转入的【掉单处理】菜单 | 沿用现网后台已有页面,本版不出原型 |
验收标准
见第 04 章 4.2.9 典型验收场景与第 09 章 9.3 支付验收用例第 11 条「配置与优惠资格」。
后台运营模块
5 个优化菜单:剧集管理(含合集)、排行榜设置、推荐与分发、首页板块设置、操作日志。合集为剧集管理内功能,不增加独立菜单;5.2.3–5.2.4 仅保留范围说明,不包含本版优化要求。
本轮后台对齐基线:20260917_DramaRush_前后端原型图_v1.1_统一手形指针.html。文档版本保持 V1.1;后台优化以该 demo 为基线;本轮另按用户反馈修复文档导航、保留线上剧集四状态,并补充已确认的身份恢复、提示、日志、路由恢复、存量折扣及接入规则。其余前台与支付需求不变。后台导航仅展示上述 5 个优化菜单;删除资源草稿箱整体功能、金币包与支付通道菜单,以及全部标记“保留”的菜单。题材与标签字典及剧集内的既有选择关系继续使用,不提供本版字典管理优化入口。
原型与正式交付:demo 验证后台配置、交互及本地保存;前台体验保持原样,后台预览入口仅切换前台终端,不能据此判定服务端或前台联动已完成。第 04 章仅补充本轮已确认规则及其引用,其余需求原文保留;生产联动须在真实接口接入后另行验收;隐藏后台菜单不等于删除现网支付能力或已有字典数据。第 04 章若出现后台样式选择或字典优化的历史引用,本轮后台交付范围以 5.2.3/5.2.4/5.2.7 为准;这些引用对应的前台展示规则保持原文,不据此恢复已删除的后台控件。
5.2.1 剧集管理
优化后台P1用户目标:维护剧集资料、题材标签、收费范围和已有单集资源,直接完成上下架;保持内容与视频、字幕的对应关系。
入口与页面:内容与片源 → 剧集管理。列表提供新增剧集、条件检索、状态汇总、批量操作、合集、表格/紧凑卡片切换及显示字段设置。勾选至少 1 部剧后可使用“合集”,详见 5.2.2。编辑页分为基础信息、多语言资料、集数资源、收费与预览四个区域;不再提供“转类型”“新增一集”按钮或独立“语言字幕”区域。
| 对象/字段 | 产品规则 |
|---|---|
| 剧集身份 | 系统生成内部剧集 ID;改名、上下架、题材修改或排序不改变身份。 |
| 剧集与单集状态 | 剧集保留线上“草稿、审核中、已发布、已下架”四种业务状态,列表、筛选、统计及编辑回显均不可丢失。demo 的“已上架”对应线上“已发布”,仅用于原型演示;不可将草稿或审核中归一为已下架。单集沿用 demo 的已上架/已下架,不因剧集四状态而新增单集审核流程。未保存的编辑副本与已保存的草稿业务状态是不同概念。 |
| 基础资料 | 剧名、简介、原语种必填;可维护副标题、封面、横图、预告片地址、来源、年份、置顶、内容类型、连载/完结/暂停进度和计划总集数(可空,正整数,≥ 当前集数;前台 total_count 取该值,为空时按“总集数未知”处理)。副标题、预告片、评分、热度本版前台不展示,仅后台维护。无成本字段、成本列或成本校验。 |
| 类型 | 短剧、长剧、电影、综艺、动漫;在基础资料内维护。 |
| 题材设置 | 独立模块,必选一个已保存题材。 |
| 标签设置 | 独立模块,可选多个已保存标签,也可不选;支持搜索、取消单个选择。 |
| 多语言资料 | 按系统支持的 13 个语种维护标题、副标题与简介;某语种标题及简介均已填写时计为资料完整,副标题可空。与字幕覆盖度分别统计。 |
| 单集资源 | 连续集号、集标题、上下架状态、HLS 地址、已配置字幕。单集内部 ID 不随集号变化。 |
| 收费 | 全剧免费或收费。收费剧免费集数为 0—总集数的整数,单集金币为正整数;免费剧全部集数免费。收费范围按当前集号位置计算,不因单集下架顺延;下架单集在前台选集面板不展示,其集号保留。「单集金币」旁增加「全剧折扣」:1–100 的整数百分比,默认 100(不打折),非法值阻止保存。全剧价格 = 单集金币 ×(总集数 − 免费集数 − 已购集数)× 全剧折扣,结果向上取整(已购集数按用户由服务端扣除);单集金币为现网已支持的按剧价格。 存量剧折扣缺省按 100% 处理,合法旧值保留,异常值阻止受影响的全剧售卖;不追改旧订单或权益(见 10.2)。 |
| 运营展示 | 保留热度、评分、权重、更新时间等现有排序或展示信息;不将示例数值解释为真实运营统计。置顶与权重用于既有类型入口(short / long / movie / variety / anime)片单及题材结果的默认排序:置顶优先,其次权重降序,再按更新时间降序;首页板块与排行榜不读取这两个字段。 |
线上状态与原型差异:本轮以用户提供的线上状态截图为业务基线,保留草稿、审核中、已发布、已下架;最新 demo 的 STATUS 仅含 published/offline,且 normalizeEpisodes 会将其他剧集状态转为 offline。该归一逻辑不得用于生产迁移或资料保存。正式接口沿用现网状态枚举与流转权限,不凭截图推定审核步骤、驳回规则或接口代码。文档中的“剧集上架/已上架”在生产对应“发布/已发布”,单集上下架含义不变。
| 线上剧集状态 | 本版保留要求 | 最新 demo 覆盖 |
|---|---|---|
| 草稿 | 保留已保存记录及其状态,可被筛选、回显和统计;编辑副本不是业务草稿。 | 未覆盖,不能据此删除或转为已下架。 |
| 审核中 | 保留原状态、审核流程及权限;普通资料保存、合集操作不得直接发布。 | 未覆盖,需按现网流程联调验收。 |
| 已发布 | 保持现网展示名称与发布状态;分发还需满足至少一集已上架等既有条件。 | published,显示为“已上架”。 |
| 已下架 | 保留下架状态及既有数据、已购权益处理规则;重新发布仍走现网权限校验。 | offline,显示为“已下架”。 |
列表与上下架交互
搜索覆盖剧名、副标题和 ID,可组合状态、类型、更新进度、题材、标签、来源筛选,提供重置。生产列表状态筛选保留“草稿、审核中、已发布、已下架”,支持组合选择;汇总按四状态分别统计,另保留连载/完结/暂停数量。最新 demo 仅演示全部/已上架/已下架,不能据此裁剪线上状态。列表支持分页和每页数量设置,翻页可保留已勾选记录;变更筛选条件清空原勾选,避免把旧范围误提交。
demo 每行按其二状态提供“上架”或“下架”,并保留预览、编辑、删除入口。生产环境按现网四状态及权限展示对应操作:草稿和审核中继续沿用原提交/审核流程,不能使用原型的二状态切换绕过审核;已发布、已下架沿用现网发布/下架权限。批量操作先核对所选项是否允许目标动作,不将草稿或审核中强制改为已发布。上下架先显示目标剧集和目标状态,确认后保存;批量操作仅作用于实际勾选的剧集,确认弹窗展示范围。提交时校验目标剧集 version 与打开确认弹窗时一致,不一致则阻止并提示重新核对。剧集状态修改不自动改写各单集状态;剧集上架时如果没有已上架的单集,确认弹窗提示“该剧无已上架单集,前台不会展示”,并提供“同时上架全部单集”勾选项。集数列表支持勾选多集批量上架 / 下架(确认弹窗展示范围),并写操作日志。
当前删除入口只提示暂不支持删除,不会删除剧集或单集。正式删除及已购权益、关联分发内容的处置不在当前已接通能力中。
下架对已购用户的处理
剧集或单集下架后,不再对新用户售卖和展示;已永久购买该集的用户仍可从观看历史 / 已购列表进入播放(accessState 按 unlocked_permanent 返回),首页 / 题材 / 榜单不展示;下架确认弹窗显示“已购用户数 {n}”。
资料编辑与图片
进入编辑时复制已保存记录。题材与标签按内部 ID 关联,字典改名不丢失关系;遇到未匹配或歧义的旧题材须重新选择,旧标签未全部匹配时须重新选择并确认。保存前再次检查字典有效性,失效项不能直接提交。
封面与横图各自支持 URL 或本地图片,分别选择与预览。封面比例 3:4,横图 16:9;比例偏差超过 5% 时保存提示并按居中裁切预览,前台以 object-fit: cover 展示,不拉伸。本地图片限 JPEG、PNG、WebP,单张大于 0 且不超过 2 MiB,校验实际格式与可解码尺寸;格式或读取失败应保留原图和其他输入。读取中阻止整剧保存;取消、换图、换编辑对象后,旧文件读取结果不能写入新对象。预告片地址可空,填写时须为有效 HTTP(S) 地址。
单集资源编辑弹窗
集数列表点击“编辑资源”打开独立大弹窗,保留集数列表作为背景,不切换整页。弹窗标题标明当前剧集与单集,正文只有一个主要纵向滚动区域,底部“取消/应用到当前编辑稿”固定可达。表单维护集号、集标题、上下架状态、HLS 地址及按需字幕,保留已配置字幕的新增、替换与移除能力。
打开时建立本集独立副本。取消、X、遮罩或 Escape 关闭,以及被其他弹窗替换,均丢弃该集尚未应用的资源和字幕修改(包括已确认但尚未应用到整剧的字幕),保留打开前的整剧编辑副本及列表位置。文件读取未完成时取消或换对象,后续旧读取结果不得写回已关闭弹窗或其他单集。
应用时校验集号、标题、状态、地址及字幕配置;存在未确认字幕表单或正在读取文件时,先完成或取消该表单。校验失败留在弹窗并保留输入,在正文内显示错误,不跳转整页。应用成功将本集副本合入整剧编辑副本并关闭弹窗、返回集数列表;未改变集号时保留原页,改变集号时定位目标所在页,仍需“保存剧集”才写入已保存记录。
已有集号调整
集数列表点击“调整集数”打开独立弹窗,显示剧名、当前集标题和集号。输入目标集号 1—N,实时展示本集移动位置、中间集顺移范围;跨越免费边界时提示新的收费属性。相同集号不能确认,空值、小数、非数字、越界值均不能提交。
确认后移动整条单集内容并连续重编号,视频、字幕、状态和内部单集 ID 随内容一起移动,总集数不变;自动定位目标集所在列表页。取消、右上关闭、遮罩或 Escape 不修改顺序。打开弹窗后,剧集副本或单集集合变化则阻止旧弹窗继续应用。原单集资源编辑中的集号输入保留相同的移动语义。
按需维护单集字幕
单集资源编辑只列出已配置语种;没有字幕时显示空态和“新增字幕”。新增时选择一个尚未配置的语种,上传一个 SRT/VTT 文件或填写字幕 URL。已有条目可替换或移除,替换时语种固定,避免误改另一语种。正在处理一个字幕表单时,不同时开启第二个新增或替换表单。
本地字幕要求 UTF-8、非空、单个不超过 512 KiB,并通过格式、时间码和有效字幕条目校验;URL 来源要求有效 HTTP(S) 地址。读取中不能确认;错误保留表单并提示修正。取消或切换单集后忽略旧读取结果。没有全语种空输入矩阵,也不提供本模块内的 ZIP 批量上传流程。字幕语种下拉与前端 subtitles[].lang 使用同一字典(BCP-47 代码,如 zh-Hans / zh-Hant / en / ja / ko);SRT 由后台上传时转为 VTT 后下发。
保存分三层:确认字幕更新当前单集副本;“应用到当前编辑稿”更新整剧编辑副本;“保存剧集”才写入已保存记录。未确认的字幕表单必须先确认或取消,再应用单集;未应用的单集编辑须先处理,再保存整剧。取消本集修改可恢复该集尚未提交的字幕和资源修改。
保存、取消与异常
整剧保存检查必填资料、现网合法状态、连续集号、唯一单集 ID、有效题材标签、收费范围、图片及字幕;生产状态校验接受并保留草稿、审核中、已发布、已下架,资料保存不能暗中改变业务状态;「至少一集已上架」仅在剧集上架时校验。校验失败定位问题并保留编辑内容;保存失败恢复原记录和操作日志,编辑副本留在页面供重试。离开有未保存修改的整剧编辑时,弹窗提供继续编辑或放弃修改。
demo 新增剧集默认已下架、全剧免费;生产新增初始状态沿用现网规则,不由 demo 覆盖。生产允许保存零集剧集,但不得发布;现存草稿/审核中不因零集被自动改成已下架。发布时仍校验至少一集已上架;资源草稿箱及资源中心接收流程已移除;本轮支持从已选剧集复制单集资源形成合集(5.2.2),不新增独立视频导入入口。
前后端联动与边界
合集保存后进入目标剧集编辑页,可继续维护资料、集数、字幕和收费规则;源剧及其单集保持不变。资源预览展示地址、状态、语种和收费范围,当前不实际播放视频。正式接入需由内容服务统一返回资料、状态、单集及收费范围;媒体上传、字幕托管和播放验证另需接入。
验收
| 编号 | 验收条件 |
|---|---|
| BE-DRAMA-01 | 列表、筛选、编辑和批量上下架只出现已上架/已下架;全模块无成本字段,无转类型动作。 |
| BE-DRAMA-02 | 单条及批量上下架确认范围准确;取消/失败保留原状态和勾选范围;生产状态筛选、统计、详情、资料保存及合集追加保留草稿/审核中/已发布/已下架,不绕过现网审核权限。demo 二状态与生产四状态分别验收。 |
| BE-DRAMA-03 | 题材单选、标签多选分区设置;字典改名不丢关联,失效或未确认的旧关联阻止保存。 |
| BE-DRAMA-04 | 调整集数以独立弹窗完成;移动第 1 集到第 2 集及跨页位置均不覆盖视频或字幕,ID 不变、集号连续,关闭不改顺序。 |
| BE-DRAMA-05 | 字幕只展示已配置语种;新增、替换、移除均遵循三级保存;重复语种、无效文件、读取未完成均不能误提交。 |
| BE-DRAMA-06 | 封面和横图可独立使用合法本地图片;读取失败及过期读取不覆盖原图,不影响另一图片字段。 |
| BE-DRAMA-07 | 免费/收费范围随当前集序预览;非法免费集数或金币值阻止保存,跨免费边界移动有提示;前 N 集内下架一集后免费范围不变,前台可看集数相应减少。 |
| BE-DRAMA-08 | 整剧取消有未保存提醒;失败可重试;删除入口不产生实际删除,资源预览不冒充视频播放成功。 |
| BE-DRAMA-09 | 编辑资源打开独立弹窗并保留列表背景,正文单滚动、底部操作固定;取消/X/遮罩/Escape 不应用本集修改且忽略过期读取,应用成功回到列表后仍需保存整剧。 |
5.2.2 剧集管理:合集
优化后台P1入口与流程:剧集管理列表勾选一部或多部剧集 → 点击“合集(已选数量)” → 选择合并到新剧集或已有剧集 → 核对合并单集、来源及顺序 → “确认合并并保存” → 进入目标剧集编辑页。未勾选时合集按钮禁用;存在尚未保存的整剧编辑时先处理该编辑。该功能复制单集,不删除或搬空源剧。
| 配置项 | 行为与校验 |
|---|---|
| 合并到新剧集 | 新剧集名称必填,去首尾空格后最多 80 字符。系统生成新剧 ID;沿用首部源剧的基础资料、图片、题材和标签。以输入的新名称为准,清空旧英文名、副标题及多语言资料;置顶关闭、权重归零、热度与评分不继承。demo 新剧默认下架、全剧免费,全部复制单集默认下架;生产目标初始状态沿用现网新建规则,不以原型默认值覆盖现网状态流程。保存后可继续完善资料。 |
| 合并到已有剧集 | 必须选择有效目标,目标不能属于本次已勾选源剧。保留目标资料、现网四状态、收费规则和原有单集;草稿/审核中目标不得因合集保存变成下架或已发布。新增复制单集默认下架。目标原有单集在前,源剧单集依次追加;可在确认前调整合并后的完整顺序。免费目标按合并后集数更新免费集数。 |
| 单集来源与去重 | 按源剧勾选顺序和各剧原单集顺序生成队列。复制视频地址、字幕及单集资料,新副本使用新单集 ID;已有目标单集 ID 不变。以 originDramaId + originEpisodeId 识别同源单集,重复项跳过并显示数量;已是合集的来源继续使用其原始来源标识。 |
| 调整集数顺序 | 弹窗展示合并后总集数、原有数、新增数、跳过重复数。支持拖拽整行或 ⠿、上移/下移、输入目标集号(1—N 的整数);插入目标位置,中间单集顺移,最终连续编号。无效集号不应用;视频、字幕及内部 ID 随单集内容移动。 |
| 切换模式或目标 | 按新模式/目标重新生成队列,之前在弹窗中的排序不会跨目标保留,须再次核对。已有目标模式没有新增且没有顺序变化时阻止无效提交;无可合并单集时阻止保存。 |
保存与取消:“确认合并并保存”直接保存目标剧集及完整单集序列,不需要再点击“保存剧集”才完成合集。之后编辑资料属于新的未保存修改。取消/关闭合并弹窗不修改任何剧集;保存前检查源剧及目标与打开/选择时的快照一致,不一致提示重新勾选源剧或重新选择目标。保存失败回滚目标和本次成功日志,保留弹窗输入与顺序供重试,失败结果单独记录。保存成功清空勾选并打开目标剧;源剧数量、资料、单集 ID、视频及字幕不变。
合集联调边界:demo 沿用源/目标的计划总集数等基础值,不自动修正计划总集数小于合并后实际集数的情况;后续编辑须按剧集校验规则核对。新建合集虽保留部分基础资料,但多语言资料清空,需按目标剧实际内容补齐。上述检查属于生产接入与资料完善,不代表 demo 已做完整业务校验。
生产接入:目标及单集写入须原子提交,以 requestId 防重复提交,并对源剧和目标执行并发校验。合集不会自动搬迁用户已购权益、观看进度或分发关系,也不会自动上架、替换 Banner 或加入首页。收费目标的免费范围仍按当前集号位置解释;正式权益处置沿用内容服务,不能把复制后的新单集视为原购买单集。
验收
| 编号 | 验收条件 |
|---|---|
| BE-COLLECTION-01 | 未勾选禁用;勾选后两种目标模式可用,源剧不能作为已有目标。空名、超长名、无目标、无单集及无实际变化均阻止保存。 |
| BE-COLLECTION-02 | 两部源剧合并后,集数等于去重后的来源总数;demo 新剧下架、全剧免费,复制单集下架,原剧不变;生产新剧状态按现网规则,原有目标四状态不得被覆盖。 |
| BE-COLLECTION-03 | 合并到已有目标保留原单集、资料和收费规则;重复同源单集不再次追加,可核对跳过数量。 |
| BE-COLLECTION-04 | 拖拽、上下移与目标集号结果一致;单集连续编号,视频、字幕和身份不被相邻单集覆盖。 |
| BE-COLLECTION-05 | 确认前关闭/取消无变更;源剧或目标冲突阻止覆盖。保存失败无部分合集,输入和顺序保留,重试成功仅产生一个目标结果。 |
| BE-COLLECTION-06 | 成功即完成合集保存并进入目标编辑;不自动上架或改变任何分发配置,日志归属目标剧集。 |
5.2.3 题材管理范围说明
题材管理菜单从本次运营原型移除,本版不优化其新增、编辑、删除、排序、多语言翻译或覆盖统计。已有字典和内容关联继续沿用,剧集管理中的题材单选、标签多选不受影响。原 BE-CATEGORY 优化验收项不再列入本轮交付;前台相关需求不在本次修改范围。
5.2.4 标签管理范围说明
标签管理菜单从本次运营原型移除,本版不优化其新增、编辑、删除、排序、多语言翻译或覆盖统计。已有字典和内容关联继续沿用,剧集管理中的题材单选、标签多选不受影响。原 BE-TAG 优化验收项不再列入本轮交付;前台相关需求不在本次修改范围。
5.2.5 排行榜设置
优化后台P1用户目标:运营维护推荐、热播、收藏、点赞四类通用榜单,按指标自动排序,并在门槛范围内进行人工固定名次和排除。
列表与展示结构
总览显示四榜、启用数量和人工调整数量。每张榜单卡按“榜名及状态—指标与统计窗口—当前排名预览—候选/上榜数量—更新时间”组织,提供编辑设置、刷新榜单和「复制前台链接」(生成含 list ID 的 #/channel/ranking?list=… Web 与 H5 路由,只读)。榜单全局通用,没有市场字段或预览市场选择。
顶部仅提供 Web、H5 已保存预览;不提供保存草稿、变更审核/发布、发布版本与回滚,也不显示待发布字段、草稿已保存或与发布一致等状态。当前“编辑设置”进入单榜编辑页,保存后直接更新该榜配置;取消不保存。
| 榜单 | 自动规则 | 默认设置 |
|---|---|---|
| 推荐榜 | 窗口播放、收藏、点赞分别按合格候选最大值归一化,再按权重求和,乘以 100。 | 首期正式权重 50%/30%/20%(整数百分比 weights={views, favorites, likes}),按最大值归一化;剔除测试、重复及已确认作弊数据。生产数据接入与复盘见 10.2,demo 模拟数据不能代表生产验收。 |
| 热播榜 | 窗口播放量降序。 | 与推荐榜采用相同候选和门槛结构。 |
| 收藏榜 | 窗口内收藏量降序。 | 同上。 |
| 点赞榜 | 窗口内点赞量降序。 | 同上。 |
指标口径同 4.3.3:热播 = 窗口内 ≥5 秒播放会话数;收藏 / 点赞 = 窗口内新增 userId × dramaId 去重数,撤销不回扣。四榜默认近 7 天、每 60 分钟更新、目标 10 部;片库不足时按实际数量。默认标识分别为 rank-recommended、rank-hot、rank-favorites、rank-likes,改名不改变榜单身份和自动规则。
字段与校验
榜单中文标题必填且不超过 40 字符。系统按中文为支持语种生成展示标题,运营无需填写英文或其他语言;可切换语种只读预览译文。预设四个标题已配置全部支持语种,自定义标题未接通翻译时保留中文、标记待翻译,并以中文回退。
每榜独立启停,展示终端字段 devices 枚举统一为 web / h5 / app(文档统一写 Web/H5/APP);本期 APP 选项置灰并提示「本期不展示」,启用时至少勾选 Web 或 H5 之一。目标上榜数量由运营手动填写正整数,不设业务数量上限;合格候选不足时不补虚假内容。候选范围可搜索、跨页选择;未限定候选表示使用全目录。
统计窗口可选 1、7、14、30、90 天。最低播放、收藏、点赞量为非负整数,三个门槛须同时满足。推荐榜三个权重为 0—100 的整数且合计 100%(计算时以百分比/100 归一化)。自动规则只读,改标题不改变所属榜种。
更新方式支持按间隔或每日固定时间。间隔为 1—10080 分钟的整数;每日时间为合法 HH:mm,前后端统一北京时间。显示最近更新时间、下次计划及是否已到更新时间。
排序、人工调整与空态
人工调整集中在“候选范围与当前榜单”列表,不另设独立人工配置区。列表先显示当前上榜,再显示合格候选和未达门槛/不可展示项;逐剧显示名次/状态、剧名、播放/收藏/点赞及人工操作。已上榜行支持拖拽;合格行可填写“移至 N 名”,并提供恢复自动、排除/取消排除;列表上方提供“恢复全部自动”。
拖拽或输入名次采用插入移动,其他内容顺移;原型将调整后的当前榜单序列记录为人工固定名次,而不只是固定被拖动的一行。名次须在实际可用上榜范围内(不超过目标数量与合格候选数的较小值);未达门槛内容不能通过手动操作强制上榜。排除某剧同时解除其固定名次,恢复全部自动清空固定和排除。减少目标数量后,超出数量的固定项移除。所有编辑先更新副本,点击“保存设置”才持久化。
先排除不可展示、人工排除和未达门槛的内容,再按榜种计算自动序。指标同分先比较窗口播放量降序,再按内部内容 ID 的 UTF-8 字节序升序确定顺序(与前端引擎同一实现)。推荐榜某项最大值为零时,该项贡献为零。
人工固定指定剧集和 1—目标数量内的名次,最终配置中的内容及名次均不可重复,必须位于候选范围,且不能同时被排除;行内移动到已有名次会插入并顺移原内容,不以占位本身作为重复错误。人工固定继续受可展示条件和门槛约束;规则改变后不满足条件或候选不足导致目标名次不可用时,提示该固定项未生效,其余位置由自动序补齐。支持取消固定、移出排除名单及恢复自动排序。
“按当前规则重新计算”和编辑内刷新只更新编辑预览,保存设置后才保留。列表刷新使用已保存规则,更新快照时间。全部不满足条件时显示空榜及原因,不借用其他榜单凑数。
保存与预览
保存设置校验当前榜及最终配置,保留其他已保存榜单。编辑期间保存版本发生变化则阻止覆盖,要求取消后重新编辑。保存成功直接成为读取配置;失败恢复原配置和日志,保留输入重试。旧数据内部兼容不恢复草稿/发布/版本入口。
生产 Web/H5 应读取已保存配置;当前 demo 预览只切换前台终端,不消费后台新配置,也不提交当前编辑。前端使用同一四榜规则及语言标题,不按市场分组。前端在某榜下再按题材或标签筛选时,从已经计算的 Top N 中取子集,并保留原名次,不生成新的题材榜。
前后端联动与边界
当前指标来自固定日期的模拟数据,切窗口可重新计算,刷新时间不伪造实时增长;关闭页面没有后台调度。APP 仅保存终端配置,没有 APP 预览实现。生产需接真实指标和统一调度:播放、收藏、点赞的去重与反作弊由服务端提供;自动翻译和缓存更新也待接。
验收
| 编号 | 验收条件 |
|---|---|
| BE-RANK-01 | 页面始终提供四类通用榜,无市场、草稿发布或版本回滚操作;单榜保存不改其他榜。 |
| BE-RANK-02 | 中文标题驱动多语言展示,无其他语言必填输入;自定义标题正确回退中文。 |
| BE-RANK-03 | 非法窗口、数量、门槛、权重、更新时间或终端配置阻止保存并保留输入;仅勾选 APP 时保存被阻止并提示。 |
| BE-RANK-04 | 自动计算依次遵循可展示范围、排除、门槛、规则和稳定同分排序;不足及空榜均按实际结果显示。 |
| BE-RANK-05 | 最终固定配置重复、越界、跨候选或与排除冲突不能提交;行内移至已占用名次应顺移而非报重复;失去资格不强制上榜。 |
| BE-RANK-06 | 编辑重新计算不直接保存,列表刷新用已保存规则;保存失败及取消保持原榜配置,重试后只产生一次成功变更。 |
| BE-RANK-07 | 生产联调时验证 Web/H5 使用已保存榜单、筛选保留原名次;demo 仅验收后台保存与预览不提交编辑,不将固定前台数据视为联动通过。 |
| BE-RANK-08 | 填写 101 或 500 可保存;非正整数不可保存,合格候选不足按实际展示。人工操作全部在候选列表内,拖拽/输入名次更新唯一连续排名,取消不保存。 |
5.2.6 推荐与分发:推荐位/Banner
优化后台P1用户目标:配置 Web PC 首页推荐位的内容、顺序、标题和图片,核对目标后保存。当前推荐与分发页面只提供推荐位/Banner 入口,信息流广告、推荐算法不属于本轮页面及验收范围。
列表与 Web 配置
仅维护 Web PC 推荐位开关和 Banner 列表,保留 web_hero / WEBPC_HERO 标识。删除 H5 配置入口、列表、摘要及两端切换;不创建 H5 推荐位配置。本轮 Web 最多 12 条,同一剧不可重复,可保存空列表,关闭开关不清空内容。列表支持拖拽整行或左侧 ⠿ 调整顺序,也可上移/下移;插入到目标位置,其余项目顺移,序号即时重算。编辑、预览、移除沿用现有入口;移除须确认,不删除剧集。
整行悬停使用与首页板块和排行榜一致的浅粉背景(#fff5fa)和抓取手形(cursor: grab);左侧 ⠿+序号采用 26×26 浅灰圆角样式。操作按钮保留自身点击指针,禁用按钮不可操作。拖拽只改工作列表,未保存时刷新或撤销不应冒充已持久化;将项目放回原位置不改变顺序。
新增/编辑弹窗
新增和编辑都使用独立弹窗,集中完成搜索选剧、可选展示标题与图片选择,并预览最终标题、素材和目标剧集。按中英文剧名、ID 或类型搜索,显示匹配总数与前 12 条,超出时通过关键词定位;无结果允许继续修改搜索。明确选择剧集后才记录目标,不因检索结果出现而自动加入。
展示标题可空,最多 60 字符;为空时按当前界面语言用剧集多语言标题(运营录入的展示标题仅作中文覆盖)。投放起止时间 start_at / end_at(可空 = 长期;按北京时间录入,服务端存 UTC;end_at 必须晚于 start_at,否则不能确认);过期或未到投放期的条目前台不展示、后台列表标灰。当前 demo 首次选剧带入片库海报,运营可替换为 Web Banner 图片;不将横图优先或裁切提示视为已实现能力。图片为必填来源,可选有效 HTTP(S) URL 或本地 JPEG/PNG/WebP,单张大于 0 且不超过 2 MiB。本轮只维护 Web 素材;当前 demo 校验格式、大小与可解码尺寸,未定义像素规格或比例硬性校验。生产槽位尺寸仍需设计确认,不阻塞本轮后台交互验收;素材预览按容器裁切,不视为正式前台投放验收。校验实际格式、大小和可解码尺寸;本地文件显示文件名、尺寸和大小。图片来源切换保留另一来源输入,但确认只使用当前明确选择的来源;移除当前图片后须重新补齐,不能暗中回退旧图。
读取期间禁用确认。选文件取消不更改原图;读取或格式失败保留原图及其他输入。换图、取消、切换编辑对象或关闭弹窗后,过期读取结果不得串入新 Banner。编辑项在弹窗打开后被改变时,阻止旧副本覆盖。确认前再次检查目标存在、同端不重复、数量、标题和图片。
保存层级
弹窗“确认加入列表/确认修改”只应用到Web 编辑列表;取消或关闭弹窗不应用该项。列表排序、开关、移除同样先修改工作列表。
点击“保存配置”显示 Web 推荐位相对已保存值的差异,包括开关、增删、顺序、标题和图片;确认保存后整组生效。取消差异确认保留工作列表。“查看已保存配置”打开对照;“撤销未保存修改”二次确认后恢复最近保存的 Banner 配置。此保存不提交首页板块、排行榜或剧集编辑。
校验失败保留可修改内容;持久化失败恢复已保存配置和日志,工作列表保留并提供重试。空列表预览为空态,无效目标或图片提示修正。
前后端联动与边界
后台已支持素材预览和目标剧集核对;目标为 drama_id,进入时按第 04 章 4.3.1「点击内容卡片」同一规则取 episode_id。本轮 demo 的 Web 前台保持原样,后台保存和预览不代表 Hero 已接通;正式交付按第 04 章既有要求接入 Web Hero。本轮不包含 H5 推荐位配置及接入。生产需接推荐位读取、图片上传与托管、有效目标校验和缓存更新;本地图片选择不等于上传至服务器。
验收
| 编号 | 验收条件 |
|---|---|
| BE-BANNER-01 | 页面只包含 Banner;仅 Web 启停和排序,无 H5 入口,Web 内去重、最多 12 条,空列表可保存。 |
| BE-BANNER-02 | 新增、编辑使用弹窗,搜索选剧、标题和图片可集中完成;取消不改当前列表。 |
| BE-BANNER-03 | 合法 URL 或本地图片均可确认;错误格式、超过大小、无图片、读取中或失效目标不能提交。 |
| BE-BANNER-04 | 取消文件选择、替换失败及过期异步结果不丢原图、不串写;来源切换不偷偷回退旧素材。 |
| BE-BANNER-05 | 单项确认、上移下移或删除确认尚未写入已保存值;保存配置对照 Web 差异,再确认才生效。 |
| BE-BANNER-06 | 保存失败保留工作列表和原配置、日志,允许重试;取消对照不保存,确认撤销能恢复已保存列表。 |
| BE-BANNER-07 | demo 中保存 3 条 Web Banner 后重新进入后台仍按新序展示;原型前台保持原样。Web Hero 的顺序、开关与投放期联动作为正式接入验收,不据后台本地保存判定完成。 |
| BE-BANNER-08 | 将第 1 行拖至第 3 行,序号连续,其他行顺移;标题、图片、目标及时间随同一条目移动。整行悬停背景及手形与首页/榜单一致;点击操作按钮不误触发调序。未保存前可撤销,确认保存后重新进入顺序保留。 |
5.2.7 首页板块设置
优化后台P1用户目标:直接维护首页板块、完整片单和展示顺序,用同一份配置支持不同地区的 Web 及未来 APP 展示(H5 首页为推荐流,不展示首页板块)。
列表与字段
从左侧独立菜单进入首页板块设置。列表展示板块顺序、名称、启停、展示终端、内容预览和所选剧集数;提供新增板块、编辑设置、上移/下移及「复制前台链接」(生成含板块 ID 的栏目详情路由 #/section/<sectionId>,只读)。板块全局通用,删除市场字段、列表市场信息和预览市场选择,旧市场数据不限制展示或清空原已选内容。
| 字段 | 规则 |
|---|---|
| 板块名称 | 中文标题必填,最多 40 字符;英文及其他语种由翻译服务自动补充,可人工修订,缺译回退中文(本页保留标题翻译与手动修订;题材、标签本轮不优化)。 |
| 开关与终端 | devices 枚举为 web / app,不提供 H5 终端选项;本期 APP 选项置灰并提示「本期不展示」,启用时须勾选 Web。停用不清空片单。 |
| 内容来源 | 手选片单(默认)/ 榜单引用。榜单引用板块从 5.2.5 已启用的推荐 / 热播 / 收藏 / 点赞榜中单选一个,片单与位次 = 该榜当前快照(含 5.2.5 的人工固定 / 排除),随榜单更新自动刷新;本页不再提供选剧与内部排序,人工调整一律在 5.2.5 进行。各板块(含「热门榜单 / TOP」)采用手选片单还是榜单引用、引用哪个榜,由运营在本页配置,Web 首页按已保存配置展示。所引用榜停用或当前端不支持时板块不渲染。 |
| 已选剧集 | 内容来源 = 手选片单时:从当前片库直接选择,去重且有效;允许空片单;接口字段 ids 为去重后的内容 ID 有序数组,不再下发 count;列表「所选剧集数」= ids 长度,没有手工填写的显示数量或截断上限;不设软上限或硬性数量上限,超过 100 部也按通常校验直接保存,不出现数量超限确认。 |
| 展示顺序 | 板块整体顺序与板块内部剧集顺序分别维护。手选片单支持拖拽整行或左侧 ⠿、上移/下移,移动到目标位置后其余项目顺移;序号连续,操作只修改当前板块副本,点击保存板块后生效。榜单引用不开放片单调序,应转至排行榜逐剧调整。 |
| 展示样式 | 新增和编辑均删除展示样式选项,不提供 5001 / 5002 / 5004 单选控件。已有 style 保留用于兼容,列表可只读显示原样式;新建默认 5001。不得因本次删选项覆盖已有样式;第 04 章前台样式定义原文保持不变。 |
| 内部身份 | 新增由系统生成板块 ID;编辑名称和排序不改变 ID。 |
不存在仅配置某一个固定栏目、自由搭建版式或按市场另建片单的流程。
独立弹窗与选剧
新增/编辑均打开独立弹窗,保留总览作为背景。标题与底部取消、创建/保存操作固定,正文只有一个主要纵向滚动区域,不出现弹窗及内层表单双重纵向滚动。
点击选剧在同一弹窗切换至候选视图,搜索剧名、类型或 ID,每页 16 部。支持跨页勾选、全选当前搜索结果、清空候选,并显示已选数量;按勾选顺序加入。应用候选选择回到主编辑,仅更新副本;候选页取消回到主编辑,保留此前片单和其他字段。主编辑可调整片单顺序、移除单条,保存完整有序片单。拖拽行悬停背景 #fff5fa、整行 cursor: grab、左侧 26×26 浅灰圆角 ⠿+序号,与排行榜及 Banner 共用表现;按钮保留点击指针,禁用按钮不响应。
点击主弹窗取消,或 X、遮罩、Escape 关闭,放弃整个当前板块编辑;不会把候选临时勾选单独保存。返回再编辑读取已保存板块。
保存、顺序与失败
“创建板块/保存板块”校验名称、终端、内容有效性和去重后,直接保存当前板块,不再追加草稿、审核、发布或版本回滚步骤。校验失败保留弹窗并显示具体错误;保存失败恢复原配置和日志,保留输入和片单供重试。编辑期间已保存配置变化时停止覆盖,要求重新打开核对。
总览上移/下移立即保存板块整体顺序,首尾不可越界;不要求另点保存。失败恢复原顺序。单板块保存不提交别的板块未保存内容,也不影响排行榜、Banner 或题材标签。
前后端联动与边界
各地区共用,不按市场筛选。顶部“Web 已保存预览”在当前 demo 中只切换前台终端,页面明确提示“原型前台未接后台配置,仅切换终端”;不会提交正在编辑的内容。生产前台读取已保存片单及榜单引用快照仍需联调,不以当前固定前台画面作为配置生效证据。
生产配置存储、前台读取、权限及缓存更新仍需服务端接入。
验收
| 编号 | 验收条件 |
|---|---|
| BE-HOME-01 | 新增及编辑均打开独立弹窗,总览保留背景;正文可滚动且保存按钮固定可达;无展示样式选项,保留既有 style 数据;本次不改前台。 |
| BE-HOME-02 | 无市场输入、展示及过滤,旧配置已选片单保留,不同地区使用同一板块配置。 |
| BE-HOME-03 | 选剧跨页、搜索及全选后数量准确;应用与取消层级清晰,主弹窗关闭丢弃整个副本。 |
| BE-HOME-04 | 全部有效已选剧集按内部顺序展示,不因默认条数或 123 部示例目录产生截断。 |
| BE-HOME-05 | 创建/保存直接生效;失败保留弹窗、输入和原配置,冲突不覆盖;无草稿发布或版本操作。 |
| BE-HOME-06 | 总览调序立即保存并遵守边界,失败恢复原序;板块保存不影响其他模块。 |
| BE-HOME-07 | 预览入口不保存编辑;后台重新进入读取已保存顺序。生产前台读取完整配置的联动须单独验收。 |
| BE-HOME-08 | 将「热门榜单 / TOP」板块内容来源设为榜单引用并选择热播榜,保存后后台引用片单与位次等于 5.2.5 热播榜当前快照;生产 Web 首页联动另行验收;在 5.2.5 固定某剧至第 1 名并刷新榜单后,板块同步更新;该板块编辑弹窗不出现选剧与内部排序;停用所引用榜后板块不渲染。 |
| BE-HOME-09 | 手选 101 部及以上仍可直接保存;拖拽、上下移后取消恢复原顺序,保存后重新编辑顺序保留;空片单可保存,榜单引用不出现手选拖拽入口。 |
5.2.8 操作日志
优化后台P1用户目标:查看本次后台模块中已经完成的操作,核对操作对象、内容和时间,避免失败被误记为成功。
范围与字段
操作日志覆盖本轮四个业务模块:剧集保存、上下架与合集,榜单设置与刷新,Web Banner 配置保存,首页板块创建/保存及顺序调整。合集使用“保存剧集合集”动作,对象类型为 drama,目标剧集为对象;不新增资源接收、资源归集、字典管理或支付配置操作。服务端定时刷新榜单快照不写操作日志,仅更新快照时间;运营手动刷新写一条 refresh 记录。日志页面保留记录数(分成功 / 失败两列)与无记录空态,实际操作按新近在前展示。
| 字段 | 产品要求与边界 |
|---|---|
| 时间 | 显示操作发生时间;正式接入采用服务端时间。 |
| 操作 | 使用明确的业务动作,例如保存榜单设置、保存剧集合集。 |
| 对象与变更 | 识别目标剧集、板块、榜单或 Banner 配置及本次变化;多对象操作展示数量或范围。 |
| 操作人 | 正式接入读取登录身份; |
| 结果 | result ∈ success / fail,必填;失败记录带 error_code 与失败原因摘要,展示为「失败」,不计入成功变更数。 |
| 版本 | revision_before / revision_after,成功记录必填。 |
| 对象类型 | object_type ∈ drama / ranking / banner / homepage_section;已有历史记录不因本轮菜单裁剪而删除。 |
与保存联动
表单输入、打开或取消弹窗、查看预览、未保存的候选勾选不形成记录。成功业务提交产生一条 result=success 记录;保存失败产生一条 result=fail 记录且业务数据回滚,保留编辑供重试;重试成功再产生一条 success 记录,前一次失败记录保留但不计入成功变更数。
生产交付应使用真实审计记录,不以样例混充实际记录。
前后端联动与边界
当前 demo 分“示例操作记录”和“本次体验操作记录”,无服务端分页。正式接入仍按原要求最近 200 条、每次 50 条加载、保留 180 天;本轮不新增导出入口。生产要求审计结果与业务保存保持一致,禁止出现失败业务的成功日志;可见权限:所有后台角色可读(见后台 5.3.1「权限」段);检索支持时间、操作人、模块、动作、对象 ID、成功/失败,默认最近 7 天(已确认,见 10.2;demo 尚未接入生产检索)。不得记录密码、令牌等敏感原文。日志不得包含视频文件正文、字幕正文或本地图片数据等大体积素材。
验收
| 编号 | 验收条件 |
|---|---|
| BE-LOG-01 | 对本轮模块成功保存后出现对应时间、动作、对象、操作人与 result=success,最新记录在前,记录数分成功 / 失败两列且正确。 |
| BE-LOG-02 | 修改但未保存、取消、关闭或预览不会新增成功变更记录。 |
| BE-LOG-03 | 保存失败产生一条 result=fail 记录且业务数据回滚;重试成功再产生一条 success 记录。 |
| BE-LOG-04 | 无新增操作时显示空态;固定历史样例不作为真实审计数据,不扩大本轮业务范围。 |
| BE-LOG-05 | 正式接入验收要求真实操作人、服务端时间和实际结果与业务提交一致;当前未接通部分明确列入联调边界。 |
5.3.1 保存层级
并发版本:正式写接口针对剧集(含合集目标)、榜单、Banner、板块执行 expectedVersion 与 requestId 校验。合集额外校验源剧版本;冲突拒绝覆盖,返回当前版本及最后修改信息。demo 以对象快照比较模拟冲突,不等同服务端事务。资源草稿箱和题材/标签写入口不在本轮范围。
| 操作 | 确认与保存 | 取消/失败 |
|---|---|---|
| 首页板块 | 拖拽内部片单先改副本,创建/保存板块直接保存当前项;总览上下移直接保存整体顺序。 | 关闭主编辑丢弃本项修改,保存失败回滚原配置,保留输入重试。 |
| 排行榜 | 拖拽、目标名次、排除、规则预览先改编辑副本,保存设置生效;总览刷新使用已保存规则。 | 取消不保存;校验及冲突失败保留输入,恢复旧配置。 |
| Web Banner | 单项弹窗确认加入工作列表;拖拽、上下移、开关、删除仍在工作列表。保存配置→差异确认→确认保存。 | 取消差异确认保留工作列表;撤销恢复已保存值;保存失败保留输入。 |
| 合集 | 确认合并并保存直接写目标与单集,不再追加整剧保存步骤;成功后打开目标编辑。 | 取消不写入;失败不留下半个目标或部分单集,源剧始终不变。 |
| 单集资源/字幕/集号 | 字幕先确认到单集;应用资源到整剧编辑稿;最后保存剧集。 | 逐层取消只丢弃该层未提交修改;视频、字幕和单集身份保持对应。 |
| 上下架 | 单条/批量确认目标状态后保存。 | 冲突或失败不允许部分成功。 |
权限:管理员全权;内容运营可写剧集管理(含合集),分发运营可写排行榜、推荐与分发、首页板块;其他可见业务模块只读,操作日志所有角色可读。只读角色不能通过拖拽或保存绕过权限。生产由服务端校验权限,失败记 fail;本地角色切换仅演示。已移除菜单不通过旧导航恢复;支付原有权限原则 5.1 保持不变。
首页与榜单不提供保存草稿、审核/发布和版本回滚;“编辑副本/工作列表”只是未保存输入,不是资源草稿箱或业务发布状态。业务提交失败不得生成成功记录;失败结果与成功重试应分开记录。
5.3.2 标识、数量与语言的一致性
| 对象 | 关联规则 |
|---|---|
| 内容/单集 | 源剧和原有单集 ID 稳定;合集复制单集使用新 ID 并保存 originDramaId / originEpisodeId。同一目标内的排序只改集号,不改视频、字幕及身份。原始来源字段用于复制去重,不作为复制用户权益或观看进度的依据。 |
| 题材/标签 | 沿用已保存字典和稳定关联,剧集题材单选、标签多选;本版不新增字典管理、翻译或删除要求。 |
| 首页板块 | 保存有序 ids,数量从片单计算,不设 100 部软上限、硬上限或超量确认;榜单引用读快照,不另行手排。删除展示样式选项但保留兼容 style。 |
| 排行榜 | 目标数量为正整数,不设业务上限;实际名次不可超出可用上榜范围。不足时按合格内容数展示,不伪造内容。 |
| Web Banner | 仅 Web 配置,仍最多 12 条,与首页/榜单的不限数量规则不同;拖拽不拆散目标、标题、图片与投放时间。 |
| 统一拖拽样式 | Banner、手选首页片单、已上榜行使用相同浅灰 ⠿+序号、悬停浅粉 #fff5fa 与整行 grab 手形;可用按钮保持 pointer。拖拽只改变所在模块编辑副本,按各自保存流程持久化。 |
| 语言 | 剧集资料仍按已有语言能力维护。榜单中文标题自动映射译名、只读预览;首页板块中文标题可补译并人工修订;demo 预设词典以外缺译回退中文,生产翻译服务另接。Banner 运营标题仅中文覆盖。题材/标签优化退出本轮。 |
| 可展示内容 | displayable=剧集已发布(demo 显示已上架)且至少一集已上架;草稿、审核中、已下架不作为可分发内容。既有不可用条目可标记保留;生产前台跳过。合集新增单集下架,不自动产生可展示内容。 |
| 原型与生产 | 当前 demo 前台不消费本轮后台变更;预览不提交输入。正式联动沿用第 04/06 章接入约定,需实际接口验证。 |
06接口职责
| 能力 | 前端责任 | 服务端需提供 | 幂等 / 去重要求 |
|---|---|---|---|
| 商品报价 | 只提交 offer_id 与目标剧集;展示服务端返回的有效报价,不自行乘算、折算或用 Demo 固定金额 | 一次返回当前弹层 / 弹框全部可售商品 offers[{offer_id, offer_type ∈ episode / drama / membership / coin, quote_id, config_version, sort, is_default_recommend, badges[{type=first_topup, priority}], first_episode, last_episode, actual_episode_count, discount_percent(全剧), duration_days, pass_until_preview, base_coins, bonus_coins, total_coins, cost_coins, prices[{channel, amount, currency, available, unavailable_reason}], compare_rank, eligibility_status ∈ eligible / ineligible / unknown, expires_at}];报价按 offer × 渠道 × 国家读取后台配价,未配置价格的渠道返回不可用(前台置灰),USDT 取 usdtPriceOverride;报价失败返回可重试错误 | 报价变化时前端回显新金额由用户再次确认;提交订单时服务端重新校验并保存快照 |
| 首充资格 | 仅在服务端确认资格时展示首充角标;资格未知或失败不展示专属奖励,可显示普通报价 | 按当前账号是否有过成功充值订单判断首充资格;返回赠送数量与到账总数 | 成功仅发一次,重复回调不重复领奖 |
| 创建订单 / 支付会话 | 主按钮点击后禁用重复提交;请求携带 request_id、purchase_intent_id、paywall_flow_id、trace_id、origin_page、offer_id、quote_id、channel、currency;直接创建支付会话并拉起渠道;失败保留原选择 |
以 request_id 去重(保留 24 小时);校验身份、商品、可用渠道;以 quote_id 校验报价是否仍有效,失效返回 QUOTE_EXPIRED 并附新报价,前端回显后由用户再次点击;返回会话 / 收银台 / 二维码;订单快照记录 quote_id 与 config_version,并将 trace_id、purchase_intent_id、paywall_flow_id、origin_page 写入 Order 新增的同名 4 列(P0 供数;Order.meta 只存网关原始报文)且回填到服务端事件公共字段 |
重复调用不重复建单;网络重试复用 request_id,新购买动作(重新支付 / 更换支付方式)生成新 request_id 与 attempt_id 并关联原 order_id(标识层级见第 04 章 4.2.8) |
| 支付结果确认 | 前端查询兜底;未知结果显示「正在确认支付结果」,查询失败提供再次查询 | 接收渠道 Webhook 并确认最终状态(成功 / 失败 / 取消 / 处理中 / 过期);过期时间取渠道返回值 | 同一订单至多成功入账 / 授予一次;前后端双报不相加,以服务端唯一订单为准 |
| 金币入账 / 会员授权益 | 到账确认前显示「支付成功,权益处理中」;确认后刷新余额或会员状态 | 金币订单确认后仅入账(基础 + 赠送一次入账);会员订单确认后授予所选周期权益并记录到期时间;失败进入补偿队列(1s / 5s / 30s / 5min / 30min 五次重试,仍失败转入现有后台【掉单处理】菜单并告警,处理复用同一 order_id);本版不支持退款 | 重复回调不重复入账;页面刷新不重复处理 |
| 金币解锁剧集 | 提交目标集、原套餐类型、quote_id 及 trace_id、purchase_intent_id、origin_page;解锁成功刷新余额、选集锁标与订单后返回原集 |
重新核价、查余额;扣金币与授予目标集永久权益在同一事务完成;创建 amount=0 的消费订单并记录实际集数、集ID与最终金币成本;trace_id / purchase_intent_id 固化到 EpisodeUnlock 与 CoinTransaction,unlock_transaction_id 回填到服务端事件 | 已拥有集不重复授予;旧报价拒绝扣费;全部已拥有不新建消费订单 |
| 观看权限(accessState) | 锁定集不直接播放;VIP 到期时重新请求,不沿用本地缓存 | 剧集信息 / 选集接口对 accessState=locked 的单集不返回播放地址;播放地址按 userId + episode_id 签发短时效签名 URL(有效期 ≤ 2 小时),HLS 分片同样校验签名或使用 CDN token 鉴权,限时权益到期后拒绝新的签发请求。按 drama_id + episode_id 返回 accessState ∈ {free, unlocked_permanent, unlocked_temporary, locked};unlocked_temporary 附 entitlementSource ∈ {time_pass, membership} 与 expiresAt(服务端时间);locked 附 priceCoins 与 canUseCoins;批量接口支持整剧一次返回,用于选集面板锁标;限时权益到期后重新判断 | 不以报价缺失或请求失败等同于已解锁 |
| 首页推荐流 | H5 首页按设备分页请求 | 按设备分页返回免费剧集 [{drama_id, episode_id, title, intro, total_count, updated_count, is_completed, position_in_feed}],不含收费集;候选规则见 H5-P01「推荐范围」 | 同一会话内不重复出现同一部剧 |
| 剧集详情与单集列表 | 选集面板、剧集介绍读取 | 返回 {drama_id, title{…}, intro{…}, cover_url, banner_url, type, progress_state, total_count, free_episode_count, episodes[{episode_id, index, title, unlock_coins, hls_url(未解锁不下发), subtitles[]}]};已下架单集不返回但保留 index | 只读 |
| 本剧看完推荐 | 完结剧末集剩余 10 秒时请求 | 入参 drama_id,按 H5-P02「本剧最后一集」行的推荐规则返回 {next_drama_id, next_episode_id, title},无候选返回空 | 只读 |
| 支付 / 解锁后回流 | 支付 / 解锁成功后不展示结果层,自动返回原集并恢复 position_ms(剧集来源的充值先自动按原方案扣币解锁);toast 提示「解锁成功 / 订阅成功」 | return_to 只允许站内白名单路径;订单可查询并支持状态补偿 | 回流成功率分母仅含剧集来源且需要回流的成功操作 |
| 支付方式偏好 | 用户手动选择渠道时写入 | 按 userId 保存 last_channel 并随报价返回 | 以最后一次写入为准 |
| 订单列表 | 订单记录页(充值记录 / 消费记录)分页读取 | 按 account_id 分页返回 [{order_id, type ∈ recharge / membership / consume / bind_reward, status, amount, currency, cost_coins, created_at, paid_at}];不匹配账号返回 404 | 只读 |
| 钱包与权益状态 | 刷新余额或会员状态 | 返回 {coin_balance, bonus_balance, balance=两桶之和, pass_until, pass_type} | 只读 |
| 账号绑定 | 绑定页 / 弹层展示 Google、Facebook、Apple、X 与账号密码方式(仅未绑定账号可进入);成功后返回来源页面并更新账号区 | 为当前 userId 增加登录方式,不创建替代账号;绑定后账号资产不受影响;首次通过第三方授权绑定成功赠送 50 金币(每 userId 一次,rule_id=bind_reward,按 userId 幂等;账号密码绑定不送;切换账号新建的账号不送;防刷规则见 4.2.5) | 每个账号每种登录方式最多绑定一个,已绑定的每种方式都可登录同一 userId;已绑定到其他账号的登录方式不能重复绑定,绑定失败并提示;取消授权后保持未绑定,可重新发起;提交失败由用户再次点击提交直至成功,服务端按已有绑定记录识别重复提交;已提交且未取消的绑定在关闭绑定页 / 弹层后继续完成 |
| 身份卡签发 / 识别登录 | 身份卡弹层展示并可保存;切换账号支持相册上传身份卡后登录(不做独立相机取景,相机不可用时只显示上传) | 签发与识别身份卡凭证;验证成功后登录对应账号 | 凭证含 userId 与账号昵称(「剧迷」+ userId 后 6 位);识别失败可重新识别,保存失败可重新保存 |
| 设备身份初始化 | 首次进入携带 device_id 请求 | 按 device_id 返回或创建 {userId, account_type, nickname, identity_card_id};失败返回可重试错误 | 同 device_id 重复请求返回同一 userId |
| 当前账号信息 | 账号区入口展示、付款后保存提示判断时读取 | 返回 {userId, account_type, nickname, bound_methods[], identity_card_saved_at, identity_reminder_shown_at, coin_balance, bonus_balance, pass_until} | 只读 |
| 快捷登录 / 账号密码登录 | 切换账号页 / 弹层提交第三方授权结果或账号密码 | 返回 {userId, new_account_created};未绑定过的第三方账号新建账号并绑定该方式,不发 bind_reward;账号密码登录失败锁定规则见 4.1.3.4 | — |
| 观看进度上报 / 恢复 | 每 5 秒及暂停 / 切集 / 离开页面 / 页面隐藏时上报 {drama_id, episode_id, position_ms};进入播放页保留剧、集、进度;返回首页同步当前进度;退出后再次进入恢复原剧、原集、原 position_ms |
按 userId × drama_id 保存最近进度 {drama_id, episode_id, position_ms, updated_at}(毫秒,与 §07 position_ms 同一单位);另返回该用户跨剧最近一条记录,供退出后再次进入恢复 |
不能只保存剧名而丢失集号或 position_ms;恢复时定位到 position_ms,|实际起播位置 − position_ms| ≤ 2000ms 计为恢复成功;本集已播完(position_ms ≥ duration − 3000)则定位到 0 |
| 字幕资源 | 按当前视频时间显示所选语言字幕;未解锁不渲染正文;本地存储记忆上次选择 | 随集信息返回 subtitles[]{lang(BCP-47:zh-Hans / zh-Hant / en / ja / ko …), url(WebVTT,SRT 由后台上传时转 VTT), version};未解锁集不下发 url;每条字幕的起止时间与文本由 VTT 文件承载 | 快速切换只采用最后一次有效选择,过期请求不得覆盖当前字幕;同步误差 ≤ 250ms;资源格式与接口字段待研发对齐 |
| 多语言与术语资源 | 界面文字统一读取语言资源,参数化文案;翻译未命中回退默认语言并记录缺失 key | 提供语言资源与内容多语言资源;沿用 glossary_version、count_value、count_status、favorited 字段;剧集信息返回 total_count、updated_count、is_completed;互动计数返回 {count_value:int, count_status ∈ ok | failed};loading 为前端请求中的本地状态,不由服务端返回;failed 时前端显示“—”并可重试 | 新增语言 key 需经产品与本地化确认 |
内容分发与后台运营模块:接口契约(开发接入)
| 能力 | 前端责任 | 服务端需提供 | 幂等 / 去重要求 |
|---|---|---|---|
| 首页板块读取 | 按 device 请求;按 sections 顺序渲染 | 返回已按 5.3.2 过滤 displayable 的 sections[{id, title{…}, style ∈ 5001/5002/5004, order, source ∈ manual | ranking, ranking_id, total, items[{dramaId, rank, title{…}, poster_url, category_id, tag_ids[], total_count, updated_count, is_completed}]}](rank:source=ranking 时 = 所引用榜名次,否则 = 运营顺序),不下发 count;source=ranking 时 items 由服务端取所引用榜的当前快照(含人工固定 / 排除);附 version |
只读;前台与 CDN 不缓存配置,每次进入读取最新 version;榜单引用板块的 items 随 5.2.5 快照更新同步刷新 |
| 栏目详情 | 传 sectionId、page;Web 每页 12 | 返回可展示内容分页与 total;页码越界返回最后一页 | 只读 |
| 题材字典 / 标签字典 | 只用 id 路由与筛选;展示名按当前语言取译名,缺译回退中文 | 返回 [{id, name{7 种前台语言}, status}];标签另提供原值→tagId 映射(兼容期) |
只读;改名不改 id |
| 内容集合与关系 | 入参 context(home / short / long / movie / variety / anime / ranking;short→短剧、long→长剧、movie→电影、variety→综艺、anime→动漫)、listId(context=ranking 必填)、categoryId、tagId、page;错误响应不得计为 0 条 |
返回 items(与「首页板块读取」items 同一卡片结构)、total、categoryCounts、tagCounts(在当前来源集合上聚合);Web 每页 24、H5 每页 9;错误返回非 2xx | 只读 |
| 榜单列表 | 入参 device | 返回 [{listId, title{…}, rule, windowDays, metric_label, has_pinned, order, status ∈ enabled / disabled / unsupported_device}] |
只读 |
| 榜单快照 | 入参 listId、device;只读快照,不在客户端计算 | 返回 {listId, rule, windowDays, snapshotAt, items[{dramaId, rank, baseRank, pinned}]};snapshotAt 为北京时间;未知或停用 list 返回 404 + LIST_UNAVAILABLE,计算失败返回 5xx,正常空返回 items=[] |
只读;服务端定时计算 |
| Banner 读取 | 入参 device;Hero 按顺序轮播,空列表回退底稿 | 返回 [{bannerId, dramaId, target_type=drama, target_id, title, imageUrl, order, start_at, end_at}],只返回开关开启且在投放期内的条目 |
只读 |
| 后台配置保存(板块 / 榜单 / Web Banner / 剧集) | 请求带 expectedVersion 与 requestId;409 时提示重新核对 | 保存有序片单、人工规则与配置;version 不一致拒绝,成功 +1,并写真实日志(result、revision) | 同 requestId 重放不重复写;生产事务,非本地存储替代 |
| 剧集合集(新建/合并已有) | 提交 sourceDramaIds、目标模式及目标 ID/新名称、最终单集有序队列、requestId 与源/目标 expectedVersion(生产语义字段,接口命名沿现网) | 单事务保存目标剧与单集;新副本新 ID、保留 originDramaId/originEpisodeId;源剧不变;新增单集下架,默认资料见 5.2.2 | requestId 幂等;同目标内按原始来源组合去重;任一版本冲突全批拒绝 |
| 上下架 | 单条 / 批量确认后提交 | 批量全成或全败,不产生部分成功 | 同 requestId 重放不重复写 |
| 榜单刷新 / 规则预览 | 列表「刷新榜单」、编辑内「按当前规则重新计算」 | 刷新写 refresh 日志;预览不落库 | — |
| 文件上传 | 图片 / 字幕本地上传 | 校验格式、大小(图片 ≤2 MiB、字幕 ≤512 KiB)与可解码尺寸,SRT 转 VTT,返回 URL | — |
| 自动翻译 | 榜单标题/首页板块名称保存后触发(不含题材、标签优化) | 按中文变化补译,保护 manual 状态 | — |
| 后台写接口鉴权 | — | 以上及「后台配置保存」所有写接口按 5.3.1 角色鉴权,403 时写 result=fail 日志 | — |
| 观看进度 / 内容交接 | 卡片交接 drama_id 与 episode_id(单集内部 ID) | 返回剧的集号最小的已上架单集 ID 与该用户本剧最近进度(drama_id, episode_id, position_ms);进度所在单集已下架时返回其后第一个已上架单集,position_ms 置 0 | 只读 |
内容分发与后台运营模块:当前联动与正式接入责任
| 关联链路 | 正式交付要求 |
|---|---|
| 首页板块 → 首页/栏目详情 | 使用服务端已保存配置,处理有效性、权限、失败重试与并发版本 |
| 排行榜设置 → 排行榜 | 接入真实统计数据、统一口径、服务端定时更新和人工规则,返回榜单快照时间 |
| 题材名称 → 题材筛选 | 接入真实题材与内容绑定,名称调整不改变筛选身份,计数与结果采用同一集合 |
| 既有标签字典 → 题材/榜内标签 | 沿用既有稳定标签ID映射及译名读取;本轮不新增后台字典维护,避免改名导致旧链接或筛选失效 |
| 剧集管理/合集 → 前端内容 | 建立内容资料、上下架、单集资源与前端目录的同步;不把“保存成功”当作同步完成 |
| Banner 图片与目标 → 首页 Hero | 接入文件存储、推荐位配置读取、投放时间及目标跳转;图片和目标保持一一对应 |
| 配置操作 → 操作日志 | 服务端记录本次范围内的操作对象、人员、时间及结果,失败不得记为成功 |
上述服务责任为开发接入契约,不要求另建后台系统。接口沿用现有服务体系;本文不指定未经确认的接口 URL,也不以本地存储结构替代生产数据库设计。
07埋点口径
7.1 公共字段
| 字段 | 类型 | 必填 | 说明 | 数仓落列 |
|---|---|---|---|---|
event_id |
string(UUID) | 是 | 事件唯一标识,用于同端幂等与去重(不能去掉前后端各一条,见 7.4 去重规则)。 | AnalyticsEvent.eventId |
event_name |
string | 是 | 事件名,以 7.2 事件字典为唯一命名源;事件名、字段名、枚举值与《数据与埋点口径核对表 v1.0》冲突时以本 PRD 7.1 / 7.2 为准,并回写核对表。以下字段按 V1.1 改名,核对表同步:surface→origin_page、trigger_type→trigger_scene、display_id→view_id、method_id→channel、idempotency_key(建单)→request_id、latency_ms(auth_result)→duration_ms、base_revision / new_revision / actor_id→revision_before / revision_after / operator_id、result_status→result。 | AnalyticsEvent.eventName |
event_time / client_ts |
datetime / int64 | 是 | 服务端接收时间与客户端毫秒时间;时延类指标不用 event_time,用事实表时间(见 7.4)。 | receivedAt / eventTs |
reporter |
enum | 是 | client | server。服务端版事件由订单 / 流水 / 权益 / 发奖表状态变更在同一事务写入分析事件出站表(新增,不复用 Meta 回传用的 TrackingEventOutbox),异步写入 AnalyticsEvent(reporter=server);落库通道与延迟 SLA 由数据平台确认(见 10.1)。 |
AnalyticsEvent.reporter |
account_id / account_type |
string / enum | 均必填 | 所有账号均有稳定 account_id(= userId,按设备 ID 分配);account_type=guest(未绑定登录方式)|registered(已绑定登录方式),两类账号权益相同。绑定后 ID 不变,不记录映射。 | userId / identityState(取值 guest / registered) |
device_id |
string | 是 | 设备标识(现网 localStorage nq_install_id),DAU / UV 按身份卡去重。 | AnalyticsEvent.deviceId |
session_id / trace_id |
string | 是 | session_id 为会话标识(现网 sessionStorage nq_sid);trace_id 为支付链路标识,每个 purchase_intent_id 生成一个 trace_id(一一对应),贯穿付费墙到回流,建单 / 解锁请求提交 trace_id,服务端写入 Order.trace_id 列 / EpisodeUnlock / CoinTransaction 并回填到服务端事件。 | sessionId / traceId(升 P0) |
flow_id |
string | 内容分发必填 | 首页 / 题材 / 排行榜页面每次进入生成,content_impression → content_click → play_request 透传。原 checkout_context_id 并入 purchase_intent_id,不再单独使用。 | AnalyticsEvent.eventExtra.flow_id |
purchase_intent_id / paywall_flow_id |
string | 支付链路必填 | purchase_intent_id 在 paywall_show / recharge_page_view 曝光时生成(一次曝光一个意图,关闭重开换新),贯穿选择、建单、支付、入账、权益、回流;paywall_flow_id 在首次 paywall_show 生成,同剧同集链路复用。两者随建单 / 解锁请求提交并写入 Order.purchase_intent_id / Order.paywall_flow_id 列(P0 供数,数仓缺口 568)。 | Order.purchase_intent_id / Order.paywall_flow_id |
platform |
enum | 是 | h5 / web / app_webview,沿用现网 surface 枚举;surface 一词只保留终端含义。 |
不单独落列,由 AnalyticsEvent.surface 映射 |
page_route / origin_page |
string / enum | 是 / 支付链路必填 | 当前路由;origin_page ∈ episode_paywall / wallet / account(发起支付的页面,建单固化,= 数仓缺口 560,建单时写入 Order.origin_page 列)。原 source / surface(wallet|episode_paywall) 一律改为 origin_page。 |
AnalyticsEvent.path / Order.origin_page |
entry_source |
enum | 否 | entry_source ∈ player / paywall / account / top_nav / history / task(进入当前页的入口,= 数仓缺口 555);recharge_entry_click.entry 保留 header / profile / insufficient_balance / other,作为事件私有字段。 |
AnalyticsEvent.entrySource |
channel_code |
string | 是 | 投放渠道,全部漏斗按渠道 / 设备拆分。 | AnalyticsEvent.channelId |
language / country_code / currency |
string | 是 | 界面语言、国家与结算币种(currency 为 ISO 4217 代码或 USDT)。 | AnalyticsEvent.eventExtra.language / country_code / currency |
app_version / experiment_id / variant_id |
string / nullable | 是 / 否 / 否 | 版本和实验分组;experiment_id / variant_id 写入 eventExtra 并同步固化到 order_attribution_snapshot(M-202)。 | AnalyticsEvent.buildVersion / eventExtra.experiment_id、variant_id |
timezone |
string(IANA) | 否 | 用户设备时区(如 Asia/Manila),仅用于用户本地时段分析;统计日口径见 7.4。 | AnalyticsEvent.eventExtra.timezone |
device_type / network_type |
string | 是 | 终端与网络环境;不得采集完整银行卡号、验证码或钱包私钥。 | AnalyticsEvent.eventExtra.device_type / network_type |
access_state / entitlement_source / expires_at |
enum / enum / datetime | 播放与支付事件必填 / 条件必填 / 条件必填 | 与第 06 章 accessState 同一枚举:access_state ∈ free | unlocked_permanent | unlocked_temporary | locked;access_state=unlocked_temporary 时附 entitlement_source ∈ time_pass | membership 与 expires_at(服务端时间)。paywall_show.trigger_scene 与 return_to_play_result 引用该枚举。 |
eventExtra.access_state / entitlement_source / expires_at |
枚举字典
以下枚举为 7.2 全部事件共用;开发与数仓不得各自定义。
| 字段 | 取值 | 映射 / 说明 |
|---|---|---|
offer_type / entitlement_type |
episode(单集)/ drama(全剧)/ membership(会员,用户可见文案 VIP)/ coin(金币档,仅 offer_type) |
§04 支付 P04 原代码:episode_bundle→episode、series→drama、day_pass→time_pass、premium→membership。数仓:Order.type=PAYWALL_PACK→episode | drama | time_pass(按 PaywallPack.unlockType)、COIN_PACK & CoinPack.mode=COINS→coin、mode=MEMBERSHIP→membership。Order.type=EPISODE 且 amount=0 → episode(金币消费)。7.4「按商品类型拆分」按此枚举。 |
trigger_scene(替代原 trigger_type) |
paywall_show.trigger_scene ∈ locked_episode_swipe / locked_episode_select / auto_next_locked / other;auth_entry_show.trigger_scene ∈ post_pay_prompt / bind_page_login_link / switch_account / other | V1.1 新定义,核对表 E-08 同步。post_pay_prompt 指付款成功后保存提示中的「绑定登录方式」入口。 |
cta_state |
unlock_one / unlock_whole / go_recharge / open_membership / pay_recharge / pay_membership |
对应 §04 支付解锁弹层三种解锁方式、余额不足转充值及两个弹框的支付按钮。 |
result |
success / fail / pending |
默认 success / fail / pending,失败细分放 error_code;例外:account_bind_confirm 另含 conflict / cancel(核对表 E-55);unlock_attempt 用 success / insufficient_balance / fail;payment_result 用 status 枚举。 |
payment_result.status |
pending / paid / failed / canceled / expired / refunded |
= 数仓 OrderStatus。refunded 仅为数仓兼容保留,本版无退款流程,不会产生(见 §04 支付 4.2.8)。 |
failure_reason |
user_left / pending / failed / entitlement_missing / redirect_error / timeout |
return_to_play_result 使用。 |
checkout_resume_result.reason |
deeplink / refresh / back / session_restore / bind |
恢复原选择的触发原因。 |
method(绑定 / 登录方式) |
google / facebook / apple / x / password;切换账号另含 identity_card(相册上传与系统选择器拍照不区分) |
account_bind_* / switch_account_* / auth_* 共用;7.4 绑定指标按 method 拆分。 |
account_bind_method_click.action |
select / close |
— |
display_count_session |
int | 本 session_id 内该剧集付费墙第 N 次可见。 |
channel / provider |
channel ∈ WECHAT / ALIPAY / VISA / USDT(Apple Pay / Google Pay / PayPal 接入后追加);provider 为服务商代码 |
= Order.channel / Order.provider;pay_channel_select、payment_start、payment_result 共用。 |
origin_page / entry_source |
见上表公共字段 | 页面来源统一用 origin_page / entry_source;组件内入口位置用事件私有字段 entry,取值在各事件行列举;不得使用 source / surface 表示来源。 |
7.2 事件字典
| 模块 | 事件名 | 触发时机 | 业务字段(公共字段外) | 上报端 | 采样 | 关联需求 |
|---|---|---|---|---|---|---|
| 播放 | route_view | 页面路由切换(现有事件,页面 UV 主源) | path, referrer_path |
前端 | 100% | M-222 分母 / 各页面 UV |
| 播放 | play_request / video_first_frame | 播放请求发出 / 首帧渲染(现有事件,补 play_attempt_id) | play_attempt_id, drama_id, episode_id, ttff_ms, result, error_code, impression_id, flow_id |
前端 | 100% | H5-P01 / PC-P01 / 9.1 |
| 播放 | player_control | 用户触发播放 / 暂停(核对表 E-50) | action=play|pause, latency_ms, result, drama_id, episode_id, play_session_id |
前端 | 100% | 9.1 播放 / 暂停时延与成功率 |
| 播放 | episode_next | 切集完成或失败时(核对表 E-20) | next_type=auto|click|swipe|end_recommend(末集推荐跳转), end_trigger=auto|swipe|card(仅 next_type=end_recommend 时,核对表 E-95 注), from_index, to_index, drama_id, to_drama_id, to_episode_id, is_same_drama, latency_ms(切集操作到集数 UI 更新), result, error_code;同剧切集成功率(M-212)分母剔除 next_type=end_recommend |
前端 | 100% | H5-P02 / 9.1 同剧切集 |
| 播放 | end_recommend_card_show | 末集推荐卡可见(完结剧末集 / 连载剧最新集剩余 10 秒) | drama_id, episode_id, to_drama_id, series_status=completed|ongoing, impression_id;点击 / 上滑 / 播完后的跳转由 episode_next(next_type=end_recommend, end_trigger) 记录 | 前端 | 100% | H5-P02(核对表 E-95) |
| 播放 | fullscreen_toggle | 进入 / 退出全屏播放 | drama_id, episode_id, action=enter|exit, trigger=button|close|back|leave_page, content_orientation=landscape|portrait, position_ms | 前端 | 100% | H5-P09(核对表 E-96) |
| 播放 | share_click | 点击分享入口(后续分享流程沿用现网) | drama_id, episode_id, entry=player_rail|feed|web_player | 前端 | 100% | H5 / Web 播放页(核对表 E-97) |
| 全站 | app_banner_show / app_banner_click | H5 顶部下载 App 提示条可见(同一会话同一路由只记一次)/ 点击「下载」或「✕」 | page_route, impression_id;app_banner_click 另带 action=download|close | 前端 | 100% | H5-G01(核对表 E-94) |
| 福利 | task_center_view | 任务中心或任务摘要可见 | entry(含 watch_reward_capped:观看奖励领满后点击金币挂件进入), claimable_count, completed_count, login_state;页面 UV 主源仍为 route_view | 前端 | 100% | H5-G03(核对表 E-80) |
| 福利 | task_claim_result | 领取奖励结果返回(单项领取或「全部领取」) | task_id, claim_mode=single|all, claimed_task_ids[], total_reward_coins, result, reward_coins, balance_before, balance_after, error_code, reporter=client|server;「全部领取」一次请求按 claim_mode=all 上报一条;双报以服务端为准,不相加 | 前端 | 100% | H5-G02(核对表 E-82) |
| 播放 | subtitle_panel_show / subtitle_language_change | 字幕面板可见;字幕语言变更 | entry=quick|settings, from_language, to_language, result |
前端 | 100% | H5-P07 / PC-P04(核对表 E-87 / E-88) |
| 播放 | comment_submit_result | 评论提交请求返回时 | drama_id, episode_id, result, error_code, comment_count_after |
前端 | 100% | INT-01(核对表 E-89) |
| 播放 | favorite_action | 收藏 / 取消收藏 / 打开收藏列表(核对表 M-225 分子分母) | drama_id, action=add|remove|open, result |
前端 | 100% | 2.1 收藏跨端同步率 / 7.4 |
| 播放 | like_action | 点赞 / 取消点赞请求返回时 | drama_id, episode_id, action=like|unlike, result |
前端 | 100% | PC-P03 / H5-P01 |
| 账号 | register_success | 服务端按设备 ID 自动注册成功(核对表 E-07 服务端版) | user_id, device_id, method=device_auto, channel_code |
服务端 | 100% | H5-A01 / PC-A01 |
| 账号 | auth_entry_show | 认证 / 登录入口可见(核对表 E-08) | trigger_scene, entry ∈ post_pay_prompt / bind_page / switch_account, auth_flow_id |
前端 | 100% | H5-A04 / PC-A04 |
| 账号 | auth_result | 登录 / 认证结果返回(核对表 E-13) | method, result, error_code, auth_flow_id, duration_ms |
前端+服务端 | 100% | M-223 核心操作计数 |
| 账号 | auth_return | 认证完成后回到来源页(核对表 E-14) | auth_flow_id, return_to, result |
前端 | 100% | — |
| 账号 | auth_abandon | 认证流程中途关闭或超时(核对表 E-15) | auth_flow_id, stage, reason |
前端 | 100% | — |
| 账号 | identity_card_show / identity_card_save_click | 身份卡弹层实际可见时;点击“保存身份卡”按钮时(一次点击一条) | account_id, account_type, platform, impression_id, entry=profile|post_pay_prompt, bound_providers[], result, error_code |
前端 | 100% | H5-A02 / PC-A02;保存点击记录用于运营统计下载用户数(「保存身份卡 / 绑定」提示以 identity_reminder_shown_at 判断) |
| 账号 | account_bind_show | 绑定页 / 弹层可见(核对表 E-53) | entry=h5_bind_page|pc_bind_modal, source ∈ profile / post_pay_prompt / switch_account_link, methods_available[], identity_state, auth_flow_id |
前端 | 100% | H5-A03 / PC-A03 |
| 账号 | account_bind_method_click | 点击某绑定渠道或关闭(核对表 E-54) | method, action=select|close, entry, source, auth_flow_id |
前端 | 100% | H5-A03 / PC-A03 |
| 账号 | account_bind_confirm | 绑定确认提交;服务端结果返回时补 result(核对表 E-55 / M-211) | method, result=success|conflict|fail|cancel, error_code, duration_ms, auth_flow_id, source, assets_snapshot_before, assets_snapshot_after, bind_reward_granted |
前端+服务端 | 100% | H5-A03 / PC-A03 / 9.1 绑定成功率 / 支付 4.2.5 绑定奖励 |
| 账号 | switch_account_show | 切换账号页 / 弹层可见(核对表 E-56) | entry ∈ profile / bind_page_login_link, methods_available[], auth_flow_id |
前端 | 100% | H5-A04 / PC-A04 |
| 账号 | switch_account_method_click | 点击登录方式(含身份卡上传 / 拍照)(核对表 E-57) | method, auth_flow_id |
前端 | 100% | H5-A04 / PC-A04 |
| 账号 | switch_account_confirm | 登录结果返回(核对表 E-58) | method, result, error_code, new_account_created, auth_flow_id |
前端+服务端 | 100% | H5-A04 / PC-A04 |
| 支付 | paywall_show | 沿用现网 paywall_show(PaywallEventLog),改为每次可见一次曝光:同一次渲染按 impression_id 去重,关闭重开新 impression_id;meta 补 impression_id、paywall_flow_id、purchase_intent_id 等(核对表 E-26)。自本版上线日起 M-120 分母切换为按 impression_id 去重计数,上线日前数据沿用旧口径不回溯 | impression_id, purchase_intent_id, paywall_flow_id, display_count_session, drama_id, episode_id, position_ms, trigger_scene, access_state, balance_before, account_type, offer_ids[], origin_page=episode_paywall |
前端 | 100% | 支付 P04 / PAY-02 |
| 支付 | offer_select | 点击解锁弹层的解锁方式,或在充值 / VIP 弹框选择档位(单集、全剧、会员、金币档;核对表 E-60,原 paywall_offer_select / coin_pack_select / membership_plan_select 合并;现网 paywall_package_click 保留仅对账) | impression_id, purchase_intent_id, offer_id, offer_type, tier_id / plan_id(可选别名), duration_days, episode_count, base_coins, bonus_coins, total_coins, cost_coins, amount, currency, auto_renew, is_first_purchase, selection_source=manual|auto_shortfall, origin_page |
前端 | 100% | 支付 4.2.6 / 4.2.7 / 4.2.10 |
| 支付 | paywall_cta_click | 点击解锁弹层的解锁方式,或点击充值 / VIP 弹框的支付按钮(核对表 E-59) | impression_id, purchase_intent_id, paywall_flow_id, offer_id, offer_type, cta_state, balance_before, missing_coins, selection_source, original_access_offer_id, quote_coins, recommended_tier_id, origin_page |
前端 | 100% | 支付 P04 / 2.6 / 2.10 |
| 支付 | checkout_action_view | 解锁弹层或充值 / VIP 弹框实际可见且所选档位或按钮状态改变时(以购买意图、商品、状态、显示 ID 去重) | purchase_intent_id, offer_id, offer_type, cta_state, amount, currency, duration_days, cost_coins, missing_coins, action_position=unlock_panel|recharge_modal|vip_modal, view_id |
前端 | 100% | 支付 4.2.10 / 7.6 |
| 支付 | recharge_entry_click | 点击任一充值入口(核对表 E-44,M-201 分子) | entry=header|profile|insufficient_balance|other, origin_page |
前端 | 100% | 支付 PAY-01 / 7.4 用户中心充值转化率 |
| 支付 | recharge_page_view | 金币充值弹框或 VIP 弹框可见 | purchase_intent_id, origin_page=wallet|episode_paywall, balance_before, return_to, default_offer_id |
前端 | 100% | 支付 PAY-01 / 2.14 |
| 支付 | offer_quote_result | 商品报价返回后(报价失败不得计为 0 价格成功) | quote_id, config_version, offer_id, offer_type, configured_episode_count, actual_episode_count, remaining_episode_count, shortfall_policy, cost_coins, amount, currency, base_coins, bonus_coins, total_coins, result |
前端 | 100% | 支付 4.2.6 / 4.2.7 / BE-01 |
| 支付 | reward_eligibility_result | 首充资格校验完成后(不采集完整支付记录) | campaign_id, rule_id, eligibility_type=first_topup, eligible, ineligible_reason, quote_id, result |
前端 | 100% | 支付 4.2.7 首充资格 |
| 支付 | reward_badge_show | 符合资格且角标实际可见时(隐藏角标不记曝光) | campaign_id, rule_id, offer_id, badge_type, position, impression_id, eligibility_result ∈ eligible / ineligible / unknown, quote_id, purchase_intent_id |
前端 | 100% | 支付 4.2.7 |
| 支付 | offer_default_select | 默认商品确定时(自动默认与手动选择分开统计;无选中项记录失败原因) | rule_id, offer_type, offer_id, balance, quote_id, default_source=first_topup|configured_coins|configured_membership|lowest_coins|lowest_membership|shortfall_min_pack, manual_override, campaign_id, first_topup_eligible, eligibility_result, config_version, origin_page, result |
前端 | 100% | 支付 4.2.12 / 4.2.14 / 9.3 用例 13(核对表 E-92) |
| 支付 | payment_method_default_select | 默认支付渠道确定时 | history_available, language, channel, fallback_reason, origin_page, result |
前端 | 100% | 支付 4.2.13(核对表 E-93) |
| 支付 | pay_channel_select | 用户选择支付渠道(核对表 E-31,原 payment_method_select 改名) | purchase_intent_id, channel, provider, amount, currency, country_code, device_support |
前端 | 100% | 支付 P01 / 2.8 / 2.13 |
| 支付 | checkout_resume_result | 绑定成功或刷新后恢复原选择完成(成功率按同一意图去重) | purchase_intent_id, reason=deeplink|refresh|back|session_restore|bind, expected_offer_id, actual_offer_id, channel, result, error_code |
前端 | 100% | 支付 PAY-03 / 9.3 用例 14 |
| 支付 | payment_order_create | 创建订单请求与结果(服务端版即 Order.createdAt 事实,指标取 reporter=server) | order_id, offer_id, offer_type, channel, result, error_code, request_id, attempt_id, purchase_intent_id, quote_id, trace_id, origin_page, duration_ms |
前端+服务端 | 100% | 支付 4.2.7 / 4.2.8 标识层级 |
| 支付 | payment_start | 跳转 payUrl / 打开收银台时(核对表 E-42;网关回跳 / 关闭收银台 / 超时由 payment_result 记) | order_id, attempt_id, purchase_intent_id, channel, provider, offer_id, amount, currency, market, scene, origin_page |
前端 | 100% | 支付 4.2.8 |
| 支付 | payment_provider_open | 支付服务商页面 / 弹层成功拉起 | order_id, attempt_id, purchase_intent_id, origin_page, provider, open_result, duration_ms |
前端 | 100% | 支付 4.2.8 / M-223 终点 |
| 支付 | payment_result | 支付最终状态(客户端版记回跳 / 关闭 / 超时;服务端版 = Order 状态变更事实,含 paid_at) | order_id, attempt_id, purchase_intent_id, origin_page, status, provider_code, amount, currency, pay_duration_ms, retry_count, paid_at(server), reporter |
前端+服务端 | 100% | 支付 4.2.8 / 9.3 用例 05 |
| 支付 | unlock_attempt | 金币解锁 / 畅看兑换请求返回成功 / 失败时(一次请求一条,点击由 paywall_cta_click 记;核对表 E-43) | unlock_transaction_id, order_id, purchase_intent_id, quote_id, method=coins, unlock_mode=one|whole, result=success|insufficient_balance|fail, reason, owned_count, target_episode_ids, cost_coins, balance_before, balance_after, trace_id |
前端 | 100% | 支付 4.2.6 / M-190 金币解锁成功率 |
| 支付 | coin_unlock_finish / auto_unlock_triggered | 现网已有事件,仅用于与 unlock_attempt 对账;M-120 分母需扣除 auto_unlock_triggered | unlock_transaction_id, drama_id, episode_id, auto |
前端 | 100% | —(现有,仅对账) |
| 支付 | post_payment_action | 独立充值来源点击结果页按钮;剧集来源不展示结果层,由前端在自动回流时上报(trigger=auto) | action=return_account|resume_access|return_episode|view_orders, order_id, original_access_offer_id, trigger=click|auto |
前端 | 100% | 支付 4.2.7 / 4.2.8 |
| 支付 | return_to_play_result | 支付 / 解锁 / 认证 / 绑定后回原剧播放,或退出后重新进入恢复进度(核对表 E-48) | trigger=payment|unlock|auth|bind|reenter, order_id, unlock_transaction_id, purchase_intent_id, paywall_flow_id, origin_page, drama_id, episode_id, target_position_ms, actual_position_ms, result, failure_reason;trigger=payment|unlock 时权益生效后 10 秒内未出首帧记 result=fail, failure_reason=timeout |
前端 | 100% | 支付 4.2.8 / 9.1 退出后恢复 / 7.4 回流成功率 |
| 支付 | order_history_view | 进入订单记录 | entry, order_count, latest_order_status |
前端 | 100% | 支付 P07 |
| 服务端 | wallet_credit_result | 金币入账事务完成或失败(= CoinTransaction 事实) | order_id, idempotency_key(=CoinTransaction.idempotencyKey), trace_id, purchase_intent_id, origin_page, balance_before, base_coins, bonus_coins, balance_after, coin_balance_after, bonus_balance_after, credited_at, result, latency_ms |
服务端 | 100% | 支付 4.2.7 / 7.4 到账时延 |
| 服务端 | entitlement_unlock_result | 剧集 / 整剧 / 限时 / 会员权益授予(= EpisodeUnlock / 会员授予事实) | order_id, unlock_transaction_id, trace_id, purchase_intent_id, origin_page, entitlement_type, drama_id, first_episode, last_episode, duration_days, cost_coins, result |
服务端 | 100% | 支付 4.2.6 / 4.2.7 |
| 服务端 | reward_grant_result | 奖励发放完成后(首充 / 绑定奖励;按 grant_id 去重) | order_id, purchase_intent_id, origin_page, campaign_id, rule_id(=CtRewardGrant.ruleCode), grant_id(=CtRewardGrant.grantId), idempotency_key(=CtRewardGrant.idempotencyKey), bonus_coins, result, error_code |
服务端 | 100% | 支付 4.2.7 / 4.2.5 绑定奖励 / 7.5 |
| 内容分发 | content_impression | 首页板块 / Hero / 榜单 / 题材结果卡片 ≥50% 可见且持续 ≥1 秒,同一页面实例同一卡片只记一次(核对表 E-33) | impression_id, section_id, section_type=hero|section|ranking|category, position_id, rank, drama_id, ranking_version, config_version, flow_id, is_preview(is_preview:从后台预览打开时为 true,全部指标剔除) |
前端 | 100% | 4.3.1 首页 / 4.3.3 排行榜 |
| 内容分发 | content_click | 点击内容卡片交接(核对表 E-34) | impression_id, section_id, section_type, position_id, rank, drama_id, episode_id, ranking_version, config_version, flow_id, is_preview |
前端 | 100% | 4.3.1 首页 / 4.3.2 题材 / 4.3.3 排行榜 |
| 内容分发 | ranking_tab_switch | 切换四榜切换项 | list_id, rule, ranking_version, is_preview |
前端 | 100% | 4.3.3 排行榜(核对表 E-90) |
| 内容分发 | discovery_query_result | 题材 / 标签筛选结果返回(核对表 E-47) | request_id, query_kind=search|filter, context, category_id, tag_ids[], result_count(=0 表示空结果;空结果率 = result=success 且 result_count=0 ÷ 全部), latency_ms, result |
前端 | 100% | 4.3.2 题材 |
| 内容分发 | banner_click | 点击 Hero Banner | banner_id, target_type, target_id, position, is_preview |
前端 | 100% | 后台 5.2.6 / 内容分发 4.3.1 Hero(核对表 E-91) |
| 内容分发 | banner_switch | Hero Banner 切换展示项时(自动轮播、箭头或缩略图点击) | banner_id, from_position, to_position, trigger=auto|click|thumb, is_preview |
前端 | 100% | 内容分发 4.3.1 Hero |
| 后台运营 | ops_change_result | 后台保存 / 上下架 / 合集 / 调序 / 刷新请求得到服务端结果时(成功与失败都记;核对表 E-49) | object_type=drama|ranking|banner|homepage_section, object_id, action(取值待定,与 5.2.8「操作」一致), operator_id, result, error_code, config_version, revision_before, revision_after, effective_at, latency_ms, object_count |
服务端 | 100% | 5.2.8 操作日志 / CROSS-11 |
7.3 页面分支埋点补充(支付)
| 分支 | 事件 / 时机 | 新增字段与判断 |
|---|---|---|
| 主动绑定入口 | account_bind_show / account_bind_confirm(7.2) |
个人中心或付款后提示中由用户点击进入,均属主动,携带 account_id、account_type、method、source、result;不得在支付成功后自动打开绑定页。 |
| 恢复原选择 | checkout_resume_result(7.2),绑定成功或刷新后恢复完成 |
purchase_intent_id、reason、expected_offer_id、actual_offer_id、channel、result、error_code;成功率按同一意图去重。 |
| 余额不足转充值 | paywall_cta_click 与 offer_select(7.2) |
增加 selection_source=auto_shortfall|manual、original_access_offer_id、quote_coins、missing_coins、recommended_tier_id。自动推荐单独归类,不计为用户主动选档点击。 |
| 金币解锁请求 | unlock_attempt 解锁请求返回时(一次请求一条,点击由 paywall_cta_click 记);entitlement_unlock_result 服务端完成 |
unlock_transaction_id、order_id、purchase_intent_id、quote_id、method、owned_count、target_episode_ids、cost_coins、balance_before/after、result。order_id 为消费订单号(金币解锁与畅看均创建 amount=0 的消费订单,见支付 4.2.6);金币解锁链路 join 键 = unlock_transaction_id(= EpisodeUnlock.unlockId / CoinTransaction.id)。 |
| 支付/到账结果 | 既有建单、支付、入账、权益事件(7.2) | 统一携带 origin_page、purchase_intent_id、attempt_id、order_id、trace_id、reporter=client|server。最终支付成功以服务端唯一订单为准,不将前后端双报相加;指标取 reporter=server(见 7.4 去重规则)。 |
| 充值后回付费墙 | post_payment_action(7.2)独立充值来源点击结果页按钮;剧集来源不展示结果层,由前端在自动回流时上报(trigger=auto) |
action=return_account|resume_access|return_episode|view_orders、order_id、original_access_offer_id、trigger。只回付费墙不算播放恢复成功。 |
本表新增事件与既有字典均按100%上报。来源页面、购买意图和用户身份贯穿整个链路。付费转化仅统计该付费墙曝光后由同一购买意图产生的成功支付;金币余额直接解锁另计“金币解锁成功率”。回流成功率的分母仅包含剧集来源、需要回流的成功操作;独立充值完成不进入该分母。账号绑定是独立可选操作,不进入支付漏斗的必经步骤。
7.4 核心指标口径
统计日一律按 Asia/Shanghai(北京时间)自然日;事件以 AnalyticsEvent.eventDateSh 归日;成交类(付费用户、GMV、付费转化)按 Order.paidAt 归窗,建单类与订单支付成功率按 Order.createdAt 归窗;时延类用事实表时间差。按 Order.status=paid 统计的订单类指标(订单支付成功率、付费转化率、GMV 等)统一加 amountCents>0 过滤,排除金币解锁 / 畅看产生的消费订单(amount=0,创建即记 PAID)。
| 指标 | 计算口径 | 主源 | 说明 |
|---|---|---|---|
| 绑定页人均展示次数 | 统计期 account_bind_show 次数 / 打开绑定页的账号去重数 | 事件 | 仅统计主动打开的绑定流程,按 source 拆分,不作为支付漏斗前置步骤。 |
| 绑定转化率 | account_bind_confirm(result=success) 账号数 / account_bind_show 账号数 | 事件 | 按 method(google / facebook / apple / x / password)与 source 拆分;与支付转化分别统计。 |
| 绑定成功率 / 资产一致率 | 绑定成功率 = account_bind_confirm(result=success) ÷ account_bind_confirm(result∈{success, fail}),cancel 与 conflict 单列占比;资产一致率比对 金币两桶余额、已购剧集、VIP pass_until、观看历史条数、收藏、点赞、评论条数、任务进度,= 全部一致的绑定数 ÷ 成功绑定数;身份卡保存率 = identity_card_save_click(result=success) 去重账号 ÷ identity_card_show 去重账号;切换账号成功率 = switch_account_confirm(result=success) ÷ switch_account_confirm(result∈{success, fail}) | 事件 + 服务端资产快照 | = 核对表 M-211;目标见 9.1(绑定成功率 ≥ 99% / 资产一致率 100%);按 source 拆分。 |
| 付费墙→创建订单率 | payment_order_create(reporter=server, result=success) 去重用户 ÷ paywall_show 去重用户 |
服务端事实(Order.createdAt) | = 核对表 M-219;按 offer_type 与余额充足状态拆分。 |
| 付费墙曝光次数 | paywall_show 按 impression_id 去重计数 − auto_unlock_triggered 次数 |
事件 | = 核对表 M-120;自本版上线日起按 impression_id 计数,上线日前数据沿用旧口径不回溯。 |
| 订单支付成功率 | Order.createdAt 落窗且 amountCents>0 的订单中,status∈{PAID, REFUNDED} ÷ status∈{PAID, REFUNDED, FAILED, EXPIRED(claimClosedAt 非空)};剔除 CANCELED、PENDING | 服务端事实(Order.status) | = 核对表 M-076;不用前端 payment_result 计数。 |
| 付费转化率 | origin_page=episode_paywall 的 purchase_intent_id 下 Order.status=paid 且 amountCents>0 的去重用户 ÷ paywall_show 去重用户 | 服务端事实 + 事件 | 新付费用户与全部付费用户分开统计。 |
| 金币解锁成功率 | unlock_attempt(result=success) ÷ unlock_attempt 总数 |
事件 | = 核对表 M-190;余额不足另计 insufficient_balance 占比。 |
| 到账时延 P95 | p95(wallet_credit_result.credited_at − Order.paidAt),同 order_id |
服务端事实(CoinTransaction.createdAt − Order.paidAt) | = 核对表 M-221;仅统计 Order.type=COIN_PACK 且 CoinPack.mode=COINS、法币渠道(微信 / 支付宝 / VISA)的金币充值,USDT 单独统计;目标≤5秒。 |
| 支付后回流成功率 | origin_page=episode_paywall 且至少有一笔 Order.status=paid(amountCents>0)或 entitlement_unlock_result(result=success) 的 purchase_intent_id 中,最后一条 return_to_play_result(trigger∈{payment, unlock}) 为 result=success 的意图数 ÷ 上述意图数 | 事件 + 服务端事实 | = 核对表 M-206;回流窗口 = 权益生效后 10 秒内出首帧,超过 10 秒记 failure_reason=timeout 并计入分母;独立充值(origin_page=wallet)不进分母;线上分别看 user_left / pending / failed / entitlement_missing / redirect_error / timeout 占比。验收用例目标 100%。 |
| 付费墙→拉起支付核心操作次数 | 同一 purchase_intent_id 内 offer_select(selection_source=manual) + paywall_cta_click + pay_channel_select 的次数,截至该意图第一条 payment_provider_open(open_result=success) | 事件 | = 核对表 M-223;目标 ≤ 3(§02 2.1)。 |
| 重复扣款 / 重复入账 / 重复发放次数 | count((EpisodeUnlock.userId, EpisodeUnlock.episodeId) having>1) + count((CoinTransaction.orderId, CoinTransaction.bucket) having>1 where reason=PURCHASE) + count(CoinTransaction.idempotencyKey having>1) + count(CtRewardGrant.idempotencyKey having>1) | 服务端事实 | = 核对表 M-224;目标 0 次(§02 2.1)。 |
| 收藏跨端同步率 | Favorite 写入成功后,5 秒窗口内同一 userId 在另一 platform 的首次收藏状态读取结果与 Favorite 表一致的次数 ÷ 有对端读取的收藏写入次数;由服务端对账任务判定 | 事件 + 服务端 Favorite 表 | = 核对表 M-225;目标 ≥ 99.9%(§02 2.1),作为上线标准。 |
| 用户中心充值转化率 | origin_page=account 且 Order.status=paid 的去重用户 ÷ route_view(path=个人中心路由) 去重用户 |
服务端事实 + route_view | = 核对表 M-222;同时观察 recharge_entry_click(entry=profile) 点击率与建单率。 |
impression_id 防止同一次渲染重复上报,但用户关闭后重新打开必须记录为新一次展示。
- 主源与 reporter:建单 / 支付 / 入账 / 权益 / 发奖五类指标分子分母一律取 reporter=server 记录(服务端版即订单 / 流水 / 权益 / 发奖表状态变更在同一事务写入分析事件出站表后异步写入 AnalyticsEvent 的事件,不复用 TrackingEventOutbox,不另埋);reporter=client 仅用于漏斗时延与前端失败归因;前后端 result 冲突以服务端为准。
- join 键:现金链路 = order_id;金币解锁链路 = unlock_transaction_id(= EpisodeUnlock.unlockId / CoinTransaction.id),entitlement_unlock_result、return_to_play_result、unlock_attempt 均携带 unlock_transaction_id 且 order_id 允许空;同 (event_name, reporter, order_id | unlock_transaction_id) 多条按 event_time 取最后一条。
- 两类幂等键:request_id 为建单幂等键(payment_order_create);idempotency_key 为入账 / 发奖幂等键(wallet_credit_result = CoinTransaction.idempotencyKey,reward_grant_result = CtRewardGrant.idempotencyKey),用途不同不可混用。
- 前端队列:本地队列上限 200 条,超出丢最旧的非支付 / 非账号事件,支付与账号事件不丢;失败指数退避重试最多 5 次(1s 起),耗尽后写 localStorage 待下次启动补发;pagehide / 拉起外部支付前用 sendBeacon 冲刷队列;ACK = ingest 接口 2xx;支付成功 / 入账 / 权益 / 发奖以服务端事件为 100% 主源,前端同名事件允许缺失并在对账时以服务端为准。
7.5 配置报价与奖励资格埋点补充(支付)
| 事件 / 字段 | 触发与口径 |
|---|---|
offer_quote_result(7.2) |
商品报价返回后上报:quote_id、config_version、offer_id、offer_type、configured_episode_count、actual_episode_count、remaining_episode_count、shortfall_policy、cost_coins、amount、currency、base_coins、bonus_coins、total_coins、result。报价失败不得计为0价格成功。 |
reward_eligibility_result(7.2) |
资格校验完成后上报 campaign_id(= §05 活动配置主键)、rule_id(= CtRewardGrant.ruleCode)、eligibility_type(first_topup)、eligible、ineligible_reason、quote_id;不采集完整支付记录。未知、失败、不符合分别记录。 |
reward_badge_show(7.2) |
角标实际可见时上报 campaign_id、rule_id、offer_id、badge_type、position、impression_id、eligibility_result、quote_id 及 purchase_intent_id;隐藏角标不记曝光。 |
reward_grant_result(7.2) |
服务端奖励发放完成后上报 order_id、campaign_id、rule_id、grant_id(= CtRewardGrant.grantId)、idempotency_key、bonus_coins、result、error_code;按 grant_id 去重,M-227 用 rule_id × userId 判重复发放。金币充值总入账事件与赠送发放事件不得相加计算到账总金币。绑定奖励(支付 4.2.5)rule_id=bind_reward。 |
验收要求:配置报价与页面、订单、到账金额一致率100%;count(reward_badge_show where eligibility_result≠eligible) = 0;同一奖励资格重复发放次数为0;订单权益数量与实际授予数量一致率100%。
7.6 解锁弹层与充值 / VIP 弹框埋点补充(支付)
沿用现有选择、点击及支付事件,补充 origin_page=wallet|episode_paywall、offer_type、plan_id、duration_days、cost_coins、amount、currency、cta_state、balance_before、missing_coins、action_position=unlock_panel|recharge_modal|vip_modal、selection_source=manual|auto_shortfall。会员计划改变触发一次选择事件;仅切换档位不记录支付发起。
checkout_action_view(7.2):解锁弹层或充值 / VIP 弹框实际可见且所选档位或按钮状态改变时记录曝光,以购买意图、商品、状态和本次显示ID去重;滚动与无状态变化的重绘不重复上报。金额、周期和不足差额与同一时刻页面内容一致。
7.7 身份与默认选择埋点(支付)
身份卡保存事件以本 PRD 7.2 为准(对应核对表 E-51 / E-52):identity_card_show(E-51,身份卡弹层曝光)与 identity_card_save_click(E-52,点击“保存身份卡”);原支付 PRD 的 passport_download_request / passport_download_result 并入 identity_card_save_click(仅代表保存触发结果,不代表文件已落盘),字段见 7.2。不得上报身份卡内容或恢复令牌。运营按 identity_card_save_click 去重账号数统计身份卡下载用户数;点击保存身份卡时同步调用服务端写入 identity_card_saved_at;充值 / 订阅 / 解锁成功后是否弹出「保存身份卡 / 绑定登录方式」提示读取 bound_methods、identity_card_saved_at 与 identity_reminder_shown_at 判断(规则见支付 4.2.5),identity_card_save_click 仅用于统计。
默认选择事件 offer_default_select(7.2)记录 rule_id、offer_type、offer_id、balance、quote_id、default_source、manual_override;payment_method_default_select(7.2)记录 history_available、language、channel、fallback_reason。自动默认与用户主动选择分开统计,两页面携带 origin_page。个人中心充值的 offer_default_select 补充 campaign_id(= §05 活动配置主键)、rule_id(= CtRewardGrant.ruleCode)、first_topup_eligible、eligibility_result、config_version(= 5.1 报价配置版本)及 default_source=first_topup|configured_coins|configured_membership|lowest_coins|lowest_membership|shortfall_min_pack;无选中项记录失败原因,不计为成功默认选择。
7.8 支付验收补充
覆盖未绑定 / 已绑定登录方式的账号均可直接付款且权益相同;未绑定账号的绑定与下载入口;绑定后资产及渠道偏好保留;解锁本集 / 解锁本剧剩余全集余额充足与不足、余额不足时可补足与无可补足档位;历史支付方式有效/失效、无历史默认 VISA、VISA 不可用及设备不可用。金币充值弹框另需覆盖:首充资格符合/不符合/查询中/失败、有 / 无默认推荐档、无默认推荐取最低价档、无可售档位及提交时首充资格失效;VIP 弹框覆盖有 / 无默认推荐计划、无默认推荐取最低价计划。两个弹框相同历史渠道条件的支付方式默认结果必须一致。所有分支默认结果应唯一,不能未经点击自动创建订单。
08异常边界
8.1 播放模块必须处理的异常状态
| 异常 / 边界 | 处理要求 | 关联需求 |
|---|---|---|
| 下一集不存在(完结剧末集) | 末集剩余 10 秒在底部选集入口下方弹出推荐卡(封面;「本剧已看完,接下来看」/ 推荐剧名 / 集数;「上滑继续看」);播完自动进入推荐剧第 1 集,末集上滑、点击推荐卡同样进入该推荐剧第 1 集(同标签随机剧的第 1 集,排除第 1 集收费的剧;无同标签剧时在热播榜随机选择一部);不再出现「已到最后一集」停止提示。 | H5-P02 |
| 连载 / 暂停剧看到最新更新集 | 同完结剧自动进入推荐剧第 1 集;推荐卡首行为「本剧更新至 N 集,接下来看」,按钮为「去看看」;推荐不到剧时停留并显示「已更新至第 N 集,敬请期待」。 | H5-P02 |
| 锁定集网络失败 | ① accessState 或报价请求失败——不播放,解锁弹层显示「加载失败,重试」;② 解锁 / 扣币请求超时或断网——按钮保持禁用,用同一 request_id 查询结果(最多 3 次,间隔 2 秒):服务端已扣币授权则按解锁成功回流播放;确认未扣币则提示「网络异常,未扣币,请重试」;查询仍失败则提示「结果确认中」,刷新后按 accessState 恢复。 | H5-P02 / H5-P04 / PC-P02 |
| VIP 刚到期 | 客户端在进入播放页、切集、页面从后台恢复或刷新、服务端 expiresAt 到点时重新请求 accessState,不能继续使用本地 VIP 缓存;expiresAt 到点时当前集播完前不打断,切下一集按新结果处理;客户端不自行计算到期,只信服务端时间。 | H5-P04 / PC-P02 |
| 视频加载 / 播放失败 | 播放区中央显示错误态:图标 +「视频加载失败」+ 按钮「重新播放」,点击后从已保存进度重载;选集与返回保持可用。 | H5-P02 / PC-P01 |
| 首页推荐流首帧加载 / 视频失败 / 推荐为空 | 首帧加载中显示封面占位与加载中;视频失败显示「加载失败,请重试」+ 重试按钮;推荐为空显示空态并提供重试。 | H5-P01 |
| 语言资源缺失 | 回退默认语言并记录缺失 key,不展示裸 key 或服务端堆栈。 | V01 |
| 计数未返回 / 请求失败 | 使用加载或失败状态,不用 0 代替未返回或失败的数据。 | V02 / INT-01 |
| 英文文案过长 | 优先伸缩或按词换行,不能遮挡字幕、截断动作词或缩至不可读。 | V02 |
| 字幕所在时间段为空 | 隐藏字幕正文,保留语言选择;不残留上一句,不按播放故障处理。 | H5-P08 / PC-P04 |
| 当前内容未解锁 | 不渲染或预览字幕正文,语言偏好保留;解锁后按目标内容与实际进度恢复。 | H5-P07 / H5-P08 / PC-P04 |
| 本地存储不可用 | 当次会话仍可切换字幕;不承诺关闭后的记忆,不以存储失败阻断播放。 | H5-P08 / PC-P04 |
8.2 播放模块字幕资源异常与平台边界
| 情况 | 处理要求 | 待确认内容 |
|---|---|---|
| 本集没有字幕资源 | 保留关闭字幕选项,显示“暂无可用字幕”;不列出不存在的语种,不阻断视频。 | 资源清单、空态文案及入口呈现。 |
| 切集后缺少偏好语种 | 当前集按默认规则显示(本集有界面语言字幕则开启该语种,没有则关闭字幕),并提示该语种不可用;保留用户偏好,后续集有该语种时恢复。 | — |
| 字幕下载 / 解析失败 | 提示“字幕加载失败,点击重试”,自动重试 1 次,视频不中断。不得用上一集或另一语言文本充当成功结果。 | 重试方式、错误码、超时与提示口径。 |
| 快速切换多个语言 / 切集 | 只采用最后一次有效选择与当前内容的结果,过期请求不得覆盖当前字幕。 | 资源取消、缓存和请求标识方案。 |
| 字幕过长或需多行 | 每条字幕按容器宽度自动换行;两行是内容制作规范,超过两行时前端完整显示(向上扩展),不截断、不缩小字号。 | 字号与时长验收。 |
| 原生全屏 / 系统画中画 | 全屏对播放器容器调用 Fullscreen API,字幕随容器显示;iOS H5 用 playsinline 自绘全屏;画中画不显示字幕并在进入时提示,退出后恢复(见 4.1.6.4)。 | 实测终端:Chrome / Edge / Safari 最新版(桌面)、iOS Safari、Android Chrome。 |
| 跨设备 / 切换账号 | 字幕选择只保存在本地浏览器,不随账号同步;同一浏览器切换账号仍沿用;换设备或换浏览器无记忆,按默认规则。 | — |
8.3 支付模块异常与安全边界
- return_to 白名单:按现网路由定义:播放页
/{lang}/webpc/watch/{drama_id}/{集号}(H5 沿用现网 H5 播放页路由)、个人中心/{lang}/webpc/me、金币与充值/{lang}/webpc/me/coin、订单/{lang}/webpc/me/orders;服务端用路由模板正则校验,不匹配一律回落个人中心。 - Webhook:必须校验渠道签名并按 provider 事件 ID 去重,重放不重复入账。
- 订单归属:订单查询、结果页、订单记录接口按当前 account_id 校验订单归属,不匹配返回 404。
- 限频:创建订单与金币解锁接口每账号每分钟限 10 次;超限返回 429 + RATE_LIMITED,前端保留原选择并提示“操作过于频繁,请稍后再试”;同一 request_id 的重试、充值后自动扣币解锁不计入限频次数。账号密码登录:同一账号连续失败 5 次锁定 5 分钟,同一 IP 每分钟最多 20 次。
- 页面状态:「我的」钱包余额 / VIP 读取失败显示「—」+ 重试,不显示 0;解锁弹层与充值 / VIP 弹框报价加载中显示加载态,报价失败显示「加载失败,请重试」;无可用支付方式时支付按钮置灰并显示「当前暂无可用支付方式」。
- 前端上报字段:前端上报的金额、余额字段仅用于对账,指标计算以服务端事件为准。
8.4 内容分发模块异常边界
| 异常 / 边界 | 处理要求 | 关联需求 |
|---|---|---|
| 板块停用或不支持当前端;通过旧链接访问 | 不显示在首页;旧链接显示「该栏目暂不可用」及「返回首页」按钮 | FE-HOME-02 / FE-HOME-08 |
| 启用板块没有可展示内容 | 首页不渲染该板块;栏目详情旧链接显示未配置空态,不自动补片 | FE-HOME-08 |
| 板块 ids 含重复或不存在的内容 ID | 同板块重复 ID 只展示第一次;不存在的 ID 不生成空卡片;不存在的板块 ID 不得指向其他同名栏目 | FE-HOME-01 / FE-HOME-08 |
| 内容无溢出或容器宽度变化 | 无溢出时不自动移动、两侧按钮隐藏且禁用;出现溢出后恢复横向浏览能力 | FE-HOME-04 |
| 页面隐藏或用户开启减弱动画 | 停止栏目自动滚动,保留手动浏览;返回前台或偏好变化后重算 | FE-HOME-05 |
| 拖动结束与循环接缝点击 | 横向拖动达到阈值才作为拖动,结束后短暂抑制误点击;接缝处点击只进入对应内容一次;键盘不重复聚焦视觉副本;离开再返回不叠加滚动速度 | FE-HOME-06 |
| Web 栏目详情页码越界 | 非法页码收敛到合法页 | FE-HOME-07 |
| 配置接口失败、内容失效、图片加载失败 | 不得显示为正常空集合或永久破图,须提供合理恢复路径(待接) | FE-HOME-10 |
| 未知题材 ID | 显示题材不可用和 0 结果,不静默回退全部 | FE-CATEGORY-04 |
| 新题材没有内容绑定 | 保留可选的 0 计数,选中后显示该题材暂无内容 | FE-CATEGORY-04 |
| 标签未知或与题材不相交 | 显示零结果;空态的查看全部 / 重置只清条件,不更换基础集合、不补其他剧集 | FE-CATEGORY-04 |
| 旧链接 tag=<原值> 含空格、字面 +、中文或 = | 前端调用映射接口获取 tagId,命中则用 history.replaceState 替换为新链接,未命中显示零结果;翻译文本只作展示,不作路由标识 | FE-CATEGORY-05 |
| 收起标签后已选标签位于第 31 个以后 | 选项区可不显示,但摘要和结果必须保留,不能误显示全部 | FE-CATEGORY-07 |
| 题材英文名为空 / 标签缺翻译 / 其他语言 | 题材先回退另一名称再回退稳定 ID;标签缺译回退中文主名称 | FE-CATEGORY-08 |
| 题材 / 标签字典或内容关系接口无响应、错误 | 不能计为 0 条正常结果(待接) | FE-CATEGORY-10 |
| 未知、停用或不支持当前端的榜单 list | 无可展示结果,不静默换到其他榜;空态「查看全部」仅清题材 / 标签仍保留原 list;生产需区分不可用、正常空结果与接口 / 配置错误(专门提示待接) | FE-RANK-08 |
| 所有榜均停用或不支持当前端 | 显示「暂无可用榜单」 | FE-RANK-08 |
| 合格内容不足目标数量 / 筛选后为空 | 保留短列表或零结果,不补不合格内容、不引入榜外内容 | FE-RANK-04 / FE-RANK-06 |
| 人工固定项不合格或名次超出实际榜长 | 不强制上榜;重复位置 / 内容、排除与固定冲突属配置错误,不产生正常结果 | FE-RANK-05 |
| 自定义榜名暂无翻译 | 显示中文,不把空英文替换成不对应的默认榜名 | FE-RANK-09 |
| 真实统计数据未知或服务失败 | 不得以零指标代替;服务失败不得伪装无上榜内容(待接) | FE-RANK-10 |
| Web 首页加载中 / 配置接口失败 / 板块为空 / 封面加载失败 | 加载中显示骨架与「加载中…」;失败显示「加载失败,请重试」+ 重试按钮;板块为空时首页不渲染该板块;封面加载失败显示占位图,不显示破图 | FE-HOME-10 |
| 剧场 / 题材结果加载中 / 失败 / 未知题材 | 加载中显示骨架与「加载中…」;失败显示「加载失败,请重试」+ 重试按钮;题材为空显示「该题材暂无内容」;未知题材显示题材不可用 | FE-CATEGORY-04 / FE-CATEGORY-10 |
| 排行榜为空 / 榜不可用 / 失败 | 榜单为空显示「当前榜单暂无上榜内容」;榜不可用与接口失败分别提示,失败提供重试,不显示整页空白 | FE-RANK-08 |
| 福利页加载中 / 失败 / 兑换码为空 | 加载中显示骨架与「加载中…」;失败显示「加载失败,请重试」+ 重试按钮;兑换码为空时不提交并提示输入兑换码 | 福利页(现网) |
| 全局无网络 | 顶部条提示「网络异常,请检查网络后重试」,网络恢复后自动消失 | 全站 |
| 整页刷新、浏览器后退、Web / H5 切换 | demo 仅内容页专用返回可恢复路由、筛选与位置;生产按已确认规则保留刷新时的路由/筛选/页码及后退滚动位置,内容失效提供有效返回入口,不恢复失效弹窗(见 10.2);分别验证刷新与返回,不以原型限制代替生产验收 | FE-HOME-09 / FE-CATEGORY-10 / FE-RANK-09 |
8.5 后台运营模块异常边界
| 异常 / 边界 | 处理要求 | 关联需求 |
|---|---|---|
| 上下架目标版本已变化 | 提交时校验 version,不一致停止提交并要求重新核对;批量操作不产生部分成功 | BE-DRAMA-02 |
| 封面、横图、Banner 图片格式或大小不合法、读取失败 | 限 JPEG / PNG / WebP,单张大于 0 且不超过 2 MiB;封面/横图按既有比例规则处理;Banner 当前只校验格式、大小和解码,生产槽位比例待设计确认(5.2.6);失败保留原图和其他输入;读取中阻止保存 / 确认;取消、换图、换对象后过期读取结果不得写入新对象 | BE-DRAMA-06 / BE-BANNER-03 / BE-BANNER-04 |
| 单集资源弹窗取消、X、遮罩、Escape 或被其他弹窗替换 | 丢弃该集尚未应用的资源与字幕修改(含已确认未应用的字幕),保留整剧编辑副本与列表位置 | BE-DRAMA-09 |
| 集号非法(相同、空值、小数、非数字、越界) | 不能确认;弹窗打开后剧集副本或单集集合变化则阻止旧弹窗继续应用 | BE-DRAMA-04 |
| 字幕文件非法(非 UTF-8、空、超过 512 KiB、格式 / 时间码错误)或语种重复 | 读取中不能确认;错误保留表单并提示修正;同一时间不开启第二个字幕表单 | BE-DRAMA-05 |
| 整剧保存校验失败 / 持久化失败 / 离开有未保存修改 | 校验失败定位问题并保留编辑内容;保存失败恢复原记录和日志,副本留在页面重试;离开时提供继续编辑或放弃修改 | BE-DRAMA-08 |
| 点击剧集/单集删除入口 | 当前只提示暂不支持删除;字典管理菜单已移除,不纳入本轮删除验收 | BE-DRAMA-08 |
| 合集同源重复/无新增且无调序 | 同目标按 originDramaId + originEpisodeId 去重并显示跳过数;没有实际变化时不执行重复保存 | BE-COLLECTION-03 / BE-COLLECTION-05 |
| 合集源剧或目标版本已变化 | 停止旧确认,提示重新勾选源剧或选择目标;源剧不变,不覆盖最新目标 | BE-COLLECTION-05 |
| 合集保存失败/重复请求 | 目标及单集全部回滚,弹窗输入和顺序保留;失败日志不计成功;重试及请求幂等不重复创建 | BE-COLLECTION-05 / BE-LOG-03 |
| 榜单窗口、数量、门槛、权重、更新时间或终端配置非法 | 阻止保存并保留输入 | BE-RANK-03 |
| 人工固定名次重复、越界、跨候选或与排除冲突;固定项失去资格 | 冲突配置不能提交;失去资格的固定项提示未生效,其余位置由自动序补齐 | BE-RANK-05 |
| 榜单全部内容不满足条件 | 显示空榜及原因,不借用其他榜单凑数 | BE-RANK-04 |
| 编辑期间已保存版本被其他操作改变(榜单、板块、Banner 项) | 阻止覆盖,要求取消后重新编辑或重新打开核对 | BE-RANK-06 / BE-HOME-05 / BE-BANNER-04 |
| Banner 同端重复、超过 12 条、无图片、目标失效、图片读取中 | 不能确认;移除当前图片后须重新补齐,不暗中回退旧图;来源切换只使用当前明确选择的来源 | BE-BANNER-01 / BE-BANNER-03 / BE-BANNER-04 |
| 配置保存持久化失败(Banner / 首页板块 / 榜单) | 恢复已保存配置和日志,保留工作列表或输入供重试;取消对照不保存 | BE-BANNER-06 / BE-HOME-05 / BE-RANK-06 |
| 板块总览上移 / 下移失败 | 恢复原顺序;首尾操作不可越界 | BE-HOME-06 |
| 拖拽超出当前列表或落回原位置 | 不跨模块移动,不新增/删除内容;原位置不变。只读角色不得改变顺序,合法拖拽仍按所在模块保存层级提交 | BE-BANNER-08 / BE-HOME-09 / BE-RANK-08 |
| 榜单数量超过 100/首页片单超过 100 | 榜单允许合法正整数,无业务上限;首页不设超量确认。Banner 仍最多 12 条,不能套用不限数量规则 | BE-RANK-08 / BE-HOME-09 / BE-BANNER-01 |
| 业务保存失败与操作日志 | 失败记为一条 result=fail 记录,不计入成功变更数;重试成功另记一条 success;表单输入、取消、关闭弹窗、预览、未保存勾选不产生记录 | BE-LOG-02 / BE-LOG-03 |
| 日志内容体积 | 不得包含视频文件正文、字幕正文或本地图片数据等大体积素材 | BE-LOG-05 |
| 无权限的保存请求 | 服务端拒绝并记一条 result=fail 日志;角色定义见后台 5.3.1「权限」段 | 后台 5.3.1 权限 / BE-LOG-03 |
09验收标准
9.0 验收索引
验收项分散在各章卡片内,本表为唯一索引;验收环境统一为 preview 测试环境。
| 模块 | 验收项来源 | 位置 | 条数 |
|---|---|---|---|
| 播放模块 | 9.1 验收指标;各需求卡片「验收标准」(V01–V02、H5-A01–A04、PC-A01–A04、H5-P01–P09、PC-P01–P04、INT-01、H5-G01–G03) | §09 9.1;§04 播放模块卡片 | 9.1 共 13 行;卡片级 AT 若干 |
| 支付模块 | 9.3 验收用例(编号沿用支付 PRD 5.2,07–10 已剔除,13–22 本版新增);4.2.9 典型验收场景;4.2.11 本次变更验收;7.5 / 7.8 埋点验收 | §09 9.3;§04 支付模块 4.2.9 / 4.2.11;§07 7.5 / 7.8 | 9.3 共 18 条;4.2.9 共 7 行;4.2.11 共 6 行 |
| 内容分发模块 | FE-HOME-01–11、FE-CATEGORY-01–10(含 -10P)、FE-RANK-01–10 | §04 内容分发模块各卡片「验收 ID」表 | 共 32 条 |
| 后台运营模块 | BE-DRAMA-01–09、BE-COLLECTION-01–06、BE-RANK-01–08、BE-BANNER-01–08、BE-HOME-01–09、BE-LOG-01–05;支付后台 BE-01 保持原文 | §05 各卡片验收;合集是剧集管理内功能。BE-01 仍见原支付验收 | 共 45 条运营后台验收项 + BE-01 |
| 跨模块 | CROSS-01–13;设备矩阵与通过标准 | §09 9.4 | 13 条 |
9.1 播放模块验收指标
| 验收项 | 指标要求 | 关联需求 |
|---|---|---|
| 界面国际化 | 核心页面英文覆盖率 100%;中文硬编码为 0;按钮、弹窗、错误及支付文案覆盖率 100%。 | V01 |
| 术语一致性 | 核心术语一致率 100%,新增文案从多语言资源读取。 | V02 |
| 评论展示与计数 | 提交评论后列表即时出现该条;评论计数准确率 100%;加载、失败与真实 0 条可区分。 | INT-01 |
| 账号绑定 | 绑定成功率 = account_bind_confirm(result=success) ÷ account_bind_confirm(result∈{success, fail}) ≥ 99%,cancel 与 conflict 单列占比;资产一致率 100%:按同一 userId 绑定前后金币两桶余额、已购剧集、VIP pass_until、观看历史条数、收藏、点赞、评论条数、任务进度逐项比对(首次绑定奖励的 50 赠币除外);身份卡保存率与切换账号成功率口径见 7.4。 | H5-A03 / PC-A03 |
| 播放 / 暂停 | 交互时延 ≤300ms;状态切换成功率 ≥99.5%。 | H5-P01 / 播放控制 |
| 当前集数 | 显示准确率 100%;切集后 UI 集数更新时延 ≤300ms。 | H5-P01 / H5-P02 / PC-P01 |
| 同剧连续切集 | 目标成功率 ≥99%;上线门槛 ≥90%;本剧中途不误跳外部短剧。 | H5-P02 |
| 退出后恢复 | 恢复原剧、原集、原 position_ms(|实际起播位置 − position_ms| ≤ 2000ms)成功率目标 100%;上线门槛 90%。 | H5-P01 / H5-P02 / PC-P01 |
| 末集推荐 | 完结剧末集剩余 10 秒显示推荐提示,播完或上滑进入推荐剧第 1 集(同标签随机剧,排除第 1 集收费;无同标签剧取热播榜随机一部);连载剧最新集不自动跳转。 | H5-P02 / PC-P01 |
| VIP 到期不打断 | expiresAt 到点时当前正在播放的集播完前不打断,切下一集按新 accessState 处理。 | H5-P04 / PC-P02 |
| 字幕入口与选择 | CC、播放设置、选中态与预览一致;单选、即时生效和返回路径均按用例验证。 | H5-P07 / PC-P04 |
| 字幕与播放同步 | 字幕随当前内容和视频时间显示;语言切换不重载视频,不改变进度、播放状态、声音或倍速。时间同步误差 ≤ 250ms。 | H5-P08 / PC-P04 |
| 字幕关闭与记忆 | 关闭后无字幕层;支持时保持本地选择;清屏、切集、界面语言与字幕设置互不串改。 | H5-P05 / H5-P08 / PC-P04 |
9.2 播放模块验收执行口径
- 两端分别验收。覆盖 H5 与 Web 的账号流程、播放流程和互动入口;涉及共用规则的场景需在两端确认。
- 围绕完整链路。从首页进入、播放/暂停、切集、付费解锁、充值回流、返回首页到再次进入,确认剧、集、进度与权限一致。
- 保留目标与门槛。同剧切集和进度恢复同时给出了目标值与上线门槛,两个数值均保留:门槛值为发版判定标准,目标值为上线后两周的观察指标。
- 明确测量方法。播放时延的起止时点、进度恢复误差(|实际起播位置 − position_ms| ≤ 2000ms,见第 06 章)、成功率统计样本,需在验收前确定。
- 字幕单独验收。覆盖首次进入、两种入口、本集全部可用语种、关闭、即时预览、暂停 / 播放、拖动、倍速、清屏、切集、付费回流及本地记忆。使用实际可用字幕资源和时间轴。
9.3 支付模块验收用例
9.4 内容分发与后台运营模块验收与范围检查
9.4.1 验收方式
各模块中的 FE/BE 编号为独立验收项。逐项记录输入、操作、结果、异常结果和问题链接;不得仅以按钮存在或演示数值变化判定完成。Web 和 H5 分别验收,包括手势、窄屏、滚动、返回和键盘可达性。
设备矩阵。 Web:Chrome / Safari / Edge 最新版,视窗 1280 / 1440 / 1920,输入:鼠标、触控板、键盘(Tab、←→);H5:iOS Safari、Android Chrome,视窗宽 360 / 390 / 414,输入:触摸。
通过标准。 自动滚动速度 24px/s ±10%,按钮步进 80% 视窗宽 ±5%,初次等待 1.2s ±0.3s,手动操作后恢复 ≥3.5s;键盘 Tab 顺序不进入视觉副本。各验收表中标「按 9.4.1 设备矩阵验收」的条目一律按本段矩阵与标准执行。
9.4.2 跨模块验收
| 编号 | 场景 | 通过条件 |
|---|---|---|
| CROSS-01 | 核对后台范围 | 后台仅 5 个优化菜单;合集在剧集管理内。资源草稿箱、金币包/支付通道及所有保留菜单不可进入;字典数据仍可供剧集引用。前台仅补充本轮已确认的规则与引用,其余原文保持不变。 |
| CROSS-02 | 后台未保存时打开预览 | 当前 demo 仅切前台终端,不提交后台编辑;生产前台读取已保存配置须另行联调,不以固定前台画面判定成功。 |
| CROSS-03 | 同一配置在不同终端/语言查看 | 终端与启停规则正确;无市场筛选;更换语言不改变片单或榜单身份 |
| CROSS-04 | 移除题材/标签管理菜单后维护剧集 | 旧字典仍能回显、选择和关联;不因菜单移除清空剧集 categoryId / tagIds。本轮无独立字典优化验收。 |
| CROSS-05 | 筛选计数、列表及空态 | 同一上下文下计数与结果一致;题材/标签交集为零时不补入全库;榜内筛选保留原名次 |
| CROSS-06 | 调整集号及跨越免费范围 | 每集的视频、字幕、状态与内部ID随内容移动;目标集号连续唯一,免费范围按新位置计算 |
| CROSS-07 | 编辑资源弹窗内字幕未确认或文件仍在读取 | 阻止父级应用/保存;校验失败保留弹窗与输入;取消或切换对象后,过期读取结果不能写入另一个对象 |
| CROSS-08 | 剧集合集保存失败及重试 | 源剧始终不变;失败目标与单集回滚,弹窗输入顺序保留,记录失败不伪造成功。重试成功只写一个目标及对应成功日志。 |
| CROSS-09 | 保存前目标已被其他操作修改 | 提示冲突并保留输入,不覆盖更新后的目标;用户可重新加载核对 |
| CROSS-10 | 已下架内容与前台同步 | 生产接入后下架结果按第 05 章 5.3.2「可展示内容」行(displayable = 剧已上架且至少一集已上架)生效:板块、详情、题材 / 榜单候选、Banner 目标均跳过不可展示内容 |
| CROSS-11 | 日志显示本次操作 | 成功记录与实际保存一致,失败不伪造成功记录,示例与本次操作分开 |
| CROSS-13 | 后台越权保存 | 内容运营 / 分发运营越权保存被拒且记一条 result=fail 日志 |
| CROSS-12 | 检查移除内容与统一拖拽 | 无资源草稿箱、金币包/支付通道、保留菜单及新增字典优化页面;无首页展示样式选项、榜单100条上限、首页100部软上限。Banner仍最多12条;Banner/首页手选片单/榜单上榜行统一悬停高亮及grab手形,分别按既有保存层级生效。 |
9.4.3 验收依据
不以历史截图或源码检查代替真实页面、真实接口和设备验收。
10依赖与待确认
10.1 依赖项
| 依赖方 | 交付内容 | 阻断条件 |
|---|---|---|
| 账户服务 | 账号绑定、账户资料、余额、历史、收藏、任务状态 | 无法返回稳定 userId |
| 商品与权益服务 | 金币档位、会员计划、剧集权益报价、权益查询与授予 | 前端需自行计算最终价格或权益范围 |
| 支付服务 | 创建支付会话、渠道配置、Webhook、订单查询、入账失败补偿队列与现有【掉单处理】菜单(本版不含退款) | 缺少测试环境、签名校验或最终状态查询 |
| 数据平台 | 事件 Schema、SDK、ACK/重试、实时明细与漏斗看板;数仓清单纳入 PaywallEventLog / CoinTransaction / EpisodeUnlock / CtRewardGrant / AuditLog(P0),Order.createdAt / type / channel / claimClosedAt 升 P0,启用生产供数通道(DATA_PLATFORM_ENABLED);服务端事件出站表落库通道与延迟 SLA | 事件无法用 trace_id 与 order_id 对账;上述表未供数或供数通道未启用时,7.4 服务端主源指标与 2.1 数据类核心结果不可验收 |
| 法务与运营 | 英文/中文协议、会员续费说明、充值中心页「购买须知」不退款声明文案(见第 04 章 4.2.10)、渠道与档位配置 | 正式上线仍使用演示文案或模拟价格 |
字幕资源对接与验收依赖
正式内容随集信息返回 subtitles[]{lang, url, version}(见第 06 章「字幕资源」行),每条字幕的起止时间与文本由 WebVTT 文件承载;同步误差与语种规则见 4.1.5.8。字幕验收须使用实际字幕资源与时间轴。
内容分发与后台运营模块:尚需接入的能力
| 项目 | 必须完成的内容 | 所属模块 |
|---|---|---|
| 自动翻译 | 接入翻译服务;按中文变化更新自动译文;失败保留中文和待补状态,保护人工修订 | 排行榜标题、首页板块名称(题材与标签本轮不优化) |
| 真实榜单与调度 | 统一播放/收藏/点赞统计口径,接入综合推荐分与周期更新;页面关闭后仍由服务端执行 | 排行榜 |
| 文件服务 | 图片、单集字幕的上传、存储、地址返回和错误处理;合集复用源单集资源,不接资源中心推送 | 推荐与分发、剧集管理(含合集) |
| 内容同步 | 后台内容关联、资料、上下架和单集顺序同步前端;标签文本迁移为稳定ID | 首页、题材、排行榜及相关后台 |
| 并发与日志 | 服务端权限、并发版本、幂等、事务回滚和操作审计 | 本轮五个后台菜单共同依赖 |
10.2 已确认规则与接入事项
开发前需要确定的关键业务口径
| # | 事项 | 需要决定的规则 | 影响范围 |
|---|---|---|---|
| 1 | 商品与配置 | 已确认原则(2026-09-17):免费集范围、单集金币、全剧折扣与 VIP 价格/周期沿用现网已验证配置,按剧保留差异;新增商品由运营配置,上线前核对。VIP 权益仍覆盖全平台剧集。截图金额、集数、档位不作为统一生产配置。具体新增商品价格及周期仍需运营确认。 | 选集、PAY-02 解锁弹层、会员购买 |
| 2 | 第三方登录接入方案 | 已确认原则(2026-09-17):Facebook、Apple、X 使用各平台官方支持的 OAuth/OIDC 登录方案或官方 SDK;审核通过且实测可用才展示。未通过继续保留现网 Google、邮件链接和账号密码,不影响已有账号及绑定关系。IG/TikTok 内嵌浏览器按实际兼容性结果展示;具体平台审核、回调配置和绑定联调仍由技术完成。 | H5-A03 / H5-A04 / PC-A03 / PC-A04 绑定与登录渠道;§10.1 账户服务依赖 |
| 3 | 新增支付渠道接入方式 | 已确认原则(2026-09-17):Apple Pay、Google Pay、PayPal 优先通过现有支付服务商接入;前提是服务商实际支持且商户开通成功,按地区、币种、设备能力展示。未接通不展示,微信、支付宝、USDT、VISA 现有流程及默认选择规则不变(4.2.13)。商务费率、开通审核与新增渠道正式排序仍需接入确认。 | 支付模块 P01 / 2.8 / 2.13 / 2.14 |
接入原则参考:Google OpenID Connect、Stripe 动态支付方式。这些文档说明标准接入及可用性判断方式,不代表本项目已选用 Stripe 或已完成渠道审核。
各需求内的已确认规则
| # | 需求 | 确认后执行规则 | 负责人 | 确认日期 |
|---|---|---|---|---|
| 1 | 4.1.3.1 / 4.1.4.1 H5-A01 PC-A01 | 已确认规则:设备身份初始化或恢复失败时保留原身份及恢复凭据,自动重试最多 2 次,间隔分别为 1 秒、3 秒。仍失败提示“暂时无法恢复账号,请重试”,提供手动重试;恢复前禁用支付与解锁,不新建账号覆盖旧身份。首次分配请求重试复用原设备标识,防止重复建号。 | 技术 | 2026-09-17 |
| 2 | 4.1.3.4 / 4.1.4.4 H5-A04 PC-A04 | 已确认规则:账号密码错误统一提示“账号或密码不正确”,不暴露账号是否存在。已明确识别相册访问被拒绝时提示“无法访问相册,请检查浏览器或系统权限,也可使用其他登录方式”;浏览器无法识别拒绝原因时只提示“未选择图片”,不能误报权限被拒绝。保留其他登录入口;既有登录限频规则不变。 | 产品 | 2026-09-17 |
| 3 | 5.2.8 BE-LOG | 已确认规则:日志支持时间范围、操作人、模块、动作、对象 ID、成功/失败筛选,默认最近 7 天,保留 180 天。筛选无结果显示空态,查询失败显示失败及重试,不伪装为零条。审计信息不包含密码、令牌等敏感原文;操作权限、分页规则沿用 5.2.8。 | 产品 | 2026-09-17 |
| 4 | 4.3.1–4.3.3 FE-HOME-09 FE-CATEGORY-10P | 已确认规则:生产刷新保留路由、筛选和页码,浏览器后退恢复原列表滚动位置;布局与数据就绪后定位,不恢复失效临时弹窗。内容或栏目失效时明确提示并提供仍有效的列表/首页返回入口,不展示空白页,也不静默清除有效筛选。demo 仍只保证内容页专用返回,此规则需真实路由与数据联调验收。 | 技术 | 2026-09-17 |
| 5 | 5.2.1 全剧折扣 | 已确认规则:存量剧未配置全剧折扣时按 100%(不打折)处理;已有合法折扣保留。仅影响新报价,不追改已支付订单及已购权益。已有值不合法时阻止受影响的全剧售卖并提示运营修正,不静默改价。上线前核对缺省、合法与异常三类数据,并保留处理记录。 | 产品 | 2026-09-17 |
通用实践参考:OWASP 登录错误提示、OWASP 日志记录、MDN 滚动恢复。重试次数、默认检索天数及推荐权重为本项目已确认取值,非行业强制标准;确认规则不等于 demo 或生产已实现。
内容分发与后台运营模块:已确认业务规则
- 已确认:综合推荐分。首期综合推荐分权重确认为播放 50%、收藏 30%、点赞 20%,各指标按同一统计窗口内合格候选最大值归一化后求和,最大值为 0 时该项贡献为 0。统计前剔除测试数据、重复事件与已确认作弊数据,保留剔除原因;正式指标与作弊识别服务仍需接入。上线后按真实效果复盘调整。这是本项目首期配置,不是行业统一比例。
- 已确认:文件服务限制。文件限制沿用 demo:图片仅 JPEG/PNG/WebP,单张大于 0 且不超过 2 MiB;字幕为 UTF-8 SRT/VTT,单文件大于 0 且不超过 512 KiB,须可解析。视频沿用现网文件服务及 HLS 地址,本轮不新增视频上传容量规则。生产前后端统一校验,具体存储、托管、转码及访问接口仍需联调。