feat: 优化名片详情加载逻辑,处理未登录和卡片不存在的情况,新增公开页跳转功能

This commit is contained in:
2026-10-14 13:50:28 +08:00
parent e56b91970c
commit 6309a5bb4b

View File

@@ -174,15 +174,19 @@ export default {
data: { card_id: this.cardId },
success: res => {
this.isLoading = false;
const data = res.data || {};
if (res.code == 0) {
const data = res.data || {};
this.relation = data.relation || null;
this.source = data.source || null;
this.shareList = data.share_list || [];
// 公开页/二维码地址由后端统一拼装返回, 前端不自行拼接
this.shareUrl = data.wap_url || '';
this.qrUrl = data.qr_url || '';
} else {
// 后端对"不存在"与"非本人名下"同一报错口径,不区分展示
this.errorMsg = res.message || '卡片不存在或已被删除';
this.relation = null;
// 未登录 / 卡片不存在 / 非本人名下(详情接口按归属校验, 同事打开
// 别人分享的链接会命中) —— 后端在报错 data 里同样返回公开页地址,
// 据此匿名落到公开名片页(可看、可提交交换/留资), 不出现死路
this.fallbackToPublicPage(data.wap_url || '');
}
},
fail: () => {
@@ -192,6 +196,23 @@ export default {
}
});
},
fallbackToPublicPage(wapUrl) {
// 公开页地址完全由后端 detail 接口返回(成功/报错路径都带), 前端零拼装
if (!wapUrl) {
this.isLoading = false;
this.errorMsg = this.errorMsg || '卡片不存在或已被删除';
return;
}
// #ifdef H5
window.location.href = wapUrl;
// #endif
// #ifndef H5
// 小程序/鸿蒙/APP: 复用 share.vue 中转页(web-view 加载 wap 页)
uni.redirectTo({
url: '/pages_tool/card/share?url=' + encodeURIComponent(wapUrl)
});
// #endif
},
callPhone(mobile) {
if (!mobile) return;
uni.makePhoneCall({ phoneNumber: mobile });
@@ -206,18 +227,13 @@ export default {
},
/* ---------- 分享 ---------- */
siteId() {
return uni.getStorageSync('uniacid') || this.$config.uniacid || 0;
},
openShare() {
if (!this.relation) return;
const sid = this.siteId();
const rid = this.relation.id;
const base = this.$config.baseUrl || '';
// wap 公开名片页(客户视角, 无需登录)
this.shareUrl = base + '/card/wap/index/detail?site_id=' + sid + '&id=' + rid;
// 二维码由后端同源生成(项目内置 extend\QRcode), 与链接一一对应
this.qrUrl = base + '/card/wap/index/qr?site_id=' + sid + '&id=' + rid;
// 链接/二维码地址已在 loadDetail 时由后端返回(wap_url/qr_url), 这里只做兜底校验
if (!this.shareUrl || !this.qrUrl) {
uni.showToast({ title: '分享链接未返回,请稍后重试', icon: 'none' });
return;
}
this.showShare = true;
},
closeShare() {