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/assets/images/phone_help.png b/assets/images/phone_help.png index 8a11dd2..7208884 100644 Binary files a/assets/images/phone_help.png and b/assets/images/phone_help.png differ diff --git a/assets/images/realname_help.png b/assets/images/realname_help.png index a8db2fd..7c3e360 100644 Binary files a/assets/images/realname_help.png and b/assets/images/realname_help.png differ diff --git a/lib/controller/discover/visitor_controller.dart b/lib/controller/discover/visitor_controller.dart index f8c5c44..e3283cd 100644 --- a/lib/controller/discover/visitor_controller.dart +++ b/lib/controller/discover/visitor_controller.dart @@ -1,11 +1,12 @@ // controllers/visitor_controller.dart 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 { // 访客列表 - var visitors = [].obs; + var visitors = [].obs; // Refresh controllers final EasyRefreshController refreshController = EasyRefreshController( @@ -18,42 +19,41 @@ 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(); - _loadInitialData(); + _userApi = Get.find(); + loadInitialData(); } // 加载初始数据 - void _loadInitialData() async { + 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 +62,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 +81,6 @@ class VisitorController extends GetxController { Get.snackbar('成功', '已删除访客记录'); } - // 清空所有访客记录 - void clearAllVisitors() { - visitors.clear(); - Get.snackbar('成功', '已清空所有访客记录'); - } - // 获取今日访客数量 int get todayVisitorsCount { return visitors.length; @@ -101,46 +91,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/controller/mine/mine_controller.dart b/lib/controller/mine/mine_controller.dart index 9af8d19..f29b4fe 100644 --- a/lib/controller/mine/mine_controller.dart +++ b/lib/controller/mine/mine_controller.dart @@ -1,10 +1,13 @@ import 'package:dating_touchme_app/controller/global.dart'; import 'package:dating_touchme_app/generated/assets.dart'; +import 'package:dating_touchme_app/model/mine/user_count_data.dart'; +import 'package:dating_touchme_app/network/user_api.dart'; import 'package:dating_touchme_app/pages/mine/auth_center_page.dart'; import 'package:dating_touchme_app/pages/mine/matchmaker_update_page.dart'; import 'package:dating_touchme_app/pages/mine/my_wallet_page.dart'; import 'package:dating_touchme_app/pages/mine/rose_page.dart'; import 'package:dating_touchme_app/pages/mine/user_help_center_page.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import '../../pages/setting/match_spread_page.dart'; @@ -13,14 +16,13 @@ import '../../pages/setting/setting_page.dart'; class MineController extends GetxController { - List infoList = [ - {"label": "我的关注", "num": 88, "type": 1}, - {"label": "关注我的", "num": 18988, "type": 2}, - {"label": "好友", "num": 8, "type": 3}, - {"label": "访客", "num": 357, "type": 4}, + final infoList = [ + {"label": "好友", "num": 0, "type": 1}, + {"label": "好友申请", "num": 0, "type": 2}, + {"label": "访客", "num": 0, "type": 3}, ].obs; - List blockList = [ + final blockList = [ {"icon": Assets.imagesRose, "title": "我的玫瑰", "subTitle": "新人限时福利", "path": () => RosePage()}, {"icon": Assets.imagesWallet, "title": "我的钱包", "subTitle": "提现无门槛", "path": () => MyWalletPage()}, {"icon": Assets.imagesShop, "title": "商城中心", "subTitle": "不定期更新商品", "path": () => null}, @@ -28,7 +30,7 @@ class MineController extends GetxController { {"icon": Assets.imagesMatchmaker, "title": "红娘等级", "subTitle": "实习红娘", "path": () => MatchSpreadPage()}, ].obs; - List settingList = [ + final settingList = [ {"icon": Assets.imagesSetting, "title": "设置", "path": () => SettingPage()}, {"icon": Assets.imagesCustomer, "title": "联系客服", "path": () => Null}, {"icon": Assets.imagesMail, "title": "意见反馈", "path": () => UserHelpCenterPage()}, @@ -37,12 +39,38 @@ class MineController extends GetxController { final userData = GlobalData().userData.obs; final userId = GlobalData().userId.obs; + final countData = UserCountData(friendNum: 0, friendApplyNum: 0, visitorNum:0).obs; + + late UserApi _userApi; + @override void onInit() { super.onInit(); userData.value = GlobalData().userData; userId.value = GlobalData().userId; + _userApi = Get.find(); + getUserCount(); } + getUserCount() async { + try { + final response = await _userApi.userGetDongwoOwnUserCount(); + if (response.data.isSuccess && response.data.data != null) { + countData.value = response.data.data ?? UserCountData(friendNum: 0, friendApplyNum: 0, visitorNum:0); + infoList[0]["num"] = countData.value.friendNum; + infoList[1]["num"] = countData.value.friendApplyNum; + infoList[2]["num"] = countData.value.visitorNum; + } else { + + // 响应失败,抛出异常 + throw Exception(response.data.message ?? '获取数据失败'); + } + } catch(e){ + print('用户数据获取失败: $e'); + SmartDialog.showToast('用户数据获取失败'); + rethrow; + + } + } } \ No newline at end of file diff --git a/lib/controller/mine/my_friend_controller.dart b/lib/controller/mine/my_friend_controller.dart index 49ee428..8a219d8 100644 --- a/lib/controller/mine/my_friend_controller.dart +++ b/lib/controller/mine/my_friend_controller.dart @@ -3,6 +3,7 @@ import 'package:easy_refresh/easy_refresh.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; +import '../../model/mine/friend_apply_data.dart' as fa; import '../../model/mine/friend_data.dart'; @@ -20,11 +21,12 @@ class MyFriendController extends GetxController with GetSingleTickerProviderStat late final EasyRefreshController listRefreshController; final friendList = [].obs; + final friendApplyList = [].obs; @override void onInit() { super.onInit(); - tabController = TabController(length: 3, vsync: this); + tabController = TabController(length: 2, vsync: this); listRefreshController = EasyRefreshController( controlFinishRefresh: true, @@ -33,6 +35,7 @@ class MyFriendController extends GetxController with GetSingleTickerProviderStat _userApi = Get.find(); getFriendList(); + getFriendApplyList(); } getFriendList() async { @@ -57,8 +60,36 @@ class MyFriendController extends GetxController with GetSingleTickerProviderStat throw Exception(response.data.message ?? '获取数据失败'); } } catch(e) { - print('玫瑰记录获取失败: $e'); - SmartDialog.showToast('玫瑰记录获取失败'); + print('好友列表获取失败: $e'); + SmartDialog.showToast('好友列表获取失败'); + rethrow; + } + } + + getFriendApplyList() async { + try{ + final response = await _userApi.userPageFriendApply( + pageNum: page.value, + pageSize: size.value, + ); + if (response.data.isSuccess && response.data.data != null) { + final data = response.data.data?.records ?? []; + + friendApplyList.addAll(data.toList()); + if((data.length ?? 0) == size.value){ + + listRefreshController.finishLoad(IndicatorResult.success); + } else { + listRefreshController.finishLoad(IndicatorResult.noMore); + } + } else { + + // 响应失败,抛出异常 + throw Exception(response.data.message ?? '获取数据失败'); + } + } catch(e) { + print('好友申请列表获取失败: $e'); + SmartDialog.showToast('好友申请列表获取失败'); rethrow; } } diff --git a/lib/model/discover/visitor_model.dart b/lib/model/discover/visitor_model.dart deleted file mode 100644 index 66a7e0d..0000000 --- a/lib/model/discover/visitor_model.dart +++ /dev/null @@ -1,75 +0,0 @@ -class VisitorModel { - final String? miId; - final String? profilePhoto; - final String? nickName; - final int? height; - final String? visitTime; - final String? education; - final int? age; - final int? minimumIncome; - final int? maximumIncome; - final String? income; - final String? describeInfo; - final int? vip; - final int? miSessionType; - final int? genderCode; - final int? onlineStatus; - - VisitorModel({ - this.miId, - this.profilePhoto, - this.nickName, - this.height, - this.visitTime, - this.education, - this.age, - this.minimumIncome, - this.maximumIncome, - this.income, - this.describeInfo, - this.vip, - this.miSessionType, - this.genderCode, - this.onlineStatus, - }); - - factory VisitorModel.fromJson(Map json) { - return VisitorModel( - miId: json['miId'] as String?, - profilePhoto: json['profilePhoto'] as String?, - nickName: json['nickName'] as String?, - height: json['height'] as int?, - visitTime: json['visitTime'] as String?, - education: json['education'] as String?, - age: json['age'] as int?, - minimumIncome: json['minimumIncome'] as int?, - maximumIncome: json['maximumIncome'] as int?, - income: json['income'] as String?, - describeInfo: json['describeInfo'] as String?, - vip: json['vip'] as int?, - miSessionType: json['miSessionType'] as int?, - genderCode: json['genderCode'] as int?, - onlineStatus: json['onlineStatus'] as int?, - ); - } - - Map toJson() { - return { - 'miId': miId, - 'profilePhoto': profilePhoto, - 'nickName': nickName, - 'height': height, - 'visitTime': visitTime, - 'education': education, - 'age': age, - 'minimumIncome': minimumIncome, - 'maximumIncome': maximumIncome, - 'income': income, - 'describeInfo': describeInfo, - 'vip': vip, - 'miSessionType': miSessionType, - 'genderCode': genderCode, - 'onlineStatus': onlineStatus, - }; - } -} \ No newline at end of file diff --git a/lib/model/mine/friend_apply_data.dart b/lib/model/mine/friend_apply_data.dart new file mode 100644 index 0000000..7352b6e --- /dev/null +++ b/lib/model/mine/friend_apply_data.dart @@ -0,0 +1,84 @@ +class FriendApplyData { + List? records; + int? total; + int? size; + int? current; + int? pages; + + FriendApplyData( + {this.records, this.total, this.size, this.current, this.pages}); + + FriendApplyData.fromJson(Map json) { + if (json['records'] != null) { + records = []; + json['records'].forEach((v) { + records!.add(new Records.fromJson(v)); + }); + } + total = json['total']; + size = json['size']; + current = json['current']; + pages = json['pages']; + } + + Map toJson() { + final Map data = new Map(); + if (this.records != null) { + data['records'] = this.records!.map((v) => v.toJson()).toList(); + } + data['total'] = this.total; + data['size'] = this.size; + data['current'] = this.current; + data['pages'] = this.pages; + return data; + } +} + +class Records { + String? id; + String? toUserId; + String? toMiId; + int? toUId; + String? toNickName; + String? toProfilePhoto; + int? toGenderCode; + Null? applyMsg; + int? status; + + Records( + {this.id, + this.toUserId, + this.toMiId, + this.toUId, + this.toNickName, + this.toProfilePhoto, + this.toGenderCode, + this.applyMsg, + this.status}); + + Records.fromJson(Map json) { + id = json['id']; + toUserId = json['toUserId']; + toMiId = json['toMiId']; + toUId = json['toUId']; + toNickName = json['toNickName']; + toProfilePhoto = json['toProfilePhoto']; + toGenderCode = json['toGenderCode']; + applyMsg = json['applyMsg']; + status = json['status']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['toUserId'] = this.toUserId; + data['toMiId'] = this.toMiId; + data['toUId'] = this.toUId; + data['toNickName'] = this.toNickName; + data['toProfilePhoto'] = this.toProfilePhoto; + data['toGenderCode'] = this.toGenderCode; + data['applyMsg'] = this.applyMsg; + data['status'] = this.status; + return data; + } +} diff --git a/lib/model/mine/user_count_data.dart b/lib/model/mine/user_count_data.dart new file mode 100644 index 0000000..fcc11ac --- /dev/null +++ b/lib/model/mine/user_count_data.dart @@ -0,0 +1,21 @@ +class UserCountData { + int? friendNum; + int? friendApplyNum; + int? visitorNum; + + UserCountData({this.friendNum, this.friendApplyNum, this.visitorNum}); + + UserCountData.fromJson(Map json) { + friendNum = json['friendNum']; + friendApplyNum = json['friendApplyNum']; + visitorNum = json['visitorNum']; + } + + Map toJson() { + final Map data = new Map(); + data['friendNum'] = this.friendNum; + data['friendApplyNum'] = this.friendApplyNum; + data['visitorNum'] = this.visitorNum; + return data; + } +} diff --git a/lib/network/api_urls.dart b/lib/network/api_urls.dart index 9d6c204..a981282 100644 --- a/lib/network/api_urls.dart +++ b/lib/network/api_urls.dart @@ -90,6 +90,10 @@ class ApiUrls { 'dating-agency-mall/user/get/payment-order/detail'; static const String userPageFriendRelation = 'dating-agency-chat-audio/user/page/friend-relation'; + static const String userGetDongwoOwnUserCount = + 'dating-agency-service/user/get/dongwo/own-user-count'; + static const String userPageFriendApply = + 'dating-agency-chat-audio/user/page/friend-apply'; //首页相关接口 static const String getMarriageList = @@ -110,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 e2dfe85..19e67e7 100644 --- a/lib/network/user_api.dart +++ b/lib/network/user_api.dart @@ -3,6 +3,7 @@ import 'package:dating_touchme_app/model/home/user_info_data.dart'; import 'package:dating_touchme_app/model/mine/bank_card_data.dart'; import 'package:dating_touchme_app/model/mine/bank_card_ocr_data.dart'; import 'package:dating_touchme_app/model/mine/education_data.dart'; +import 'package:dating_touchme_app/model/mine/friend_apply_data.dart'; import 'package:dating_touchme_app/model/mine/friend_data.dart'; import 'package:dating_touchme_app/model/mine/login_data.dart'; import 'package:dating_touchme_app/model/mine/occupation_data.dart'; @@ -10,6 +11,7 @@ import 'package:dating_touchme_app/model/mine/payment_detail_data.dart'; import 'package:dating_touchme_app/model/mine/rose_data.dart'; import 'package:dating_touchme_app/model/mine/rose_history_data.dart'; import 'package:dating_touchme_app/model/mine/user_base_data.dart'; +import 'package:dating_touchme_app/model/mine/user_count_data.dart'; import 'package:dating_touchme_app/model/mine/user_data.dart'; import 'package:dating_touchme_app/model/mine/user_rose_data.dart'; import 'package:dating_touchme_app/model/mine/wallet_account_data.dart'; @@ -21,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'; @@ -223,4 +226,22 @@ abstract class UserApi { Future>> applyMatchmaker( @Body() Map data, ); + + + @GET(ApiUrls.userGetDongwoOwnUserCount) + Future>> userGetDongwoOwnUserCount(); + + @GET(ApiUrls.userPageFriendApply) + Future>> userPageFriendApply( + { + @Query('pageNum') required int pageNum, + @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 03b8af7..a8dbb3a 100644 --- a/lib/network/user_api.g.dart +++ b/lib/network/user_api.g.dart @@ -1374,6 +1374,121 @@ class _UserApi implements UserApi { return httpResponse; } + @override + Future>> + userGetDongwoOwnUserCount() async { + final _extra = {}; + final queryParameters = {}; + final _headers = {}; + const Map? _data = null; + final _options = _setStreamType>>( + Options(method: 'GET', headers: _headers, extra: _extra) + .compose( + _dio.options, + 'dating-agency-service/user/get/dongwo/own-user-count', + 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) => UserCountData.fromJson(json as Map), + ); + } on Object catch (e, s) { + errorLogger?.logError(e, s, _options); + rethrow; + } + final httpResponse = HttpResponse(_value, _result); + return httpResponse; + } + + @override + Future>> userPageFriendApply({ + 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>>( + Options(method: 'GET', headers: _headers, extra: _extra) + .compose( + _dio.options, + 'dating-agency-chat-audio/user/page/friend-apply', + 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) => FriendApplyData.fromJson(json as Map), + ); + } on Object catch (e, s) { + errorLogger?.logError(e, s, _options); + rethrow; + } + final httpResponse = HttpResponse(_value, _result); + 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 || diff --git a/lib/pages/discover/visitor_list_page.dart b/lib/pages/discover/visitor_list_page.dart index bd3e847..056f25f 100644 --- a/lib/pages/discover/visitor_list_page.dart +++ b/lib/pages/discover/visitor_list_page.dart @@ -7,7 +7,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../controller/discover/visitor_controller.dart'; -import '../../model/discover/visitor_model.dart'; +import '../../model/home/marriage_data.dart'; class VisitorListPage extends StatefulWidget { const VisitorListPage({super.key}); @@ -31,28 +31,6 @@ class _VisitorListPagePageState extends State { )), centerTitle: true, backgroundColor: Colors.white, - actions: [ - // 更多操作 - PopupMenuButton( - onSelected: (value) { - if (value == 'clear') { - _showClearDialog(); - } else if (value == 'sort') { - _showSortDialog(); - } - }, - tooltip: "", - padding: EdgeInsets.zero, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(14)), - color: Colors.white, - elevation: 8, - offset: Offset(32.w, 36.h), // 相对按钮下移一点 - itemBuilder: (BuildContext context) => [ - PopupMenuItem(value: 'sort', child: Text('排序方式')), - PopupMenuItem(value: 'clear', child: Text('清空记录')), - ], - ), - ], ), body: Obx(() { if (visitorController.isLoading.value && visitorController.visitors.isEmpty) { @@ -76,17 +54,15 @@ class _VisitorListPagePageState extends State { Icon(Icons.people_outline, size: 80, color: Colors.grey[300]), SizedBox(height: 16), Text( - '暂无访客记录', - style: TextStyle(fontSize: 18, color: Colors.grey), + '暂无访客记录,点击刷新', + style: TextStyle(fontSize: 14, color: Colors.grey), ), SizedBox(height: 8), - Text( - '下拉刷新获取数据', - style: TextStyle(color: Colors.grey), - ), ], ), - ); + ).onTap((){ + visitorController.loadInitialData(); + }); } return EasyRefresh( @@ -134,65 +110,10 @@ class _VisitorListPagePageState extends State { ); } - void _showClearDialog() { - Get.dialog( - AlertDialog( - title: Text('确认清空'), - content: Text('确定要清空所有访客记录吗?此操作不可恢复。'), - actions: [ - TextButton( - onPressed: () => Get.back(), - child: Text('取消'), - ), - TextButton( - onPressed: () { - visitorController.clearAllVisitors(); - Get.back(); - }, - child: Text('确定', style: TextStyle(color: Colors.red)), - ), - ], - ), - ); - } - - void _showSortDialog() { - Get.dialog( - AlertDialog( - title: Text('排序方式'), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - ListTile( - title: Text('按访问时间'), - onTap: () { - // 实现排序逻辑 - Get.back(); - }, - ), - ListTile( - title: Text('按访问时长'), - onTap: () { - // 实现排序逻辑 - Get.back(); - }, - ), - ListTile( - title: Text('按访问次数'), - onTap: () { - // 实现排序逻辑 - Get.back(); - }, - ), - ], - ), - ), - ); - } } class VisitorListItem extends StatelessWidget { - final VisitorModel visitor; + final MarriageData visitor; const VisitorListItem({Key? key, required this.visitor}) : super(key: key); @@ -215,7 +136,7 @@ class VisitorListItem extends StatelessWidget { borderRadius: BorderRadius.circular(8), color: Colors.blue[100], image: DecorationImage( - image: NetworkImage(visitor.profilePhoto!), + image: NetworkImage(visitor.profilePhoto), fit: BoxFit.cover, ), ), @@ -227,26 +148,26 @@ class VisitorListItem extends StatelessWidget { Row( children: [ Text( - visitor.nickName!, + visitor.nickName, style: TextStyle( fontSize: 14, ), ), Spacer(), - Text( - _formatTime(visitor.visitTime!), - style: TextStyle( - color: Colors.grey[500], - fontSize: 13, - ), - ), + // Text( + // _formatTime(visitor.visitTime!), + // style: TextStyle( + // color: Colors.grey[500], + // fontSize: 13, + // ), + // ), ], ), SizedBox(height: 4), SizedBox( // height: 20, // 固定高度20 child: Text( - visitor.describeInfo!, + visitor.describeInfo, style: TextStyle( fontSize: 13, color: Color.fromRGBO(51, 51, 51, 0.6), diff --git a/lib/pages/mine/mine_page.dart b/lib/pages/mine/mine_page.dart index 8f5217f..2329efb 100644 --- a/lib/pages/mine/mine_page.dart +++ b/lib/pages/mine/mine_page.dart @@ -183,9 +183,9 @@ class _MinePageState extends State with AutomaticKeepAliveClientMixin{ height: 57.w, padding: EdgeInsets.only( top: 11.w, - right: 37.w, + right: 42.w, bottom: 8.w, - left: 27.w + left: 42.w ), decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(9.w)), @@ -268,13 +268,30 @@ class _InfoItemState extends State { Widget build(BuildContext context) { return Column( children: [ - Text( - "${widget.item["num"]}", - style: TextStyle( - fontSize: 15.w, - color: Colors.black, - fontWeight: FontWeight.w700 - ), + Stack( + clipBehavior: Clip.none, + children: [ + Text( + "${widget.item["num"]}", + style: TextStyle( + fontSize: 15.w, + color: Colors.black, + fontWeight: FontWeight.w700 + ), + ), + if(widget.item["type"] == 2 && widget.item["num"] != 0)Positioned( + right: -5.w, + top: 0, + child: Container( + width: 5.w, + height: 5.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(5.w)), + color: const Color.fromRGBO(255, 87, 51, 1) + ), + ), + ) + ], ), Text( widget.item["label"], @@ -285,7 +302,7 @@ class _InfoItemState extends State { ) ], ).onTap((){ - if(widget.item['type'] == 4){ + if(widget.item['type'] == 3){ Get.to(()=> VisitorListPage()); } else { Get.to(()=> MyFriendPage()); diff --git a/lib/pages/mine/my_friend_page.dart b/lib/pages/mine/my_friend_page.dart index 472f10e..1bec71e 100644 --- a/lib/pages/mine/my_friend_page.dart +++ b/lib/pages/mine/my_friend_page.dart @@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:tdesign_flutter/tdesign_flutter.dart'; +import '../../model/mine/friend_apply_data.dart' as fa; class MyFriendPage extends StatelessWidget { const MyFriendPage({super.key}); @@ -66,19 +67,13 @@ class MyFriendPage extends StatelessWidget { TDTab( child: Padding( padding: EdgeInsets.only(right: 16, left: 16), - child: Text('我的关注'), + child: Text('我的好友'), ), ), TDTab( child: Padding( padding: EdgeInsets.only(right: 16, left: 16), - child: Text('好友'), - ), - ), - TDTab( - child: Padding( - padding: EdgeInsets.only(right: 12, left: 12), - child: Text('粉丝'), + child: Text('好友申请'), ), ), ], @@ -148,8 +143,11 @@ class MyFriendPage extends StatelessWidget { if(controller.friendList.isNotEmpty) ...[ ...controller.friendList.map((e){ return UserItem(item: e,); - }) - ] + }), + ], + AddUserItem(item: fa.Records(),), + AddUserItem(item: fa.Records(),), + AddUserItem(item: fa.Records(),), ], ), ), @@ -255,3 +253,134 @@ class _UserItemState extends State { ); } } + +class AddUserItem extends StatefulWidget { + final fa.Records item; + const AddUserItem({super.key, required this.item}); + + @override + State createState() => _AddUserItemState(); +} + +class _AddUserItemState extends State { + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric( + vertical: 15.w + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(45.w)), + child: CachedNetworkImage( + imageUrl: "${widget.item.toProfilePhoto ?? ""}?x-oss-process=image/format,webp/resize,w_170", + width: 45.w, + height: 45.w, + fit: BoxFit.cover, + ), + ), + SizedBox(width: 9.w,), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + "${widget.item.toNickName}", + style: TextStyle( + fontSize: 14.w, + fontWeight: FontWeight.w500 + ), + ), + Container( + margin: EdgeInsets.only(left: 7.w), + width: 12.w, + height: 12.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(12.w)), + color: widget.item.toGenderCode == 0 ? const Color.fromRGBO(237, 245, 255, 1) : const Color.fromRGBO(255, 237, 255, 1) + ), + child: Center( + child: Image.asset( + widget.item.toGenderCode == 0 ? Assets.imagesMale : Assets.imagesFemale, + width: 7.w, + ), + ), + ) + ], + ), + Text( + "30岁·广州", + style: TextStyle( + fontSize: 11.w, + color: const Color.fromRGBO(144, 144, 144, 1), + fontWeight: FontWeight.w500 + ), + ) + ], + ) + ], + ), + if(widget.item.status == 2) Container( + width: 60.w, + height: 22.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(22.w)), + color: const Color.fromRGBO(224, 224, 224, .5) + ), + child: Center( + child: Text( + "已同意", + style: TextStyle( + fontSize: 11.w, + color: const Color.fromRGBO(144, 144, 144, 1), + fontWeight: FontWeight.w500 + ), + ), + ), + ), + if(widget.item.status == 3) Container( + width: 60.w, + height: 22.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(22.w)), + color: const Color.fromRGBO(224, 224, 224, .5) + ), + child: Center( + child: Text( + "已拒绝", + style: TextStyle( + fontSize: 11.w, + color: const Color.fromRGBO(144, 144, 144, 1), + fontWeight: FontWeight.w500 + ), + ), + ), + ), + if(widget.item.status == 1) Container( + width: 60.w, + height: 22.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(22.w)), + border: Border.all(width: 1, color: const Color.fromRGBO(144, 144, 144, 1)), + color: Colors.white + ), + child: Center( + child: Text( + "同意", + style: TextStyle( + fontSize: 11.w, + fontWeight: FontWeight.w500 + ), + ), + ), + ) + ], + ), + ); + } +} diff --git a/lib/pages/mine/user_help_center_page.dart b/lib/pages/mine/user_help_center_page.dart index 07ac5cb..92b525a 100644 --- a/lib/pages/mine/user_help_center_page.dart +++ b/lib/pages/mine/user_help_center_page.dart @@ -384,6 +384,7 @@ class _ServiceItemState extends State { child: Image.asset( widget.icon, width: 44.w, + fit: BoxFit.cover, ), ), ),