Browse Source

:update login

0235699曾露 12 hours ago
parent
commit
04066ab69a
6 changed files with 375 additions and 123 deletions
  1. 81 4
      exportToPlugin.js
  2. 29 4
      index.js
  3. 163 37
      nova-pbf/components/home/index.js
  4. 1 1
      nova-pbf/pages/index/index.wxml
  5. 55 0
      utils/clearLogin.js
  6. 46 77
      utils/login.js

+ 81 - 4
exportToPlugin.js

@@ -17,11 +17,88 @@ module.exports = {
   company,
   rootPage,
   updateLocal(config, isUpdate) {
-    console.log('插件调用export=====',config);
+    console.log('===========================================');
+    console.log('======= 插件授权回调 =======');
+    console.log('config:', config);
+    console.log('isUpdate:', isUpdate);
+    console.log('===========================================');
+    
     isUpdate && wx.setStorageSync('config', config)
-    if (config.token) wx.setStorageSync("sessionToken", config.token)
-    if (config.userInfo) wx.setStorageSync("userInfo", config.userInfo)
-    if (config.userLogin) wx.setStorageSync("userLogin", config.userLogin)
+    if (config.token) {
+      wx.setStorageSync("sessionToken", config.token)
+      console.log('✅ 已保存 sessionToken');
+    }
+    if (config.userInfo) {
+      wx.setStorageSync("userInfo", config.userInfo)
+      console.log('✅ 已保存 userInfo');
+    }
+    if (config.userLogin) {
+      wx.setStorageSync("userLogin", config.userLogin)
+      console.log('✅ 已保存 userLogin:', config.userLogin);
+    }
+    
+    // 授权成功后,自动返回首页
+    if (config.userLogin && isUpdate) {
+      console.log('🔄 授权成功,准备返回首页...');
+      
+      // 检查是否有待处理的跳转
+      const pendingNavigation = wx.getStorageSync('pendingNavigation');
+      
+      // 延迟一下,确保数据保存完成
+      setTimeout(() => {
+        const pages = getCurrentPages();
+        console.log('当前页面栈层数:', pages.length);
+        
+        if (pages.length > 1) {
+          // 如果有上一页,返回上一页
+          console.log('📱 返回上一页');
+          wx.navigateBack({
+            delta: 1,
+            success: () => {
+              console.log('✅ 返回成功');
+              
+              // 如果有待处理的跳转,触发跳转
+              if (pendingNavigation) {
+                console.log('🎯 检测到待处理的跳转:', pendingNavigation);
+                wx.removeStorageSync('pendingNavigation');
+                
+                // 再延迟一下,确保页面已经返回并刷新
+                setTimeout(() => {
+                  // 触发页面的跳转方法
+                  const currentPages = getCurrentPages();
+                  const currentPage = currentPages[currentPages.length - 1];
+                  
+                  if (currentPage && currentPage.selectComponent) {
+                    const homeComponent = currentPage.selectComponent('#home-component');
+                    if (homeComponent && homeComponent.navigateToConsultation) {
+                      console.log('✅ 触发咨询页面跳转');
+                      homeComponent.navigateToConsultation();
+                    } else {
+                      console.warn('⚠️ 未找到 home 组件或 navigateToConsultation 方法');
+                    }
+                  }
+                }, 500);
+              }
+            },
+            fail: (err) => {
+              console.error('❌ 返回失败:', err);
+              // 如果返回失败,重新加载首页
+              wx.reLaunch({
+                url: rootPage || '/nova-pbf/pages/index/index'
+              });
+            }
+          });
+        } else {
+          // 如果没有上一页,重新加载首页
+          console.log('📱 重新加载首页');
+          wx.reLaunch({
+            url: rootPage || '/nova-pbf/pages/index/index'
+          });
+        }
+      }, 500);
+    }
+    
+    console.log('===========================================');
   },
   getCode() {
     return new Promise((resolve) => {

+ 29 - 4
index.js

@@ -182,34 +182,59 @@ Page({
       }
 
       let currentUser = Parse.User.current()
-      console.log(Parse.User.current())
+      console.log('===========================================');
+      console.log('======= index.js review 方法 =======');
+      console.log('当前用户:', currentUser ? currentUser.id : '无');
+      console.log('用户手机号:', currentUser?.get('mobile') || '无');
+      console.log('用户名:', currentUser?.get('username') || '无');
+      console.log('Session Token:', currentUser?.getSessionToken()?.substring(0, 20) || '无');
+      console.log('userLogin 存储:', wx.getStorageSync('userLogin') || '无');
+      console.log('force 参数:', force);
+      console.log('===========================================');
       
       // 修改:不强制登录,允许游客访问
       if (!currentUser || force) {
+        console.log('🔄 开始调用 checkAuth...');
+        
         // 尝试静默登录(不强制授权)
         let r = await checkAuth(false)  // 改为 false,不强制授权
-        console.log(r);
+        
+        console.log('===========================================');
+        console.log('======= checkAuth 返回结果 =======');
+        console.log('返回值:', r);
+        
+        // 重新获取用户信息
+        currentUser = Parse.User.current();
+        console.log('checkAuth 后的用户:', currentUser ? currentUser.id : '无');
+        console.log('checkAuth 后的手机号:', currentUser?.get('mobile') || '无');
+        console.log('checkAuth 后的 Session Token:', currentUser?.getSessionToken()?.substring(0, 20) || '无');
+        console.log('===========================================');
         
         // 即使登录失败,也允许继续访问
         if(!r) {
           console.log('⚠️ 用户未登录或拒绝授权,允许游客访问');
           // 不要 return,继续执行后面的跳转逻辑
         } else {
-          // 登录成功,更新 currentUser 并设置 userLogin
-          currentUser = Parse.User.current();
+          // 登录成功,设置 userLogin
           if (currentUser && currentUser.get('mobile')) {
             wx.setStorageSync("userLogin", currentUser.id);
             console.log('✅ 授权登录成功,已设置 userLogin:', currentUser.id);
             console.log('✅ 用户手机号:', currentUser.get('mobile'));
+          } else {
+            console.warn('⚠️ checkAuth 返回成功,但用户没有手机号!');
+            console.warn('   用户对象:', currentUser);
           }
           
           // 检查是否有待记录的扫码信息
           await this.checkAndRecordPendingScan();
         }
       } else {
+        console.log('✅ 用户已登录,跳过 checkAuth');
+        
         // 用户已登录,确保 userLogin 已设置
         if (currentUser.get('mobile')) {
           wx.setStorageSync("userLogin", currentUser.id);
+          console.log('✅ 已确认 userLogin:', currentUser.id);
         }
         this.updateUser(currentUser.id)
         // 用户已登录,检查是否有待记录的扫码信息

+ 163 - 37
nova-pbf/components/home/index.js

@@ -1,6 +1,7 @@
 const Parse = getApp().Parse;
 const company = getApp().globalData.company;
 const login = require("../../../utils/login");
+const clearLogin = require("../../../utils/clearLogin");
 
 Component({
   /**
@@ -17,10 +18,13 @@ Component({
 
   lifetimes: {
     created() {},
-    attached: function () {
+    attached: async function () {
       // 页面加载时检查是否首次访问
       this.checkFirstVisit();
       
+      // 检查并清理异常的登录状态
+      await this.checkAndCleanInvalidLoginState();
+      
       // 在控制台显示当前登录用户信息
       this.showCurrentUser();
     },
@@ -28,18 +32,34 @@ Component({
 
   pageLifetimes: {
     show: function() {
-      // 页面显示时,检查并更新登录状态
-      const currentUser = Parse.User.current();
-      if (currentUser && currentUser.get('mobile')) {
-        const userLogin = wx.getStorageSync('userLogin');
-        if (!userLogin || userLogin !== currentUser.id) {
-          wx.setStorageSync("userLogin", currentUser.id);
-          console.log('✅ 页面显示时更新 userLogin:', currentUser.id);
-        }
-      }
+      console.log('===========================================');
+      console.log('======= 页面显示 (pageLifetimes.show) =======');
       
-      // 更新显示的用户信息
-      this.showCurrentUser();
+      // 延迟检查登录状态,等待 Parse 更新
+      setTimeout(() => {
+        const currentUser = Parse.User.current();
+        console.log('当前用户:', currentUser ? currentUser.id : '无');
+        console.log('手机号:', currentUser?.get('mobile') || '无');
+        
+        if (currentUser && currentUser.get('mobile')) {
+          const userLogin = wx.getStorageSync('userLogin');
+          console.log('userLogin 存储:', userLogin || '无');
+          
+          if (!userLogin || userLogin !== currentUser.id) {
+            wx.setStorageSync("userLogin", currentUser.id);
+            console.log('✅ 页面显示时更新 userLogin:', currentUser.id);
+            
+            // 清除游客模式标记
+            wx.removeStorageSync('isGuestMode');
+            console.log('✅ 已清除游客模式标记');
+          }
+        }
+        
+        console.log('===========================================');
+        
+        // 更新显示的用户信息
+        this.showCurrentUser();
+      }, 500); // 延迟 500ms,等待 Parse 更新
     }
   },
 
@@ -47,6 +67,44 @@ Component({
    * 组件的方法列表
    */
   methods: {
+    /**
+     * 检查并清理异常的登录状态
+     * 在页面加载时自动执行,避免点击登录时白屏
+     */
+    async checkAndCleanInvalidLoginState() {
+      try {
+        const currentUser = Parse.User.current();
+        const userLogin = wx.getStorageSync('userLogin');
+        
+        // 如果有 Parse 用户但没有 userLogin,说明状态不一致
+        if (currentUser && !userLogin) {
+          console.log('⚠️ 检测到异常登录状态:有 Parse 用户但没有 userLogin');
+          console.log('   用户 ID:', currentUser.id);
+          console.log('   手机号:', currentUser.get('mobile') || '无');
+          
+          // 如果用户有手机号,补充设置 userLogin
+          if (currentUser.get('mobile')) {
+            wx.setStorageSync('userLogin', currentUser.id);
+            console.log('✅ 已补充设置 userLogin');
+          } else {
+            // 如果用户没有手机号,清除这个无效的用户
+            console.log('🧹 用户没有手机号,清除无效状态');
+            await clearLogin.clearAllLoginState();
+          }
+        }
+        
+        // 如果有 userLogin 但没有 Parse 用户,说明状态不一致
+        if (!currentUser && userLogin) {
+          console.log('⚠️ 检测到异常登录状态:有 userLogin 但没有 Parse 用户');
+          console.log('   userLogin:', userLogin);
+          console.log('🧹 清除无效的 userLogin');
+          wx.removeStorageSync('userLogin');
+        }
+      } catch (error) {
+        console.error('❌ 检查登录状态失败:', error);
+      }
+    },
+
     /**
      * 在控制台显示当前登录用户信息
      */
@@ -493,44 +551,94 @@ Component({
       console.log('===========================================');
       
       // 方案定制需要登录
-      const currentUser = Parse.User.current();
+      let currentUser = Parse.User.current();
       const isGuestMode = wx.getStorageSync('isGuestMode');
-      const userLogin = wx.getStorageSync('userLogin');
+      let userLogin = wx.getStorageSync('userLogin');
       
-      console.log('当前用户:', currentUser ? '已登录' : '未登录');
-      console.log('用户手机号:', currentUser?.get('mobile'));
+      console.log('当前用户:', currentUser ? currentUser.id : '无');
+      console.log('用户手机号:', currentUser?.get('mobile') || '无');
       console.log('游客模式:', isGuestMode);
-      console.log('userLogin 存储:', userLogin);
+      console.log('userLogin 存储:', userLogin || '无');
+      
+      // 如果有 Parse 用户但没有 userLogin,可能是刚授权完成,等待一下
+      if (currentUser && currentUser.get('mobile') && !userLogin) {
+        console.log('⏳ 检测到刚授权完成,等待状态同步...');
+        
+        // 等待 500ms 后重新检查
+        await new Promise(resolve => setTimeout(resolve, 500));
+        
+        // 重新获取状态
+        currentUser = Parse.User.current();
+        userLogin = wx.getStorageSync('userLogin');
+        
+        // 如果还是没有 userLogin,手动设置
+        if (currentUser && currentUser.get('mobile') && !userLogin) {
+          wx.setStorageSync("userLogin", currentUser.id);
+          userLogin = currentUser.id;
+          console.log('✅ 手动设置 userLogin:', userLogin);
+        }
+      }
       
       // 检查用户是否真正登录(有手机号且有 userLogin 存储)
       const isReallyLoggedIn = currentUser && currentUser.get('mobile') && userLogin;
       
-      if (!isReallyLoggedIn || isGuestMode) {
-        console.log('⚠️ 用户未完成登录或是游客,显示登录提示');
-        
-        // 如果是游客模式,清除游客标记
-        if (isGuestMode) {
-          wx.removeStorageSync('isGuestMode');
-          wx.removeStorageSync('userLogin');
-        }
+      console.log('最终登录状态:', isReallyLoggedIn ? '已登录' : '未登录');
+      
+      // 如果用户已经真正登录,清除游客模式标记
+      if (isReallyLoggedIn && isGuestMode) {
+        console.log('✅ 用户已登录,清除游客模式标记');
+        wx.removeStorageSync('isGuestMode');
+      }
+      
+      // 只有在真正未登录时才提示
+      if (!isReallyLoggedIn) {
+        console.log('⚠️ 用户未完成登录,显示登录提示');
         
         wx.showModal({
           title: '需要登录',
           content: '方案定制和咨询功能需要登录后使用,是否立即登录?',
           confirmText: '立即登录',
           cancelText: '取消',
-          success: (res) => {
+          success: async (res) => {
             if (res.confirm) {
               console.log('用户选择:立即登录');
-              console.log('准备调用 login.loginNow()');
               
-              // 直接调用登录方法,不需要延迟
-              const loginResult = login.loginNow();
-              console.log('login.loginNow() 返回值:', loginResult);
+              // 显示加载提示
+              wx.showLoading({
+                title: '准备登录...',
+                mask: true
+              });
               
-              // 如果返回 false,说明已经跳转到登录页面
-              if (!loginResult) {
-                console.log('✅ 已跳转到登录页面');
+              try {
+                // 强制清除所有登录相关的缓存
+                console.log('🧹 清除旧的登录状态...');
+                await clearLogin.clearAllLoginState();
+                
+                // 等待一下,确保状态清除完成
+                await new Promise(resolve => setTimeout(resolve, 300));
+                
+                wx.hideLoading();
+                
+                console.log('准备调用 login.loginNow()');
+                
+                // 直接调用登录方法
+                const loginResult = login.loginNow();
+                console.log('login.loginNow() 返回值:', loginResult);
+                
+                // 如果返回 false,说明已经跳转到登录页面
+                if (!loginResult) {
+                  console.log('✅ 已跳转到登录页面');
+                  // 设置待处理的跳转,登录成功后自动跳转到咨询页面
+                  wx.setStorageSync('pendingNavigation', 'consultation');
+                  console.log('📌 已设置待处理跳转: consultation');
+                }
+              } catch (error) {
+                wx.hideLoading();
+                console.error('❌ 登录准备失败:', error);
+                wx.showToast({
+                  title: '登录准备失败,请重试',
+                  icon: 'none'
+                });
               }
             } else {
               console.log('用户选择:取消');
@@ -541,6 +649,7 @@ Component({
       }
       
       console.log('✅ 用户已登录,跳转到咨询页面');
+      console.log('===========================================');
       await this.navigateToH5Page('owner/nav/consultation');
     },
 
@@ -557,8 +666,15 @@ Component({
       const currentUser = Parse.User.current();
       let userInfo = wx.getStorageSync("userLogin");
       
+      console.log('📱 当前登录状态检查:');
+      console.log('   Parse.User.current():', currentUser ? currentUser.id : '无');
+      console.log('   用户手机号:', currentUser?.get('mobile') || '无');
+      console.log('   userLogin 存储:', userInfo || '无');
+      console.log('   Session Token (前20字符):', currentUser?.getSessionToken()?.substring(0, 20) || '无');
+      
       // 检查是否是游客模式
       const isGuestMode = wx.getStorageSync('isGuestMode');
+      console.log('   游客模式:', isGuestMode);
       
       // 定义允许游客访问的页面
       const guestAllowedPages = [
@@ -624,9 +740,10 @@ Component({
       }
       
       let token = currentUser.getSessionToken();
-      console.log('🔑 当前 Session Token:', token);
-      console.log('   - Token 长度:', token ? token.length : 0);
-      console.log('   - Token 前20个字符:', token ? token.substring(0, 20) : 'null');
+      console.log('🔑 准备传递的 Token:');
+      console.log('   完整 Token:', token);
+      console.log('   Token 长度:', token ? token.length : 0);
+      console.log('   Token 前20个字符:', token ? token.substring(0, 20) : 'null');
       
       if (!token) {
         console.error('❌ 无法获取 Session Token!');
@@ -688,6 +805,10 @@ Component({
       
       h5Url += `token=${token}`;
       
+      console.log('🌐 构建的 H5 URL:');
+      console.log('   完整 URL:', h5Url);
+      console.log('   URL 中的 token (前20字符):', token.substring(0, 20));
+      
       // 添加额外的参数(如 productId)
       if (extraParams && Object.keys(extraParams).length > 0) {
         for (const [key, value] of Object.entries(extraParams)) {
@@ -711,9 +832,14 @@ Component({
         webViewPath += `&storeName=${encodeURIComponent(storeName)}`;
       }
       
+      console.log('📄 最终跳转路径:', webViewPath.substring(0, 150) + '...');
+      console.log('===========================================');
+      
       wx.navigateTo({
         url: webViewPath,
-        success: () => {},
+        success: () => {
+          console.log('✅ 跳转成功');
+        },
         fail: (err) => {
           console.error('❌ 跳转失败:', err);
           wx.showToast({

+ 1 - 1
nova-pbf/pages/index/index.wxml

@@ -10,7 +10,7 @@
 	</block>
 </view>
 
-	<home id="comp{{id}}" />
+	<home id="home-component" />
 <!-- <van-tabbar
  class="custom-tabbar" active="{{ active }}" bind:change="onChange" active-color="{{tabbarList.activeColor || '#000000'}}" inactive-color="#fff" z-index="99">
 	<block wx:for="{{tabbarList.list}}" wx:key="index">

+ 55 - 0
utils/clearLogin.js

@@ -0,0 +1,55 @@
+/**
+ * 清除所有登录状态的工具方法
+ * 用于调试和解决登录状态混乱的问题
+ */
+
+var Parse = getApp().Parse;
+
+/**
+ * 强制清除所有登录状态
+ */
+async function clearAllLoginState() {
+  console.log('===========================================');
+  console.log('======= 强制清除所有登录状态 =======');
+  console.log('===========================================');
+  
+  try {
+    // 1. 获取当前用户信息(用于日志)
+    const currentUser = Parse.User.current();
+    if (currentUser) {
+      console.log('当前用户 ID:', currentUser.id);
+      console.log('当前手机号:', currentUser.get('mobile'));
+    }
+    
+    // 2. 登出 Parse 用户
+    if (currentUser) {
+      await Parse.User.logOut();
+      console.log('✅ 已登出 Parse 用户');
+    }
+    
+    // 3. 清除所有本地存储
+    wx.removeStorageSync('userLogin');
+    wx.removeStorageSync('sessionToken');
+    wx.removeStorageSync('isGuestMode');
+    wx.removeStorageSync('userInfo');
+    console.log('✅ 已清除本地存储');
+    
+    // 4. 验证清除结果
+    const afterUser = Parse.User.current();
+    console.log('清除后的用户:', afterUser ? '还有用户!' : '无');
+    console.log('清除后的 userLogin:', wx.getStorageSync('userLogin') || '无');
+    
+    console.log('===========================================');
+    console.log('✅ 登录状态已完全清除');
+    console.log('===========================================');
+    
+    return true;
+  } catch (error) {
+    console.error('❌ 清除登录状态失败:', error);
+    return false;
+  }
+}
+
+module.exports = {
+  clearAllLoginState
+};

+ 46 - 77
utils/login.js

@@ -1,6 +1,6 @@
 var Parse = getApp().Parse;
 
-function loginNow(authPage = 'plugin://fm-plugin/fm-auth') {
+function loginNow(forceAuth = true) {
   console.log('===========================================');
   console.log('======= 开始登录流程 =======');
   
@@ -28,84 +28,53 @@ function loginNow(authPage = 'plugin://fm-plugin/fm-auth') {
     wx.removeStorageSync('userLogin');
   }
   
-  // 跳转到授权页面
-  console.log('🔄 准备跳转到授权页面:', authPage);
+  // 使用插件的 checkAuth 方法进行授权
+  console.log('🔄 调用插件的 checkAuth 方法...');
   
-  // 检查页面栈
-  const pages = getCurrentPages();
-  console.log('当前页面栈层数:', pages.length);
-  console.log('当前页面路径:', pages[pages.length - 1]?.route);
-  
-  // 添加短暂延迟,确保 UI 渲染完成
-  setTimeout(() => {
-    if (pages.length >= 9) {
-      // 页面栈接近满,使用 redirectTo
-      console.log('⚠️ 页面栈接近满,使用 redirectTo');
-      wx.redirectTo({
-        url: authPage,
-        success: () => {
-          console.log('✅ redirectTo 跳转成功');
-        },
-        fail: (err) => {
-          console.error('❌ redirectTo 失败:', err);
-          console.error('错误详情:', JSON.stringify(err));
-          wx.showToast({
-            title: '跳转失败,请重试',
-            icon: 'none',
-            duration: 2000
-          });
-        }
-      });
-    } else {
-      // 使用 navigateTo
-      console.log('📱 使用 navigateTo 跳转');
-      wx.navigateTo({
-        url: authPage,
-        success: () => {
-          console.log('✅ navigateTo 跳转成功');
-        },
-        fail: (err) => {
-          console.error('❌ navigateTo 失败:', err);
-          console.error('错误详情:', JSON.stringify(err));
-          console.log('⚠️ 尝试使用 redirectTo');
-          
-          // 降级使用 redirectTo
-          wx.redirectTo({
-            url: authPage,
-            success: () => {
-              console.log('✅ redirectTo 跳转成功');
-            },
-            fail: (err2) => {
-              console.error('❌ redirectTo 也失败:', err2);
-              console.error('错误详情:', JSON.stringify(err2));
-              
-              // 最后尝试使用 reLaunch
-              console.log('⚠️ 尝试使用 reLaunch');
-              wx.reLaunch({
-                url: '/index',
-                success: () => {
-                  console.log('✅ reLaunch 到首页成功,请重新点击登录');
-                  wx.showToast({
-                    title: '请重新点击登录',
-                    icon: 'none',
-                    duration: 2000
-                  });
-                },
-                fail: (err3) => {
-                  console.error('❌ reLaunch 也失败:', err3);
-                  wx.showToast({
-                    title: '跳转失败,请重启小程序',
-                    icon: 'none',
-                    duration: 3000
-                  });
-                }
-              });
-            }
-          });
-        }
+  const checkAuth = getApp().checkAuth;
+  if (checkAuth) {
+    // 调用插件的授权方法
+    checkAuth(forceAuth).then((result) => {
+      console.log('✅ checkAuth 成功:', result);
+      
+      // 授权成功后,更新本地存储
+      const newUser = Parse.User.current();
+      if (newUser && newUser.get('mobile')) {
+        wx.setStorageSync("userLogin", newUser.id);
+        console.log('✅ 已设置 userLogin:', newUser.id);
+        console.log('✅ 用户手机号:', newUser.get('mobile'));
+        
+        // 提示用户授权成功
+        wx.showToast({
+          title: '登录成功',
+          icon: 'success',
+          duration: 2000
+        });
+        
+        // 返回上一页或刷新当前页
+        setTimeout(() => {
+          const pages = getCurrentPages();
+          if (pages.length > 1) {
+            wx.navigateBack();
+          }
+        }, 2000);
+      }
+    }).catch((err) => {
+      console.error('❌ checkAuth 失败:', err);
+      wx.showToast({
+        title: '授权失败,请重试',
+        icon: 'none',
+        duration: 2000
       });
-    }
-  }, 100);
+    });
+  } else {
+    console.error('❌ 找不到 checkAuth 方法');
+    wx.showToast({
+      title: '登录功能异常,请重启小程序',
+      icon: 'none',
+      duration: 3000
+    });
+  }
   
   console.log('===========================================');
   return false;