61 lines
1.7 KiB
Dart
61 lines
1.7 KiB
Dart
// 2026-04-09 | OnlineController | 在线统计控制器 | 管理心跳和在线数据
|
||
// 2026-04-10 | API v2.0.0: OnlineRepository → StatsRepository,移除 timeline 方法
|
||
import 'dart:async';
|
||
import 'package:get/get.dart';
|
||
import 'package:mom_kitchen/src/controllers/base_controller.dart';
|
||
import 'package:mom_kitchen/src/repositories/online_repository.dart' as repo;
|
||
|
||
class OnlineController extends BaseController {
|
||
final repo.StatsRepository _statsRepository = repo.StatsRepository();
|
||
|
||
final RxMap<String, dynamic> onlineStats = <String, dynamic>{}.obs;
|
||
final RxMap<String, dynamic> requestStats = <String, dynamic>{}.obs;
|
||
Timer? _heartbeatTimer;
|
||
|
||
@override
|
||
void onInit() {
|
||
super.onInit();
|
||
Future.delayed(Duration.zero, () {
|
||
loadOnlineStats();
|
||
startHeartbeat();
|
||
});
|
||
}
|
||
|
||
@override
|
||
void onClose() {
|
||
_heartbeatTimer?.cancel();
|
||
super.onClose();
|
||
}
|
||
|
||
Future<void> loadOnlineStats() async {
|
||
try {
|
||
onlineStats.value = await _statsRepository.fetchOnlineStats();
|
||
} catch (_) {}
|
||
}
|
||
|
||
Future<void> loadRequestStats() async {
|
||
try {
|
||
requestStats.value = await _statsRepository.fetchRequestStats();
|
||
} catch (_) {}
|
||
}
|
||
|
||
void startHeartbeat() {
|
||
_heartbeatTimer?.cancel();
|
||
_heartbeatTimer = Timer.periodic(
|
||
const Duration(seconds: 30),
|
||
(_) => _sendHeartbeat(),
|
||
);
|
||
_sendHeartbeat();
|
||
}
|
||
|
||
Future<void> _sendHeartbeat() async {
|
||
try {
|
||
await _statsRepository.sendHeartbeat(platform: 'ios');
|
||
} catch (_) {}
|
||
}
|
||
|
||
int get onlineTotal => onlineStats['online_total'] as int? ?? 0;
|
||
int get online10min => onlineStats['online_10min'] as int? ?? 0;
|
||
int get online1hour => onlineStats['online_1hour'] as int? ?? 0;
|
||
}
|