let currentOffset = 0;
const limit = 50;
let currentView = 'groups';
let currentGroupId = null;
// 页面加载时初始化
document.addEventListener('DOMContentLoaded', function () {
loadStatistics();
loadGroupMessages();
loadMessages();
});
// 加载统计信息
async function loadStatistics() {
try {
const response = await fetch('api/statistics');
const data = await response.json();
if (data) {
const stats = data;
document.getElementById('userCount').textContent = stats.user_count;
document.getElementById('groupCount').textContent = stats.group_count;
document.getElementById('messageCount').textContent = stats.message_count;
document.getElementById('fileCount').textContent = stats.file_count;
}
} catch (error) {
console.error('加载统计信息失败:', error);
}
}
// 加载按群组分组的消息统计
async function loadGroupMessages() {
try {
const response = await fetch('api/groups');
const data = await response.json();
const groupList = document.getElementById('groupList');
if (data.success) {
const groups = data.groups || [];
groupList.innerHTML = '';
if (groups.length === 0) {
groupList.innerHTML = '
暂无群组';
return;
} else {
currentGroupId = groups[0].id;
}
groups.forEach(group => {
const li = document.createElement('li');
li.className = 'group-item';
li.setAttribute('data-group-id', group.id);
li.onclick = () => selectGroup(group.id);
const groupName = document.createElement('div');
groupName.className = 'group-name';
groupName.textContent = group.name || group.id;
const groupInfo = document.createElement('div');
groupInfo.className = 'group-info';
groupInfo.innerHTML = `
创建者: ${group.owner || '未知'}
`;
li.appendChild(groupName);
li.appendChild(groupInfo);
groupList.appendChild(li);
});
// 默认选择第一个群组
if (currentView === 'groups' && groups.length > 0) {
selectGroup(groups[0].id);
}
} else {
groupList.innerHTML = '加载失败';
}
} catch (error) {
console.error('加载群组消息失败:', error);
}
}
// 选择群组
function selectGroup(groupId) {
currentGroupId = groupId;
currentOffset = 0;
// 更新选中状态
document.querySelectorAll('.group-item').forEach(item => {
item.classList.remove('active');
});
// 找到对应的群组项并添加选中状态
document.querySelectorAll('.group-item').forEach(item => {
// 使用data-group-id属性来准确匹配群组
if (item.getAttribute('data-group-id') === groupId) {
item.classList.add('active');
// 更新群组信息
document.getElementById('currentGroup').textContent = item.querySelector('.group-name').textContent;
document.getElementById('messageCountDisplay').textContent = '消息数量: 加载中...';
document.getElementById('latestTime').textContent = '最新消息: 加载中...';
}
});
// 加载该群组的消息
loadMessages();
// 加载统计信息
loadStatistics();
}
// 加载更多消息
async function loadMoreMessages() {
await loadMessages();
}
// 关闭聊天记录模态框
function closeChatRecordModal() {
document.getElementById('chatRecordModal').style.display = 'none';
}
// 显示聊天记录模态框
function showChatRecordModal(chatrecordData) {
const modal = document.getElementById('chatRecordModal');
const title = document.getElementById('modalTitle');
const content = document.getElementById('chatRecordContent');
// 设置模态框标题
if (chatrecordData.chatrecord && chatrecordData.chatrecord.title) {
title.textContent = chatrecordData.chatrecord.title;
} else {
title.textContent = '聊天记录';
}
// 渲染聊天记录内容
renderChatRecordContent(chatrecordData, content);
modal.style.display = 'block';
}
// 渲染聊天记录内容
function renderChatRecordContent(chatrecordData, contentElement) {
try {
if (!chatrecordData.chatrecord || !chatrecordData.chatrecord.item) {
contentElement.innerHTML = '聊天记录数据格式错误
';
return;
}
const chatItems = chatrecordData.chatrecord.item;
if (!Array.isArray(chatItems) || chatItems.length === 0) {
contentElement.innerHTML = '暂无聊天记录内容
';
return;
}
let html = '';
chatItems.forEach(item => {
// 处理不同类型的聊天记录项
let contentHtml = '';
if (item.type === 'ChatRecordText') {
// 文本消息
try {
const contentData = JSON.parse(item.content);
contentHtml = contentData.content || item.content || '';
} catch (e) {
contentHtml = item.content || '';
}
} else if (item.type === 'ChatRecordImage') {
// 图片消息
contentHtml = '[图片消息]
';
} else {
// 其他类型消息
contentHtml = `[${item.type}] ${item.content || ''}`;
}
html += `
${item.from_chatroom ? '群聊' : '私聊'}
${contentHtml}
${new Date(item.msgtime * 1000).toLocaleString()}
`;
});
contentElement.innerHTML = html;
} catch (error) {
console.error('渲染聊天记录失败:', error);
contentElement.innerHTML = '渲染聊天记录失败: ' + error.message + '
';
}
}
// 加载消息
async function loadMessages() {
try {
const chatMessages = document.getElementById('chatMessages');
if (!currentGroupId) {
chatMessages.innerHTML = '暂无消息
';
return;
}
let url = `api/group_messages?limit=${limit}&offset=${currentOffset}&group_id=${currentGroupId}`;
const response = await fetch(url);
const data = await response.json();
if (data.success) {
const messages = data.messages || [];
if (messages.length === 0) {
if (currentOffset === 0) {
chatMessages.innerHTML = '暂无消息
';
}
document.getElementById('messageCountDisplay').textContent = `消息数量: ${data.total || 0}`;
document.getElementById('latestTime').textContent = `最新消息: ${data.lastest_time || '暂无'}`;
return;
}
// 如果是第一次加载(offset=0),清空消息区域
if (currentOffset === 0) {
chatMessages.innerHTML = '';
}
// 将新消息插入到消息区域的开头(向上加载历史消息)
messages.forEach(message => {
const messageDiv = createMessageElement(message);
chatMessages.insertBefore(messageDiv, chatMessages.firstChild);
});
// 更新偏移量,用于下次加载更多
currentOffset += limit;
document.getElementById('messageCountDisplay').textContent = `消息数量: ${data.total || 0}`;
document.getElementById('latestTime').textContent = `最新消息: ${data.lastest_time || '暂无'}`;
} else {
chatMessages.innerHTML = '加载消息失败
';
}
} catch (error) {
console.error('加载消息失败:', error);
document.getElementById('chatMessages').innerHTML = '加载消息失败: ' + error.message + '
';
}
}
// 创建消息元素
function createMessageElement(message) {
const messageDiv = document.createElement('div');
messageDiv.className = 'message';
// 判断是否为自己的消息
if (message.is_own) {
messageDiv.classList.add('own');
}
const avatar = document.createElement('div');
avatar.className = 'avatar';
avatar.textContent = message.sender_name ? message.sender_name.charAt(0).toUpperCase() : 'U';
const contentDiv = document.createElement('div');
contentDiv.className = 'message-content';
const senderDiv = document.createElement('div');
senderDiv.className = 'message-sender';
senderDiv.textContent = message.sender_name || '未知用户';
const textDiv = document.createElement('div');
textDiv.className = 'message-text';
// 处理消息内容
if (message.content) {
if (message.type === 'chatrecord' && message.chatrecord_data) {
const chatrecordBtn = document.createElement('button');
chatrecordBtn.className = 'chatrecord-btn';
chatrecordBtn.textContent = message.display_content || '[聊天记录]';
chatrecordBtn.onclick = () => showChatRecordModal(message.chatrecord_data);
textDiv.appendChild(chatrecordBtn);
} else {
textDiv.textContent = message.display_content;
}
} else {
textDiv.textContent = '[空消息]';
}
const timeDiv = document.createElement('div');
timeDiv.className = 'message-time';
timeDiv.textContent = message.formatted_time;
contentDiv.appendChild(senderDiv);
contentDiv.appendChild(textDiv);
contentDiv.appendChild(timeDiv);
messageDiv.appendChild(avatar);
messageDiv.appendChild(contentDiv);
return messageDiv;
}
// 点击模态框外部关闭
window.onclick = function (event) {
const modal = document.getElementById('chatRecordModal');
if (event.target === modal) {
modal.style.display = 'none';
}
}