feat(util,navigate): add uniacid stale check for wap url
新增租户uniacid一致性校验逻辑,修复装修外链携带过期租户ID导致的跳转错误问题: 1. 新增pickCurrentUniacid和hasStaleUniacidInUrl工具函数 2. 在链接处理逻辑中校验wap_url内的uniacid与当前系统租户ID是否一致 3. 脏数据场景下强制走外链模式而非内部跳转 4. 补充完整的单元测试覆盖
This commit is contained in:
@@ -19,6 +19,8 @@ import {
|
||||
appendQueryParams as _appendQueryParamsBase,
|
||||
extractInternalAppPath as _extractInternalAppPath,
|
||||
resolveNavMode as _resolveNavMode,
|
||||
hasStaleUniacidInUrl as _hasStaleUniacidInUrl,
|
||||
pickCurrentUniacid as _pickCurrentUniacid,
|
||||
_shouldEncodeUrl,
|
||||
_safeEncodeForPlatform,
|
||||
_navigateTo,
|
||||
@@ -44,6 +46,36 @@ import {
|
||||
|
||||
export { decodeEntity, cleanParamUrls, _toParamValueString, adaptSubpackageUrl };
|
||||
|
||||
/**
|
||||
* 获取系统当前的 uniacid(运行时单点真值)。
|
||||
*
|
||||
* 必须【与 common/js/http.js 发送请求时使用的 uniacid 完全一致】(行 168):
|
||||
* data.uniacid = uni.getStorageSync('uniacid') || Config.uniacid
|
||||
* 否则 uniacid 守卫(脏数据判断)和实际网络请求会基于不同的真值,
|
||||
* 产生不一致行为。
|
||||
*
|
||||
* 真值源:
|
||||
* 1) uni.getStorageSync('uniacid') — 持久化, 由登录 / 初始化写入
|
||||
* 2) Config.uniacid — 编译期兜底(从 .local.config.js / vue.config.js 注入)
|
||||
*
|
||||
* 0 视为"无 uniacid": hasStaleUniacidInUrl 收到 0 时直接返回 false (不强行判断)。
|
||||
*
|
||||
* @returns {number} 当前 uniacid; 无法获取时返回 0
|
||||
*/
|
||||
function _getCurrentUniacid() {
|
||||
let storageVal;
|
||||
try {
|
||||
if (typeof uni !== 'undefined' && uni && typeof uni.getStorageSync === 'function') {
|
||||
storageVal = uni.getStorageSync('uniacid');
|
||||
}
|
||||
} catch (e) {}
|
||||
let configVal;
|
||||
try {
|
||||
if (Config && Config.uniacid) configVal = Config.uniacid;
|
||||
} catch (e) {}
|
||||
return _pickCurrentUniacid(storageVal, configVal);
|
||||
}
|
||||
|
||||
/**
|
||||
* 把 URL 上的 page_params 还原成对象。是 _toParamValueString 的逆操作。
|
||||
* 容错策略:任何解析失败都安全降级到 defaultValue,不抛异常。
|
||||
@@ -1088,6 +1120,19 @@ export default {
|
||||
link.wap_url = decodeEntity(link.wap_url);
|
||||
}
|
||||
|
||||
// 修复: wap_url 自带的 uniacid query 必须与系统当前 uniacid 一致
|
||||
// 原因: uniacid 是本平台租户 ID,会随租户迁移 / 平台调整而变化。
|
||||
// 装修数据里的 wap_url?uniacid=2482 一旦与系统当前 uniacid(比如 2483)不一致,
|
||||
// 说明这份数据可能是历史遗留或别的租户的(脏数据),
|
||||
// 不应该被自动改写成内部 SPA(否则会跳到错租户的内页 / 拿错数据)。
|
||||
// 应当保守地走外链(整页 / web-view), 让原 URL(及其 uniacid)如实生效。
|
||||
// ★ 必须在 resolveLinkUrl 之前判断 —— 否则 URL 的 query 被抽走就分不清了。
|
||||
// ★ open_mode=internal 时不覆盖 —— 用户显式强制内部, 表示"我知道我在做什么"。
|
||||
if (_hasStaleUniacidInUrl(link.wap_url, _getCurrentUniacid())
|
||||
&& _resolveNavMode(link) !== 'internal') {
|
||||
link.open_mode = 'online';
|
||||
}
|
||||
|
||||
// 优先用 page_key 解析实际URL(新机制,向后兼容)
|
||||
const resolvedUrl = resolveLinkUrl(link);
|
||||
if (link.page_key && resolvedUrl) {
|
||||
|
||||
Reference in New Issue
Block a user