|
@@ -24,7 +24,13 @@ OnlineUsersWidget::OnlineUsersWidget(QWidget *parent)
|
|
|
, m_privateMessageAction(nullptr)
|
|
, m_privateMessageAction(nullptr)
|
|
|
, m_viewProfileAction(nullptr)
|
|
, m_viewProfileAction(nullptr)
|
|
|
, m_kickUserAction(nullptr)
|
|
, m_kickUserAction(nullptr)
|
|
|
|
|
+ , m_totalCount(0)
|
|
|
{
|
|
{
|
|
|
|
|
+ // 初始化统计数据
|
|
|
|
|
+ for (int i = 0; i < 7; ++i) {
|
|
|
|
|
+ m_globalStats[i] = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
setupUI();
|
|
setupUI();
|
|
|
setupTable();
|
|
setupTable();
|
|
|
setupContextMenu();
|
|
setupContextMenu();
|
|
@@ -93,8 +99,8 @@ void OnlineUsersWidget::setupUI()
|
|
|
|
|
|
|
|
void OnlineUsersWidget::setupTable()
|
|
void OnlineUsersWidget::setupTable()
|
|
|
{
|
|
{
|
|
|
- // 设置表格列 - 原有3列 + 新增6列
|
|
|
|
|
- m_usersTable->setColumnCount(9);
|
|
|
|
|
|
|
+ // 设置表格列 - 原有3列 + 新增7列 (0-6)
|
|
|
|
|
+ m_usersTable->setColumnCount(10);
|
|
|
QStringList headers;
|
|
QStringList headers;
|
|
|
headers << "状态" << "用户名" << "最后活动" << "0" << "1" << "2" << "3" << "4" << "5" << "6";
|
|
headers << "状态" << "用户名" << "最后活动" << "0" << "1" << "2" << "3" << "4" << "5" << "6";
|
|
|
m_usersTable->setHorizontalHeaderLabels(headers);
|
|
m_usersTable->setHorizontalHeaderLabels(headers);
|
|
@@ -112,7 +118,7 @@ void OnlineUsersWidget::setupTable()
|
|
|
header->resizeSection(0, 60); // 状态列
|
|
header->resizeSection(0, 60); // 状态列
|
|
|
header->resizeSection(1, 120); // 用户名列
|
|
header->resizeSection(1, 120); // 用户名列
|
|
|
header->resizeSection(2, 80); // 最后活动列
|
|
header->resizeSection(2, 80); // 最后活动列
|
|
|
- // 设置新增的1-6列宽度
|
|
|
|
|
|
|
+ // 设置新增的0-6列宽度
|
|
|
for (int i = 3; i < 10; ++i) {
|
|
for (int i = 3; i < 10; ++i) {
|
|
|
header->resizeSection(i, 40);
|
|
header->resizeSection(i, 40);
|
|
|
}
|
|
}
|
|
@@ -459,12 +465,12 @@ void OnlineUsersWidget::updateTableRow(int row, const OnlineUser &user)
|
|
|
timeItem->setFlags(timeItem->flags() & ~Qt::ItemIsEditable);
|
|
timeItem->setFlags(timeItem->flags() & ~Qt::ItemIsEditable);
|
|
|
m_usersTable->setItem(row, 2, timeItem);
|
|
m_usersTable->setItem(row, 2, timeItem);
|
|
|
|
|
|
|
|
- // 添加1-6列的内容
|
|
|
|
|
- for (int i = 3; i < 9; ++i) {
|
|
|
|
|
- QTableWidgetItem *numberItem = new QTableWidgetItem(QString::number(i - 2));
|
|
|
|
|
- numberItem->setFlags(numberItem->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
- numberItem->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
- m_usersTable->setItem(row, i, numberItem);
|
|
|
|
|
|
|
+ // 添加0-6列的统计数据
|
|
|
|
|
+ for (int i = 0; i < 7; ++i) {
|
|
|
|
|
+ QTableWidgetItem *statsItem = new QTableWidgetItem(QString::number(user.messageStats[i]));
|
|
|
|
|
+ statsItem->setFlags(statsItem->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
+ statsItem->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
+ m_usersTable->setItem(row, i + 3, statsItem);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -513,6 +519,12 @@ void OnlineUsersWidget::updateEmptyState()
|
|
|
|
|
|
|
|
void OnlineUsersWidget::updateUserListFromRoomUsers(const QList<RoomUserInfo> &roomUsers)
|
|
void OnlineUsersWidget::updateUserListFromRoomUsers(const QList<RoomUserInfo> &roomUsers)
|
|
|
{
|
|
{
|
|
|
|
|
+ // 保存现有用户的统计数据
|
|
|
|
|
+ QHash<QString, OnlineUser> existingUsers;
|
|
|
|
|
+ for (const auto &user : m_users) {
|
|
|
|
|
+ existingUsers[user.userId] = user;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
clearUsers();
|
|
clearUsers();
|
|
|
|
|
|
|
|
for (const auto &roomUser : roomUsers) {
|
|
for (const auto &roomUser : roomUsers) {
|
|
@@ -523,6 +535,15 @@ void OnlineUsersWidget::updateUserListFromRoomUsers(const QList<RoomUserInfo> &r
|
|
|
user.lastSeen = QDateTime::currentDateTime();
|
|
user.lastSeen = QDateTime::currentDateTime();
|
|
|
user.isAdmin = false; // 可以根据需要设置管理员状态
|
|
user.isAdmin = false; // 可以根据需要设置管理员状态
|
|
|
|
|
|
|
|
|
|
+ // 如果用户之前存在,恢复其统计数据
|
|
|
|
|
+ if (existingUsers.contains(user.userId)) {
|
|
|
|
|
+ const OnlineUser &existingUser = existingUsers[user.userId];
|
|
|
|
|
+ for (int i = 0; i < 7; ++i) {
|
|
|
|
|
+ user.messageStats[i] = existingUser.messageStats[i];
|
|
|
|
|
+ }
|
|
|
|
|
+ user.isAdmin = existingUser.isAdmin; // 保持管理员状态
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
addUser(user);
|
|
addUser(user);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -614,3 +635,87 @@ void OnlineUsersWidget::onUserListUpdate(const QString &roomId, const QJsonArray
|
|
|
// 更新用户列表显示
|
|
// 更新用户列表显示
|
|
|
updateUserListFromRoomUsers(roomUsers);
|
|
updateUserListFromRoomUsers(roomUsers);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+// 统计功能方法 (从 StatsWidget 迁移)
|
|
|
|
|
+void OnlineUsersWidget::updateStats(const QJsonObject& statsData)
|
|
|
|
|
+{
|
|
|
|
|
+ qDebug() << "[OnlineUsersWidget] 收到统计更新:" << statsData;
|
|
|
|
|
+
|
|
|
|
|
+ // 解析data数组并更新用户统计数据
|
|
|
|
|
+ if (statsData.contains("data") && statsData["data"].isArray()) {
|
|
|
|
|
+ QJsonArray dataArray = statsData["data"].toArray();
|
|
|
|
|
+
|
|
|
|
|
+ // 重置全局累计数据
|
|
|
|
|
+ m_totalCount = 0;
|
|
|
|
|
+ for (int i = 0; i < 7; ++i) {
|
|
|
|
|
+ m_globalStats[i] = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ QDateTime latestUpdate;
|
|
|
|
|
+
|
|
|
|
|
+ // 遍历所有用户数据进行更新
|
|
|
|
|
+ for (const QJsonValue& value : dataArray) {
|
|
|
|
|
+ if (value.isObject()) {
|
|
|
|
|
+ QJsonObject userStats = value.toObject();
|
|
|
|
|
+ QString userId = userStats["userId"].toString();
|
|
|
|
|
+
|
|
|
|
|
+ // 更新单个用户的统计数据
|
|
|
|
|
+ updateUserStats(userId, userStats);
|
|
|
|
|
+
|
|
|
|
|
+ // 累加到全局统计
|
|
|
|
|
+ m_totalCount += userStats["totalCount"].toInt();
|
|
|
|
|
+ for (int i = 0; i < 7; ++i) {
|
|
|
|
|
+ QString typeKey = QString("type%1Count").arg(i);
|
|
|
|
|
+ m_globalStats[i] += userStats[typeKey].toInt();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 找到最新的更新时间
|
|
|
|
|
+ QString lastUpdateStr = userStats["lastUpdate"].toString();
|
|
|
|
|
+ QDateTime userUpdate = QDateTime::fromString(lastUpdateStr, Qt::ISODate);
|
|
|
|
|
+ if (userUpdate.isValid() && (!latestUpdate.isValid() || userUpdate > latestUpdate)) {
|
|
|
|
|
+ latestUpdate = userUpdate;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ m_lastStatsUpdate = latestUpdate;
|
|
|
|
|
+
|
|
|
|
|
+ qDebug() << "[OnlineUsersWidget] 全局统计信息已更新 - 总数:" << m_totalCount
|
|
|
|
|
+ << "类型0-6:" << m_globalStats[0] << m_globalStats[1] << m_globalStats[2]
|
|
|
|
|
+ << m_globalStats[3] << m_globalStats[4] << m_globalStats[5] << m_globalStats[6]
|
|
|
|
|
+ << "用户数:" << dataArray.size();
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void OnlineUsersWidget::updateUserStats(const QString &userId, const QJsonObject& userStats)
|
|
|
|
|
+{
|
|
|
|
|
+ // 查找用户
|
|
|
|
|
+ int userIndex = -1;
|
|
|
|
|
+ for (int i = 0; i < m_users.size(); ++i) {
|
|
|
|
|
+ if (m_users[i].userId == userId) {
|
|
|
|
|
+ userIndex = i;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (userIndex >= 0) {
|
|
|
|
|
+ // 更新用户的统计数据
|
|
|
|
|
+ for (int i = 0; i < 7; ++i) {
|
|
|
|
|
+ QString typeKey = QString("type%1Count").arg(i);
|
|
|
|
|
+ m_users[userIndex].messageStats[i] = userStats[typeKey].toInt();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 更新表格显示
|
|
|
|
|
+ int row = findUserRow(userId);
|
|
|
|
|
+ if (row >= 0) {
|
|
|
|
|
+ updateTableRow(row, m_users[userIndex]);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ qDebug() << "[OnlineUsersWidget] 用户统计已更新:" << userId
|
|
|
|
|
+ << "统计数据:" << m_users[userIndex].messageStats[0]
|
|
|
|
|
+ << m_users[userIndex].messageStats[1] << m_users[userIndex].messageStats[2]
|
|
|
|
|
+ << m_users[userIndex].messageStats[3] << m_users[userIndex].messageStats[4]
|
|
|
|
|
+ << m_users[userIndex].messageStats[5] << m_users[userIndex].messageStats[6];
|
|
|
|
|
+ } else {
|
|
|
|
|
+ qDebug() << "[OnlineUsersWidget] 未找到用户:" << userId;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|