فهرست منبع

:update index

0235699曾露 8 ساعت پیش
والد
کامیت
58bc5ab974
3فایلهای تغییر یافته به همراه251 افزوده شده و 30 حذف شده
  1. 125 6
      common-page/pages/web-view/index.js
  2. 100 6
      components/app-auth/index.js
  3. 26 18
      index.js

+ 125 - 6
common-page/pages/web-view/index.js

@@ -17,15 +17,25 @@ Page({
     /**
      * 生命周期函数--监听页面加载
      */
-    onLoad: function (options) {
-        // 解码 URL
-        let path = decodeURIComponent(options.path || '');
-
+    onLoad: async function (options) {
         console.log('===========================================');
         console.log('======= web-view 页面加载 =======');
+        
+        // 1. 先检查用户登录状态
+        const loginCheck = await this.checkUserLogin(options);
+        if (!loginCheck) {
+            console.log('⚠️ 用户未登录或没有手机号,已跳转到授权页面');
+            console.log('===========================================');
+            return; // 停止后续加载
+        }
+        
+        console.log('✅ 用户已登录且有手机号,继续加载 web-view');
+        
+        // 2. 解码 URL
+        let path = decodeURIComponent(options.path || '');
+
         console.log('原始 options.path:', options.path);
         console.log('解码后的 path:', path);
-        console.log('===========================================');
 
         // 拼接额外参数(避免重复添加已存在的参数)
         let hasQuery = path.indexOf('?') !== -1;
@@ -78,6 +88,115 @@ Page({
         // 启动标题轮询监听
         this.startTitlePolling();
     },
+    
+    /**
+     * 检查用户登录状态
+     * @returns {Promise<boolean>} true: 已登录且有手机号,false: 需要登录
+     */
+    checkUserLogin: async function(options) {
+        try {
+            console.log('===========================================');
+            console.log('🔍 开始检查用户登录状态...');
+            
+            // 检查是否有 skipAuth 参数(用于跳过登录检查)
+            if (options.skipAuth === 'true') {
+                console.log('ℹ️ 检测到 skipAuth 参数,跳过登录检查');
+                console.log('===========================================');
+                return true;
+            }
+            
+            // 1. 先调用 checkAuth 初始化用户(不强制授权)
+            console.log('📱 调用 checkAuth 初始化用户...');
+            try {
+                await getApp().checkAuth(false); // false = 不强制授权,只是初始化
+                console.log('✅ checkAuth 调用成功');
+            } catch (err) {
+                console.warn('⚠️ checkAuth 调用失败(可能是游客模式):', err);
+            }
+            
+            // 2. 检查用户状态
+            const currentUser = Parse.User.current();
+            const hasMobile = currentUser?.get('mobile');
+            const userLogin = wx.getStorageSync('userLogin');
+            
+            console.log('📊 用户状态:');
+            console.log('   - 当前用户:', currentUser ? currentUser.id : '无');
+            console.log('   - 手机号:', hasMobile || '无');
+            console.log('   - userLogin 存储:', userLogin || '无');
+            
+            // 只有同时满足以下条件才认为已完整登录:
+            // 1. Parse.User.current() 存在
+            // 2. 用户有手机号
+            // 3. userLogin 存储存在
+            if (currentUser && hasMobile && userLogin) {
+                console.log('✅ 用户已完整登录');
+                console.log('===========================================');
+                return true;
+            }
+            
+            // 用户未登录或没有手机号,跳转到授权页面
+            console.log('⚠️ 用户未完整登录,准备跳转到授权页面');
+            
+            // 构建返回 URL(登录成功后返回当前页面)
+            const currentPath = options.path || '';
+            const returnUrl = encodeURIComponent(currentPath);
+            
+            console.log('🔗 returnUrl:', returnUrl);
+            console.log('===========================================');
+            
+            // 跳转到授权页面,并传递 returnUrl
+            wx.redirectTo({
+                url: `/components/app-auth/index?returnUrl=${returnUrl}`,
+                success: () => {
+                    console.log('✅ redirectTo 到授权页面成功');
+                },
+                fail: (err) => {
+                    console.error('❌ redirectTo 失败:', err);
+                    
+                    // 降级:使用 navigateTo
+                    wx.navigateTo({
+                        url: `/components/app-auth/index?returnUrl=${returnUrl}`,
+                        success: () => {
+                            console.log('✅ navigateTo 到授权页面成功');
+                        },
+                        fail: (err2) => {
+                            console.error('❌ navigateTo 也失败:', err2);
+                            
+                            // 最后降级:使用 reLaunch
+                            wx.reLaunch({
+                                url: `/components/app-auth/index?returnUrl=${returnUrl}`,
+                                success: () => {
+                                    console.log('✅ reLaunch 到授权页面成功');
+                                },
+                                fail: (err3) => {
+                                    console.error('❌ 所有跳转方式都失败:', err3);
+                                }
+                            });
+                        }
+                    });
+                }
+            });
+            
+            return false;
+            
+        } catch (err) {
+            console.error('❌ 检查登录状态失败:', err);
+            console.log('===========================================');
+            
+            // 出错时也跳转到授权页面
+            const returnUrl = options.path ? encodeURIComponent(options.path) : '';
+            wx.redirectTo({
+                url: `/components/app-auth/index?returnUrl=${returnUrl}`,
+                fail: () => {
+                    wx.navigateTo({
+                        url: `/components/app-auth/index?returnUrl=${returnUrl}`
+                    });
+                }
+            });
+            
+            return false;
+        }
+    },
 
     onReady: function () {
     },
@@ -244,4 +363,4 @@ Page({
             console.error('设置 web-view 标题失败:', e);
         }
     }
-})
+})

+ 100 - 6
components/app-auth/index.js

@@ -29,7 +29,8 @@ Page({
     verilyCode: '', //验证码
     s: 0, //获取验证码倒计时 秒/s
     countDown: false,
-    avatarKey: Date.now() // 用于强制刷新头像显示
+    avatarKey: Date.now(), // 用于强制刷新头像显示
+    isProcessingAuth: false, // 标记是否正在处理授权流程
   },
   onLoad: async function (options) {
     let Company = new Parse.Query('Company')
@@ -139,7 +140,10 @@ Page({
     if (!auth) return
     let userProfile = await this.getUserProfile()
     if (!userProfile) return
+    
+    // 标记正在处理授权
     this.setData({
+      isProcessingAuth: true,
       phoneModal: true
     })
   },
@@ -148,6 +152,12 @@ Page({
     if (!auth) return
     let userProfile = await this.getUserProfile()
     if (!userProfile) return
+    
+    // 标记正在处理授权
+    this.setData({
+      isProcessingAuth: true
+    })
+    
     let {
       code
     } = e.detail
@@ -448,6 +458,12 @@ Page({
       });
       return
     }
+    
+    // 标记正在处理授权
+    this.setData({
+      isProcessingAuth: true
+    })
+    
     let parsm = {
       mobile: mobile,
       code:verilyCode
@@ -457,6 +473,10 @@ Page({
     if(isVerify.code == 200){
       this.authMobileUser(mobile.toString())
     }else{
+      // 验证失败,重置标记
+      this.setData({
+        isProcessingAuth: false
+      })
       wx.showToast({
         title:isVerify?.msg || '验证码错误',
         icon: 'none',
@@ -470,7 +490,8 @@ Page({
   //关闭手机号授权弹窗
   hideModal: function () {
     this.setData({
-      phoneModal: false
+      phoneModal: false,
+      isProcessingAuth: false // 重置标记
     })
   },
   backLoad() {
@@ -481,6 +502,39 @@ Page({
     console.log('当前页面栈层数:', pages.length);
     console.log('当前页面路由:', pages[pages.length - 1]?.route);
     
+    // 检查是否有 returnUrl 参数(从 H5 页面传递过来)
+    const currentPage = pages[pages.length - 1];
+    const returnUrl = currentPage?.options?.returnUrl;
+    
+    if (returnUrl) {
+      console.log('📍 检测到 returnUrl 参数:', returnUrl);
+      
+      // 如果是 web-view 页面,跳转回去
+      const decodedUrl = decodeURIComponent(returnUrl);
+      console.log('🔙 准备跳转回 H5 页面:', decodedUrl);
+      
+      wx.navigateTo({
+        url: `/common-page/pages/web-view/index?path=${encodeURIComponent(decodedUrl)}`,
+        success: () => {
+          console.log('✅ 跳转回 H5 页面成功');
+          console.log('===========================================');
+        },
+        fail: (err) => {
+          console.error('❌ 跳转回 H5 页面失败:', err);
+          // 降级:正常返回上一页
+          this.normalBackLoad();
+        }
+      });
+      return;
+    }
+    
+    // 没有 returnUrl,执行正常的返回逻辑
+    this.normalBackLoad();
+  },
+  
+  normalBackLoad() {
+    let pages = getCurrentPages();
+    
     // 如果页面栈只有1层或没有上一页,直接跳转到首页
     if (pages.length <= 1) {
       console.log('⚠️ 没有上一个页面,直接跳转到首页');
@@ -795,7 +849,8 @@ Page({
   //关闭头像昵称填写弹窗
   onClose() {
     this.setData({
-      wxModel: false
+      wxModel: false,
+      isProcessingAuth: false // 重置标记
     })
   },
 
@@ -901,10 +956,49 @@ Page({
   },
 
   onShow: function () {
+    console.log('=== onShow 方法被调用 ===');
+    
+    // 如果正在处理授权流程,不要自动返回
+    if (this.data.isProcessingAuth) {
+      console.log('ℹ️ 正在处理授权流程,不自动返回');
+      return;
+    }
+    
+    // 如果有弹窗显示(手机号弹窗或头像昵称弹窗),不要自动返回
+    if (this.data.phoneModal || this.data.wxModel) {
+      console.log('ℹ️ 有弹窗显示,不自动返回');
+      return;
+    }
+    
     let userLogin = wx.getStorageSync('userLogin');
-    if (userLogin != '') {
-      wx.navigateBack();
-    };
+    let currentUser = Parse.User.current();
+    
+    console.log('userLogin 存储:', userLogin);
+    console.log('当前用户:', currentUser ? currentUser.id : '无');
+    console.log('手机号:', currentUser?.get('mobile') || '无');
+    
+    // 检查是否是从其他页面跳转过来的(有 returnUrl 参数)
+    const pages = getCurrentPages();
+    const currentPage = pages[pages.length - 1];
+    const hasReturnUrl = currentPage?.options?.returnUrl;
+    
+    if (hasReturnUrl) {
+      console.log('ℹ️ 检测到 returnUrl 参数,用户需要完成登录流程');
+      // 不要自动返回,让用户完成登录
+      return;
+    }
+    
+    // 只有当用户已登录且有手机号,并且不是从其他页面跳转过来时才返回
+    if (userLogin && currentUser && currentUser.get('mobile')) {
+      console.log('✅ 用户已完整登录,返回上一页');
+      wx.navigateBack({
+        fail: () => {
+          console.log('⚠️ 返回失败,可能是首页');
+        }
+      });
+    } else {
+      console.log('ℹ️ 用户未完整登录,显示授权页面');
+    }
   },
   onReady: function () {
 

+ 26 - 18
index.js

@@ -929,33 +929,41 @@ Page({
       console.log('🏪 扫码次数 (scanCount):', scanCount || '0');
       
       // 确定来源类型
-      let sourceType = 'unknown';
+      // 规则:
+      // 1. 扫描异业码(partnerId)→ sourceType = "partner"
+      // 2. 扫描员工码(employeeId、老板/员工)→ sourceType = "sales" 或 "promoter"
+      // 3. 扫描其他码(产品码、案例码等)→ sourceType = "scan"
+      let sourceType = 'scan';  // 默认为通用扫码
       let sourceId = null;
       
-      if (employeeId) {
-        sourceType = 'employee';
+      if (partnerId) {
+        // 异业合作伙伴二维码
+        sourceType = 'partner';
+        sourceId = partnerId;
+        console.log('🤝 [来源识别] 来源类型: 异业合作伙伴 (partner)');
+        console.log('🤝 合作伙伴ID (partnerId):', partnerId);
+      } else if (employeeId) {
+        // 员工二维码(包括老板和员工)
+        sourceType = 'sales';
         sourceId = employeeId;
-        console.log('👤 [来源识别] 来源类型: 员工展业');
+        console.log('👤 [来源识别] 来源类型: 员工展业 (sales)');
         console.log('👤 员工ID (employeeId):', employeeId);
+      } else if (ownerId) {
+        // 老板二维码
+        sourceType = 'sales';
+        sourceId = ownerId;
+        console.log('👔 [来源识别] 来源类型: 老板展业 (sales)');
+        console.log('👔 老板ID (ownerId):', ownerId);
       } else if (userId) {
-        // 推广员二维码使用userId
+        // 推广员二维码
         sourceType = 'promoter';
         sourceId = userId;
-        console.log('📢 [来源识别] 来源类型: 推广员展业');
+        console.log('📢 [来源识别] 来源类型: 推广员展业 (promoter)');
         console.log('📢 推广员ID (userId):', userId);
-      } else if (ownerId) {
-        sourceType = 'owner';
-        sourceId = ownerId;
-        console.log('👔 [来源识别] 来源类型: 老板展业');
-        console.log('👔 老板ID (ownerId):', ownerId);
-      } else if (partnerId) {
-        sourceType = 'partner';
-        sourceId = partnerId;
-        console.log('🤝 [来源识别] 来源类型: 异业合作伙伴');
-        console.log('🤝 合作伙伴ID (partnerId):', partnerId);
       } else {
-        sourceType = 'store';
-        console.log('🏬 [来源识别] 来源类型: 店铺分享(无具体来源人)');
+        // 其他情况(产品码、案例码、店铺分享等)
+        sourceType = 'scan';
+        console.log('🏬 [来源识别] 来源类型: 通用扫码 (scan)');
       }
       
       if (productId) {