// 账号同步管理器 - 自动检查并处理手机号绑定和账号合并 const apiClient = require('./api-client.js'); const authManager = require('./auth.js'); class AccountSyncManager { constructor() { this.isChecking = false; this.hasChecked = false; } // 检查用户是否需要绑定手机号 async checkPhoneBinding() { try { // 确保用户已登录 if (!authManager.isLoggedIn()) { return false; } const userInfo = authManager.getUserDisplayInfo(); if (!userInfo) { return false; } // 检查是否已绑定手机号(注意空字符串的处理) const hasPhone = !!(userInfo.phone && userInfo.phone.trim() !== ''); return !hasPhone; // 返回是否需要绑定 } catch (error) { console.error('检查手机号绑定状态失败:', error); return false; } } // 自动检查并引导用户绑定手机号 async autoCheckAndBind() { if (this.isChecking || this.hasChecked) { return; } this.isChecking = true; try { const needsBinding = await this.checkPhoneBinding(); if (needsBinding) { this.showPhoneBindingModal(); } else { } this.hasChecked = true; } catch (error) { console.error('自动检查账号同步失败:', error); } finally { this.isChecking = false; } } // 显示手机号绑定弹窗 showPhoneBindingModal() { // 检查是否应该跳过 if (this.shouldSkipBinding()) { return; } wx.showModal({ title: '完善账号信息', content: '为了更好的使用体验和账号安全,请绑定您的手机号', confirmText: '立即绑定', cancelText: '稍后再说', success: (res) => { if (res.confirm) { // 跳转到手机号绑定页面 wx.navigateTo({ url: '/subpackages/settings/phone-binding/phone-binding' }); } else { // 用户选择稍后,记录状态避免频繁弹出 this.setSkipBindingFlag(); } } }); } // 设置跳过绑定标记(24小时内不再提示) setSkipBindingFlag() { const skipUntil = Date.now() + 24 * 60 * 60 * 1000; // 24小时后 wx.setStorageSync('skipPhoneBinding', skipUntil); } // 检查是否应该跳过绑定提示 shouldSkipBinding() { try { const skipUntil = wx.getStorageSync('skipPhoneBinding'); if (skipUntil && Date.now() < skipUntil) { return true; } } catch (error) { console.error('检查跳过绑定标记失败:', error); } return false; } // 清除跳过绑定标记 clearSkipBindingFlag() { try { wx.removeStorageSync('skipPhoneBinding'); } catch (error) { console.error('清除跳过绑定标记失败:', error); } } // 绑定手机号 async bindPhone(phone, verifyCode, autoMerge = false) { try { const response = await apiClient.bindPhone(phone, verifyCode, autoMerge); if (response && response.code === 0) { // 修正成功码为0 // 清除跳过绑定标记 this.clearSkipBindingFlag(); // 尝试刷新用户信息(失败不影响绑定结果) try { await this.refreshUserInfo(); } catch (refreshError) { console.warn('刷新用户信息失败,但绑定操作已成功:', refreshError); // 不抛出错误,因为绑定本身是成功的 } // 根据文档,返回完整的绑定结果 return { success: response.data.success || true, hasMerged: response.data.hasMerged || false, mergeCount: response.data.mergeCount || 0, ...response.data }; } else { throw new Error(response?.message || '绑定失败'); } } catch (error) { console.error('绑定手机号失败:', error); // 根据文档,处理特定的错误情况 if (error.message && error.message.includes('已关联其他账号')) { // 重新抛出冲突错误,让上层处理 throw new Error('该手机号已关联其他账号,请选择合并或使用其他手机号'); } throw error; } } // 检测可合并账号 async detectMerge(customId) { try { const response = await apiClient.detectMerge(customId); if (response && response.code === 0) { // 修正成功码为0 return response.data; } else { throw new Error(response?.message || '检测失败'); } } catch (error) { console.error('检测可合并账号失败:', error); throw error; } } // 合并账号 async mergeAccount(primaryCustomId, secondaryCustomId, mergeReason) { try { const response = await apiClient.mergeAccount(primaryCustomId, secondaryCustomId, mergeReason); if (response && response.code === 0) { // 修正成功码为0 // 刷新用户信息 await this.refreshUserInfo(); return response.data; } else { throw new Error(response?.message || '合并失败'); } } catch (error) { console.error('合并账号失败:', error); throw error; } } // 刷新用户信息 async refreshUserInfo() { try { const response = await apiClient.getUserInfo(); if (response && response.code === 0) { // 更新全局用户信息 const app = getApp(); if (app && app.globalData.userInfo) { app.globalData.userInfo.user = response.data; // 同步到本地存储 wx.setStorageSync('userInfo', app.globalData.userInfo); } } } catch (error) { console.error('刷新用户信息失败:', error); } } // 重置检查状态(用于测试或强制重新检查) resetCheckStatus() { this.hasChecked = false; this.isChecking = false; this.clearSkipBindingFlag(); } } // 创建单例实例 const accountSyncManager = new AccountSyncManager(); module.exports = accountSyncManager;