fix(dashboard): 优化活跃用户统计逻辑
- 修改活跃用户数统计方式,解决groupBy无法正确统计不重复用户数的问题 - 改为先查询符合条件的登录记录,再使用Stream API统计不重复用户名 - 提高统计准确性,确保活跃用户数据的正确性 - 添加详细的中文注释说明统计逻辑
This commit is contained in:
parent
d9fb89adad
commit
28941ede41
@ -152,17 +152,20 @@ public class DashboardServiceImpl implements DashboardService {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// 活跃用户数(最近30天有登录记录的用户)
|
// 活跃用户数(最近30天有登录记录的用户)
|
||||||
|
// 使用原生SQL统计不重复的登录用户数
|
||||||
LambdaQueryWrapper<SysLoginLog> activeWrapper =
|
LambdaQueryWrapper<SysLoginLog> activeWrapper =
|
||||||
new LambdaQueryWrapper<>();
|
new LambdaQueryWrapper<>();
|
||||||
activeWrapper
|
activeWrapper
|
||||||
.apply("login_time >= DATE_SUB(NOW(), INTERVAL 30 DAY)")
|
.apply("login_time >= DATE_SUB(NOW(), INTERVAL 30 DAY)")
|
||||||
.eq(SysLoginLog::getLoginStatus, "0")
|
.eq(SysLoginLog::getLoginStatus, "0");
|
||||||
.select(SysLoginLog::getLoginName)
|
|
||||||
.groupBy(SysLoginLog::getLoginName);
|
// 获取符合条件的登录记录,然后统计不重复的用户名
|
||||||
Long activeUsers = sysLoginLogMapper.selectCount(activeWrapper);
|
List<SysLoginLog> loginLogs = sysLoginLogMapper.selectList(activeWrapper);
|
||||||
userStats.setActiveUsers(
|
long activeUsers = loginLogs.stream()
|
||||||
activeUsers != null ? activeUsers.intValue() : 0
|
.map(SysLoginLog::getLoginName)
|
||||||
);
|
.distinct()
|
||||||
|
.count();
|
||||||
|
userStats.setActiveUsers((int) activeUsers);
|
||||||
|
|
||||||
// 当前在线用户数(通过Sa-Token获取)
|
// 当前在线用户数(通过Sa-Token获取)
|
||||||
List<String> onlineTokens = StpUtil.searchTokenValue(
|
List<String> onlineTokens = StpUtil.searchTokenValue(
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user