// app.js const config = require('./config/config.js'); const authManager = require('./utils/auth.js'); const apiClient = require('./utils/api-client.js'); const accountSyncManager = require('./utils/account-sync.js'); const animationManager = require('./utils/animation-manager.js'); App({ globalData: { userInfo: null, isLoggedIn: false, appConfig: { name: config.appName, version: config.appVersion }, systemInfo: null, networkStatus: 'unknown' }, // 小程序启动 onLaunch: async function () { console.log('=== FindMe小程序启动 ==='); console.log('版本:', config.appVersion); console.log('环境:', config.debug?.enabled ? '开发' : '生产'); try { // 1. 初始化系统信息 await this.initSystemInfo(); // 2. 监听网络状态 this.initNetworkMonitoring(); // 3. 初始化认证管理器 await this.initAuth(); // 4. 静默登录检查 await this.checkSilentLogin(); console.log('=== 小程序启动完成 ==='); } catch (error) { console.error('小程序启动过程中发生错误:', error); // 即使出错也要继续启动,不能阻塞用户使用 } }, // 小程序显示 onShow: function () { console.log('小程序显示'); // 检查网络状态 this.checkNetworkStatus(); // 如果用户已登录,检查token是否需要刷新 if (this.globalData.isLoggedIn) { this.refreshTokenIfNeeded(); // 🔥 自动检查账号同步状态(延迟执行,避免阻塞主流程) setTimeout(() => { this.checkAccountSync(); }, 2000); } }, // 小程序隐藏 onHide: function () { console.log('小程序隐藏'); }, // 小程序错误处理 onError: function (error) { console.error('小程序全局错误:', error); // 这里可以集成错误上报服务 // 例如:errorReporter.report(error); }, // 页面未找到 onPageNotFound: function (res) { console.error('页面未找到:', res); // 重定向到首页 wx.reLaunch({ url: '/pages/map/map' }); }, // 未处理的Promise拒绝 onUnhandledRejection: function (res) { console.error('未处理的Promise拒绝:', res); }, // 初始化系统信息 async initSystemInfo() { try { // 使用新的API替代废弃的wx.getSystemInfoSync const [windowInfo, deviceInfo, appBaseInfo] = await Promise.all([ this.getWindowInfo(), this.getDeviceInfo(), this.getAppBaseInfo() ]); // 合并系统信息 const systemInfo = { ...windowInfo, ...deviceInfo, ...appBaseInfo }; this.globalData.systemInfo = systemInfo; console.log('系统信息初始化成功:', { platform: systemInfo.platform, version: systemInfo.version, model: systemInfo.model, language: systemInfo.language }); } catch (error) { console.error('获取系统信息失败,使用兜底方案:', error); // 兜底使用统一的系统信息工具 try { const { getSystemInfoSync } = require('./utils/system-info-helper.js'); const systemInfo = getSystemInfoSync(); this.globalData.systemInfo = systemInfo; } catch (fallbackError) { console.error('兜底方案也失败:', fallbackError); } } }, // 获取窗口信息 getWindowInfo() { return new Promise((resolve) => { try { const windowInfo = wx.getWindowInfo(); resolve(windowInfo); } catch (error) { console.warn('获取窗口信息失败:', error); resolve({}); } }); }, // 获取设备信息 getDeviceInfo() { return new Promise((resolve) => { try { const deviceInfo = wx.getDeviceInfo(); resolve(deviceInfo); } catch (error) { console.warn('获取设备信息失败:', error); resolve({}); } }); }, // 获取应用基础信息 getAppBaseInfo() { return new Promise((resolve) => { try { const appBaseInfo = wx.getAppBaseInfo(); resolve(appBaseInfo); } catch (error) { console.warn('获取应用信息失败:', error); resolve({}); } }); }, // 初始化网络监听 initNetworkMonitoring() { // 获取当前网络状态 wx.getNetworkType({ success: (res) => { this.globalData.networkStatus = res.networkType; console.log('当前网络类型:', res.networkType); } }); // 监听网络状态变化 wx.onNetworkStatusChange((res) => { this.globalData.networkStatus = res.networkType; console.log('网络状态变化:', res); if (res.isConnected) { console.log('网络连接恢复'); // 网络恢复时,重新检查登录状态 if (this.globalData.isLoggedIn) { this.refreshTokenIfNeeded(); } } else { console.log('网络连接断开'); } }); }, // 初始化认证管理器 async initAuth() { try { console.log('初始化认证管理器...'); await authManager.init(); console.log('认证管理器初始化完成'); } catch (error) { console.error('认证管理器初始化失败:', error); } }, // 静默登录检查 async checkSilentLogin() { try { console.log('🔍 开始静默登录检查...'); // 🔥 先检查本地存储的token const storedUserInfo = wx.getStorageSync('userInfo'); const directToken = wx.getStorageSync('token'); console.log('🔍 本地token检查:', { hasStoredUserInfo: !!storedUserInfo, hasUserInfoToken: !!(storedUserInfo?.token), hasDirectToken: !!directToken, userInfoTokenLength: storedUserInfo?.token?.length || 0, directTokenLength: directToken?.length || 0 }); // 如果没有任何token,直接返回false if (!storedUserInfo?.token && !directToken) { console.log('❌ 没有找到任何token,用户需要登录'); this.globalData.isLoggedIn = false; this.globalData.userInfo = null; return; } const isAuthenticated = await authManager.silentLogin(); if (isAuthenticated) { console.log('✅ 静默登录成功,用户已登录'); this.globalData.isLoggedIn = true; // 🔥 再次验证token的有效性 const finalUserInfo = wx.getStorageSync('userInfo'); if (finalUserInfo && finalUserInfo.token && finalUserInfo.token.length > 0) { this.globalData.userInfo = finalUserInfo; console.log('✅ 已恢复完整用户信息,token长度:', finalUserInfo.token.length); } else { console.error('❌ 静默登录成功但无法获取有效token'); this.globalData.isLoggedIn = false; this.globalData.userInfo = null; } } else { console.log('❌ 静默登录失败,用户需要手动登录'); this.globalData.isLoggedIn = false; this.globalData.userInfo = null; // 🔥 清理无效的存储数据 wx.removeStorageSync('userInfo'); wx.removeStorageSync('token'); } } catch (error) { console.error('❌ 静默登录检查失败:', error); this.globalData.isLoggedIn = false; this.globalData.userInfo = null; // 🔥 出错时清理存储数据 wx.removeStorageSync('userInfo'); wx.removeStorageSync('token'); } }, // 检查网络状态 checkNetworkStatus() { wx.getNetworkType({ success: (res) => { const oldStatus = this.globalData.networkStatus; this.globalData.networkStatus = res.networkType; if (oldStatus !== res.networkType) { console.log('网络类型变化:', oldStatus, '->', res.networkType); } }, fail: (error) => { console.error('获取网络类型失败:', error); } }); }, // 刷新token(如果需要) async refreshTokenIfNeeded() { try { if (!this.globalData.userInfo) { return; } const isValid = authManager.isTokenValid(this.globalData.userInfo); if (!isValid) { console.log('Token即将过期,尝试刷新'); const refreshed = await authManager.refreshTokenIfNeeded(this.globalData.userInfo); if (refreshed) { console.log('Token刷新成功'); // 🔥 修复:获取完整的认证信息 const storedUserInfo = wx.getStorageSync('userInfo'); if (storedUserInfo && storedUserInfo.token) { this.globalData.userInfo = storedUserInfo; console.log('Token刷新后已更新完整用户信息'); } } else { console.log('Token刷新失败,需要重新登录'); this.handleAuthExpired(); } } } catch (error) { console.error('Token刷新检查失败:', error); } }, // 处理认证过期 handleAuthExpired() { console.log('认证已过期,清除登录状态'); authManager.clearAuthData(); this.globalData.isLoggedIn = false; this.globalData.userInfo = null; // 显示提示 wx.showToast({ title: '登录已过期,请重新登录', icon: 'none', duration: 2000 }); // 跳转到登录页 setTimeout(() => { wx.reLaunch({ url: '/pages/login/login' }); }, 2000); }, // 手动登录方法(供页面调用) async login(loginData) { try { console.log('执行登录,保存用户信息'); // 使用认证管理器保存登录信息 const success = await authManager.saveAuthData(loginData); if (success) { // 🔥 修复:获取完整的认证信息 const storedUserInfo = wx.getStorageSync('userInfo'); if (storedUserInfo && storedUserInfo.token) { this.globalData.userInfo = storedUserInfo; this.globalData.isLoggedIn = true; console.log('登录信息保存成功,包含token'); return true; } else { console.error('登录信息保存失败:无法获取完整用户信息'); return false; } } else { console.error('登录信息保存失败'); return false; } } catch (error) { console.error('登录处理失败:', error); return false; } }, // 登出方法(供页面调用) async logout() { try { console.log('执行登出'); const success = await authManager.logout(); // 无论服务端登出是否成功,都要清除本地状态 this.globalData.isLoggedIn = false; this.globalData.userInfo = null; console.log('登出完成'); return success; } catch (error) { console.error('登出失败:', error); return false; } }, // 检查是否需要登录(供页面调用) requireAuth() { return authManager.requireAuth(); }, // 获取用户显示信息(供页面调用) getUserDisplayInfo() { return authManager.getUserDisplayInfo(); }, // 检查用户权限(供页面调用) hasPermission(permission) { return authManager.hasPermission(permission); }, // 获取当前token(供页面调用) getCurrentToken() { return authManager.getCurrentToken(); }, // 等待认证初始化完成(供页面调用) async waitForAuth() { await authManager.waitForInitialization(); return this.globalData.isLoggedIn; }, // 检查网络连接 isNetworkAvailable() { return this.globalData.networkStatus !== 'none'; }, // 显示网络错误提示 showNetworkError() { if (!this.isNetworkAvailable()) { wx.showToast({ title: '网络连接不可用', icon: 'none', duration: 2000 }); return true; } return false; }, // 全局错误处理工具 handleError(error, context = '') { console.error(`${context} 错误:`, error); // 根据错误类型显示不同提示 let message = '操作失败,请重试'; if (error.message) { message = error.message; } else if (error.errMsg) { if (error.errMsg.includes('timeout')) { message = '请求超时,请检查网络连接'; } else if (error.errMsg.includes('fail')) { message = '网络连接失败'; } } wx.showToast({ title: message, icon: 'none', duration: 2000 }); }, // 显示加载状态 showLoading(title = '加载中...') { wx.showLoading({ title: title, mask: true }); }, // 隐藏加载状态 hideLoading() { wx.hideLoading(); }, // 兼容性方法 - 检查登录状态 isLoggedIn() { return this.globalData.isLoggedIn; }, // 兼容性方法 - 获取用户信息 getUserInfo() { return this.globalData.userInfo; }, // 兼容性方法 - 获取token getToken() { return authManager.getCurrentToken(); }, // 🔥 账号同步检查 async checkAccountSync() { try { console.log('开始检查账号同步状态...'); // 检查是否应该跳过绑定提示 if (accountSyncManager.shouldSkipBinding()) { console.log('用户选择跳过绑定,24小时内不再提示'); return; } // 自动检查并引导用户绑定手机号 await accountSyncManager.autoCheckAndBind(); } catch (error) { console.error('账号同步检查失败:', error); // 不影响主要功能,静默处理错误 } } })