You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

144 lines
3.9 KiB

// controllers/visitor_controller.dart
import 'package:easy_refresh/easy_refresh.dart';
import 'package:get/get.dart';
import '../../model/home/marriage_data.dart';
import '../../network/user_api.dart';
class VisitorController extends GetxController {
// 访客列表
var visitors = <MarriageData>[].obs;
// Refresh controllers
final EasyRefreshController refreshController = EasyRefreshController(
controlFinishRefresh: true,
controlFinishLoad: true,
);
// 分页参数
var currentPage = 1.obs;
final int pageSize = 15;
var hasMore = true.obs;
var isLoading = false.obs;
late final UserApi _userApi;
@override
void onInit() {
super.onInit();
_userApi = Get.find<UserApi>();
loadInitialData();
}
// 加载初始数据
void loadInitialData() async {
isLoading.value = true;
final result = await _fetchVisitorData(pageNum: currentPage.value);
visitors.assignAll(result['records']);
isLoading.value = false;
final int current = result['current'] ?? 1;
final int total = result['pages'] ?? 1;
hasMore.value = current < total;
}
// 下拉刷新
void onRefresh() async {
hasMore.value = true;
final result = await _fetchVisitorData(pageNum: currentPage.value);
visitors.clear();
visitors.addAll(result['records']);
final int current = result['current'] ?? 1;
final int total = result['pages'] ?? 1;
hasMore.value = current < total;
refreshController.finishRefresh();
refreshController.resetFooter();
}
// 上拉加载更多
void onLoadMore() async {
print('onLoadMore');
if (!hasMore.value) {
return;
}
final result = await _fetchVisitorData(pageNum: currentPage.value + 1);
currentPage.value++;
final int current = result['current'] as int;
final int total = result['pages'] as int;
hasMore.value = current < total;
visitors.addAll(result['records']);
if (hasMore.value) {
refreshController.finishLoad(IndicatorResult.success);
} else {
refreshController.finishLoad(IndicatorResult.noMore);
}
}
// 删除访客
void deleteVisitor(String visitorId) {
// visitors.removeWhere((visitor) => visitor.id == visitorId);
Get.snackbar('成功', '已删除访客记录');
}
// 获取今日访客数量
int get todayVisitorsCount {
return visitors.length;
}
// 获取在线访客数量
int get onlineVisitorsCount {
return visitors.length;
}
Future<Map<String, dynamic>> _fetchVisitorData({required int pageNum}) async {
try {
print('_fetchVisitorData - pageNum: $pageNum, pageSize: $pageSize');
// 调用API获取数据
var response = await _userApi.getVisitorList(
pageNum: pageNum,
pageSize: pageSize,
);
if (response.data.isSuccess) {
final paginatedData = response.data.data;
// 检查data是否为空
if (paginatedData == null) {
return {
'records': <MarriageData>[],
'current': pageNum,
'pages': 1,
'total': 0,
'size': pageSize,
};
}
// data 是 PaginatedResponse<dynamic>,直接使用其属性
// records 中的每个项是 dynamic,需要转换为 MarriageData
final records = paginatedData.records
.map((item) => MarriageData.fromJson(item as Map<String, dynamic>))
.toList();
return {
'records': records,
'current': paginatedData.current,
'pages': paginatedData.pages,
'total': paginatedData.total,
'size': paginatedData.size,
};
} else {
// 响应失败,抛出异常
throw Exception(response.data.message);
}
} catch (e) {
// 向上抛出异常,让调用方处理
rethrow;
}
}
@override
void onClose() {
refreshController.dispose();
super.onClose();
}
}