// 导入用户相关的接口函数 import { getUserInfo, editUserInfo, anonymousLogin as anonymousLoginInterface, userInterface } from '@/common/server/interface/user' import { ref } from 'vue' import throttle from 'lodash/throttle'; // 用户信息响应式数据 export const userInfo = ref(null); // 创建节流函数,防止频繁调用用户信息加载接口(2秒内只执行一次) const throttledLoadUserInfo = throttle(_loadUserInfo, 2000, { leading: true, trailing: false }); /** * 清除用户相关存储 */ const clearUserStorage = () => { userInfo.value = null; uni.removeStorageSync('tokenInfo'); uni.removeStorageSync('userInfo'); }; /** * 检查token是否有效 * @param {string} token - token字符串 * @returns {boolean} token是否有效 */ const isValidToken = (token) => { return token && token !== null && token !== ''; }; /** * 加载用户信息(外部调用接口) * 使用节流函数防止频繁调用 */ export const loadUserInfo = async () => { console.log('loadUserInfo'); throttledLoadUserInfo(); }; /** * 内部用户信息加载函数 * 从服务器获取用户信息并更新本地状态 */ async function _loadUserInfo() { console.log("_loadUserInfo"); try { // 调用接口获取用户信息 const res = await getUserInfo(); // 如果获取失败,清空用户信息和本地存储 if (res == null) { clearUserStorage(); return; } // 更新用户信息 userInfo.value = res; } catch (error) { console.error('加载用户信息失败:', error); clearUserStorage(); } } /** * 更新用户信息 * @param {string} nickName - 昵称 * @param {string} avatar - 头像 * @param {string} sex - 性别 * @param {string} birthday - 生日 */ export const updateUserInfo = async (nickName, avatar, sex, birthday) => { try { // 调用接口更新用户信息 const res = await editUserInfo(nickName, avatar, sex, birthday); // 如果更新失败,直接返回 if (!res) { return; } // 更新成功后重新加载用户信息 loadUserInfo(); } catch (error) { console.error('更新用户信息失败:', error); } }; /** * 检查用户是否已登录 * @returns {Promise} 是否已登录 */ export const isLogin = async () => { // 如果用户信息已存在,直接返回true if (userInfo.value !== null) { return true; } // 检查本地token const tokenInfo = uni.getStorageSync('tokenInfo'); if (!isValidToken(tokenInfo)) { return false; } try { // 尝试加载用户信息 await _loadUserInfo(); // 如果加载后用户信息仍为空,清除存储并返回false if (userInfo.value === null) { clearUserStorage(); return false; } return true; } catch (error) { console.error('检查登录状态失败:', error); clearUserStorage(); return false; } }; /** * 匿名登录 * 检查本地是否有token,如果有则进行匿名登录 */ export const anonymousLogin = async () => { // 从本地存储获取token信息 const tokenInfo = uni.getStorageSync('tokenInfo'); // 如果没有token,直接返回 if (!isValidToken(tokenInfo)) { return; } try { // 调用匿名登录接口 const res = await anonymousLoginInterface(); if (res) { // 登录成功,保存新的token并加载用户信息 uni.setStorageSync("tokenInfo", res); console.log("匿名登录成功", res); loadUserInfo(); } else { // 登录失败,清除本地存储的token和用户信息 clearUserStorage(); } } catch (error) { console.error('匿名登录失败:', error); clearUserStorage(); } };