🔍 MR: H5 70055 dev kitsdk

代码变更影响范围深度分析与回归测试指南 · 由 AI 极速推演生成

项目仓库:PwaSlotCash
分支流向h5-70055-dev-kitsdkh5-70055-test
分析触发人:lipeifeng

🧠 回归测试专项拓扑脑图

graph TD Root[🔍 回归测试拓扑脑图] --> A[🟢 交互与渲染] Root --> B[🔵 逻辑完整性] Root --> C[🟣 性能与极值] A --> A1[提现页默认流程展示] A --> A2[埋点上报UI无异常] B --> B1[开关缺失时默认走V3] B --> B2[旧缓存数据防覆盖] B --> B3[用户信息与网络状态合并] C --> C1[弱网连续点击提交] C --> C2[清除缓存后首次加载] C --> C3[长列表/高频操作稳定性] style Root fill:#ff9900,stroke:#333,stroke-width:2px,color:#fff style A fill:#28a745,stroke:#333,stroke-width:1px,color:#fff style B fill:#007bff,stroke:#333,stroke-width:1px,color:#fff style C fill:#6f42c1,stroke:#333,stroke-width:1px,color:#fff
🔍 点击全屏放大查看

📋 核心变更内容与测试边界提醒

💡 关键变动逻辑:
🚨 【高危必测区】
🛡️ 【安全豁免区】
📈 【极值边界点】

📊 风险评估级别

🟡
medium Risk
当前合并请求的整体发布风险评级

⚠️ 潜在隐患与风险点

  • 1
    [默认开关误触] 未配置开关时直接走新版,若新版逻辑未适配旧设备或特定网络,可能导致提现页白屏或按钮无响应。
  • 2
    [埋点数据覆盖] 旧缓存若未正确识别缺失字段,可能覆盖事件发生时的实时数据,导致后台统计信息不准确或丢失关键用户行为。
  • 3
    [缓存兼容异常] 老用户本地残留旧版数据结构,合并基础参数时若判断逻辑失效,可能引发页面假死或上报中断。

🗺️ 业务波及页面与反向依赖调用链

受改动波及路由入口 业务功能与波及说明 反向依赖链路 trace 路径
无显著波及入口

📋 回归测试专项用例

🎯 测试维度:交互与渲染验证

受影响模块 用例标题 前置条件 测试步骤 预期结果
提现页面 提现页默认流程展示检查 应用已安装且未手动配置提现流程开关 1. 打开提现页面
2. 查看页面顶部提示与整体布局
3. 观察页面元素加载与排版情况
页面完整展示新版提现界面,无错位、空白或加载失败提示,所有按钮与输入框清晰可见。
全局页面 埋点模块全局渲染检查 正常网络环境下 1. 依次打开首页、个人中心、设置页
2. 快速滑动列表并点击各个功能入口
3. 观察页面切换流畅度与内容加载
各页面切换顺畅无卡顿,内容完整加载,未出现因数据合并导致的界面闪烁或元素缺失。

🎯 测试维度:业务逻辑完整性

受影响模块 用例标题 前置条件 测试步骤 预期结果
提现页面 开关缺失时默认走V3流程 本地存储中不存在提现流程版本配置 1. 进入提现页面
2. 不手动切换任何流程选项
3. 点击立即提现按钮
页面直接跳转至新版提现流程,未出现旧版界面或报错提示,流程节点与新版说明一致。
全局页面 旧缓存数据防覆盖验证 使用曾安装过旧版本的应用打开首页 1. 打开应用并进入首页
2. 随意点击几个功能按钮触发操作
3. 观察页面响应与数据加载状态
页面正常响应,无卡顿或重复加载现象,历史操作记录保留完整,未出现数据被清空或重置的情况。
全局页面 用户信息与网络状态合并 用户已登录且手机网络状态正常 1. 登录账号并进入任意业务页面
2. 切换手机网络类型(如WiFi切移动数据)
3. 执行一次完整操作并提交
操作成功提交,页面提示成功,后台记录中准确包含当前账号、设备型号及切换后的网络状态信息。

🎯 测试维度:性能与加载极值

受影响模块 用例标题 前置条件 测试步骤 预期结果
提现页面 弱网连续点击提交 将手机网络切换至2G或极差信号环境 1. 在提现页面填写必要信息
2. 连续快速点击提交按钮五次
3. 观察按钮状态与页面反馈
按钮点击后迅速变灰并显示加载中,页面不重复提交,网络恢复后正常提示最终结果或错误原因。
提现页面 清除缓存后首次加载 在手机设置中彻底清除应用本地数据 1. 重新打开应用并进入提现页
2. 观察页面初始化与数据拉取过程
3. 尝试执行一次提现操作
页面重新加载基础信息,默认进入新版流程,无白屏或崩溃现象,操作可正常完成。

📂 本次 MR 代码变更审阅 (GitHub 级体验)

可通过左侧文件列表快速定位跳转,右侧包含文件卡片化高亮 Diff 细节

.env
+2 -2
@@ -9,10 +9,10 @@ SENTRY_AUTH_TOKEN="sntrys_eyJpYXQiOjE3NDczOTE2NjguNTM0NzU3LCJ1cmwiOiJodHRwczovL3
NEXT_PUBLIC_NAME="Go Go Gold"
# 项目版本
-NEXT_PUBLIC_VERSION="1.39.0"
+NEXT_PUBLIC_VERSION="1.39.1"
# 核心项目版本号
-NEXT_PUBLIC_VERSION_CORE=211
+NEXT_PUBLIC_VERSION_CORE=212
# 测试环境标识
NEXT_PUBLIC_TEST_CODE=1
CHANGELOG.md
+6 -2
@@ -1,9 +1,13 @@
# Changelog
+## ================== 【70055_V1.39.1_C212】 - 2026-5-25 新增提现默认值
+
+1、新增提现默认值,默认走3.0 -- 震权
+
## ================== 【70055_V1.39.0_C211】 - 2026-5-22 注册页MMS协议修改为默认勾选& GEO改回允许用户0
-1、注册页MMS协议修改为默认勾选,
-2、geo 改回之前的允许用户0 的版本
+1、注册页MMS协议修改为默认勾选,-- 哲华
+2、geo 改回之前的允许用户0 的版本 -- 哲华
## ================== 【70055_V1.38.10_C210】 - 2026-5-21 每日上限&交易号重复修复&bagming 不再过滤 ========================
src/Fwk/Kit/Track/EData.ts
+8 -1
@@ -4,6 +4,7 @@ import { CacheManager } from '@/Fwk/Kit/Track/CacheManager';
import KitLog from '../KitLog';
import { KitTrack } from './KitTrack';
+import { RecodeKey } from '@/Fwk/Kit/Track/TrackConst';
export class EData {
private readonly id: number;
@@ -41,7 +42,13 @@ export class EData {
this.json = new JsonData();
}
- KitTrack.MergeBase(this.json);
+ // 兼容老用户:旧缓存没有基础 base 数据时只补缺失字段,避免覆盖事件发生时的数据。
+ if (
+ !Object.prototype.hasOwnProperty.call(this.json.jObject, RecodeKey.SDK_CHANNEL_VERSION)
+ ) {
+ KitTrack.MergeBase(this.json, false);
+ }
+
return this.json;
}
src/Fwk/Kit/Track/KitEvent.ts
+7 -28
@@ -3,12 +3,10 @@
/// </summary>
/// <author>xiexingwu</author>
import { JsonData } from '@/Fwk/Kit/JsonData';
-import { RecodeKey } from '@/Fwk/Kit/Track/TrackConst';
import { CacheManager } from './CacheManager';
-
-type KitAPIStatic = typeof import('../KitAPI').default;
-const loadKitAPI = (): KitAPIStatic => (require('../KitAPI') as typeof import('../KitAPI')).default;
+import { KitTrack } from '@/Fwk/Kit/Track/KitTrack';
+import Util from '@/Master/Util';
export class KitEvent extends JsonData {
private EbKey1 = 'eb_key1';
@@ -92,32 +90,13 @@ export class KitEvent extends JsonData {
public Commit() {
if (this.isSubmitted) return;
this.isSubmitted = true;
- const KitAPI = loadKitAPI();
this.put(this.EVENT, this._name);
this.put(this.SRC, this._src);
- this.put(this.TIME_STAMP, KitAPI.GetNowMills());
- //是否为升级用户
- this.put(RecodeKey.IS_UPGRADE_USER, KitAPI.isUpdateUser ? 1 : 0);
- //用户账号
- this.put(RecodeKey.CUSTOM_USER_ID, KitAPI.kitUserId);
- //用户手机
- this.put(RecodeKey.CUSTOM_USER_MOBILE, KitAPI.kitUserMobile);
- //用户邮箱
- this.put(RecodeKey.CUSTOM_USER_EMAIL, KitAPI.kitUserEmail);
- //versionName
- this.put(RecodeKey.VERSION_NAME, KitAPI.versionName);
- //versionCode
- this.put(RecodeKey.VERSION_CODE, KitAPI.versionCode);
- //安装天数
- this.put(RecodeKey.INSTALL_DAYS, KitAPI.GetActiveDay());
- //安装小时
- this.put(RecodeKey.INSTALL_HOURS, KitAPI.GetActiveHours());
-
- //网络状态
- this.put(RecodeKey.NET, KitAPI.GetNetworkType());
- this.put(RecodeKey.VPN_USR, KitAPI.isVpnConnected() ? 1 : 0);
- // this.put(RecodeKey.MEMORY, MemoryHelper.getTotalMemory()/1024)
- // this.put(RecodeKey.USR_ABS, KitAB.getAbExperimentData()?.ToString() ?? "");
+ this.put(this.TIME_STAMP, Util.localTimeStampMill);
+
+ // 提前合并基础base参数到缓存里面
+ KitTrack.MergeBase(this);
+
CacheManager.submit(this);
// if (KitLog.IsLog){
src/Fwk/Kit/Track/KitTrack.ts
+52 -17
@@ -45,6 +45,10 @@ export class KitTrack {
private static baseJson: JsonData;
+ private static EnsureBaseJson() {
+ if (!this.baseJson) this.InitBaseJson();
+ }
+
private static InitBaseJson() {
this.baseJson = new JsonData();
//sdk的版本号
@@ -83,30 +87,61 @@ export class KitTrack {
this.baseJson.put(RecodeKey.h5_clarity_id, KitAPI.h5ClarityId);
}
- static MergeBase(json: JsonData) {
+ static MergeBase(json: JsonData, overwrite = true) {
+ this.EnsureBaseJson();
+ const putBase = (key: string, value: number | boolean | string | JsonData | null) => {
+ if (
+ overwrite ||
+ json.jObject[key] === undefined ||
+ json.jObject[key] === null ||
+ json.jObject[key] === ''
+ ) {
+ json.put(key, value);
+ }
+ };
+
// 遍历 obj2 的所有键值对并添加到 obj1
const keys = Object.keys(this.baseJson.jObject);
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
- json.put(key, this.baseJson.jObject[key]);
+ putBase(key, this.baseJson.jObject[key]);
}
// if (KitAPI.IS_IOS) json.put(RecodeKey.IFA, KitAPI.ADID);
- json.put(RecodeKey.GOOGLE_AID, KitAPI.ADID);
- json.put(RecodeKey.TP_DEVICE_ID, KitAPI.GetSmID());
- json.put(RecodeKey.MEDIA_SOURCE, KitAdjust.GetDistributor(false));
- json.put(RecodeKey.CAMPAIGN, KitAdjust.GetSecondDistributor());
- json.put(RecodeKey.ADSET_ADSET_ID, KitAdjust.GetCreative());
- json.put(RecodeKey.ADGROUP_NAME, KitAdjust.GetAdGroup());
- json.put(RecodeKey.h5_is_pwa, KitAPI.GetIsPWA);
- json.put(RecodeKey.h5_ua_parser, KitAPI.GetUaParser);
- json.put(RecodeKey.h5_os, KitAPI.h5Os);
- json.put(RecodeKey.h5_os_version, KitAPI.h5OsVersion);
- json.put(RecodeKey.h5_device, KitAPI.h5Device);
- json.put(RecodeKey.h5_browser, KitAPI.h5Browser);
- json.put(RecodeKey.h5_browser_version, KitAPI.h5BrowserVersion);
- json.put(RecodeKey.h5_clarity_id, KitAPI.h5ClarityId);
-
+ putBase(RecodeKey.GOOGLE_AID, KitAPI.ADID);
+ putBase(RecodeKey.TP_DEVICE_ID, KitAPI.GetSmID());
+ putBase(RecodeKey.MEDIA_SOURCE, KitAdjust.GetDistributor(false));
+ putBase(RecodeKey.CAMPAIGN, KitAdjust.GetSecondDistributor());
+ putBase(RecodeKey.ADSET_ADSET_ID, KitAdjust.GetCreative());
+ putBase(RecodeKey.ADGROUP_NAME, KitAdjust.GetAdGroup());
+ putBase(RecodeKey.h5_is_pwa, KitAPI.GetIsPWA);
+ putBase(RecodeKey.h5_ua_parser, KitAPI.GetUaParser);
+ putBase(RecodeKey.h5_os, KitAPI.h5Os);
+ putBase(RecodeKey.h5_os_version, KitAPI.h5OsVersion);
+ putBase(RecodeKey.h5_device, KitAPI.h5Device);
+ putBase(RecodeKey.h5_browser, KitAPI.h5Browser);
+ putBase(RecodeKey.h5_browser_version, KitAPI.h5BrowserVersion);
+ putBase(RecodeKey.h5_clarity_id, KitAPI.h5ClarityId);
+
+ //是否为升级用户
+ putBase(RecodeKey.IS_UPGRADE_USER, KitAPI.isUpdateUser ? 1 : 0);
+ //用户账号
+ putBase(RecodeKey.CUSTOM_USER_ID, KitAPI.kitUserId);
+ //用户手机
+ putBase(RecodeKey.CUSTOM_USER_MOBILE, KitAPI.kitUserMobile);
+ //用户邮箱
+ putBase(RecodeKey.CUSTOM_USER_EMAIL, KitAPI.kitUserEmail);
+ //versionName
+ putBase(RecodeKey.VERSION_NAME, KitAPI.versionName);
+ //versionCode
+ putBase(RecodeKey.VERSION_CODE, KitAPI.versionCode);
+ //安装天数
+ putBase(RecodeKey.INSTALL_DAYS, KitAPI.GetActiveDay());
+ //安装小时
+ putBase(RecodeKey.INSTALL_HOURS, KitAPI.GetActiveHours());
+ //网络状态
+ putBase(RecodeKey.NET, KitAPI.GetNetworkType());
+ putBase(RecodeKey.VPN_USR, KitAPI.isVpnConnected() ? 1 : 0);
}
static TrackALive(key: string) {
src/app/(redeem)/RedeemUI.tsx
+1 -1
@@ -249,7 +249,7 @@ const RedeemUI = () => {
// 通过配置开关判断是否使用H5提现(1: H5新提现流程, 0: 旧版提现流程)
const shouldUseH5Redeem = () => {
- const rawSwitch = DataMgr.getStorage(KitConst.REDEEM_V3_SWITCH, '');
+ const rawSwitch = DataMgr.getStorage(KitConst.REDEEM_V3_SWITCH, '1');
const switchValue = String(rawSwitch ?? '').trim();
return switchValue === '1';
};