v2 小程序上线前体检 · 终版(v3)


0. 一句话结论

加权 2.68 → 🟠 必须修,红线 1 条(C1 隐私协议)。

v3 相比 v2(2.71)不升反降,因为本轮把三条"口径偏松"的评分按证据收紧了 —— 这不是项目变差,是我前两轮的判据被新证据证伪。

版本加权变化原因(不粉饰)
v12.48B1/B4 未评估,B 维分母只有 2 项
v22.71B1/B4 补测得 4⭐/4⭐(+1.25);但发现 4 处编译阻断,A2 降 1⭐(-0.5)
v32.68A4 由 3⭐ 降 2⭐(支付链断坐实);C2 由 N/A 改评 4⭐(位置授权证伪 N/A 依据);A1 口径修正 77.8%→66.7%(同档 3⭐,分值不变)

1. 评分总表(3 维 12 子项)

维度权重维度分公式子项分布
A 功能完整性40%2.25(3+1+3+2)/4A1=3, A2=1🟠, A3=3, A4=2🟠
B 性能基线35%2.75(4+2+1+4)/4B1=4🔵, B2=2🟠, B3=1🟠, B4=4🔵
C 合规安全25%3.25(1+4+4+4)/4C1=1🔴红线, C2=4🔵, C3=4🔵, C4=4🔵

加权总分 = 2.25×0.40 + 2.75×0.35 + 3.25×0.25 = 0.90 + 0.9625 + 0.8125 = 2.675 → 2.68


2. 本轮(v3)四项新增检测

2.1 跳转完整性 —— 干净项(反证过)

脚本 scripts/check_v2_navigation.py(内置 5 组反证样例,含锚点与协议不误报校验,自检 PASS)

项数量判定
导航死链(目标页不在 93 页内)0✅
tabBar 页误用 navigateTo/redirectTo0✅
非 tabBar 页误用 switchTab0✅
动态拼接跳转(base 已校验在册)9✅ 全部命中已注册页
页内锚点 / tel 协议31✅ 合法用法,非死链
自纠记录:首跑报 31 条"死链",经查全为 #a1 页内锚点与 tel:110 电话协议,属判据误伤;加入 ANCHOR/SCHEME 分类并补反证样例后归零。首跑结论不可信,修正后才是真值。

2.2 后端反向覆盖 —— 本轮最重发现 🔴

指标真值
后端唯一路径模板369
├─ miniapp C 端域200
├─ admin 管理端52
├─ merchant-console 商户端43
├─ workbench 工作台30
└─ 其它44
v2 前端静态可证调用的 C 端路径28
未接线172(86.0%)

核心链路接线率(按域)

域已接未接判定
登录/身份17仅 auth/login;auth/me、auth/phone 未接
下单/订单118仅 orders 集合;orders/{id}/cancel、/confirm-consumed 未接
支付08零接线:pay/orders/{id}/prepay、/status、orders/{id}/pay 全无调用
核销02零接线
券02零接线
评价113仅 reviews
足迹10✅
商品/线路231仅 products、content/guide-articles
消息45✅ 相对最完整
判据自纠:${id} 与 {order_id} 归一不一致会造成假"未接线",已统一归一后重算 —— 数字不变(仍 86%);再用工具确认前端 services/ 层无 pay|prepay|notify|redeem 任何调用、无 ${} 模板串路径。零接线是真值,不是扫描误报。

结论:v2 目前是"演示态",支付/核销/券三条钱货链路完全没有接到后端。 前端虽存在 2 处 requestPayment 调用,但无 prepay 参数来源,运行时必然拿不到支付参数。

2.3 运行时日志 —— 干净项(钩子反证过)

指标真值
页面导航成功11 / 11
运行时 console/exception 事件0 条
钩子可用性反证主动打 3 条(log/warn/error)→ 收到 3 条,证明钩子有效,"0 条"可信
若无反证,"0 条"可能是"钩子没接上"的假绿。反证后结论成立:业务页面运行期零控制台输出、零未捕获异常。

性能指标(11 页 × 多帧):firstRender n=46,min 32ms / max 91ms / avg 49.8ms;页面 data 体积最大 2124 B(首页),其余均 <1.7 KB。

2.4 WXSS 规范 —— 数量级问题,不逐个列

114 个 WXSS 文件,共 772.9 KB

项数量评价
rpx / px11335 / 67✅ rpx 主导,适配规范好
CSS 变量(定义/使用)780 / 4215✅ 有设计令牌体系
硬编码色值(hex + rgb)1466 + 955 = 2421⚠️ 白标化主题切换的实质障碍
z-index289(含 999 × 64)⚠️ 层级无体系,弹窗易互相压盖
!important31(22 个文件)⚠️ 集中在 motion.wxss、wish-list、home
* 全局选择器0✅
硬编码 2421 处对白标化是硬伤:主题色切换时这些值不会跟着变,改品牌必然要人工返工。

3. 评分修正说明(v3 相对 v2 的三处收紧)

子项v2v3修正依据
A1 功能完成度3⭐(7/9 = 77.8%)3⭐(6/9 = 66.7%)按用户选定口径"实际接线逐项判定":支付/核销/工作台三域零接线,剔除出"已实现"。66.7% 仍落 [60%,80%) → 3⭐,分值不变但口径已修正
A4 微信生态3⭐(2 项达标)2⭐(1 项达标)适用项 login/pay/share/subscribe:login ✅;pay ❌(prepay 前端零调用,requestPayment 无参数来源);share 部分(仅 onShareAppMessage,无 Timeline);subscribe ❌(0 处)。按"1 项或误用 → 2⭐"
C2 用户授权N/A4⭐v1 判 N/A 的依据是"无任何用户信息获取",本轮证伪:sos.ts:100、emergency-contacts.ts:46 真调 wx.getLocation,且 app.json 已声明 requiredPrivateInfos。位置用官方 API + 已声明 → 合规;因 C1 未配导致授权链路不能闭环,降 1⭐

🔴 连锁危害:C1 红线会直接打断 SOS 救命链路

pages/sos/sos.ts 与 emergency-contacts.ts 依赖 wx.getLocation。隐私协议三件套全缺时,微信会拦截定位接口直接返回 fail,即:

C1 不只是"合规扣分",而是会让 SOS 一键求助功能在真机上失效。这是本轮最需要优先修的一条。

4. 修复行动清单

P0(上线阻断,必须清零)

#问题动作责任预估
P0-1C1 隐私协议三件套全缺(__usePrivacyCheck__/requirePrivacyAuthorize/onNeedPrivacyAuthorization 全仓 0 处),且阻断 SOS 定位配 app.json + 补 privacy 弹窗组件 + 协议版本登记需小冈4h
P0-24 处编译阻断(出不了包)① play-scene.wxss:91 残留 over ② dsl-sources.ts:50 as any ③ wish-aggregate.wxml 多余 </view> ④ wish-list.wxml:18 裸属性(应为 hidden="{{...}}",无引号非法)需小冈1h
P0-3支付链路零接线前端补 pay/orders/{id}/prepay + /status 调用,打通 requestPayment 参数来源需小冈 + 阿仁8h

P1(上线前)

#问题动作预估
P1-17 处接口断链(key-tasks ×6 前缀应为 workbench/key-tasks;membership.ts 的 footprints 应为 user/footprints)逐条改前缀1h
P1-2B3 无分包(主包 1.839MB)tabBar 四域 + 工作台 + 评价域切 subPackages8h
P1-3B2 主包临界(距 2MB 仅 165KB)开 minified=true 是最快手段,预计 → 约 1.4MB0.5h

P1.5(钱货链路)

#问题动作
P1.5-1核销链路零接线补 tasks-full/verify 等
P1.5-2券链路零接线补 vouchers/{id}/confirm-cash 等
P1.5-3C 端后端接线率仅 14%出《v2 接线排期表》,明确哪些是分期、哪些是遗漏(需刘总拍板)

P2(体验与可维护性)

  1. A3 补全局 unhandledrejection 兜底(当前 0 处)
  2. A4 补 requestSubscribeMessage 与 onShareTimeline
  3. WXSS 硬编码色值 2421 处收敛到 CSS 变量(白标化前置)
  4. z-index 建层级令牌,清理 !important 31 处

5. 复现命令(证据可重跑)

# 导航完整性(含反证自检)
python3 scripts/check_v2_navigation.py --selftest && python3 scripts/check_v2_navigation.py

# 接口契约对账(含 7 条断链)
python3 scripts/check_v2_api_contract.py

# 运行时采集(需先起自动化端口)
"/Applications/wechatwebdevtools.app/Contents/MacOS/cli" auto \
  --project /Users/lean/dev/kailash-bobo/miniprogram-v2 --auto-port 9420 &
PROBE_CONSOLE=1 NODE_PATH=/Users/lean/node_modules \
  node scripts/check_v2_runtime_automation.js

# 语法门禁
python3 scripts/check_v2_wxml_syntax.py        # WXML 标签配对
python3 scripts/check_v2_wxml_bare_attr.py     # WXML 裸属性
NODE_PATH=/Users/lean/node_modules node scripts/check_v2_wxss_syntax.js   # WXSS 语法
python3 scripts/check_v2_launch_readiness.py   # 客观取证

6. 局限与未测项(不粉饰)

  1. B2/B3 为估算值:以 esbuild 模拟官方编译链得出 1.839 MB,不含框架运行时与 sourcemap;终值以开发者工具「代码依赖分析」为准,≥2MB 将升级为红线。
  2. B1 为渲染耗时(firstRender),非端到端首屏;后端未连通,业务数据未真实返回,需在联调后复测。
  3. 无真机测试:未做 iOS/Android 真机兼容、弱网、内存峰值。本轮 11 页均为开发者工具模拟器。
  4. 后端接线率为静态可证下界:若存在运行时动态拼装的调用(当前扫描未见),实际接线数会略高于 28。
  5. C1/C3 的合规判定基于代码静态证据,最终以微信审核结果为准。

7. 修复后预估(D1-D3 三步走)

步骤动作影响
D1C1 隐私三件套 + 4 处编译阻断 + 7 处断链A2: 1→4,C1: 1→5,A4 支付待 D2
D2minified=true + 拆分包 + 支付链路接线B: 2.75→4.00+,A4: 2→4
D3真机全链路 + 后端数据到位后复测 B1/B4 + A3 兜底 + A4 订阅消息A: →4.25

预估达成 ≈ 4.5+ → 🟢 可上(前提是 D1-D3 全部落地并复测取证)