Files
谢宇宁andClaude Opus 5.5 f65d10e998 Initial commit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 23:07:59 +07:00

272 lines
42 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# API 对接验证
日期:2026-10-17。
## 2026-10-22 测试与生产环境配置
本项目增加 `config/test.env`、`config/production.env`,保留独立的开发配置。进程变量优先,其次为对应 `*.local.env`,最后为基础配置;本地覆盖文件忽略提交。接口均沿用 `https://91av-wz.80sygtm.com`,默认端口均为 21030。测试部署使用 `APP_ENV=test` 和 `NODE_ENV=production`,构建目录为 `.next-test/`;生产目录为 `.next/`。开发目录为 `.next-dev/`。SEO 快照随对应目录隔离,同 API 的两个环境也不会共用快照。
`npm run build:test`、`npm run check` 通过,全部 290 项测试通过。新增测试覆盖配置优先级、环境隔离、CLI 参数、错误配置、真实子进程退出状态,以及同上游的 SEO 快照隔离。另通过启动脚本分别启动两套实际 Next.js 服务,使用临时端口和本地模拟上游验证静态资源及 API 代理均返回 200,验证结束后关闭临时服务。未执行远程部署。
## 2026-10-22 slug 路由
本项目(`JHA-1050`)的内容链接、轮播、专题/标签/栏目、搜索、书架卡片、选集、评论分页及解锁后跳转统一优先 slug,缺少时用 ID。支持 slug 地址直接访问与刷新,保留原 ID 地址直接访问;业务写入及仅接受 ID 的读取继续使用真实数字 ID。专题详情按当前文档先从分页专题目录解析 ID,不向接口发送未定义的 slug 参数。
生产构建及全部 283 项测试通过。新增回归覆盖 URL 编码、中文及特殊字符、分页目录解析、目录异常与缺失资源、canonical/JSON-LD 一致性、客户端选集与解锁跳转,以及严格 Swagger 参数约束下的 Next.js 生产响应。当前 Swagger 的 slug 查询参数已只读核对;测试使用本地模拟接口,未提交真实付费解锁、订单或评论。
## 2026-10-21 跳转性能优化
公共数据服务增加短期进程内缓存和并发合并:配置、页脚、导航、分类及标签选项 60 秒,首页 30 秒;按上游及查询参数隔离,返回独立副本并限制条目数量。无效数据、错误响应、认证和私人业务读取不缓存,配置/首页可在刷新失败时使用最近一次有效数据。详情、章节、选集、评论和推荐在响应详情之前并行请求,仍在服务端输出完整 HTML。
浏览器直接复用首屏公开配置及页脚,SDK 配置不序列化。公开页从浏览器前进后退缓存恢复时保留文档,后台按当前 Cookie 恢复身份并补报页面访问;账户、播放、支付及打开弹窗的页面保留重新验证。类型检查、生产构建及全部 258 项测试通过,包括跨请求缓存、并发合并、过期、错误恢复、副本隔离、缓存边界、两个账号隔离、首屏配置白名单、并行请求屏障、后退恢复与埋点。
真实接口及 29 个页面检查通过。本机短期采样中,公共缓存预热后列表约 312ms、专题约 287ms、回家的路约 143ms(首字节中位数,各 3 次);首次游客会话曾超时,另一次交替对比也出现显著上游波动,不能将上述采样当作稳定延迟承诺。未提交真实订单、付费解锁、评论或反馈,未执行浏览器视觉验收。
## 2026-10-21 服务端直接渲染
请求与渲染方式:页面数据在服务端准备,页头、公开列表、搜索、详情/播放、应用目录、回家的路、反馈、个人中心及设置、充值/VIP 的正文随初始 HTML 返回。站内链接、分页和搜索使用原生文档请求,保留当前页面直到新响应到达;不再清空正文显示页面加载占位。浏览器复用首屏快照绑定交互,避免启动时重复读取整页数据。提交成功后重新请求当前页面,轮播、图片解密、实时权限、解锁和支付确认保留。
Proxy 为有效业务页面准备身份,并在本次请求中传递新 Cookie,供服务端读取账户内容;同一 Cookie 同时写回浏览器。客户端复用服务端用户快照,避免再次初始化游客;正式账号失效显示登录入口,服务异常直接提供重试。外部传入的内部身份头先清除,用户、列表、套餐和流水使用明确字段白名单,凭证不写入 HTML;账户响应继续禁止缓存和索引。独立 `/navigation/`、资源、无效地址和尾斜杠重定向不触发该会话流程。
类型检查、生产构建及全部 249 项测试通过,覆盖完整首屏正文、原生跳页保留旧文档、快照绑定不重复取数、两个账号隔离、伪造身份头、正式账号过期与退出、Cookie 传递、套餐及流水、播放器与广告/轮播清理。真实只读接口及 29 个页面检查通过,另确认真实免费与金币章节页面输出完整 HTML。没有创建真实订单、付费解锁、提交评论或反馈;未执行浏览器视觉验收。
## 2026-10-21 动态导航
顶部与侧栏共用 `navigation/header` 的服务端数据,移动抽屉继承同一菜单,底栏按同源数据生成。保留接口名称、顺序、图标和二级条目;过滤底部类型、不安全地址及已移除的独立剧集地址。首屏 HTML 已包含真实链接,原脚本不再插入固定顶部导航或覆盖接口名称。已知 API 的 `/hot` 与空系统入口直接生成本站路径,不新增跳转。
路由高亮由同一纯函数处理首屏及客户端导航:首页精确匹配,列表分页保持选中,排行榜覆盖三个榜单,具体专题及带查询条件的入口按对应地址匹配,顶部不借用详情页的列表高亮。接口空列表不回填静态菜单;异常只提示导航暂不可用,正文仍能加载。构建、类型检查和全部 248 项测试通过,覆盖动态顺序/名称、二级条目、外链、空列表、异常、旧剧集过滤和高亮规则。
## 2026-10-21 移除独立剧集
按后续确认移除桌面顶部、侧栏、移动端的“剧集”导航,以及独立剧集列表、视频详情和对应分页路由;旧地址无论是否带尾斜杠均直接返回 404,不请求内容接口,也不重定向。首页与 JSON-LD 不再展示旧类型的视频栏目。短剧详情、选集、金币解锁和章节播放保留。构建、类型检查与全部 242 项测试通过,包括入口清理、旧地址 404 和原有播放/解锁回归。
## 2026-10-21 当前 Swagger 对接
按 `91av-wz.80sygtm.com` 当前文档与实际只读响应核对页面接口,端点和参数映射见 [页面接口对照](api-contract.md)。修正短剧列表、专题顶层字段、题材筛选、搜索联想与空结果推荐、详情推荐及章节 SEO/统计字段;删除旧接口代理依赖。首页“更多”保留已确认的 moreUrl 优先规则,未配置时只展示真实首页栏目的数据。按用户后续要求移除独立剧集导航和路由,旧地址及分页直接返回 404;短剧章节播放保留。
构建、类型检查及全部 240 项接口合同与回归测试通过。真实服务验证游客身份、列表/三个榜单、专题、标签、配置、应用、套餐、个人列表和余额记录;另核对 29 个原生页面响应与实际有内容的免费/金币章节(`/play/10923/12723/`、`/play/10923/12726/`)。没有创建真实订单、付费解锁、注册账号或提交评论、反馈。未执行新的浏览器视觉验收。
## 2026-10-20 充值确认弹窗
恢复原 HTML 的支付标题/副标题、订单卡片、基础/赠送/合计金币、金额徽标、渠道图标按钮及选中圆点、确认按钮和底部说明,并复用原稿的尺寸、间距、圆角及移动布局。支付宝、微信、USDT 图标使用原始本地素材;渠道仅来自套餐配置,其他渠道保留名称和通用图标。使用隐藏表单值连接样式按钮和原下单参数,金币充值与 VIP 接口保持不变。
`tests/payment.test.mjs` 验证实际金币字段及金额换算、不注入演示赠送或未配置渠道、方法切换后的订单参数、重复提交拦截、VIP 接口、无效支付地址、无支付方式以及旧表单响应隔离。类型检查、生产构建和全部 152 项测试通过,仅使用本地模拟上游,没有创建真实订单或发起真实支付。
## 2026-10-20 详情选集解锁
对照参考项目 `playletser/chapter.go` 的列表权限规则和 `pages/play.js` 的解锁处理,金币集数使用按钮直接打开 `play-episode-lock`,保留原 HTML 的金币图标、余额/消耗摘要、确认和充值入口样式。弹窗先获取目标章节详情,再展示实际价格及余额;仅确认后提交解锁,成功刷新余额并跳转所选真实章节。已可观看和会员章节按最新权限处理,余额不足和登录过期分别进入充值或登录。
新增测试覆盖:列表权限优先级、详情页弹窗不提前跳转/扣费、最新价格覆盖列表旧价格、正确章节 ID、重复点击及确认防重、支付中禁止切换、迟到响应隔离、关闭/离开页面、余额不足、已可观看/VIP、章节信息不匹配、登录失效、失败重试,以及实际 Route Handler 的凭据和解锁参数转发。类型检查、生产构建与全部 147 项测试通过;测试仅连接本地模拟上游,未提交真实金币解锁。
## 2026-10-20 详情页样式调整
区块留白按原稿保留:横幅上下桌面端 26px、手机端 22px,官方链接至评论区 28px。无横幅数据时,选集与官方链接之间仍保留对应间距,不因条件渲染移除广告区而贴合。
对照原 HTML 的 `overviewMarkup`、操作栏、选集和评论 DOM 恢复结构,复用已有桌面/移动样式及原始 SVG 素材;修复 API 按钮属性与原样式选择器不一致的问题。简介支持三行截断与展开/收起,尺寸变化及离开页面时更新和清理;选集分段只横向调整滚动,保持桌面/手机切换前的章节位置。评论使用原稿的头像、正文、时间/操作行和嵌套回复容器,保留接口和独立分页路由。
`tests/detail.test.mjs` 验证动态字段与文本转义、图片解密入口、真实章节链接、配置官方链接和简介展开/尺寸变化/清理;播放测试补充详情页点赞接口、评论回复结构及移动端集数分段。类型检查、生产构建和全部 137 项测试通过。浏览器视觉复核仍受访问工具策略限制,未生成新的浏览器截图。
## 2026-10-20 登录逻辑调整
游客登录 403 已复现并修复:带 `Origin: http://localhost:3000` 的正常浏览器请求被本地来源校验拒绝,未到达上游。Next.js 使用监听地址 `0.0.0.0` 构造请求 URL,不能将它直接与浏览器 Origin 比较;现在使用实际 HTTP Host 和协议校验。新增真实 HTTP Host 集成测试及来源校验单元测试,覆盖 localhost、IPv4、IPv6、域名、端口、协议及伪造转发头。类型检查、生产构建及全部 131 项测试通过。
修复后对用户正在运行的 `http://localhost:3000/api/app/auth/guest` 进行一次正常游客握手,携带浏览器 Origin 和设备标识,真实响应为 HTTP 200 / code 200,返回用户信息及会话 Cookie。未记录或展示登录凭证,未提交正式账号注册、密码或其他业务写操作。
对照参考项目的 `common/auth.js`、登录/绑定弹窗及 `authser` 调整游客初始化、账号切换、绑定、失效恢复和退出。`tests/auth.test.mjs` 验证账号/邮箱和密码校验、密码确认、协议、设备持久化、首次渠道与邀请码、存储不可用、游客请求合并、登录响应顺序、失败保留原身份、旧请求隔离、正式账号过期只提示一次、手动退出,以及实际弹窗事件的防重复提交和密码清理。
HTTP 集成测试另验证真实 Route Handler 的登录与绑定参数、游客 Authorization、可选邮箱补全、设备头与客户端 IP、getInfo 不返回 token 时续用原凭证、正式账号初始化过期不降级、游客 GET/POST 失效最多重试一次、HTTP 401、缺少 token 的异常登录响应、Cookie 清理和退出后一次自动登录跳过。类型检查、生产构建和全部 127 项测试通过。测试只连接本地模拟上游,没有提交真实账号登录、绑定或密码重置。
## 真实接口
通过本地 Next.js 代理验证首页、配置、底部信息、短剧运营列表、热榜、专题、热搜、应用列表、充值套餐和搜索接口,均返回业务码 200。首页使用服务端请求的实际内容,首页筛选项保持移除。
上游 `POST /api/app/auth/guest` 在直接请求和代理请求中均出现超时(最长等待 25 秒)。无有效 token 的章节列表返回业务码 1000。真实登录态下的播放、用户资料、评论、收藏、订单和金币解锁尚未完成端到端联调;没有向真实接口提交评论、支付订单或解锁请求。
## 本地集成测试
`npm test` 启动独立模拟上游和 Next.js 生产服务,检查:
- 服务端渲染使用上游标题和栏目;API 文本转义;首页筛选项未恢复。
- 首页广告列表显式返回 `null`、轮播/栏目/公告为非数组、数组夹有空项时仍返回 200;有效内容继续显示,空内容显示空状态。
- 纯站点地址和带 `/` 的根地址均直接返回首页及 200,无 Location 响应头;首页入口指向根路径,短剧入口单独指向 `/shorts/`。
- 游客 token 仅写 HttpOnly Cookie,不返回到前端脚本;设备头按参考格式发送。
- 公共请求隔离过期 token;兼容二次编码的 JSON data。
- 正式账号会话失效后,写请求不会自动降级为游客重试。
- 接口白名单、请求方法、跨站写入拒绝。
- 保留真实章节 ID、观看权限和单集金币数。
- 退出登录清理会话 Cookie,不调用上游业务写接口。
- 30 个页面路径以 `/` 结尾,直接返回 200 且没有 Location 响应头;不带尾斜杠的地址也直接返回 200;`/shorts/` 刷新返回 200;无效路径返回可见的 404;首页和业务页面链接直接包含尾斜杠。
- `/navigation/` 直接访问与刷新返回 200,独立渲染入口线路、渠道和 App 下载链接,不加载业务页面运行脚本;首页及其余 30 个路径均不包含入口导航弹窗或隐藏页面的等待状态。
- 顶部、悬浮工具和首页底部的下载入口在配置未知时保持隐藏;页面不包含悬浮二维码面板。独立入口页在下载地址为空或无效时不渲染下载按钮。
`tests/routing.test.mjs` 另检查所有路由类型、中文和含斜线的搜索词、hash 地址不转换或替换、站内链接识别,以及 History 导航的事件通知、重复地址和前进后退记录。
全部分页使用 `原页面路径/page/页码/`,第一页链接使用原路径;页码、上一页和下一页均为真实链接。`tests/pagination.test.mjs` 覆盖短剧、剧集、专题/题材/标签/栏目、榜单、搜索、个人收藏/历史/已购、充值和 VIP 余额明细,以及详情/播放页的评论分页,检查页码解析、首尾页、无效页码、中文搜索词、排序保留和会员接口参数。播放器测试检查评论页码与排序、真实分页链接;HTTP 集成测试检查 20 类路径的两种尾斜杠形式均直接返回 200、刷新不重定向,以及非法分页路径返回 404。本次生产构建及全部 109 项测试通过。
排行榜独立使用 `/rank/hot/`、`/rank/new/`、`/rank/follow/`,对应接口 `rankType=1/2/3`。`tests/rank-pages.test.mjs` 检查真实页面路由逻辑、链接与当前页高亮、标题、刷新和翻页后的榜单类型,以及加载中和请求失败时保留导航;HTTP 集成测试检查三条路径两种尾斜杠形式均直接返回 200、独立标题且没有 Location 响应头。原 `/rank/` 仍直接展示热播榜,不重定向。此次生产构建和全部 100 项测试通过。
`tests/download.test.mjs` 检查下载地址优先级和有效性、各下载入口随配置显示/隐藏、动态插入入口,以及桌面端直接打开链接、移动端点击弹窗与组合键保留浏览器默认操作。
`tests/render.test.mjs` 检查广告、首页列表及嵌套栏目中的空值和类型异常,保留有效内容顺序及 HTML 转义;弹窗测试另覆盖广告队列中的空项和非对象项。
`tests/images.test.mjs` 使用参考算法的固定密文验证逐字节解密、100 字节边界、MIME 识别和普通图片兼容,并检查重复请求合并与缓存、并发和优先级、失败重试、超时取消、异步切图、Blob 释放、初始/动态节点和视口懒加载。渲染与 SSR 测试另确认接口图片不直接写入 `src`,视频封面使用 `data-poster`。
2026-10-19 只读抽取真实首页接口的 3 张图片验证,均返回 HTTP 200,按参考密钥解密后识别为 WebP;图片 CDN 返回 `Access-Control-Allow-Origin: *`。未保存原始图片,也未提交业务写请求。
`tests/playback.test.mjs` 覆盖播放地址及签名保留、观看权限优先级与旧字段、正片/预告切换、Safari/Chromium/移动壳浏览器选择、HLS 恢复上限、重试重建、切换路由与异步导入竞态、拒绝自动播放后的重试、预告不计入正片记录、真实章节 ID、解锁确认与防重复提交,以及实际控件脚本的播放/重试/解锁事件。HTTP 集成测试覆盖媒体清单、密钥端点两种尾斜杠形式、原始 AES 字节、凭据隔离、Range 和错误状态。
H.264/H.265 兼容测试另覆盖 MSE/原生 HLS 编码错误回退、签名与播放位置保留、重复错误及重试次数限制、网络错误区别处理、MP4 不误走 HLS,以及回退过程中的路由取消。`tests/codec-manifest.test.mjs` 运行真实 hls.js 1.7.3 完整版的清单解析和 LevelController,在模拟设备能力下验证 H.264 回退、`hvc1`/`hev1` 保留、HEVC 单编码清单接受/拒绝;测试不访问网络,不代表真实浏览器或硬件的解码实播结果。
2026-10-19 只读验证真实免费预告:清单返回 200,保留 `id/t/ticket` 参数后密钥代理返回 200 和 16 字节 AES 密钥,首片成功通过 AES-128-CBC 解密,输出首字节为 MPEG-TS 同步字节 `0x47`。不带签名参数的密钥请求会被上游拒绝。本次未保存密钥/媒体,也未提交真实观看上报、解锁或订单请求;真实账号付费章节和浏览器实播仍需联调。
`tests/startup.test.mjs` 对照参考项目的实际脚本规则验证:会话内首次年龄确认、确认早于配置返回、完整广告队列、刷新恢复进度、相同队列不重复弹出、广告码变化后重置、无效图片与失败图片跳过、全部失败后可重试、存储不可用、过期异步结果隔离,以及图片加载超时和取消。DOM 事件适配测试覆盖年龄弹窗禁止 Esc 关闭、广告 Esc/按钮切换下一条、广告链接与展示/点击事件,以及退出行为。
浏览器访问工具受 URL 策略限制,本次未进行浏览器视觉复核。目录中的桌面、手机截图属于原 HTML 迁移阶段的布局基线,不是当前 API 数据截图。
## 2026-10-22 部署脚本与本地发布包
- `bash deploy_test.sh --package-only` 完成测试环境构建、294 项回归测试和 zip/SHA-256 生成;`bash deploy_prod.sh --package-only` 完成生产构建、299 项回归测试和 Linux x64/glibc 包/MD5 生成。构建包含 TypeScript 检查。
- 两份脚本的 `--dry-run` 通过命令替身验证,不执行构建、SSH 或 SCP;缺失/非法部署目标在构建前拒绝。测试和生产共用构建锁。
- 发布包测试覆盖基础配置隔离、本地覆盖/缓存/旧 dist 排除、符号链接目标保护。Next.js 自动追踪漏带的 Turbopack Route Handler 运行文件已显式包含。
- 最终 `dist.zip`(29.87 MiB)解压到临时目录,使用本机裁剪依赖启动 `node start.mjs`;本地模拟 API 下首页、`/healthz`、Next 静态资源和 public 文件均返回 200,健康检查未触发上游请求。测试 zip 按约定不含依赖,真实 Linux 服务器需执行 `npm ci --omit=dev`。
- 最终 `web_jgdj_h5.tar.gz`(44.94 MiB)通过内容、MD5 和目标平台元信息检查;目标 Sharp/libvips 使用 lockfile 固定版本,并通过 Linux x64 ELF 校验,不含 macOS 原生模块。本机未运行 Linux 生产服务。
- `deploy/up_next_h5.sh` 用临时目录和命令替身验证校验失败、安装失败不停止旧服务;健康检查失败恢复旧版本;成功更新保留测试私有覆盖和公开 SEO 缓存。新增部署测试共 8 项通过,已包含在最新生产环境的 299 项回归中。
- 本次仅本地构建和打包,未执行任何真实 SSH/SCP、Supervisor 更新或远端 `running.sh`。部署前需配置本站目标地址,测试 Supervisor 程序及生产跳板机脚本由运维预先配置。
部署配置统一采用本站标识:测试 `root@172.104.181.99:22889` → `/server/web_jgdj/h5`;生产 `server@116.212.120.2` → `/home/server/web_jgdj/h5/nuxt`,SCP 22889 / SSH 22。包名 `web_jgdj_h5.tar.gz`、校验文件和 Supervisor `jgdj_next_h5` 使用本站标识;生产仍只通过完整路径调用原有 `running.sh`。部署测试验证当前配置、环境变量覆盖、无效目标提前失败及 dry-run 不连接远端;本次未执行实际上传或部署。
### 部署配置变化后的测试修复
已复现 `tests/deploy.test.mjs:72` 的目录断言失败:测试仍固定期望旧项目的上传目录,实际测试脚本已配置 `/server/web_jgdj/h5`。修复后不再将主机、路径、端口或 API 域名作为测试不变量,保留对参数覆盖、命令与帮助输出一致、非法目标提前失败、dry-run 不构建/不连接远端的验证。测试服更新的模拟 Supervisor 使用固定测试服务,避免调用者的 `DEPLOY_PROGRAM` 污染测试。两份脚本的帮助内容统一从当前变量生成,修复当时测试 SSH 配置 21030、帮助文案却写 22889 的不一致;保留修复时的上传路径和端口。
`bash deploy_test.sh --package-only` 已完成测试环境构建、全部 299 项测试和 `dist.zip` 打包;压缩内容及 SHA-256 通过校验。另在设置自定义 `DEPLOY_PROGRAM`、`DEPLOY_DIR`、`DEPLOY_SSH_PORT` 后运行部署专项测试,8 项通过。当前 SSH 端口和应用监听端口分别配置,未连接真实服务器验证 SSH 端口或执行上传/部署。
### 测试部署改用 tar.gz
`deploy_test.sh` 现在生成并上传 `web_jgdj_h5.tar.gz`、`web_jgdj_h5.tar.gz.sha256` 和 `up_next_h5.sh`,包名可通过 `DEPLOY_PACKAGE_NAME` 覆盖;同时刷新对应 MD5 文件供本地兼容校验。测试包继续排除依赖、本地覆盖、缓存和 macOS 附加文件,包内使用 `.next-test` 与 `config/test.env`。保留当前上传目录和端口,以及用户注释的远端自动更新命令;实际脚本上传完成后结束。
服务器辅助脚本同步使用 tar.gz:先校验 SHA-256、检查成员路径与类型,再解压、安装依赖和切换版本;损坏包、路径越界、链接及特殊文件在停止旧服务前拒绝。测试覆盖真实 tar.gz 上传参数、校验值、自定义包名、自动更新保持禁用,以及安装/健康检查失败的回滚。
完整本地构建和 304 项测试通过;测试部署专项 13 项通过。生成的测试 tar.gz 为 29.78 MiB、414 个文件,内容、SHA-256 和 MD5 均通过校验。解压后使用本机裁剪依赖和本地模拟 API 验证启动、首页、健康检查、Next 静态资源与 public 文件均返回 200。未执行真实上传或服务器更新。
## 2026-10-22 埋点检查与补全
通过项目自带的官方 SDK v1.2.0 复现了内容事件因空 `parent_item_id` 被拒收的问题;此前测试替身未校验字段,所以没有发现。现在回归测试调用真实 SDK 的具名事件方法,仅使用其初始化前缓存和字段校验,不向外发送测试数据。只读获取当前业务接口配置并在本机解析后,确认页面、内容、搜索、广告、弹窗行为、播放事件均在事件允许列表内;未修改服务端配置或打印密文、签名密钥。
| 范围 | 事件与检查结果 |
| --------------------------- | ------------------------------------------------------------------------------------------------- |
| 页面、分页、后退恢复 | `appPageView/pageClick`,保留真实路径及原有访问去重规则 |
| 导航与下载 | `navigation`,补齐独立入口页渠道、App 下载入口选择器 |
| 首页及列表内容 | `appPageitemExposure/appPageitemClick`,无父级用字符串 `0`,通过真实 SDK 校验 |
| 专题、福利应用 | 补齐专题卡片内容元数据;关联 `advitiseId` 的应用按广告上报,其他应用按内容并携带分类父级 |
| 大图广告 | `adImpression/adClick`,保留原展示、点击触发;独立展示位置及延迟 SDK 队列防止漏报 |
| 宫格广告 | 与首页分开去重,滚动后补报可见项;关闭、遮挡或后台标签页不记曝光,恢复后重新观察 |
| 弹窗行为 | 补齐参考项目的 `advertising`:show/click/close,使用真实广告 ID;关闭不记 adClick,重复关闭不重报 |
| 搜索 | `keywordSearch/keywordClick`,保留真实总数、首轮搜索及分页后的全局位置 |
| 播放、切集、分享、失败 | `dramaEvent/dramaStatusChange`,全部现有行为的载荷通过真实 SDK 校验,预告不作为正片统计 |
| 登录、游客、注册、充值、VIP | 沿用 SDK 原始公共字段透传及 UID 同步,成功业务事件由服务端负责 |
| 点赞、收藏、评论、购买解锁 | 保留 BFF 校验后的事件上下文和请求 ID 透传,前端不重复发送服务端成功事件 |
| 加载、排队、错误 | 配置首读跳过 SDK 等待;脚本失败重试加载;扩大初始化前队列并报告溢出;SDK 拒收和发送失败有脱敏诊断 |
浏览器使用真实页面及未修改的官方 SDK,测试专用包装通过 SDK 支持的单次事件地址参数把请求送入本机接收端,避开官方域名解析器对配置地址的 HTTPS 要求。已验证大图广告展示/点击、宫格展示/点击、页面访问、内容曝光,以及原生页面跳转前的内容点击均实际发出带 `event_sig` 的网络记录。UI 点击和弹窗滚动经浏览器执行,未向正式统计后台发测试事件。未验证正式部署的反向代理和统计后台入库结果。
最终验证:测试环境构建(含 TypeScript)及全部 323 项回归测试通过。最后一轮本机浏览器验证收到 78 条带签名的 SDK 事件,其中 `advertising` 为 show 21、click 2、close 21;大图广告的三种行为均到达,宫格关闭只覆盖实际曝光的广告,关闭未增加 `ad_click`。另外一轮已确认原生页面跳转前的 `app_pageitem_click` 实际到达,内容父级字段为字符串 `0`。所有网络验证仅使用本地模拟业务数据和本地测试签名配置。
## 2026-10-26 禁果短剧基础信息迁移
项目编号统一为 `JHA-1050`,应用及埋点 App ID 为 `1050`,npm 包和健康检查应用名为 `jha-1050-jgdj-web`。开发、测试、生产基础配置与测试数据同步更新。站名、页面标题、下载提示、协议品牌名称和 SEO 默认值统一为「禁果短剧」;Logo、侧栏缩略标识、App 下载图标、浏览器/桌面图标及默认分享图均已更新,并核对实际渲染及素材字节数登记。
发布包、默认目录和 Supervisor 使用 `jgdj` 标识,服务器地址与端口保持原配置。侧栏和页脚从后台配置生成官方联系方式,未配置或不安全的链接不输出;版权通知入口改为本站意见反馈,移除参考站邮箱。新增集成测试覆盖首屏联系方式的有效、缺失和不安全配置。
验证结果:生产构建、`npm run typecheck`、全部 **374 项**回归测试和 `git diff --check` 通过。首次测试因沙箱禁止本机端口监听而取消集成用例,获得本地测试所需权限后完整重跑,374 项通过、0 失败、0 取消。未执行部署、推送或 Git remote 切换;上线前需核对新仓库地址、服务器目录/更新脚本/Supervisor,以及应用 `1050` 对应的 Go 上游、后台 SEO 和 `reportSdkConfig`。
## 2026-10-26 按禁果短剧 HTML 调整页面
以用户提供的 `禁果短剧_2组.html` 为视觉参考,提取其样式并保留原级联顺序,导入实际使用的品牌、页头背景、空状态、导航和年龄提示素材。桌面改为双层品牌页头;移动端按参考稿保留菜单、搜索及账户工具,正文使用独立主推轮播和六张横版推荐,模块副标题、热搜标签、排行榜角标、页脚及弹窗使用同一套粉色主题。真实 API 的动态栏目、路径、分页、账户、支付及下载流程继续使用现有实现。
首页横版推荐从启用的真实栏目中去重选取,数量不足时使用有效轮播数据;轮播切换只替换主推区,避免重复替换横版推荐或生成额外曝光。桌面历史面板在悬停或键盘聚焦时读取当前账户的历史接口,支持错误/空状态,关闭及身份变化后忽略过期返回,不持久化私人记录。
生产构建、TypeScript 检查、全部 **376 项**回归测试及 JavaScript 语法检查通过。已用本机模拟接口在浏览器对照桌面、390px 手机和 800px 平板布局,并验证轮播、历史面板的键盘进入和真实接口数据展示。预览中的剧目及账号均为本地测试数据;未执行线上部署或向外部服务发送测试事件。
## 2026-10-26 宫格弹窗限高与独立滚动
按参考项目的宫格弹窗规则,将 `#startup-grid` 最大高度限制为 `80vh / 80dvh`,仅广告列表区域纵向滚动,列表最大高度为视口 80% 减去 60px,预留底部关闭按钮及间距。隐藏滚动条并限制滚动向页面传递;原有四列宫格、手机间距和广告交互继续使用现有实现。
使用真实弹窗结构和当前全局样式,分别在桌面及 390 × 650 手机视口下放入 48 条本地测试数据,验证滚动可到达最后一排,关闭按钮始终可见。弹窗与埋点相关 32 项测试全部通过,`git diff --check` 通过。
## 2026-10-26 请求代理移除来源拦截
按 `jha-1047-91dj-web` 移除 Next.js Route Handler 对 POST 的 `isSameOriginRequest` 校验及不再使用的工具和单元测试。该逻辑原用于防止跨站 POST,运行于服务端代理;当 CDN / 反向代理使浏览器 Origin 与内部 Host 或协议不同时,可能在请求到达 Go 之前返回「请求来源不允许」。本次调整覆盖 `/api/*` 与兼容的 `/api/app/*` 两个入口,保留接口白名单、请求方法限制、HttpOnly / SameSite Cookie、会话失效处理及代理循环检测,上游鉴权错误继续传回。此前记录中的本地来源检查及跨站写入拒绝已由本次规则替代。
集成用例覆盖 localhost、IP、CDN HTTPS、反代内部域名与协议变化、`Origin: null` 及跨站标记,验证请求确实到达本机模拟上游、成功响应不泄漏 token,并检查上游 HTTP 403 仍返回 403。所有业务请求只发送至本机模拟服务。生产构建(含 TypeScript)、全部 **374 项**测试及 `git diff --check` 通过。
## 2026-10-26 生产部署脚本对齐参考项目
`deploy_prod.sh` 与 `jha-1047-91dj-web` 同步,生产远端命令统一为 `REMOTE_UPDATE_COMMAND`,预览和实际 SSH 执行使用相同文本。目录经 `valid_path` 校验后生成 `cd /目录 && bash rsupdate.sh`,移除原实际执行时额外的目录单引号,兼容按命令文本配置的 SSH 白名单;执行前打印远端命令,保留发布日志及失败状态检测。本站品牌、`web_jgdj` 包名和目录、主机与端口沿用当前配置。
脚本语法检查、默认 dry-run、26 项部署专项测试及 `git diff --check` 通过。测试通过本机命令替身验证上传先于更新、白名单命令匹配、权限拒绝、SSH 失败、远端错误输出、curl 401、自定义目录及仅打包行为;未执行真实上传或生产部署。
## 2026-10-26 请求头与 UA 对齐 JHA-1045
对照 `jha-1045-hgdjnet-web/app/static/js/common/request.js`、`pub/common/useragent/build.go`、`app/service/upstream/client.go` 和媒体代理实现,统一浏览器 Accept / Cookie 携带方式、SDK X-User-Agent 生成,以及 API、SSR、媒体和密钥的 UA / IP / SID 转发。原生浏览器 UA 按原值透传,客户端已有 X-User-Agent 优先;缺少时使用参考 Go 的解析规则,补充设备品牌/型号、系统名称/版本、浏览器 BuildID 与 SID。移除固定站点 UA 及虚构的 server-public 设备标识,公开 SSR 在缓存未命中时也使用本次访客的请求信息。应用 1050、接口地址、业务设备参数、会话恢复、公开数据凭证隔离及事件上下文校验沿用当前项目。
直接抽取并运行参考项目的 Go UA 生成函数,生成 12 组样例,覆盖 iPhone / iPad、Android 手机/平板及品牌、Windows / Edge、macOS / Safari、Linux / Firefox、Opera、IE、爬虫和空 UA;TypeScript 输出与 Go 输出逐字一致,样例保存在 `tests/fixtures/request-user-agents.json`。HTTP 集成测试验证两种 API 路径的请求头及 SDK 字段、完整 SSR 请求链路、媒体与密钥转发和凭证隔离。生产构建(含 TypeScript)、全部 **394 项**回归测试及 `git diff --check` 通过;网络验证仅连接本机模拟上游,未执行真实登录、支付或部署。
## 2026-10-26 对齐 SGDJ Swagger
只读获取用户指定的 `https://sgdj-h5.80sygtm.com/swagger/doc.json`,与旧文档核对 70 个应用接口及响应模型;生成 `tests/fixtures/sgdj-app-contract.json`,记录端点、方法、查询和请求字段及原始文档 SHA-256。首页读取 modules,短剧和题材模块分别映射现有页面组件,题材进入自己的 theme 路径;只有未提供 modules 字段时兼容旧首页快照,显式空模块不恢复旧数据。
首页更多使用 home-config/list 的 config、list / topicList、totalCount 和分页字段。短剧四类推荐及搜索换一批使用 operate/list 的 type 参数,移除文档中不存在的 hot/list。专题列表按分组显示,使用各组计数的最大值确定共同分页边界;专题详情直接传 topicSlug 或 ID,题材使用 theme/list 与 all/list 的 themeId / themeSlug、排序和更新状态参数。题材与专题各自保留主地址,正文链接、canonical、面包屑和 JSON-LD 同步,筛选变体继续 noindex。新文档没有要求改变的登录、支付、解锁和章节权限字段沿用原有处理,不恢复此前移除的独立视频路由。
生产构建(含 TypeScript)、全部 **399 项**回归测试、smoke 脚本语法及 `git diff --check` 通过。新增 HTTP 场景验证新首页模块、首页更多第二页的实际数据、专题分组和分页上限、直接 slug 请求没有目录扫描、题材更新状态筛选及 SEO。文档抓取之外,所有业务验证仅连接本机模拟 API;未执行正式账号注册、订单、评论、解锁或部署。应用 1050、服务端上游配置和已对齐的请求头规则继续使用当前项目设置。
## 2026-10-26 本地与测试上游切换 SGDJ 域名
开发、测试基础配置及服务端非生产默认地址统一改为 `https://sgdj-h5.80sygtm.com`,同步本地配置示例、项目说明及配置断言。生产上游继续为 `http://172.104.56.28:26125`。已核对本机没有旧地址的私有环境覆盖或进程覆盖;实际启动配置解析结果与目标地址一致,测试部署 dry-run 也显示新地址。
环境、API 配置及部署专项共 **42 项**测试、`git diff --check` 通过。没有执行实际上传或部署;已运行的本地进程需要重启,测试服需发布新配置并重启后生效。
## 2026-10-26 本地与测试上游域名更正为 JGDJ
按用户更正,开发、测试基础配置和非生产默认上游改为 `https://jgdj-h5.80sygtm.com`,同步配置示例、当前文档及测试断言;Swagger 来源链接继续保留实际核对过的 SGDJ 文档地址。确认本机有效配置与测试部署 dry-run 均采用新 JGDJ 地址,生产配置保持原值。环境及 API 配置 **16 项**测试和 `git diff --check` 通过;本次未上传或部署,运行中的服务需更新配置并重启后生效。
## 2026-10-26 HTML 页面样式核对
对照 `禁果短剧_2组.html` 的最终样式,用当前页面渲染函数和本地模拟内容检查首页、短剧列表、榜单、专题及详情、题材、标签、更多栏目、搜索、个人中心及四种个人列表、账号设置、金币充值、短剧详情、播放、应用、反馈和六种信息页面,并补查回家入口及独立导航页。桌面和 390px 手机预览分别加载原稿 CSS 与项目 CSS,核对关键组件的字号、字重、行高、内外边距、颜色、圆角和宽度;手机预览同时检查横向溢出。
- 榜单链接恢复原稿 9px 圆角、106px 最小宽度、16px 字号和 13px/24px 内边距;600px 以下按原稿等宽分配,保留真实榜单链接和当前页状态。
- 列表卡片、专题卡片及搜索关键词样式同时兼容语义化的 `h2`、`h3`,恢复原稿标题大小、字重、截断和间距。
- 个人中心、历史、收藏、点赞、已购和设置页按实际组件匹配原稿容器样式,去掉失效页面标识带来的额外面板和内边距;个人列表导航恢复原稿文字、间距和焦点样式。
- 详情及播放页点赞、收藏样式兼容当前业务属性,恢复按钮固定宽度和选中背景;手机端保留原稿自适应宽度。
- 通用 API 表单样式仅用于新增的简介和安全字段,避免覆盖原稿昵称输入框及反馈表单背景、边框和圆角。
浏览器核对的 26 类桌面页面关键样式指标与原稿一致;28 类手机页面(含回家入口和独立导航页)未出现横向溢出,涉及修复的关键组件指标一致。使用模拟内容核对布局,未执行真实付款、解锁、评论或账户修改。生产构建、TypeScript 检查和全部 403 项回归测试通过。
## 2026-10-26 首页分类按 style 渲染
首页模块保留接口 `style` 和 `label`,按 A–E 映射原稿分类布局:A 五列双排海报、B 六列海报、C 三列双排图文、D 六列编号海报、E 四列双排横版题材。A/B/C/D/E 首页预览上限分别为 10/6/6/6/8;分类名称和后台顺序保持原值,D 序号依次从 01 开始。缺失、预留或类型不兼容的 style 保留默认网格。首页 HTML 与 JSON-LD 使用同一预览限制,“查看更多”仍读取完整列表及真实分页。
使用本地模拟内容,将原稿最终 CSS 与项目 CSS 分别加载到 1440px、900px、390px、320px 的浏览器预览中,核对 A–E 的列数、可见数量、间距和封面比例;修正 B 在平板宽度的间距,并检查手机 C 图文卡和 D 封面编号。四种宽度均无横向溢出。
生产构建及全部 **409 项**回归测试通过,覆盖按 style 渲染的初始 SSR、预览上限、名称与顺序无关性、空数据、未知 style、内容转义、真实链接、结构化数据及更多分页。最后的平板间距修正后再次通过生产构建;`git diff --check` 通过。
## 2026-10-27 首页分类数量由 limit 控制
分类模块透传接口 `limit`,替代此前由 A–E 固定的预览上限。`style` 继续决定卡片布局及响应式列数,分类条目按 `limit` 取接口顺序中的前 N 项;数量不足时按实际有效条目数展示。`limit=0` 显示空态,缺失或无效时展示全部有效返回条目。新 `modules` 和旧 `homeConfigData`、短剧和题材、预留或默认 style 均使用相同规则,HTML 与 JSON-LD 同步;更多页继续使用真实总数和分页。
移除 B 样式在平板和手机端按固定序号隐藏条目的规则。在 1440px、900px、390px 浏览器模拟预览中,A/B/C/D/E 分别配置 limit=3/9/8/7/5,各尺寸均显示对应数量,无横向溢出。
生产构建(含 TypeScript)及全部 **411 项**回归测试通过,覆盖动态数量、新旧结构、0 值、缺失/异常 limit、列表不足、接口顺序、结构化数据、SSR 及更多页真实分页;`git diff --check` 通过。
## 2026-10-27 本地与测试上游切换 IP 地址
开发、测试基础配置及非生产默认上游改为 `http://172.104.181.99:26792`,同步配置示例、当前文档和配置断言。实际启动配置解析及测试部署 dry-run 均采用该地址,兼容变量 `API_BASE_URL` 同步解析;应用端口保持 `21030`,生产上游保持 `http://172.104.56.28:26125`。
环境及 API 配置 **16 项**测试和 `git diff --check` 通过。本次未上传或部署;运行中的本地服务需重启,测试服需发布新配置并重启后生效。
## 2026-10-27 业务接口统一 `/api/app/` 前缀
参考 `jha-1051-cgdj2-web`,浏览器业务请求及 API 冒烟脚本统一使用 `/api/app/*`,与已有 SSR 上游路径保持一致;旧 `/api/*` 处理器保留兼容。同步环境配置注释和部署说明,明确请求直达 Go 时会跳过 Next.js 的会话 Cookie、参数转换及 token 过滤。冒烟脚本同时按参考项目改用空登录参数校验,移除已失效的跨站 POST 拒绝断言。
生产构建(含 TypeScript)及全部 **411 项**回归测试通过,覆盖浏览器查询参数、JSON 和 FormData 请求、会话与旧路径兼容,并验证 `current` 模式下 Go 直达与 Next.js 会话处理的差别;`git diff --check` 通过。集成测试使用本机模拟上游,本次未部署或调用真实业务写接口。