chore:邀请码初步更改
This commit is contained in:
@@ -76,6 +76,113 @@ function _getCurrentUniacid() {
|
||||
return _pickCurrentUniacid(storageVal, configVal);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 从当前登录态读取 memberInfo → 返回后端接口真实生成的推荐码
|
||||
* 读取优先级:storage.memberInfo.recommend_code > Vuex store.state.memberInfo.recommend_code
|
||||
* 没登录 / 未同意授权 / 后端还没返回码 → 返回 ''
|
||||
* @returns {string}
|
||||
*/
|
||||
function _getCurrentRecommendCode() {
|
||||
// P1: storage 中 memberInfo.recommend_code(DIY 推荐码组件 _persistRecommendInfo 已写入)
|
||||
try {
|
||||
var info = null;
|
||||
if (typeof uni !== 'undefined' && uni && typeof uni.getStorageSync === 'function') {
|
||||
info = uni.getStorageSync('memberInfo');
|
||||
}
|
||||
if (info && typeof info === 'object') {
|
||||
if (info.recommend_code && String(info.recommend_code).trim()) {
|
||||
return String(info.recommend_code).trim();
|
||||
}
|
||||
// 兼容旧字段 invite_code(商家之前保存的配置)
|
||||
if (info.invite_code && String(info.invite_code).trim()) {
|
||||
return String(info.invite_code).trim();
|
||||
}
|
||||
}
|
||||
} catch (e) {}
|
||||
|
||||
// P2: Vuex store.state.memberInfo(某些平台 storage 还没落地时,内存里可能已经好了)
|
||||
try {
|
||||
if (store && store.state && store.state.memberInfo && typeof store.state.memberInfo === 'object') {
|
||||
var s = store.state.memberInfo;
|
||||
if (s.recommend_code && String(s.recommend_code).trim()) {
|
||||
return String(s.recommend_code).trim();
|
||||
}
|
||||
if (s.invite_code && String(s.invite_code).trim()) {
|
||||
return String(s.invite_code).trim();
|
||||
}
|
||||
}
|
||||
} catch (e) {}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* 从 URL 中移除指定 query 参数(防止 URL 里已存在旧的 recommend_code=xxx 时,append 之后重复)
|
||||
* - 仅移除 key,不影响其他参数
|
||||
* - 同时处理 hash(xxx#yyy) 在 query 后面的情况(保留 hash 原位置)
|
||||
* @param {string} url
|
||||
* @param {string} key
|
||||
* @returns {string}
|
||||
*/
|
||||
function _removeQueryParam(url, key) {
|
||||
if (!url || !key) return url || '';
|
||||
// 先拆 hash
|
||||
var hashIdx = url.indexOf('#');
|
||||
var hash = '';
|
||||
var main = url;
|
||||
if (hashIdx !== -1) {
|
||||
hash = url.substring(hashIdx);
|
||||
main = url.substring(0, hashIdx);
|
||||
}
|
||||
var qIdx = main.indexOf('?');
|
||||
if (qIdx === -1) return url; // 没 query
|
||||
var path = main.substring(0, qIdx);
|
||||
var qs = main.substring(qIdx + 1);
|
||||
if (!qs) return url;
|
||||
var pairs = qs.split('&').filter(function(p) {
|
||||
if (!p) return false;
|
||||
var eq = p.indexOf('=');
|
||||
var k = (eq === -1) ? p : p.substring(0, eq);
|
||||
// 大小写不敏感(URL 参数通常大小写不敏感)
|
||||
return String(k).toLowerCase() !== String(key).toLowerCase();
|
||||
});
|
||||
var newMain = pairs.length ? (path + '?' + pairs.join('&')) : path;
|
||||
return newMain + hash;
|
||||
}
|
||||
|
||||
/**
|
||||
* 给 URL 追加当前登录会员的推荐码(方案 B 标准函数,推荐使用)
|
||||
* 规则:
|
||||
* - 当前登录且能拿到后端返回的 recommend_code → 移除 URL 里已存在的旧值
|
||||
* → 同时追加 recommend_code + invite 两个 key(双参数兼容,后端收哪个都能用)
|
||||
* - 未登录 / 推荐码为空 → 原样返回
|
||||
* - 兼容内部相对路径 '/pages/xxx?x=1' 与 外部绝对 URL 'https://host/xx#yyy'
|
||||
* @param {string} url
|
||||
* @returns {string}
|
||||
*/
|
||||
function _appendRecommendCodeIfLoggedIn(url) {
|
||||
if (!url) return '';
|
||||
var code = _getCurrentRecommendCode();
|
||||
if (!code) return url; // 没登录或没码:不动
|
||||
// 1) 先清 URL 里已存在的旧参数(两个 key 都清,避免重复追加或旧码覆盖新码)
|
||||
var cleaned = _removeQueryParam(url, 'recommend_code');
|
||||
cleaned = _removeQueryParam(cleaned, 'invite');
|
||||
// 2) 双 key 同时追加:标准名 recommend_code + 历史兼容名 invite
|
||||
// 这样不管后端 parseCode 接口收哪个 key,都能正确命中
|
||||
return _appendQueryParamsBase(cleaned, { recommend_code: code, invite: code });
|
||||
}
|
||||
|
||||
/**
|
||||
* 旧版函数别名(保持对 _appendInviteCodeIfLoggedIn 的调用兼容)
|
||||
* 之前业务代码调用 _appendInviteCodeIfLoggedIn 的,现在全部委托给新的 _appendRecommendCodeIfLoggedIn
|
||||
* 确保:一次改动,全链路统一使用后端真实码 + 双 key 兼容
|
||||
*/
|
||||
function _appendInviteCodeIfLoggedIn(url) {
|
||||
return _appendRecommendCodeIfLoggedIn(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* 把 URL 上的 page_params 还原成对象。是 _toParamValueString 的逆操作。
|
||||
* 容错策略:任何解析失败都安全降级到 defaultValue,不抛异常。
|
||||
@@ -1255,6 +1362,11 @@ export default {
|
||||
let url = this.normalizeUrl(decodeEntity(link.wap_url));
|
||||
url = this.appendQueryParams(url, params);
|
||||
|
||||
// ✅ 外链跳转自动拼邀请码:当前登录有邀请码 → 去 URL 旧 invite → 追加成新值
|
||||
// H5: window.location.href 新页面打开时 location.search 能收到
|
||||
// MP: webview src URL 打开目标 H5 页面时能收到
|
||||
url = _appendInviteCodeIfLoggedIn(url);
|
||||
|
||||
// #ifdef H5
|
||||
// console.log(`url ---->`, url, link)
|
||||
window.location.href = url;
|
||||
@@ -1367,6 +1479,16 @@ export default {
|
||||
// resolveLinkUrl 已把 wap_url 中的 query 合并到 link.page_params
|
||||
// 这里过滤掉 link 元数据字段, 避免 wap_url/name/parent/title 等被错误附加到目标 URL
|
||||
// title/enable_set_title/page_params 仍需透传到目标 URL,page_params 放最后
|
||||
|
||||
// ✅ 内部页:把推荐码写进 page_params(最终会被拼成 URL query,diy-form onLoad options 能收到)
|
||||
// 仅在当前登录已拿到推荐码时追加,不覆盖上游已有值;双写 recommend_code(老师标准)+ invite(历史兼容)
|
||||
var _curRecommendCode = _getCurrentRecommendCode();
|
||||
if (_curRecommendCode) {
|
||||
if (!link.page_params || typeof link.page_params !== 'object') link.page_params = {};
|
||||
if (!link.page_params.recommend_code) link.page_params.recommend_code = _curRecommendCode;
|
||||
if (!link.page_params.invite) link.page_params.invite = _curRecommendCode;
|
||||
}
|
||||
|
||||
const { wap_url, name, parent, type, appid, page, mobile, image, ...navParams } = link;
|
||||
this.redirectTo(link.wap_url, {
|
||||
...navParams,
|
||||
|
||||
Reference in New Issue
Block a user