// 🔍 全局搜索页面逻辑 const messageSearchManager = require('../../utils/message-search-manager.js'); const app = getApp(); Page({ data: { // 系统信息 statusBarHeight: 44, // 搜索状态 searchKeyword: '', searchFocus: true, searchType: 'all', isSearching: false, isLoadingMore: false, // 会话搜索 conversationId: null, conversationName: '', isConversationSearch: false, // 搜索结果 searchResults: [], searchTotal: 0, currentPage: 1, hasMoreResults: false, searchStatusText: '', // 搜索历史和建议 searchHistory: [], hotSearches: ['图片', '文件', '链接', '表情包'], // 防抖定时器 searchTimer: null }, onLoad(options) { console.log('🔍 全局搜索页面加载', options); // 获取系统信息 this.getSystemInfo(); // 初始化搜索管理器 this.initSearchManager(); // 加载搜索历史 this.loadSearchHistory(); // 处理会话内搜索 if (options.conversationId) { this.setData({ conversationId: options.conversationId, conversationName: decodeURIComponent(options.conversationName || '聊天'), isConversationSearch: true }); // 更新页面标题 wx.setNavigationBarTitle({ title: `在"${this.data.conversationName}"中搜索` }); } // 处理传入的搜索关键词 if (options.keyword) { this.setData({ searchKeyword: options.keyword, searchFocus: false }); this.performSearch(); } }, onShow() { console.log('🔍 全局搜索页面显示'); // 刷新搜索历史 this.loadSearchHistory(); }, onUnload() { console.log('🔍 全局搜索页面卸载'); // 清理定时器 if (this.data.searchTimer) { clearTimeout(this.data.searchTimer); } }, // 获取系统信息 getSystemInfo() { try { const windowInfo = wx.getWindowInfo(); this.setData({ statusBarHeight: windowInfo.statusBarHeight || 44 }); } catch (error) { console.error('获取系统信息失败:', error); this.setData({ statusBarHeight: 44 }); } }, // 初始化搜索管理器 async initSearchManager() { try { await messageSearchManager.init(); console.log('✅ 搜索管理器初始化完成'); } catch (error) { console.error('❌ 搜索管理器初始化失败:', error); } }, // 加载搜索历史 loadSearchHistory() { const history = messageSearchManager.getSearchHistory(); this.setData({ searchHistory: history.slice(0, 10) // 只显示前10条 }); }, // 🔍 ===== 搜索输入处理 ===== // 搜索输入 onSearchInput(e) { const keyword = e.detail.value; this.setData({ searchKeyword: keyword }); // 防抖搜索 this.searchWithDebounce(keyword); }, // 搜索确认 onSearchConfirm(e) { const keyword = e.detail.value.trim(); if (keyword) { this.performSearch(); } }, // 防抖搜索 searchWithDebounce(keyword) { // 清除之前的定时器 if (this.data.searchTimer) { clearTimeout(this.data.searchTimer); } // 如果关键词为空,清除结果 if (!keyword.trim()) { this.setData({ searchResults: [], searchTotal: 0, hasMoreResults: false }); return; } // 设置新的定时器 const timer = setTimeout(() => { this.performSearch(); }, 500); this.setData({ searchTimer: timer }); }, // 清除搜索 clearSearch() { this.setData({ searchKeyword: '', searchResults: [], searchTotal: 0, hasMoreResults: false, searchFocus: true }); }, // 🔍 ===== 搜索执行 ===== // 执行搜索 async performSearch() { const keyword = this.data.searchKeyword.trim(); if (!keyword) { return; } console.log('🔍 执行搜索:', keyword); try { this.setData({ isSearching: true, currentPage: 1, searchResults: [], searchStatusText: '正在搜索...' }); // 调用搜索管理器 const searchOptions = { type: this.data.searchType, page: 1 }; // 如果是会话内搜索,添加会话ID if (this.data.isConversationSearch && this.data.conversationId) { searchOptions.conversationId = this.data.conversationId; } const result = await messageSearchManager.searchMessages(keyword, searchOptions); if (result.success) { // 处理搜索结果 const processedResults = this.processSearchResults(result.data.messages); // 更新搜索状态文本 const statusText = this.data.isConversationSearch ? `在"${this.data.conversationName}"中找到 ${result.data.total} 条结果` : `找到 ${result.data.total} 条相关结果`; this.setData({ searchResults: processedResults, searchTotal: result.data.total, hasMoreResults: result.data.hasMore, currentPage: 1, searchStatusText: statusText }); console.log(`🔍 搜索完成,找到 ${result.data.total} 条结果`); } else { console.error('❌ 搜索失败:', result.error); wx.showToast({ title: result.error || '搜索失败', icon: 'none' }); } } catch (error) { console.error('❌ 搜索异常:', error); wx.showToast({ title: '搜索出错', icon: 'none' }); } finally { this.setData({ isSearching: false }); } }, // 加载更多结果 async loadMoreResults() { if (!this.data.hasMoreResults || this.data.isLoadingMore) { return; } console.log('🔍 加载更多搜索结果'); try { this.setData({ isLoadingMore: true }); const nextPage = this.data.currentPage + 1; const searchOptions = { type: this.data.searchType, page: nextPage }; // 如果是会话内搜索,添加会话ID if (this.data.isConversationSearch && this.data.conversationId) { searchOptions.conversationId = this.data.conversationId; } const result = await messageSearchManager.searchMessages(this.data.searchKeyword, searchOptions); if (result.success) { const processedResults = this.processSearchResults(result.data.messages); const allResults = [...this.data.searchResults, ...processedResults]; this.setData({ searchResults: allResults, hasMoreResults: result.data.hasMore, currentPage: nextPage }); console.log(`🔍 加载更多完成,当前共 ${allResults.length} 条结果`); } } catch (error) { console.error('❌ 加载更多失败:', error); wx.showToast({ title: '加载失败', icon: 'none' }); } finally { this.setData({ isLoadingMore: false }); } }, // 处理搜索结果 processSearchResults(messages) { return messages.map(message => { // 格式化时间 const formattedTime = this.formatMessageTime(message.timestamp); // 获取会话名称 const conversationName = this.getConversationName(message); return { ...message, formattedTime: formattedTime, conversationName: conversationName }; }); }, // 格式化消息时间 formatMessageTime(timestamp) { const now = new Date(); const messageTime = new Date(timestamp); const diffMs = now.getTime() - messageTime.getTime(); const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24)); if (diffDays === 0) { // 今天 return messageTime.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' }); } else if (diffDays === 1) { // 昨天 return '昨天 ' + messageTime.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' }); } else if (diffDays < 7) { // 一周内 const weekdays = ['日', '一', '二', '三', '四', '五', '六']; return `周${weekdays[messageTime.getDay()]}`; } else { // 更早 return messageTime.toLocaleDateString('zh-CN', { month: '2-digit', day: '2-digit' }); } }, // 获取会话名称 getConversationName(message) { // 这里可以根据conversationId获取会话名称 // 暂时返回默认值 if (message.conversationId) { return message.conversationName || '群聊'; } return '私聊'; }, // 🔍 ===== 搜索类型切换 ===== // 切换搜索类型 changeSearchType(e) { const type = e.currentTarget.dataset.type; if (type === this.data.searchType) { return; } console.log('🔍 切换搜索类型:', type); this.setData({ searchType: type }); // 如果有搜索关键词,重新搜索 if (this.data.searchKeyword.trim()) { this.performSearch(); } }, // 🔍 ===== 搜索历史管理 ===== // 选择历史搜索项 selectHistoryItem(e) { const keyword = e.currentTarget.dataset.keyword; this.setData({ searchKeyword: keyword, searchFocus: false }); this.performSearch(); }, // 删除历史搜索项 removeHistoryItem(e) { const keyword = e.currentTarget.dataset.keyword; messageSearchManager.removeSearchHistoryItem(keyword); this.loadSearchHistory(); }, // 清除搜索历史 clearSearchHistory() { wx.showModal({ title: '清除搜索历史', content: '确定要清除所有搜索历史吗?', success: (res) => { if (res.confirm) { messageSearchManager.clearSearchHistory(); this.loadSearchHistory(); } } }); }, // 选择热门搜索 selectHotSearch(e) { const keyword = e.currentTarget.dataset.keyword; this.setData({ searchKeyword: keyword, searchFocus: false }); this.performSearch(); }, // 🔍 ===== 搜索结果操作 ===== // 打开消息 openMessage(e) { const message = e.currentTarget.dataset.message; console.log('🔍 打开消息:', message.id); // 跳转到聊天页面并定位到该消息 this.jumpToMessage(e); }, // 跳转到消息 jumpToMessage(e) { const message = e.currentTarget.dataset.message; // 跳转到聊天页面 wx.navigateTo({ url: `/pages/chat/chat?conversationId=${message.conversationId}&messageId=${message.id}` }); }, // 🔍 ===== 页面导航 ===== // 返回上一页 goBack() { wx.navigateBack(); } });