/** * 认证工具类 * 用于管理用户登录状态、token存储和登录检查 * 使用微信官方最新登录方式: * 1. wx.login() 获取code * 2. button open-type="chooseAvatar" 获取头像 * 3. input type="nickname" 获取昵称 * 4. button open-type="getPhoneNumber" 获取手机号 */ import { wxLogin } from './api.js' const TOKEN_KEY = 'user_token' const USER_INFO_KEY = 'user_info' /** * 保存用户token到本地存储 * @param {string} token - 用户登录token */ export const setToken = (token) => { uni.setStorageSync(TOKEN_KEY, token) } /** * 获取本地存储的token * @returns {string|null} token或null */ export const getToken = () => { return uni.getStorageSync(TOKEN_KEY) || null } /** * 移除本地存储的token */ export const removeToken = () => { uni.removeStorageSync(TOKEN_KEY) } /** * 保存用户信息到本地存储 * @param {object} userInfo - 用户信息对象 */ export const setUserInfo = (userInfo) => { uni.setStorageSync(USER_INFO_KEY, JSON.stringify(userInfo)) } /** * 获取本地存储的用户信息 * @returns {object|null} 用户信息对象或null */ export const getUserInfo = () => { const userInfo = uni.getStorageSync(USER_INFO_KEY) return userInfo ? JSON.parse(userInfo) : null } /** * 移除本地存储的用户信息 */ export const removeUserInfo = () => { uni.removeStorageSync(USER_INFO_KEY) } /** * 检查用户是否已登录 * @returns {boolean} 是否已登录 */ export const isLoggedIn = () => { return !!getToken() } /** * 清除所有登录信息(退出登录) */ export const logout = () => { removeToken() removeUserInfo() } /** * 微信静默登录 * 流程: * 1. 用户点击授权手机号按钮 * 2. 调用 wx.login() 获取 code * 3. 获取手机号授权 phoneCode * 4. 将 code 和 phoneCode 发送到后端 * 5. 后端通过 code 获取 openid 和 unionid * 6. 后端通过 phoneCode 获取手机号和用户信息(昵称、头像等) * 7. 后端保存所有信息到数据库并返回 token * * @param {string} code - 微信登录code(通过wx.login获取) * @param {string} phoneCode - 手机号授权code(通过getPhoneNumber获取) * @returns {Promise} 登录是否成功 */ export const wxAuthLogin = async (code, phoneCode) => { try { console.log('[微信登录] ========== 开始登录 ==========') console.log('[微信登录] 接收到的参数:') console.log(' - code:', code) console.log(' - phoneCode:', phoneCode) // 验证必需参数 if (!code) { console.error('[微信登录] 错误:code为空!') throw new Error('微信登录code为空,请重试') } if (!phoneCode) { console.error('[微信登录] 错误:phoneCode为空!') throw new Error('手机号授权code为空,请重试') } // 构建请求参数 const loginParams = { code: code, // 微信登录code,后端用于获取 openid 和 unionid phoneCode: phoneCode // 手机号授权code,后端用于获取手机号、昵称、头像等 } console.log('[微信登录] 准备发送到后端的参数:', JSON.stringify(loginParams)) // 调用后端登录接口 const result = await wxLogin(loginParams) console.log('[微信登录] 后端响应:', result) // 保存token和用户信息 if (result.code === 200 && result.data && result.data.token) { setToken(result.data.token) if (result.data.userInfo) { setUserInfo(result.data.userInfo) } console.log('[微信登录] 登录成功,token已保存') // 显示成功提示 uni.showToast({ title: '登录成功', icon: 'success', duration: 1500 }) return true } else { console.error('[微信登录] 后端返回格式错误:', result) throw new Error(result.message || '登录返回数据格式错误') } } catch (error) { console.error('[微信登录] ========== 登录失败 ==========') console.error('[微信登录] 错误详情:', error) uni.showToast({ title: error.message || '登录失败,请稍后重试', icon: 'none', duration: 2000 }) return false } } /** * 检查登录状态,未登录则提示用户登录 * @param {function} callback - 登录成功后的回调函数 * @returns {boolean} 是否已登录 */ export const checkLogin = (callback) => { if (isLoggedIn()) { return true } // 未登录,提示用户需要登录 uni.showModal({ title: '登录提示', content: '此功能需要登录后使用,请点击"立即登录"按钮进行授权', showCancel: false, confirmText: '我知道了' }) return false } /** * 显示需要登录的提示(用于页面遮罩层) * 返回一个标识,表示是否需要显示登录按钮 */ export const needLogin = () => { return !isLoggedIn() }