/** * 登录状态管理工具 * 用于管理用户登录流程中的状态和数据传递 */ // 登录步骤常量 export const LOGIN_STEPS = { NOT_LOGGED: 'not_logged', // 未登录 WX_LOGGED: 'wx_logged', // 微信登录完成 PHONE_AUTHED: 'phone_authed', // 手机号授权完成 PHONE_SKIPPED: 'phone_skipped', // 跳过手机号授权 PROFILE_COMPLETED: 'profile_completed' // 个人信息完善完成 } // 存储键名常量 export const STORAGE_KEYS = { LOGIN_STEP: 'loginStep', WX_LOGIN_CODE: 'wxLoginCode', TOKEN: 'token', PHONE_NUMBER: 'phoneNumber', WX_USER_INFO: 'wxUserInfo', USER_INFO: 'userInfo', LOGIN_DATE: 'loginDate' } /** * 获取当前登录步骤 * @returns {string} 当前登录步骤 */ export const getCurrentLoginStep = () => { return uni.getStorageSync(STORAGE_KEYS.LOGIN_STEP) || LOGIN_STEPS.NOT_LOGGED } /** * 设置登录步骤 * @param {string} step 登录步骤 */ export const setLoginStep = (step) => { console.log('设置登录步骤:', step) uni.setStorageSync(STORAGE_KEYS.LOGIN_STEP, step) } /** * 检查用户是否已完成登录流程 * @returns {boolean} 是否已完成登录 */ export const isLoginCompleted = () => { const step = getCurrentLoginStep() return step === LOGIN_STEPS.PROFILE_COMPLETED } /** * 检查用户是否需要继续登录流程 * @returns {boolean} 是否需要继续登录 */ export const needsContinueLogin = () => { const step = getCurrentLoginStep() return step !== LOGIN_STEPS.NOT_LOGGED && step !== LOGIN_STEPS.PROFILE_COMPLETED } /** * 获取下一个应该跳转的页面 * @returns {string|null} 页面路径,如果不需要跳转则返回null */ export const getNextPage = () => { const step = getCurrentLoginStep() switch (step) { case LOGIN_STEPS.WX_LOGGED: return '/pages/auth/phone-auth' case LOGIN_STEPS.PHONE_AUTHED: case LOGIN_STEPS.PHONE_SKIPPED: return '/pages/profile/user-info?mode=setup' case LOGIN_STEPS.PROFILE_COMPLETED: return '/pages/profile/profile' default: return null } } /** * 保存微信登录信息 * @param {Object} loginData 登录数据 */ export const saveWxLoginData = (loginData) => { const { code } = loginData uni.setStorageSync(STORAGE_KEYS.WX_LOGIN_CODE, code) uni.setStorageSync(STORAGE_KEYS.LOGIN_DATE, new Date().toISOString()) setLoginStep(LOGIN_STEPS.WX_LOGGED) console.log('保存微信登录数据:', { code, step: LOGIN_STEPS.WX_LOGGED }) } /** * 保存手机号授权信息 * @param {Object} phoneData 手机号数据 */ export const savePhoneAuthData = (phoneData) => { const { token, userInfo } = phoneData if (token) { uni.setStorageSync(STORAGE_KEYS.TOKEN, token) } if (userInfo) { if (userInfo.phoneNumber) { uni.setStorageSync(STORAGE_KEYS.PHONE_NUMBER, userInfo.phoneNumber) } // 保存微信用户信息供后续使用 const wxUserInfo = { phoneNumber: userInfo.phoneNumber || '', openid: userInfo.openid || '', nickName: userInfo.nickName || '', avatarUrl: userInfo.avatarUrl || '' } uni.setStorageSync(STORAGE_KEYS.WX_USER_INFO, wxUserInfo) } setLoginStep(LOGIN_STEPS.PHONE_AUTHED) console.log('保存手机号授权数据:', { token: !!token, userInfo: !!userInfo }) } /** * 标记手机号授权被跳过 */ export const markPhoneSkipped = () => { setLoginStep(LOGIN_STEPS.PHONE_SKIPPED) console.log('标记手机号授权被跳过') } /** * 保存用户信息完善数据 * @param {Object} profileData 用户信息数据 */ export const saveProfileData = (profileData) => { uni.setStorageSync(STORAGE_KEYS.USER_INFO, profileData) setLoginStep(LOGIN_STEPS.PROFILE_COMPLETED) console.log('保存用户信息完善数据:', profileData) } /** * 清理登录流程中的临时数据 */ export const clearTempLoginData = () => { // 清理临时数据,保留重要的用户信息 uni.removeStorageSync(STORAGE_KEYS.WX_LOGIN_CODE) console.log('清理临时登录数据') } /** * 完全重置登录状态(用于登出) */ export const resetLoginState = () => { uni.removeStorageSync(STORAGE_KEYS.LOGIN_STEP) uni.removeStorageSync(STORAGE_KEYS.WX_LOGIN_CODE) uni.removeStorageSync(STORAGE_KEYS.TOKEN) uni.removeStorageSync(STORAGE_KEYS.PHONE_NUMBER) uni.removeStorageSync(STORAGE_KEYS.WX_USER_INFO) uni.removeStorageSync(STORAGE_KEYS.USER_INFO) uni.removeStorageSync(STORAGE_KEYS.LOGIN_DATE) console.log('重置登录状态') } /** * 获取登录流程的状态信息(用于内部检查) * @returns {Object} 状态信息 */ const getLoginStateInfo = () => { return { currentStep: getCurrentLoginStep(), wxLoginCode: uni.getStorageSync(STORAGE_KEYS.WX_LOGIN_CODE), hasToken: !!uni.getStorageSync(STORAGE_KEYS.TOKEN), hasPhoneNumber: !!uni.getStorageSync(STORAGE_KEYS.PHONE_NUMBER), hasWxUserInfo: !!uni.getStorageSync(STORAGE_KEYS.WX_USER_INFO), hasUserInfo: !!uni.getStorageSync(STORAGE_KEYS.USER_INFO), loginDate: uni.getStorageSync(STORAGE_KEYS.LOGIN_DATE) } } /** * 检查并处理登录流程的断点续传 * @returns {string|null} 需要跳转的页面路径,如果不需要跳转则返回null */ export const checkAndResumeLogin = () => { const currentStep = getCurrentLoginStep() // 如果已完成登录或未开始登录,不需要续传 if (currentStep === LOGIN_STEPS.PROFILE_COMPLETED || currentStep === LOGIN_STEPS.NOT_LOGGED) { return null } // 检查数据完整性 const stateInfo = getLoginStateInfo() console.log('检查登录断点续传:', stateInfo) // 根据当前步骤和数据完整性决定下一步 switch (currentStep) { case LOGIN_STEPS.WX_LOGGED: // 检查是否有微信登录凭证 if (!stateInfo.wxLoginCode) { console.warn('微信登录凭证丢失,重置登录状态') setLoginStep(LOGIN_STEPS.NOT_LOGGED) return null } // 检查登录凭证是否过期(超过30分钟) const loginDate = uni.getStorageSync(STORAGE_KEYS.LOGIN_DATE) if (loginDate) { const loginTime = new Date(loginDate).getTime() const now = new Date().getTime() const timeDiff = now - loginTime // 如果超过30分钟,认为登录凭证过期 if (timeDiff > 30 * 60 * 1000) { console.warn('微信登录凭证已过期,重置登录状态') setLoginStep(LOGIN_STEPS.NOT_LOGGED) return null } } return '/pages/auth/phone-auth' case LOGIN_STEPS.PHONE_AUTHED: // 检查是否有token if (!stateInfo.hasToken) { console.warn('Token丢失,回退到手机号授权') setLoginStep(LOGIN_STEPS.WX_LOGGED) return '/pages/auth/phone-auth' } return '/pages/profile/user-info?mode=setup' case LOGIN_STEPS.PHONE_SKIPPED: return '/pages/profile/user-info?mode=setup&phoneSkipped=true' default: console.warn('未知的登录步骤:', currentStep) setLoginStep(LOGIN_STEPS.NOT_LOGGED) return null } }