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/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/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 ab32633..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 = diff --git a/lib/network/user_api.dart b/lib/network/user_api.dart index 4297d07..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'; @@ -225,6 +227,18 @@ abstract class UserApi { @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, diff --git a/lib/network/user_api.g.dart b/lib/network/user_api.g.dart index 6383bab..a8dbb3a 100644 --- a/lib/network/user_api.g.dart +++ b/lib/network/user_api.g.dart @@ -1374,6 +1374,78 @@ 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 { 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, ), ), ),