From aeebab5559ff4e1e35fbd919a9730b81cb9bbe5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=AD=90=E8=B4=A4?= Date: Fri, 6 Mar 2026 17:58:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E8=BF=9E=E9=BA=A6=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/images/connect_history_icon.png | Bin 0 -> 24150 bytes .../home/user_information_controller.dart | 11 +- .../message/chat_settings_controller.dart | 1 - .../message/connect_history_controller.dart | 60 +++++++++ lib/controller/mine/edit_info_controller.dart | 2 +- lib/generated/assets.dart | 1 + lib/model/mine/connect_history_data.dart | 104 ++++++++++++++++ lib/network/api_urls.dart | 4 +- lib/network/user_api.dart | 7 ++ lib/network/user_api.g.dart | 43 ++++++- lib/pages/discover/visitor_list_page.dart | 2 +- lib/pages/home/content_card.dart | 2 +- lib/pages/home/user_information_page.dart | 7 +- lib/pages/message/chat_page.dart | 1 - lib/pages/message/connect_history_page.dart | 117 ++++++++++++++++++ lib/pages/message/conversation_tab.dart | 39 ++++++ lib/pages/mine/my_friend_page.dart | 4 +- lib/rtc/rtc_manager.dart | 24 +++- 18 files changed, 402 insertions(+), 27 deletions(-) create mode 100644 assets/images/connect_history_icon.png create mode 100644 lib/controller/message/connect_history_controller.dart create mode 100644 lib/model/mine/connect_history_data.dart create mode 100644 lib/pages/message/connect_history_page.dart diff --git a/assets/images/connect_history_icon.png b/assets/images/connect_history_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..64b3ac03d754afebeec32b9257bd78e82115b672 GIT binary patch literal 24150 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 diff --git a/lib/controller/message/chat_settings_controller.dart b/lib/controller/message/chat_settings_controller.dart index edfddc1..272a1b1 100644 --- a/lib/controller/message/chat_settings_controller.dart +++ b/lib/controller/message/chat_settings_controller.dart @@ -542,7 +542,6 @@ class ChatSettingsController extends GetxController { // 跳转到用户主页 await Get.to(() => UserInformationPage( miId: targetMiId!, - userId: targetUserId, )); } catch (e, stackTrace) { if (Get.isLogEnable) { diff --git a/lib/controller/message/connect_history_controller.dart b/lib/controller/message/connect_history_controller.dart new file mode 100644 index 0000000..6a5124c --- /dev/null +++ b/lib/controller/message/connect_history_controller.dart @@ -0,0 +1,60 @@ + +import 'package:dating_touchme_app/network/user_api.dart'; +import 'package:easy_refresh/easy_refresh.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:get/get.dart'; + +import '../../model/mine/connect_history_data.dart'; + +class ConnectHistoryController extends GetxController { + + late UserApi _userApi; + + final historyList = [].obs; + + + final page = 1.obs; + + final hasMore = true.obs; + + late final EasyRefreshController listRefreshController; + + @override + void onInit() { + super.onInit(); + listRefreshController = EasyRefreshController( + controlFinishRefresh: true, + controlFinishLoad: true, + ); + _userApi = Get.find(); + getHistoryList(); + } + + getHistoryList() async {try{ + final response = await _userApi.userPageLatestDatingRecord( + pageNum: page.value, + pageSize: 10, + ); + if (response.data.isSuccess && response.data.data != null) { + final data = response.data.data?.records ?? []; + + historyList.addAll(data.toList()); + if((data.length ?? 0) == 10){ + + listRefreshController.finishLoad(IndicatorResult.success); + } else { + listRefreshController.finishLoad(IndicatorResult.noMore); + } + } 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/edit_info_controller.dart b/lib/controller/mine/edit_info_controller.dart index 7c7cd5a..eb0352e 100644 --- a/lib/controller/mine/edit_info_controller.dart +++ b/lib/controller/mine/edit_info_controller.dart @@ -322,7 +322,7 @@ class EditInfoController extends GetxController { } goPreview() { - Get.to(() => UserInformationPage(miId: userData.value?.id ?? "", userId: GlobalData().userId ?? "")); + Get.to(() => UserInformationPage(miId: userData.value?.id ?? "")); } int calculateAge(String birthdayStr) { diff --git a/lib/generated/assets.dart b/lib/generated/assets.dart index 3074a67..824af94 100644 --- a/lib/generated/assets.dart +++ b/lib/generated/assets.dart @@ -98,6 +98,7 @@ class Assets { static const String imagesCheck = 'assets/images/check.png'; static const String imagesCloseArrow = 'assets/images/close_arrow.png'; static const String imagesCloseLive = 'assets/images/close_live.png'; + static const String imagesConnectHistoryIcon = 'assets/images/connect_history_icon.png'; static const String imagesCustomer = 'assets/images/customer.png'; static const String imagesDailyTasks = 'assets/images/daily_tasks.png'; static const String imagesDiscoverNol = 'assets/images/discover_nol.png'; diff --git a/lib/model/mine/connect_history_data.dart b/lib/model/mine/connect_history_data.dart new file mode 100644 index 0000000..b88b8ec --- /dev/null +++ b/lib/model/mine/connect_history_data.dart @@ -0,0 +1,104 @@ +class ConnectHistoryData { + List? records; + int? total; + int? size; + int? current; + int? pages; + + ConnectHistoryData( + {this.records, this.total, this.size, this.current, this.pages}); + + ConnectHistoryData.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? createTime; + String? anchorMiId; + String? anchorProfilePhoto; + String? anchorNickName; + String? dateObjectMiId; + String? dateObjectProfilePhoto; + String? dateObjectNickName; + int? dateObjectProvinceCode; + String? dateObjectProvinceName; + int? dateObjectCityCode; + String? dateObjectCityName; + String? dateObjectBirthYear; + String? dateObjectBirthDate; + int? dateObjectAge; + + Records( + {this.createTime, + this.anchorMiId, + this.anchorProfilePhoto, + this.anchorNickName, + this.dateObjectMiId, + this.dateObjectProfilePhoto, + this.dateObjectNickName, + this.dateObjectProvinceCode, + this.dateObjectProvinceName, + this.dateObjectCityCode, + this.dateObjectCityName, + this.dateObjectBirthYear, + this.dateObjectBirthDate, + this.dateObjectAge}); + + Records.fromJson(Map json) { + createTime = json['createTime']; + anchorMiId = json['anchorMiId']; + anchorProfilePhoto = json['anchorProfilePhoto']; + anchorNickName = json['anchorNickName']; + dateObjectMiId = json['dateObjectMiId']; + dateObjectProfilePhoto = json['dateObjectProfilePhoto']; + dateObjectNickName = json['dateObjectNickName']; + dateObjectProvinceCode = json['dateObjectProvinceCode']; + dateObjectProvinceName = json['dateObjectProvinceName']; + dateObjectCityCode = json['dateObjectCityCode']; + dateObjectCityName = json['dateObjectCityName']; + dateObjectBirthYear = json['dateObjectBirthYear']; + dateObjectBirthDate = json['dateObjectBirthDate']; + dateObjectAge = json['dateObjectAge']; + } + + Map toJson() { + final Map data = new Map(); + data['createTime'] = this.createTime; + data['anchorMiId'] = this.anchorMiId; + data['anchorProfilePhoto'] = this.anchorProfilePhoto; + data['anchorNickName'] = this.anchorNickName; + data['dateObjectMiId'] = this.dateObjectMiId; + data['dateObjectProfilePhoto'] = this.dateObjectProfilePhoto; + data['dateObjectNickName'] = this.dateObjectNickName; + data['dateObjectProvinceCode'] = this.dateObjectProvinceCode; + data['dateObjectProvinceName'] = this.dateObjectProvinceName; + data['dateObjectCityCode'] = this.dateObjectCityCode; + data['dateObjectCityName'] = this.dateObjectCityName; + data['dateObjectBirthYear'] = this.dateObjectBirthYear; + data['dateObjectBirthDate'] = this.dateObjectBirthDate; + data['dateObjectAge'] = this.dateObjectAge; + return data; + } +} diff --git a/lib/network/api_urls.dart b/lib/network/api_urls.dart index 27bd813..e71d784 100644 --- a/lib/network/api_urls.dart +++ b/lib/network/api_urls.dart @@ -103,7 +103,9 @@ class ApiUrls { static const String userPageUserPropConsumeRecord = 'dating-agency-chat-audio/user/page/user-prop-consume-record'; static const String userDelPhotos = - '/dating-agency-service/user/del/photos'; + 'dating-agency-service/user/del/photos'; + static const String userPageLatestDatingRecord = + 'dating-agency-chat-audio/user/page/latest/dating-record'; //首页相关接口 static const String getMarriageList = diff --git a/lib/network/user_api.dart b/lib/network/user_api.dart index 65fe83c..341ff7f 100644 --- a/lib/network/user_api.dart +++ b/lib/network/user_api.dart @@ -3,6 +3,7 @@ import 'package:dating_touchme_app/model/discover/task_data.dart'; 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/connect_history_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'; @@ -296,4 +297,10 @@ abstract class UserApi { @GET(ApiUrls.userGetSysInfo) Future>> userGetSysInfo(); + + @GET(ApiUrls.userPageLatestDatingRecord) + Future>> userPageLatestDatingRecord({ + @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 548d1e4..d149fd0 100644 --- a/lib/network/user_api.g.dart +++ b/lib/network/user_api.g.dart @@ -1660,7 +1660,7 @@ class _UserApi implements UserApi { Options(method: 'POST', headers: _headers, extra: _extra) .compose( _dio.options, - '/dating-agency-service/user/del/photos', + 'dating-agency-service/user/del/photos', queryParameters: queryParameters, data: _data, ) @@ -1816,6 +1816,47 @@ class _UserApi implements UserApi { return httpResponse; } + @override + Future>> + userPageLatestDatingRecord({ + 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/latest/dating-record', + 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) => ConnectHistoryData.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 71ac742..ceeee75 100644 --- a/lib/pages/discover/visitor_list_page.dart +++ b/lib/pages/discover/visitor_list_page.dart @@ -201,7 +201,7 @@ class VisitorItem extends StatelessWidget { ) ], ).onTap((){ - Get.to(() => UserInformationPage(miId: visitor.miId, userId: visitor.userId!)); + Get.to(() => UserInformationPage(miId: visitor.miId)); }); } diff --git a/lib/pages/home/content_card.dart b/lib/pages/home/content_card.dart index 929fa7d..423beb5 100644 --- a/lib/pages/home/content_card.dart +++ b/lib/pages/home/content_card.dart @@ -250,7 +250,7 @@ class ContentCard extends StatelessWidget { } await roomController.joinChannel(item.isLiveChannelId ?? ""); } else { - Get.to(() => UserInformationPage(miId: item.miId, userId: item.userId,)); + Get.to(() => UserInformationPage(miId: item.miId)); } // 点击卡片跳转到用户信息页面,传递用户数据 // 注意:userId 参数应该传入 miId,因为详情接口使用 miId 来获取用户信息 diff --git a/lib/pages/home/user_information_page.dart b/lib/pages/home/user_information_page.dart index 0650625..cce57c7 100644 --- a/lib/pages/home/user_information_page.dart +++ b/lib/pages/home/user_information_page.dart @@ -14,14 +14,13 @@ import 'package:tdesign_flutter/tdesign_flutter.dart'; class UserInformationPage extends StatelessWidget { final String miId; - final String userId; - const UserInformationPage({super.key, required this.miId, required this.userId}); + const UserInformationPage({super.key, required this.miId}); @override Widget build(BuildContext context) { return GetX( - init: UserInformationController(miId: miId, userId: userId), + init: UserInformationController(miId: miId), builder: (controller){ // 如果正在加载,显示加载中 if (controller.isLoading.value) { @@ -347,7 +346,7 @@ class UserInformationPage extends StatelessWidget { ), ), Text( - "趣恋恋ID:${userId}", + "趣恋恋ID:${controller.userData.value.miUserId}", style: TextStyle( fontSize: 12.w, color: const Color.fromRGBO(144, 144, 144, 1) diff --git a/lib/pages/message/chat_page.dart b/lib/pages/message/chat_page.dart index a157a0d..8aabdaf 100644 --- a/lib/pages/message/chat_page.dart +++ b/lib/pages/message/chat_page.dart @@ -451,7 +451,6 @@ class _ChatPageState extends State { // 点击卡片跳转到用户主页 Get.to(() => UserInformationPage( miId: marriageData.miId, - userId: marriageData.userId, )); }, child: Container( diff --git a/lib/pages/message/connect_history_page.dart b/lib/pages/message/connect_history_page.dart new file mode 100644 index 0000000..4361316 --- /dev/null +++ b/lib/pages/message/connect_history_page.dart @@ -0,0 +1,117 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:dating_touchme_app/components/page_appbar.dart'; +import 'package:dating_touchme_app/controller/message/connect_history_controller.dart'; +import 'package:dating_touchme_app/extension/ex_widget.dart'; +import 'package:dating_touchme_app/generated/assets.dart'; +import 'package:dating_touchme_app/model/mine/connect_history_data.dart'; +import 'package:dating_touchme_app/pages/home/user_information_page.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +class ConnectHistoryPage extends StatelessWidget { + const ConnectHistoryPage({super.key}); + + @override + Widget build(BuildContext context) { + return GetX( + init: ConnectHistoryController(), + builder: (controller){ + return Scaffold( + appBar: PageAppbar(title: "连线记录"), + body: SingleChildScrollView( + child: Container( + padding: EdgeInsets.symmetric( + horizontal: 15.w, + vertical: 10.w + ), + child: Column( + children: [ + ...controller.historyList.map((e){ + return ConnectItem(item: e,); + }), + ], + ), + ), + ), + ); + }, + ); + } +} + + +class ConnectItem extends StatefulWidget { + final Records item; + const ConnectItem({super.key, required this.item}); + + @override + State createState() => _ConnectItemState(); +} + +class _ConnectItemState extends State { + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.only(bottom: 40.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(51.w)), + child: CachedNetworkImage( + imageUrl: widget.item.anchorProfilePhoto ?? "", + width: 51.w, + height: 51.w, + fit: BoxFit.cover, + ), + ).onTap((){ + Get.to(() => UserInformationPage(miId: widget.item.anchorMiId ?? "",)); + }), + SizedBox(width: 5.w,), + ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(51.w)), + child: CachedNetworkImage( + imageUrl: widget.item.dateObjectProfilePhoto ?? "", + width: 51.w, + height: 51.w, + fit: BoxFit.cover, + ), + ).onTap((){ + Get.to(() => UserInformationPage(miId: widget.item.dateObjectMiId ?? "",)); + }), + SizedBox(width: 10.w,), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "${widget.item.dateObjectNickName ?? ""}", + style: TextStyle( + fontSize: 13.w + ), + ), + Text( + "${widget.item.dateObjectCityName ?? ""} | ${widget.item.dateObjectAge ?? ""}岁", + style: TextStyle( + fontSize: 8.w, + color: const Color.fromRGBO(144, 144, 144, 1) + ), + ) + ], + ) + ], + ), + Text( + "${widget.item.createTime ?? ""}", + style: TextStyle( + fontSize: 8.w, + color: const Color.fromRGBO(144, 144, 144, 1) + ), + ) + ], + ), + ); + } +} diff --git a/lib/pages/message/conversation_tab.dart b/lib/pages/message/conversation_tab.dart index 4e523fe..4f4c156 100644 --- a/lib/pages/message/conversation_tab.dart +++ b/lib/pages/message/conversation_tab.dart @@ -1,5 +1,7 @@ +import 'package:dating_touchme_app/extension/ex_widget.dart'; import 'package:dating_touchme_app/im/im_manager.dart'; import 'package:dating_touchme_app/pages/message/chat_page.dart'; +import 'package:dating_touchme_app/pages/message/connect_history_page.dart'; import 'package:flutter/material.dart'; import 'package:dating_touchme_app/generated/assets.dart'; import 'package:get/get.dart'; @@ -27,6 +29,43 @@ class _ConversationTabState extends State super.build(context); return Column( children: [ + Container( + padding: EdgeInsets.symmetric( + horizontal: 22.w + ), + child: Row( + children: [ + Column( + children: [ + Container( + width: 90.w, + height: 50.w, + margin: EdgeInsets.only(bottom: 5.w), + decoration: BoxDecoration( + color: const Color.fromRGBO(226, 222, 255, 1), + borderRadius: BorderRadius.all(Radius.circular(50.w)) + ), + child: Center( + child: Image.asset( + Assets.imagesConnectHistoryIcon, + width: 40.w, + height: 40.w, + ), + ), + ), + Text( + "连线记录", + style: TextStyle( + fontSize: 11.w + ), + ) + ], + ).onTap((){ + Get.to(() => ConnectHistoryPage()); + }) + ], + ), + ), // 聊天列表 Expanded( child: Obx(() { diff --git a/lib/pages/mine/my_friend_page.dart b/lib/pages/mine/my_friend_page.dart index 9973228..14168be 100644 --- a/lib/pages/mine/my_friend_page.dart +++ b/lib/pages/mine/my_friend_page.dart @@ -286,7 +286,7 @@ class _UserItemState extends State { ], ), ).onTap((){ - Get.to(() => UserInformationPage(miId: widget.item.miId ?? "", userId: widget.item.userId ?? "")); + Get.to(() => UserInformationPage(miId: widget.item.miId ?? "")); }); } } @@ -454,7 +454,7 @@ class _AddUserItemState extends State { ], ), ).onTap((){ - Get.to(() => UserInformationPage(miId: widget.item.fromMiId ?? "", userId: widget.item.fromUserId ?? "")); + Get.to(() => UserInformationPage(miId: widget.item.fromMiId ?? "")); }); } } diff --git a/lib/rtc/rtc_manager.dart b/lib/rtc/rtc_manager.dart index cfc1d53..4b92439 100644 --- a/lib/rtc/rtc_manager.dart +++ b/lib/rtc/rtc_manager.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:agora_rtc_engine/agora_rtc_engine.dart'; import 'package:agora_token_generator/agora_token_generator.dart'; +import 'package:dating_touchme_app/extension/ex_widget.dart'; import 'package:dating_touchme_app/rtc/rtm_manager.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -360,9 +361,15 @@ class RTCManager { // 隐藏 overlay SmartDialog.dismiss(); + // 获取 RoomController + final roomController = Get.isRegistered() + ? Get.find() + : Get.put(RoomController()); + SmartDialog.show( onDismiss: (){ isShow = false; + roomController.setDialogDismiss(false); }, builder: (context) { return ClipRRect( @@ -371,10 +378,11 @@ class RTCManager { color: Colors.white, child: Container( width: 311.w, - height: 298.w, - padding: EdgeInsets.symmetric( - vertical: 25.w, - horizontal: 25.w + height: 275.w, + padding: EdgeInsets.only( + top: 25.w, + right: 25.w, + left: 25.w ), child: Column( children: [ @@ -408,7 +416,13 @@ class RTCManager { ), ), ), - ) + ).onTap(() { + + // 隐藏 overlay + SmartDialog.dismiss(); + isShow = false; + roomController.setDialogDismiss(false); + }) ], ), ),