feat(card-share): 增加路由 query 续传功能,确保分享时名片 ID 不丢失

This commit is contained in:
2026-10-28 17:11:29 +08:00
parent 5e6eec166a
commit 60cac8780b
2 changed files with 22 additions and 4 deletions

View File

@@ -16,7 +16,8 @@
* ② storage 通道: 按钮 @tap 时把 card_id 写进 storage, 钩子读取后立即清除
* —— onShareTimeline 不接受事件参数, 只能走这条(朋友圈)。
* ③ 路由 query 通道: 分享落地页从当前页 options 取 card_id,
* 供「我的名片」组件回传给 /card/api/diy/mycard(访客看到分享者那张卡)。
* 供「我的名片」组件回传给 /card/api/diy/mycard(访客看到分享者那张卡);
* 同时作为 pickShareCardId 的第三级兜底(落地页上右上角「···」转发的续传)。
*
* 纯 JS(无 wxss), 小程序/H5/鸿蒙通用; 无 uni 运行时环境(如 node 单测)全部静默降级。
*/
@@ -74,7 +75,15 @@ export function takeRememberedShareCardId(maxAgeMs = SHARE_CARD_MEMORY_TTL) {
}
/**
* 从分享事件里挑出名片 ID(dataset 优先, storage 兜底)
* 从分享事件里挑出名片 ID(dataset 优先, storage 兜底, 路由 query 再兜底)
*
* 2026-10-28 新增第三级: 路由 query 续传。
* 背景: 右上角「···」转发时微信不传事件对象, storage 通道又只在"点过分享按钮"
* 后 5 分钟内有效 —— 访客经分享落地(query 带 card_id)后直接右上角转发,
* 原先两路都取不到 → 分享出去不带 card_id → 源头卡断链变官方卡。
* 落地页本身带着 card_id, 把它作为第三级兜底即可闭合"接收方续传"链:
* 任何落地页上发生的转发(按钮/右上角/朋友圈)都自动续传当前落地的卡。
*
* @param {object} [options] onShareAppMessage 的事件对象
* @returns {string}
*/
@@ -88,7 +97,11 @@ export function pickShareCardId(options) {
} catch (e) {
/* ignore */
}
return takeRememberedShareCardId();
const remembered = takeRememberedShareCardId();
if (remembered) return remembered;
// 落地续传: 分享落地页 query 带 card_id → 右上角「···」转发/超时后的转发也绑源
// (裸 Tab 路由无 card_id → 返回空串, 分享行为与旧行为一致, 官方卡兜底不受影响)
return routeQueryValue('card_id');
}
/**

View File

@@ -3,7 +3,7 @@ import Config from '@/common/js/config.js';
import util from '@/common/js/util.js';
import { classifyHttpError, httpErrorKey } from '@/common/js/http-error.js';
import { consumeNeedStartupAd, isColdLaunchPending } from '@/common/js/startup-ad.js';
import { pickShareCardId, appendPathParam, appendQueryParam, pathQueryPart } from '@/common/js/card-share.js';
import { pickShareCardId, appendPathParam, appendQueryParam, pathQueryPart, routeQueryValue } from '@/common/js/card-share.js';
let systemInfo = util.getDeviceInfo();
@@ -798,6 +798,11 @@ export default {
let shareUrl = this.$config.h5Domain + this.diyRoute;
if (this.id) shareUrl += '?id=' + this.id;
else if (this.name) shareUrl += '?name=' + this.name;
// 2026-10-28: H5 分享链接补 card_id —— 与小程序 path 口径对齐。
// 落地页 query 带 card_id(员工/访客从分享进入)时, 公众号转发链接续传源头卡;
// 裸 Tab 无 card_id → 行为零变化(官方卡兜底)。
const shareCardId = routeQueryValue('card_id');
if (shareCardId) shareUrl = appendPathParam(shareUrl, 'card_id', shareCardId);
this.$util.setPublicShare({
title: this.$langConfig.getField(this.diyData.global, 'title'),
desc: '',