Kaynağa Gözat

fix(share): 分享文章/小程序冷热启动捕获邀请码,新用户注册登录后自动绑定推荐人

liaoxg 1 ay önce
ebeveyn
işleme
f6f8ca0584
2 değiştirilmiş dosya ile 38 ekleme ve 2 silme
  1. 33 2
      cfc-frontend/App.vue
  2. 5 0
      cfc-frontend/pages/index-home/index.vue

+ 33 - 2
cfc-frontend/App.vue

@@ -1,14 +1,18 @@
 <script>
 import config from '@/config.js'
 import Vue from 'vue'
-import { checkUserFamily, verifyToken } from './utils/api.js'
+import { checkUserFamily, verifyToken, bindReferral } from './utils/api.js'
 Vue.prototype.$config = config
 
 export default {
   onLaunch: function(options) {
     console.log('App Launch', options)
+    // 捕获分享/邀请参数(普通分享链接 ?inviteCode=xxx):未登录写入 storage 供注册登录后绑定推荐人,已登录直接绑定
+    this.captureReferralParams(options)
+    // 分享/深链冷启动(携带分享参数)放行到落地页,不套 splash,避免分享的文章/小程序页面打不开
+    var hasDeepLink = options && options.query && (options.query.inviteCode || options.query.id)
     // 冷启动:跳转到 splash 页展示过渡动画,2秒后自动进入首页
-    if (options.scene !== 1047 && options.scene !== 1048 && options.scene !== 1049) {
+    if (options.scene !== 1047 && options.scene !== 1048 && options.scene !== 1049 && !hasDeepLink) {
       uni.setStorageSync('_isFirstLaunch', '1')
       uni.redirectTo({ url: '/pages/splash/index' })
       return
@@ -37,6 +41,8 @@ export default {
   },
   onShow: function(options) {
     console.log('App Show', options)
+    // 热启动(含从分享卡重新进入):同样捕获分享参数
+    this.captureReferralParams(options)
     // 每次 app 展示时也检查场景值(小程序码可能从冷启动后的 onShow 传入)
     this.handleScene(options)
     
@@ -51,6 +57,31 @@ export default {
     console.log('App Hide')
   },
   methods: {
+    // 捕获分享/邀请参数:普通分享链接 /pages/xxx?inviteCode=yyy 冷/热启动进入时,
+    // 新用户(未登录)写入 storage,登录注册后由 login / user-edit 消费绑定推荐人;
+    // 已登录用户直接绑定(boundInviteCode 防重,避免重复请求)
+    captureReferralParams(options) {
+      if (!options || !options.query) return
+      var code = options.query.inviteCode
+      if (!code) return
+      if (uni.getStorageSync('token')) {
+        var bound = uni.getStorageSync('boundInviteCode')
+        if (bound === code) return
+        bindReferral(code).then(function(res) {
+          if (res && (res.code === 200 || res.code === 400)) {
+            uni.setStorageSync('boundInviteCode', code)
+            console.log('分享参数推荐人绑定结果', res.code, code)
+          }
+        }).catch(function(e) {
+          console.log('分享参数推荐人绑定失败', e)
+        })
+        return
+      }
+      uni.setStorageSync('inviteCode', code)
+      if (options.query.inviteType) {
+        uni.setStorageSync('inviteType', options.query.inviteType)
+      }
+    },
     // 校验本地 token 是否有效(开发环境跳过,避免无后端时误报)
     verifyStoredToken() {
       try {

+ 5 - 0
cfc-frontend/pages/index-home/index.vue

@@ -643,6 +643,11 @@ membershipDays: 0,
   },
   onLoad(options) {
     this._onLoadFired = true
+    // 兜底:分享卡直达首页(热启动直通等 App 级捕获未覆盖到的路径)时,
+    // 新用户把 inviteCode 写入 storage,登录注册后由 login / user-edit 消费绑定推荐人
+    if (options && options.inviteCode && !uni.getStorageSync('token')) {
+      uni.setStorageSync('inviteCode', options.inviteCode)
+    }
     this._doInit(options)
   },
   onShow() {