/** * NIM 用户信息管理器 * 负责同步用户头像和昵称到 NIM SDK */ const app = getApp(); class NIMUserManager { constructor() { this.initialized = false; this.userInfoCache = new Map(); // 用户信息缓存 this.cacheExpiry = 30 * 60 * 1000; // 缓存30分钟 } /** * 初始化用户管理器 */ init() { if (this.initialized) { console.log('NIM 用户管理器已初始化'); return; } console.log('📋 初始化 NIM 用户管理器'); this.initialized = true; } /** * 更新自己的用户信息到 NIM * @param {Object} userInfo - 用户信息对象 * @param {string} userInfo.avatar - 头像 URL * @param {string} userInfo.nickname - 昵称 * @returns {Promise} 是否更新成功 */ async updateSelfUserInfo(userInfo = {}) { try { const nim = app.globalData?.nim; if (!nim) { console.warn('⚠️ NIM 实例未初始化,跳过用户信息同步'); return false; } // 🔥 正确的访问方式:nim.V2NIMUserService (小程序/Web平台) const userService = nim.V2NIMUserService; if (!userService) { console.warn('⚠️ NIM V2NIMUserService 未注册'); return false; } // 构建更新参数 const updateParams = {}; if (userInfo.avatar) { updateParams.avatar = userInfo.avatar; } if (userInfo.nickname) { updateParams.name = userInfo.nickname; } // 如果没有需要更新的字段,直接返回 if (Object.keys(updateParams).length === 0) { console.log('没有需要更新的用户信息'); return true; } console.log('🔄 同步用户信息到 NIM:', updateParams); // 🔥 调用 NIM SDK 更新用户资料 // 参考文档:https://doc.yunxin.163.com/messaging2/client-apis/jc0MTUyODY?platform=client#updateSelfUserProfile await userService.updateSelfUserProfile(updateParams); console.log('✅ NIM 用户信息同步成功'); return true; } catch (error) { console.error('❌ NIM 用户信息同步失败:', error); // 不抛出错误,避免影响主流程 return false; } } /** * 批量获取用户信息(从 NIM 或 API) * @param {Array} accountIds - 用户账号 ID 列表 * @returns {Promise>} 用户信息 Map */ async getUserInfoBatch(accountIds = []) { if (!Array.isArray(accountIds) || accountIds.length === 0) { return new Map(); } try { const nim = app.globalData?.nim; if (!nim) { console.warn('⚠️ NIM 实例未初始化'); return new Map(); } // 🔥 正确的访问方式:nim.V2NIMUserService const userService = nim.V2NIMUserService; if (!userService) { console.warn('⚠️ NIM V2NIMUserService 未注册'); return new Map(); } // 过滤掉已缓存且未过期的用户 const now = Date.now(); const needFetch = accountIds.filter(id => { const cached = this.userInfoCache.get(id); return !cached || (now - cached.timestamp > this.cacheExpiry); }); if (needFetch.length === 0) { // 全部从缓存返回 const result = new Map(); accountIds.forEach(id => { const cached = this.userInfoCache.get(id); if (cached) { result.set(id, cached.data); } }); return result; } console.log(`📡 从 NIM 获取 ${needFetch.length} 个用户信息`); // 从 NIM 获取用户信息 const users = await userService.getUserList(needFetch); const result = new Map(); if (Array.isArray(users)) { users.forEach(user => { const userInfo = { accountId: user.accountId, avatar: user.avatar || '', nickname: user.name || '', createTime: user.createTime, updateTime: user.updateTime }; result.set(user.accountId, userInfo); // 更新缓存 this.userInfoCache.set(user.accountId, { data: userInfo, timestamp: now }); }); } // 补充缓存中的数据 accountIds.forEach(id => { if (!result.has(id)) { const cached = this.userInfoCache.get(id); if (cached) { result.set(id, cached.data); } } }); return result; } catch (error) { console.error('❌ 批量获取用户信息失败:', error); return new Map(); } } /** * 获取单个用户信息 * @param {string} accountId - 用户账号 ID * @returns {Promise} 用户信息对象 */ async getUserInfo(accountId) { if (!accountId) { return null; } const userMap = await this.getUserInfoBatch([accountId]); return userMap.get(accountId) || null; } /** * 清除用户信息缓存 * @param {string} accountId - 可选,指定用户 ID,不传则清除全部 */ clearCache(accountId = null) { if (accountId) { this.userInfoCache.delete(accountId); console.log(`🗑️ 清除用户 ${accountId} 的缓存`); } else { this.userInfoCache.clear(); console.log('🗑️ 清除所有用户信息缓存'); } } /** * 获取缓存统计信息 * @returns {Object} 缓存统计 */ getCacheStats() { const now = Date.now(); let expired = 0; this.userInfoCache.forEach(item => { if (now - item.timestamp > this.cacheExpiry) { expired++; } }); return { total: this.userInfoCache.size, expired: expired, valid: this.userInfoCache.size - expired }; } } // 导出单例 const nimUserManager = new NIMUserManager(); module.exports = nimUserManager;