album-read-cost

20260916-201504 轮 · 看它的历史
[target] http://localhost:20098  容器=wt_h8_tp8  种子标记=e2ealbum-709297
[种子] 未删 2 行 / 软删 1 行

── A · getUserPhoto
  ✅ A1 种入的每一行未删照片都在返回里(逐行点名,不数总数)
       返回 2 行;缺失 无
  ✅ A2 键序逐字未变(三端解析依赖它)
       id,picname,pic_width,pic_height,picgroupuserid,ms3file,width,height,timage
  ✅ A3 🔴 软删的那行不在结果里(pic_deleted=0 没漏)
       ealbum-709297-live-1.jpg ealbum-709297-live-0.jpg
  ✅ A4 去标识仍在:picgroupuserid 是 hash 不是数字 uid
       v6lcqu30mnl7
  ✅ A5 setphotosonce 也返回了行(轮回填充到 num=6)
       {"data":[{"picname":"https://jnc-main-cd.oss-cn-chengdu.aliyuncs.com/6p40qjry/images/user/0/20260916/v6lcqu30mnl7/e2ealbum-709297-live-1.jpg
  ✅ A5b 🔴 软删的那行也不会被 setphotosonce 取到(pic_deleted=0 没漏)
       ealbum-709297-live-1.jpg ealbum-709297-live-0.jpg ealbum-709297-live-1.jpg ealbum-709297-live-0.jpg ealbum-709297-live-1.jpg ealbum-709297-live-0.jpg

── C · getalbumSince
[夹具] 作品 tplid=15760(tplrecycle=1,有就复用、没有才克隆)
  ✅ 前置 夹具作品没被订单消耗(tplrecycle ≠ 2,否则编辑器打不开)
       tplid=15760 tplrecycle=1
  ✅ C1 基线:maxid === DB 实测最大 id,且不返行
       maxid=179897 DB=179897 pic=0
  ✅ C2 since=maxid → 0 行
       {"maxid":179897,"pic":[]}
  ✅ C3 since=maxid-2 → 恰好 2 行且 id 升序
       2 行: 179896,179897
  ✅ C4 ms3file 形态 === picname + ?scale=LD_F(§1.3 出口铁律)
       https://jnc-main-cd.oss-cn-chengdu.aliyuncs.com/6p40qjry/images/user/0/20260916/v6lcqu30mnl7/e2ealbum-709297-live-0.jpg?scale=LD_F
  ✅ C5 软删的那行不会被增量拉出来
  ✅ C6 🔴 拿别人的 tplid → 拒(回字面量 false,不是空集)
       false
  ✅ C7 🔴 匿名 → 拒
       false
  ✅ C8 🔴 别人的 tplid:两个端点必须给出【同一个裁决】,且都是拒
       getalbum=拒 / getalbumSince=拒
  ✅ C9 🔴 匿名:两个端点必须给出【同一个裁决】,且都是拒
       getalbum=拒 / getalbumSince=拒
  ✅ C10 (静态)归属判定只有一处:2 个调用点都在 Flash.php,且捷径条件全仓只出现 1 次
       调用点 2 处 / 捷径条件 1 处
       BackendTp8/app/controller/Flash.php:292:        $own = $this->_albumOwnerCtx($sessiontplid, 
       BackendTp8/app/controller/Flash.php:398:        $own = $this->_albumOwnerCtx($sessiontplid, 
       BackendTp8/app/controller/Flash.php:269:        if (corpSession('adminid') && ($thirdflag ==

── B · getalbum 字段投影(admin,真实 1068 张)
  ✅ B1 组级键集合恰好 4 个
       id,picgroupname,picgroupmodel,pic
  ✅ B2 照片级键集合恰好 5 个
       id,picname,pic_width,pic_height,ms3file
  ✅ B3 🔴 10 个内部列一个都不出现
  ✅ B4 消费方真正要的两个键还在
  ✅ B5 🔴 每张照片都在它真正所属的相册里(逐张拿 DB 核对,分桶写错就红)
       核对 1068 张,进错组 0 张
  ✅ B6 🔴 0 张的相册 pic 必须是 null(不是 [] 也不是缺键)
       12 个空相册,pic 取值 [null]
  ✅ B7 🔴 分桶没丢行:响应里的照片总数 == DB 里该用户的存活照片数
       响应 1068 张 / DB 1068 张

── D · H5 扫码上传轮询
  ✅ D1 🔴 弹窗打开后一次 getalbum 都没打(改前是 1 次全量)
       getalbum=0
  ✅ D2 打的是 getalbumSince,且基线响应 < 100 字节
       第 1 次 25 字节
  ✅ D3 🔴 基线 + 3 个 tick 的响应体合计 < 1 KB(改前一次就 562.7 KB)
       4 次,逐次字节 [25,25,25,25],合计 100
  ✅ D4 全程 getalbum 仍是 0 次
       getalbum=0
  ✅ D5 🔴 弹窗开着时新上传的照片,下一 tick 真的出现在暂存区(.photo-thumb 瓦片)
       暂存区共 1 块瓦片,找的是 data-url 含 e2ealbum-709297-hot-0.jpg 的那块;轮询字节 [25,25,25,25,331,25,25]

── E · 相册选择器守卫
  ✅ E1 选择器打开且分组 tab 渲染出来
       tab=13
  ✅ E2 🔴 格子里的图真的解码出来了(naturalWidth>0)
       20/20 张解码成功

── F · 相册数封顶
  ✅ F1 🔴 守卫:499 个时新建【必须成功】(302 跳回列表页,计数 +1)
       种子后 499 → HTTP 302 → 500(期望 499 → 302 → 500)
  ✅ F2 🔴 500 个时新建被拒,且计数【没变】
       HTTP 200 → 计数 500(期望 500),文案命中=true
  ✅ F3 拒绝文案里带得出上限值 500(用户看得到该删到多少)
       body 1215 字节
  ✅ F4 超配额状态下 /User/albumlist 仍渲染出全部相册(未合并的 N+1 页在配额线上可用)
       HTTP 200,页面上出现 497 个不重复的种子相册(本趟种了 497 个)
  ✅ F5 🔴 管理侧同一道闸:admin 在 500 个时新建被拒,计数没变
       种子后 500 → HTTP 200 → 500
  ✅ F6 (静态)albumQuotaDeny 只有 2 个调用点,都在 addalbum —— 懒建路径没被闸到
       BackendTp8/app/controller/User.php:2020:        $deny = albumQuotaDeny($uid); | BackendTp8/app/controller/Admin.php:10484:        $deny = albumQuotaDeny($uid);

[清理] 照片种子 4 行→残留 0;相册种子 985 行→残留 0 ✔
[清理] 删掉本趟 C 组产生的鉴权日志 12 行,残留 0 行 ✔
  ✅ Z1 🔴 种子行已清干净
  ✅ Z3 🔴 本趟产生的鉴权日志已清干净

========================================================
PASS=39  FAIL=0