diff --git a/assets/images/connect_history_icon.png b/assets/images/connect_history_icon.png new file mode 100644 index 0000000..64b3ac0 Binary files /dev/null and b/assets/images/connect_history_icon.png differ diff --git a/lib/controller/home/user_information_controller.dart b/lib/controller/home/user_information_controller.dart index 7b53de6..e9e492e 100644 --- a/lib/controller/home/user_information_controller.dart +++ b/lib/controller/home/user_information_controller.dart @@ -7,8 +7,7 @@ import 'package:get/get.dart'; class UserInformationController extends GetxController { final String miId; - final String userId; - UserInformationController({required this.miId, required this.userId}); + UserInformationController({required this.miId}); final nowSelect = 0.obs; @@ -39,13 +38,7 @@ class UserInformationController extends GetxController { SmartDialog.showToast('用户ID无效'); return; } - - if (userId.isEmpty) { - errorMessage.value = '用户ID无效'; - isLoading.value = false; - SmartDialog.showToast('用户ID无效'); - return; - } + try { _userApi = Get.find(); 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); + }) ], ), ),