Browse Source

优化帮助页面样式,修改我的页面布局,修改好友页面布局,对接我的页面统计接口,对接好友申请列表接口

ios
王子贤 3 months ago
parent
commit
9627e103fc
12 changed files with 430 additions and 30 deletions
  1. BIN
      assets/images/phone_help.png
  2. BIN
      assets/images/realname_help.png
  3. 42
      lib/controller/mine/mine_controller.dart
  4. 37
      lib/controller/mine/my_friend_controller.dart
  5. 84
      lib/model/mine/friend_apply_data.dart
  6. 21
      lib/model/mine/user_count_data.dart
  7. 4
      lib/network/api_urls.dart
  8. 13
      lib/network/user_api.dart
  9. 72
      lib/network/user_api.g.dart
  10. 37
      lib/pages/mine/mine_page.dart
  11. 149
      lib/pages/mine/my_friend_page.dart
  12. 1
      lib/pages/mine/user_help_center_page.dart

BIN
assets/images/phone_help.png

Before After
Width: 167  |  Height: 193  |  Size: 20 KiB Width: 155  |  Height: 152  |  Size: 15 KiB

BIN
assets/images/realname_help.png

Before After
Width: 211  |  Height: 181  |  Size: 25 KiB Width: 180  |  Height: 138  |  Size: 17 KiB

42
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<Map> infoList = [
{"label": "我的关注", "num": 88, "type": 1},
{"label": "关注我的", "num": 18988, "type": 2},
{"label": "好友", "num": 8, "type": 3},
{"label": "访客", "num": 357, "type": 4},
final infoList = <Map>[
{"label": "好友", "num": 0, "type": 1},
{"label": "好友申请", "num": 0, "type": 2},
{"label": "访客", "num": 0, "type": 3},
].obs;
List<Map> blockList = [
final blockList = <Map>[
{"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<Map> settingList = [
final settingList = <Map>[
{"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<UserApi>();
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;
}
}
}

37
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 = <Records>[].obs;
final friendApplyList = <fa.Records>[].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<UserApi>();
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;
}
}

84
lib/model/mine/friend_apply_data.dart

@ -0,0 +1,84 @@
class FriendApplyData {
List<Records>? records;
int? total;
int? size;
int? current;
int? pages;
FriendApplyData(
{this.records, this.total, this.size, this.current, this.pages});
FriendApplyData.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? 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<String, dynamic> 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<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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;
}
}

21
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<String, dynamic> json) {
friendNum = json['friendNum'];
friendApplyNum = json['friendApplyNum'];
visitorNum = json['visitorNum'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['friendNum'] = this.friendNum;
data['friendApplyNum'] = this.friendApplyNum;
data['visitorNum'] = this.visitorNum;
return data;
}
}

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

13
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';
@ -223,4 +225,15 @@ abstract class UserApi {
Future<HttpResponse<BaseResponse<dynamic>>> applyMatchmaker(
@Body() Map<String, dynamic> data,
);
@GET(ApiUrls.userGetDongwoOwnUserCount)
Future<HttpResponse<BaseResponse<UserCountData>>> userGetDongwoOwnUserCount();
@GET(ApiUrls.userPageFriendApply)
Future<HttpResponse<BaseResponse<FriendApplyData>>> userPageFriendApply(
{
@Query('pageNum') required int pageNum,
@Query('pageSize') required int pageSize,
}
);
}

72
lib/network/user_api.g.dart

@ -1374,6 +1374,78 @@ class _UserApi implements UserApi {
return httpResponse;
}
@override
Future<HttpResponse<BaseResponse<UserCountData>>>
userGetDongwoOwnUserCount() async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _options = _setStreamType<HttpResponse<BaseResponse<UserCountData>>>(
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<Map<String, dynamic>>(_options);
late BaseResponse<UserCountData> _value;
try {
_value = BaseResponse<UserCountData>.fromJson(
_result.data!,
(json) => UserCountData.fromJson(json as Map<String, dynamic>),
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options);
rethrow;
}
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
@override
Future<HttpResponse<BaseResponse<FriendApplyData>>> userPageFriendApply({
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<FriendApplyData>>>(
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<Map<String, dynamic>>(_options);
late BaseResponse<FriendApplyData> _value;
try {
_value = BaseResponse<FriendApplyData>.fromJson(
_result.data!,
(json) => FriendApplyData.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 ||

37
lib/pages/mine/mine_page.dart

@ -183,9 +183,9 @@ class _MinePageState extends State<MinePage> 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<InfoItem> {
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<InfoItem> {
)
],
).onTap((){
if(widget.item['type'] == 4){
if(widget.item['type'] == 3){
Get.to(()=> VisitorListPage());
} else {
Get.to(()=> MyFriendPage());

149
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<UserItem> {
);
}
}
class AddUserItem extends StatefulWidget {
final fa.Records item;
const AddUserItem({super.key, required this.item});
@override
State<AddUserItem> createState() => _AddUserItemState();
}
class _AddUserItemState extends State<AddUserItem> {
@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
),
),
),
)
],
),
);
}
}

1
lib/pages/mine/user_help_center_page.dart

@ -384,6 +384,7 @@ class _ServiceItemState extends State<ServiceItem> {
child: Image.asset(
widget.icon,
width: 44.w,
fit: BoxFit.cover,
),
),
),

Loading…
Cancel
Save