Browse Source

完善功能,对接连麦记录

dev-2.0
王子贤 3 weeks ago
parent
commit
aeebab5559
18 changed files with 402 additions and 27 deletions
  1. BIN
      assets/images/connect_history_icon.png
  2. 11
      lib/controller/home/user_information_controller.dart
  3. 1
      lib/controller/message/chat_settings_controller.dart
  4. 60
      lib/controller/message/connect_history_controller.dart
  5. 2
      lib/controller/mine/edit_info_controller.dart
  6. 1
      lib/generated/assets.dart
  7. 104
      lib/model/mine/connect_history_data.dart
  8. 4
      lib/network/api_urls.dart
  9. 7
      lib/network/user_api.dart
  10. 43
      lib/network/user_api.g.dart
  11. 2
      lib/pages/discover/visitor_list_page.dart
  12. 2
      lib/pages/home/content_card.dart
  13. 7
      lib/pages/home/user_information_page.dart
  14. 1
      lib/pages/message/chat_page.dart
  15. 117
      lib/pages/message/connect_history_page.dart
  16. 39
      lib/pages/message/conversation_tab.dart
  17. 4
      lib/pages/mine/my_friend_page.dart
  18. 24
      lib/rtc/rtc_manager.dart

BIN
assets/images/connect_history_icon.png

Before After
Width: 160  |  Height: 160  |  Size: 24 KiB

11
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<UserApi>();

1
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) {

60
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 = <Records>[].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<UserApi>();
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;
}
}
}

2
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) {

1
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';

104
lib/model/mine/connect_history_data.dart

@ -0,0 +1,104 @@
class ConnectHistoryData {
List<Records>? records;
int? total;
int? size;
int? current;
int? pages;
ConnectHistoryData(
{this.records, this.total, this.size, this.current, this.pages});
ConnectHistoryData.fromJson(Map<String, dynamic> json) {
if (json['records'] != null) {
records = <Records>[];
json['records'].forEach((v) {
records!.add(new Records.fromJson(v));
});
}
total = json['total'];
size = json['size'];
current = json['current'];
pages = json['pages'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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<String, dynamic> 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<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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;
}
}

4
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 =

7
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<HttpResponse<BaseResponse<SysData>>> userGetSysInfo();
@GET(ApiUrls.userPageLatestDatingRecord)
Future<HttpResponse<BaseResponse<ConnectHistoryData>>> userPageLatestDatingRecord({
@Query('pageNum') required int pageNum,
@Query('pageSize') required int pageSize,
});
}

43
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<HttpResponse<BaseResponse<ConnectHistoryData>>>
userPageLatestDatingRecord({
required int pageNum,
required int pageSize,
}) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{
r'pageNum': pageNum,
r'pageSize': pageSize,
};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _options =
_setStreamType<HttpResponse<BaseResponse<ConnectHistoryData>>>(
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<Map<String, dynamic>>(_options);
late BaseResponse<ConnectHistoryData> _value;
try {
_value = BaseResponse<ConnectHistoryData>.fromJson(
_result.data!,
(json) => ConnectHistoryData.fromJson(json as Map<String, dynamic>),
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options);
rethrow;
}
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
RequestOptions _setStreamType<T>(RequestOptions requestOptions) {
if (T != dynamic &&
!(requestOptions.responseType == ResponseType.bytes ||

2
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));
});
}

2
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

7
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<UserInformationController>(
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)

1
lib/pages/message/chat_page.dart

@ -451,7 +451,6 @@ class _ChatPageState extends State<ChatPage> {
//
Get.to(() => UserInformationPage(
miId: marriageData.miId,
userId: marriageData.userId,
));
},
child: Container(

117
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<ConnectHistoryController>(
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<ConnectItem> createState() => _ConnectItemState();
}
class _ConnectItemState extends State<ConnectItem> {
@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)
),
)
],
),
);
}
}

39
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<ConversationTab>
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(() {

4
lib/pages/mine/my_friend_page.dart

@ -286,7 +286,7 @@ class _UserItemState extends State<UserItem> {
],
),
).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<AddUserItem> {
],
),
).onTap((){
Get.to(() => UserInformationPage(miId: widget.item.fromMiId ?? "", userId: widget.item.fromUserId ?? ""));
Get.to(() => UserInformationPage(miId: widget.item.fromMiId ?? ""));
});
}
}

24
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<RoomController>()
? Get.find<RoomController>()
: 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);
})
],
),
),

Loading…
Cancel
Save