From d0693c6d9ea12c1367d19809016d5e37381d37f6 Mon Sep 17 00:00:00 2001 From: xcbyy <2578898740@qq.com> Date: Fri, 23 Oct 2026 11:05:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(share):=20=E5=BE=AE=E4=BF=A1=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=85=A8=E9=A1=B5=E9=9D=A2=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=88=86=E4=BA=AB=E5=88=B0=E5=A5=BD=E5=8F=8B=E5=92=8C=E6=9C=8B?= =?UTF-8?q?=E5=8F=8B=E5=9C=88=EF=BC=8C=E5=B9=B6=E8=87=AA=E5=8A=A8=E6=90=BA?= =?UTF-8?q?=E5=B8=A6=E5=88=86=E9=94=80=E9=82=80=E8=AF=B7=E8=A3=82=E5=8F=98?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pwuniapp/common/share.js | 171 +++++++++++++++++++++++ pwuniapp/main.js | 3 + pwuniapp/pages/activity/create.vue | 7 + pwuniapp/pages/activity/detail.vue | 14 ++ pwuniapp/pages/activity/list.vue | 7 + pwuniapp/pages/activity/my-ticket.vue | 10 ++ pwuniapp/pages/auth/login.vue | 7 + pwuniapp/pages/common/protocol.vue | 11 ++ pwuniapp/pages/community/detail.vue | 13 ++ pwuniapp/pages/community/index.vue | 7 + pwuniapp/pages/expert/apply.vue | 7 + pwuniapp/pages/expert/detail.vue | 16 +++ pwuniapp/pages/expert/hall.vue | 7 + pwuniapp/pages/expert/radar.vue | 7 + pwuniapp/pages/expert/workspace.vue | 7 + pwuniapp/pages/index/index.vue | 7 + pwuniapp/pages/order/create.vue | 7 + pwuniapp/pages/order/list.vue | 7 + pwuniapp/pages/user/bill-records.vue | 7 + pwuniapp/pages/user/coupons.vue | 7 + pwuniapp/pages/user/favorites.vue | 7 + pwuniapp/pages/user/help-faq.vue | 7 + pwuniapp/pages/user/index.vue | 7 + pwuniapp/pages/user/notifications.vue | 7 + pwuniapp/pages/user/promote.vue | 14 ++ pwuniapp/pages/user/recharge.vue | 7 + pwuniapp/pages/user/reports.vue | 7 + pwuniapp/pages/user/settings.vue | 7 + pwuniapp/pages/user/withdraw-records.vue | 7 + pwuniapp/pages/user/withdraw.vue | 7 + server/tests/mini-program-share.spec.ts | 68 +++++++++ 31 files changed, 474 insertions(+) create mode 100644 pwuniapp/common/share.js create mode 100644 server/tests/mini-program-share.spec.ts diff --git a/pwuniapp/common/share.js b/pwuniapp/common/share.js new file mode 100644 index 0000000..2d439f7 --- /dev/null +++ b/pwuniapp/common/share.js @@ -0,0 +1,171 @@ +// 已读取AGENTS.md +import { onShareAppMessage, onShareTimeline, onShow } from '@dcloudio/uni-app'; +import { onMounted } from 'vue'; + +const DEFAULT_SHARE_TITLE = '同城陪伴 · 专业游戏陪玩与生活陪伴'; +const DEFAULT_INDEX_PATH = '/pages/index/index'; + +/** + * 获取当前登录用户的邀请码/用户ID,用于分销裂变与邀请自动绑定 + */ +export function getShareInviterParams() { + try { + const uid = uni.getStorageSync('userId'); + if (uid) { + return { + inviterId: String(uid), + code: `PW${uid}` + }; + } + } catch (_) {} + return { + inviterId: '', + code: '' + }; +} + +/** + * 构造携带邀请人参数与页面参数的分享路径 (用于 onShareAppMessage) + */ +export function buildSharePath(basePath = DEFAULT_INDEX_PATH, extraParams = {}) { + const { inviterId, code } = getShareInviterParams(); + const params = { ...extraParams }; + if (inviterId && !params.inviterId) { + params.inviterId = inviterId; + } + if (code && !params.code) { + params.code = code; + } + + const queryParts = []; + for (const key of Object.keys(params)) { + const val = params[key]; + if (val !== undefined && val !== null && val !== '') { + queryParts.push(`${encodeURIComponent(key)}=${encodeURIComponent(val)}`); + } + } + + const cleanBase = (basePath || DEFAULT_INDEX_PATH).split('?')[0]; + const queryStr = queryParts.join('&'); + return queryStr ? `${cleanBase}?${queryStr}` : cleanBase; +} + +/** + * 构造朋友圈分享的 query 参数字符串 (用于 onShareTimeline,微信规范 query 不带 ?) + */ +export function buildTimelineQuery(extraParams = {}) { + const { inviterId, code } = getShareInviterParams(); + const params = { ...extraParams }; + if (inviterId && !params.inviterId) { + params.inviterId = inviterId; + } + if (code && !params.code) { + params.code = code; + } + + const queryParts = []; + for (const key of Object.keys(params)) { + const val = params[key]; + if (val !== undefined && val !== null && val !== '') { + queryParts.push(`${encodeURIComponent(key)}=${encodeURIComponent(val)}`); + } + } + return queryParts.join('&'); +} + +/** + * 显式唤起微信小程序分享菜单 (同时激活【转发给朋友】与【分享到朋友圈】) + */ +export function enableShareMenu() { + // #ifdef MP-WEIXIN + try { + if (uni.canIUse && uni.canIUse('showShareMenu')) { + uni.showShareMenu({ + withShareTicket: true, + menus: ['shareAppMessage', 'shareTimeline'] + }); + } + } catch (_) {} + // #endif +} + +/** + * 页面级分享统一 Composable (支持在 Vue3