diff --git a/android/app/buildSystem/app.csr b/android/app/buildSystem/app.csr new file mode 100644 index 0000000..8772b84 --- /dev/null +++ b/android/app/buildSystem/app.csr @@ -0,0 +1,18 @@ +-----BEGIN NEW CERTIFICATE REQUEST----- +MIIC5jCCAc4CAQAwcTELMAkGA1UEBhMCQ04xEjAQBgNVBAgTCUd1YW5nRG9uZzES +MBAGA1UEBxMJR3VhbmdaaG91MREwDwYDVQQKEwhxaWFubmlhbzERMA8GA1UECxMI +cWlhbm5pYW8xFDASBgNVBAMTC1ppeGlhbiBXYW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAwCCPny8YpxenB+FZNznW03ayd/5coNlLq/z/oTID555l +5x4AVLlo5rqL/ruI6nnlESkbqD1eYABUREdT0aCgVQU4Sfau/L92VW3yfkU2y1Hd +lWDSjVcZuXnQSkWUprU5mVuZD/0InD8J/Z0NcAdIhkMcSLGzkBKqDDXsFk4vQTd6 +6ENVrH/A8aTBT81XuE6PMfDHcCE4XAcYxvg4hE85Y9Co/FHaqRG6EqrRPFldcUEr +7qeaJzLWBCcvB5zofH4+WN8n4G2GMtBB946OJqIQp1LSP4hQRPie9cRz1PTRi+ak +rDdNZzWWQyiOO4rj14gDKGjC4ob8i/HWjJNN9qk/KwIDAQABoDAwLgYJKoZIhvcN +AQkOMSEwHzAdBgNVHQ4EFgQUs/+W5dulka5xzTy7PkbYMrT77D8wDQYJKoZIhvcN +AQELBQADggEBALFq8m21l/UpyYEcehKUf+b5y5F9GGXb4Q4xNgxW1hbnF0BMYX/M +2PhoEyZyX/S39MlwtICGprstSszUIYugq1gX5fRj+MrgrOCfZ4cPrR9Fm2F0Oee2 +DMJcTIaXu5dcqL0YaHCEIKhyJY9ZCAZza4J4FhoAaSgW5UCc4xtMSQTcRhGPJm9p +a8lT5PiADh0MY0cQ8gWElI91lSdrKssnWbcAOCAxgQ0sHm2W1ZiFIzxKsSg49TTa +BVCgun+Vthww7bw2eiSwSYFilevu5payKvw7ns4f3ruLtBYLhMk+qDnld4L5CECb +R4toQ//F/XCU242bNzjIMOpQIap/LpdHs0M= +-----END NEW CERTIFICATE REQUEST----- diff --git a/lib/controller/discover/visitor_controller.dart b/lib/controller/discover/visitor_controller.dart index f8c5c44..b6049fc 100644 --- a/lib/controller/discover/visitor_controller.dart +++ b/lib/controller/discover/visitor_controller.dart @@ -2,6 +2,8 @@ import 'package:easy_refresh/easy_refresh.dart'; import 'package:get/get.dart'; import '../../model/discover/visitor_model.dart'; +import '../../model/home/marriage_data.dart'; +import '../../network/user_api.dart'; class VisitorController extends GetxController { // 访客列表 @@ -18,42 +20,42 @@ class VisitorController extends GetxController { final int pageSize = 15; var hasMore = true.obs; var isLoading = false.obs; + late final UserApi _userApi; @override void onInit() { super.onInit(); + _userApi = Get.find(); _loadInitialData(); } // 加载初始数据 void _loadInitialData() async { 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; - hasMore.value = initialVisitors.length == pageSize; + + final int current = result['current'] ?? 1; + final int total = result['pages'] ?? 1; + hasMore.value = current < total; } // 下拉刷新 void onRefresh() async { - currentPage.value = 1; 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.resetFooter(); - hasMore.value = newVisitors.length == pageSize; - if (newVisitors.isEmpty) { - hasMore.value = false; - } } // 上拉加载更多 @@ -62,20 +64,16 @@ class VisitorController extends GetxController { if (!hasMore.value) { return; } - + final result = await _fetchVisitorData(pageNum: currentPage.value + 1); 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); + } else { + refreshController.finishLoad(IndicatorResult.noMore); } } @@ -85,12 +83,6 @@ class VisitorController extends GetxController { Get.snackbar('成功', '已删除访客记录'); } - // 清空所有访客记录 - void clearAllVisitors() { - visitors.clear(); - Get.snackbar('成功', '已清空所有访客记录'); - } - // 获取今日访客数量 int get todayVisitorsCount { return visitors.length; @@ -101,46 +93,49 @@ class VisitorController extends GetxController { return visitors.length; } - // 模拟数据生成 - List _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> _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': [], + 'current': pageNum, + 'pages': 1, + 'total': 0, + 'size': pageSize, + }; + } + + // data 是 PaginatedResponse,直接使用其属性 + // records 中的每个项是 dynamic,需要转换为 MarriageData + final records = paginatedData.records + .map((item) => MarriageData.fromJson(item as Map)) + .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 diff --git a/lib/network/api_urls.dart b/lib/network/api_urls.dart index 6d82106..a981282 100644 --- a/lib/network/api_urls.dart +++ b/lib/network/api_urls.dart @@ -114,4 +114,7 @@ class ApiUrls { 'dating-agency-chat-audio/user/kicking/rtc-channel-user'; static const String applyMatchmaker = 'dating-agency-uec/user/apply/matchmaker'; + + static const String listVisitorInfo = + 'dating-agency-service/user/page/dongwo/visitor-info'; } diff --git a/lib/network/user_api.dart b/lib/network/user_api.dart index 57bae4b..19e67e7 100644 --- a/lib/network/user_api.dart +++ b/lib/network/user_api.dart @@ -23,6 +23,7 @@ import 'package:dating_touchme_app/network/api_urls.dart'; import 'package:retrofit/retrofit.dart'; import 'package:dio/dio.dart'; +import '../model/home/marriage_data.dart'; import '../model/mine/authentication_data.dart'; import '../model/mine/chat_static_data.dart'; import '../model/mine/submit_order_data.dart'; @@ -226,6 +227,7 @@ abstract class UserApi { @Body() Map data, ); + @GET(ApiUrls.userGetDongwoOwnUserCount) Future>> userGetDongwoOwnUserCount(); @@ -236,4 +238,10 @@ abstract class UserApi { @Query('pageSize') required int pageSize, } ); + + @GET(ApiUrls.listVisitorInfo) + Future>>> getVisitorList({ + @Query('pageNum') required int pageNum, + @Query('pageSize') required int pageSize, + }); } diff --git a/lib/network/user_api.g.dart b/lib/network/user_api.g.dart index 62cb018..a8dbb3a 100644 --- a/lib/network/user_api.g.dart +++ b/lib/network/user_api.g.dart @@ -1446,6 +1446,49 @@ class _UserApi implements UserApi { return httpResponse; } + @override + Future>>> + getVisitorList({required int pageNum, required int pageSize}) async { + final _extra = {}; + final queryParameters = { + r'pageNum': pageNum, + r'pageSize': pageSize, + }; + final _headers = {}; + const Map? _data = null; + final _options = + _setStreamType< + HttpResponse>> + >( + Options(method: 'GET', headers: _headers, extra: _extra) + .compose( + _dio.options, + 'dating-agency-service/user/page/dongwo/visitor-info', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl), + ), + ); + final _result = await _dio.fetch>(_options); + late BaseResponse> _value; + try { + _value = BaseResponse>.fromJson( + _result.data!, + (json) => PaginatedResponse.fromJson( + json as Map, + (json) => MarriageData.fromJson(json as Map), + ), + ); + } on Object catch (e, s) { + errorLogger?.logError(e, s, _options); + rethrow; + } + final httpResponse = HttpResponse(_value, _result); + return httpResponse; + } + RequestOptions _setStreamType(RequestOptions requestOptions) { if (T != dynamic && !(requestOptions.responseType == ResponseType.bytes ||