const payload = { sender: 'admin', senderId: 'admin', senderName: '客服', text: text, time: new Date().toLocaleString(), type: 'text', image: '' }; client.publish(topic, JSON.stringify(payload), { qos: 0, retain: false }); // 存到缓存 if (!messageCache[currentUser]) messageCache[currentUser] = []; messageCache[currentUser].push(payload); renderMessages(currentUser); adminInput.value = ''; // 更新侧边栏最后消息 if (users[currentUser]) { users[currentUser].lastMsg = text; renderSidebar(); } } function sendAdminImage(file) { if (!file !currentUser !isReady) return; const u = users[currentUser]; if (!u) return; const reader = new FileReader(); reader.onload = function(e) { const topic = 'chat/' + u.agentId + '/' + currentUser; const payload = { sender: 'admin', senderId: 'admin', senderName: '客服', text: '图片', time: new Date().toLocaleString(), type: 'image', image: e.target.result }; client.publish(topic, JSON.stringify(payload), { qos: 0, retain: false }); if (!messageCache[currentUser]) messageCache[currentUser] = []; messageCache[currentUser].push(payload); renderMessages(currentUser); if (users[currentUser]) { users[currentUser].lastMsg = '图片'; renderSidebar(); } }; reader.readAsDataURL(file); } // ===== 事件绑定 ===== adminSendBtn.addEventListener('click', sendAdminMessage); adminInput.addEventListener('keydown', (e) => { if (e.key === 'Enter') { e.preventDefault(); sendAdminMessage(); } }); adminFileBtn.addEventListener('click', () => adminFileInput.click()); adminFileInput.addEventListener('change', function() { if (this.files && this.files[0]) { sendAdminImage(this.files[0]); } this.value = ''; }); // ===== 启动 ===== connect();