From 0d6eb331c8579ffb96abd1e7785ca25f9985f56c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Tue, 20 Jan 2026 15:18:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(shop):=20=E6=B7=BB=E5=8A=A0=E5=95=86?= =?UTF-8?q?=E5=93=81=E5=88=86=E4=BA=AB=E9=82=80=E8=AF=B7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 切换API基础URL到生产环境地址 - 在商品详情页添加邀请参数解析和存储逻辑 - 实现分享链接携带邀请者ID和来源信息 - 新增商品分享来源类型标识 - 在短信登录成功后处理待绑定的邀请关系 - 添加邀请关系跟踪和统计功能 --- config/env.ts | 4 ++-- src/passport/sms-login.tsx | 10 ++++++++++ src/shop/goodsDetail/index.tsx | 27 ++++++++++++++++++++++++++- src/utils/invite.ts | 1 + 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/config/env.ts b/config/env.ts index eb27c6c..16c21e5 100644 --- a/config/env.ts +++ b/config/env.ts @@ -2,8 +2,8 @@ export const ENV_CONFIG = { // 开发环境 development: { - API_BASE_URL: 'http://127.0.0.1:9200/api', - // API_BASE_URL: 'https://cms-api.websoft.top/api', + // API_BASE_URL: 'http://127.0.0.1:9200/api', + API_BASE_URL: 'https://cms-api.websoft.top/api', APP_NAME: '开发环境', DEBUG: 'true', }, diff --git a/src/passport/sms-login.tsx b/src/passport/sms-login.tsx index 62da43d..c30933c 100644 --- a/src/passport/sms-login.tsx +++ b/src/passport/sms-login.tsx @@ -3,6 +3,7 @@ import Taro from '@tarojs/taro' import {Input, Button} from '@nutui/nutui-react-taro' import {loginBySms, sendSmsCaptcha} from "@/api/passport/login"; import {LoginParam} from "@/api/passport/login/model"; +import {checkAndHandleInviteRelation, hasPendingInvite} from "@/utils/invite"; const SmsLogin = () => { const [loading, setLoading] = useState(false) @@ -131,6 +132,15 @@ const SmsLogin = () => { code: formData.code }) + // 登录成功后(可能是新注册用户),检查是否存在待处理的邀请关系并尝试绑定 + if (hasPendingInvite()) { + try { + await checkAndHandleInviteRelation() + } catch (e) { + console.error('短信登录后处理邀请关系失败:', e) + } + } + Taro.showToast({ title: '登录成功', icon: 'success' diff --git a/src/shop/goodsDetail/index.tsx b/src/shop/goodsDetail/index.tsx index 37a6630..df66a4b 100644 --- a/src/shop/goodsDetail/index.tsx +++ b/src/shop/goodsDetail/index.tsx @@ -15,6 +15,7 @@ import SpecSelector from "@/components/SpecSelector"; import "./index.scss"; import {useCart} from "@/hooks/useCart"; import {useConfig} from "@/hooks/useConfig"; +import {parseInviteParams, saveInviteParams, trackInviteSource} from "@/utils/invite"; const GoodsDetail = () => { const [statusBarHeight, setStatusBarHeight] = useState(44); @@ -39,6 +40,24 @@ const GoodsDetail = () => { const {cartCount, addToCart} = useCart() const {config} = useConfig() + // 如果从分享链接进入(携带 inviter/source/t),且当前未登录,则暂存邀请信息用于注册后绑定关系 + useEffect(() => { + try { + const currentUserId = Taro.getStorageSync('UserId') + if (currentUserId) return + + const inviteParams = parseInviteParams({query: router?.params}) + if (inviteParams?.inviter) { + saveInviteParams(inviteParams) + trackInviteSource(inviteParams.source || 'share', parseInt(inviteParams.inviter)) + } + } catch (e) { + // 邀请参数解析/存储失败不影响正常浏览商品 + console.error('商品详情页处理邀请参数失败:', e) + } + // router 在 Taro 中可能不稳定;这里仅在 goodsId 变化时尝试处理一次即可 + }, [goodsId]) + // 处理加入购物车 const handleAddToCart = () => { if (!goods) return; @@ -186,9 +205,15 @@ const GoodsDetail = () => { // 分享给好友 useShareAppMessage(() => { + const inviter = Taro.getStorageSync('UserId') + const sharePath = + inviter + ? `/shop/goodsDetail/index?id=${goodsId}&inviter=${inviter}&source=goods_share&t=${Date.now()}` + : `/shop/goodsDetail/index?id=${goodsId}` + return { title: goods?.name || '精选商品', - path: `/shop/goodsDetail/index?id=${goodsId}`, + path: sharePath, imageUrl: goods?.image ? `${goods.image}?x-oss-process=image/resize,w_500,h_400,m_fill` : undefined, // 分享图片,调整为5:4比例 success: function (res: any) { console.log('分享成功', res); diff --git a/src/utils/invite.ts b/src/utils/invite.ts index 34975d6..cfd88a4 100644 --- a/src/utils/invite.ts +++ b/src/utils/invite.ts @@ -235,6 +235,7 @@ export function getSourceDisplayName(source: string): string { 'qrcode': '小程序码', 'link': '分享链接', 'share': '好友分享', + 'goods_share': '商品分享', 'poster': '海报分享', 'unknown': '未知来源' }