|
|
@ -2,6 +2,8 @@ |
|
|
import 'package:easy_refresh/easy_refresh.dart'; |
|
|
import 'package:easy_refresh/easy_refresh.dart'; |
|
|
import 'package:get/get.dart'; |
|
|
import 'package:get/get.dart'; |
|
|
import '../../model/discover/visitor_model.dart'; |
|
|
import '../../model/discover/visitor_model.dart'; |
|
|
|
|
|
import '../../model/home/marriage_data.dart'; |
|
|
|
|
|
import '../../network/user_api.dart'; |
|
|
|
|
|
|
|
|
class VisitorController extends GetxController { |
|
|
class VisitorController extends GetxController { |
|
|
// 访客列表 |
|
|
// 访客列表 |
|
|
@ -18,42 +20,42 @@ class VisitorController extends GetxController { |
|
|
final int pageSize = 15; |
|
|
final int pageSize = 15; |
|
|
var hasMore = true.obs; |
|
|
var hasMore = true.obs; |
|
|
var isLoading = false.obs; |
|
|
var isLoading = false.obs; |
|
|
|
|
|
late final UserApi _userApi; |
|
|
|
|
|
|
|
|
@override |
|
|
@override |
|
|
void onInit() { |
|
|
void onInit() { |
|
|
super.onInit(); |
|
|
super.onInit(); |
|
|
|
|
|
_userApi = Get.find<UserApi>(); |
|
|
_loadInitialData(); |
|
|
_loadInitialData(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 加载初始数据 |
|
|
// 加载初始数据 |
|
|
void _loadInitialData() async { |
|
|
void _loadInitialData() async { |
|
|
isLoading.value = true; |
|
|
isLoading.value = true; |
|
|
await Future.delayed(Duration(milliseconds: 800)); // 模拟网络延迟 |
|
|
|
|
|
|
|
|
|
|
|
final initialVisitors = _generateMockData(1, pageSize); |
|
|
|
|
|
visitors.assignAll(initialVisitors); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final result = await _fetchVisitorData(pageNum: currentPage.value); |
|
|
|
|
|
visitors.assignAll(result['records']); |
|
|
isLoading.value = false; |
|
|
isLoading.value = false; |
|
|
hasMore.value = initialVisitors.length == pageSize; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final int current = result['current'] ?? 1; |
|
|
|
|
|
final int total = result['pages'] ?? 1; |
|
|
|
|
|
hasMore.value = current < total; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 下拉刷新 |
|
|
// 下拉刷新 |
|
|
void onRefresh() async { |
|
|
void onRefresh() async { |
|
|
currentPage.value = 1; |
|
|
|
|
|
hasMore.value = true; |
|
|
hasMore.value = true; |
|
|
|
|
|
|
|
|
await Future.delayed(Duration(milliseconds: 1000)); // 模拟网络延迟 |
|
|
|
|
|
|
|
|
final result = await _fetchVisitorData(pageNum: currentPage.value); |
|
|
|
|
|
|
|
|
final newVisitors = _generateMockData(1, pageSize); |
|
|
|
|
|
visitors.assignAll(newVisitors); |
|
|
|
|
|
|
|
|
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.finishRefresh(); |
|
|
refreshController.resetFooter(); |
|
|
refreshController.resetFooter(); |
|
|
hasMore.value = newVisitors.length == pageSize; |
|
|
|
|
|
|
|
|
|
|
|
if (newVisitors.isEmpty) { |
|
|
|
|
|
hasMore.value = false; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 上拉加载更多 |
|
|
// 上拉加载更多 |
|
|
@ -62,20 +64,16 @@ class VisitorController extends GetxController { |
|
|
if (!hasMore.value) { |
|
|
if (!hasMore.value) { |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
final result = await _fetchVisitorData(pageNum: currentPage.value + 1); |
|
|
currentPage.value++; |
|
|
currentPage.value++; |
|
|
|
|
|
|
|
|
await Future.delayed(Duration(milliseconds: 800)); // 模拟网络延迟 |
|
|
|
|
|
|
|
|
|
|
|
final newVisitors = _generateMockData(currentPage.value, pageSize); |
|
|
|
|
|
|
|
|
|
|
|
if (newVisitors.isEmpty) { |
|
|
|
|
|
hasMore.value = false; |
|
|
|
|
|
refreshController.finishLoad(IndicatorResult.noMore); |
|
|
|
|
|
} else { |
|
|
|
|
|
visitors.addAll(newVisitors); |
|
|
|
|
|
// hasMore.value = true; |
|
|
|
|
|
|
|
|
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); |
|
|
refreshController.finishLoad(IndicatorResult.success); |
|
|
|
|
|
} else { |
|
|
|
|
|
refreshController.finishLoad(IndicatorResult.noMore); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -85,12 +83,6 @@ class VisitorController extends GetxController { |
|
|
Get.snackbar('成功', '已删除访客记录'); |
|
|
Get.snackbar('成功', '已删除访客记录'); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 清空所有访客记录 |
|
|
|
|
|
void clearAllVisitors() { |
|
|
|
|
|
visitors.clear(); |
|
|
|
|
|
Get.snackbar('成功', '已清空所有访客记录'); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 获取今日访客数量 |
|
|
// 获取今日访客数量 |
|
|
int get todayVisitorsCount { |
|
|
int get todayVisitorsCount { |
|
|
return visitors.length; |
|
|
return visitors.length; |
|
|
@ -101,46 +93,49 @@ class VisitorController extends GetxController { |
|
|
return visitors.length; |
|
|
return visitors.length; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 模拟数据生成 |
|
|
|
|
|
List<VisitorModel> _generateMockData(int page, int size) { |
|
|
|
|
|
if (page > 3) return []; // 模拟只有3页数据 |
|
|
|
|
|
|
|
|
|
|
|
final names = [ |
|
|
|
|
|
'张三', '李四', '王五', '赵六', '钱七', '孙八', '周九', '吴十', |
|
|
|
|
|
'小明', '小红', '小刚', '小花', '大山', '小云', '星辰', '大海' |
|
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
|
|
final avatars = [ |
|
|
|
|
|
'https://randomuser.me/api/portraits/men/1.jpg', |
|
|
|
|
|
'https://randomuser.me/api/portraits/women/1.jpg', |
|
|
|
|
|
'https://randomuser.me/api/portraits/men/2.jpg', |
|
|
|
|
|
'https://randomuser.me/api/portraits/women/2.jpg', |
|
|
|
|
|
'https://randomuser.me/api/portraits/men/3.jpg', |
|
|
|
|
|
'https://randomuser.me/api/portraits/women/3.jpg', |
|
|
|
|
|
'https://randomuser.me/api/portraits/men/4.jpg', |
|
|
|
|
|
'https://randomuser.me/api/portraits/women/4.jpg', |
|
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
|
|
final pages = [ |
|
|
|
|
|
'首页', '产品页', '关于我们', '博客', '联系方式', '服务页', '价格页', '案例页' |
|
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
|
|
final startIndex = (page - 1) * size; |
|
|
|
|
|
final endIndex = startIndex + size; |
|
|
|
|
|
|
|
|
|
|
|
return List.generate(size, (index) { |
|
|
|
|
|
final globalIndex = startIndex + index; |
|
|
|
|
|
final isOnline = globalIndex % 3 == 0; // 每3个有一个在线 |
|
|
|
|
|
|
|
|
|
|
|
return VisitorModel( |
|
|
|
|
|
miId: 'visitor_${globalIndex + 1}', |
|
|
|
|
|
nickName: names[globalIndex % names.length], |
|
|
|
|
|
profilePhoto: avatars[globalIndex % avatars.length], |
|
|
|
|
|
visitTime: '2025-11-14 10:42:42', |
|
|
|
|
|
onlineStatus: 2, |
|
|
|
|
|
describeInfo: '阿萨德垃圾袋杰克伦敦撒娇克拉斯的健康拉屎的 金坷垃四大皆空拉屎的距离考试啊' |
|
|
|
|
|
|
|
|
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 |
|
|
@override |
|
|
|