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
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();
|
|
}
|
|
}
|