Jolie 3 months ago
parent
commit
837c7cb0d3
16 changed files with 588 additions and 277 deletions
  1. 18
      android/app/buildSystem/app.csr
  2. BIN
      assets/images/phone_help.png
  3. BIN
      assets/images/realname_help.png
  4. 145
      lib/controller/discover/visitor_controller.dart
  5. 42
      lib/controller/mine/mine_controller.dart
  6. 37
      lib/controller/mine/my_friend_controller.dart
  7. 75
      lib/model/discover/visitor_model.dart
  8. 84
      lib/model/mine/friend_apply_data.dart
  9. 21
      lib/model/mine/user_count_data.dart
  10. 7
      lib/network/api_urls.dart
  11. 21
      lib/network/user_api.dart
  12. 115
      lib/network/user_api.g.dart
  13. 113
      lib/pages/discover/visitor_list_page.dart
  14. 37
      lib/pages/mine/mine_page.dart
  15. 149
      lib/pages/mine/my_friend_page.dart
  16. 1
      lib/pages/mine/user_help_center_page.dart

18
android/app/buildSystem/app.csr

@ -0,0 +1,18 @@
-----BEGIN NEW CERTIFICATE REQUEST-----
MIIC5jCCAc4CAQAwcTELMAkGA1UEBhMCQ04xEjAQBgNVBAgTCUd1YW5nRG9uZzES
MBAGA1UEBxMJR3VhbmdaaG91MREwDwYDVQQKEwhxaWFubmlhbzERMA8GA1UECxMI
cWlhbm5pYW8xFDASBgNVBAMTC1ppeGlhbiBXYW5nMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEAwCCPny8YpxenB+FZNznW03ayd/5coNlLq/z/oTID555l
5x4AVLlo5rqL/ruI6nnlESkbqD1eYABUREdT0aCgVQU4Sfau/L92VW3yfkU2y1Hd
lWDSjVcZuXnQSkWUprU5mVuZD/0InD8J/Z0NcAdIhkMcSLGzkBKqDDXsFk4vQTd6
6ENVrH/A8aTBT81XuE6PMfDHcCE4XAcYxvg4hE85Y9Co/FHaqRG6EqrRPFldcUEr
7qeaJzLWBCcvB5zofH4+WN8n4G2GMtBB946OJqIQp1LSP4hQRPie9cRz1PTRi+ak
rDdNZzWWQyiOO4rj14gDKGjC4ob8i/HWjJNN9qk/KwIDAQABoDAwLgYJKoZIhvcN
AQkOMSEwHzAdBgNVHQ4EFgQUs/+W5dulka5xzTy7PkbYMrT77D8wDQYJKoZIhvcN
AQELBQADggEBALFq8m21l/UpyYEcehKUf+b5y5F9GGXb4Q4xNgxW1hbnF0BMYX/M
2PhoEyZyX/S39MlwtICGprstSszUIYugq1gX5fRj+MrgrOCfZ4cPrR9Fm2F0Oee2
DMJcTIaXu5dcqL0YaHCEIKhyJY9ZCAZza4J4FhoAaSgW5UCc4xtMSQTcRhGPJm9p
a8lT5PiADh0MY0cQ8gWElI91lSdrKssnWbcAOCAxgQ0sHm2W1ZiFIzxKsSg49TTa
BVCgun+Vthww7bw2eiSwSYFilevu5payKvw7ns4f3ruLtBYLhMk+qDnld4L5CECb
R4toQ//F/XCU242bNzjIMOpQIap/LpdHs0M=
-----END NEW CERTIFICATE REQUEST-----

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

145
lib/controller/discover/visitor_controller.dart

@ -1,11 +1,12 @@
// controllers/visitor_controller.dart
import 'package:easy_refresh/easy_refresh.dart';
import 'package:get/get.dart';
import '../../model/discover/visitor_model.dart';
import '../../model/home/marriage_data.dart';
import '../../network/user_api.dart';
class VisitorController extends GetxController {
// 访
var visitors = <VisitorModel>[].obs;
var visitors = <MarriageData>[].obs;
// Refresh controllers
final EasyRefreshController refreshController = EasyRefreshController(
@ -18,42 +19,41 @@ class VisitorController extends GetxController {
final int pageSize = 15;
var hasMore = true.obs;
var isLoading = false.obs;
late final UserApi _userApi;
@override
void onInit() {
super.onInit();
_loadInitialData();
_userApi = Get.find<UserApi>();
loadInitialData();
}
//
void _loadInitialData() async {
void loadInitialData() async {
isLoading.value = true;
await Future.delayed(Duration(milliseconds: 800)); //
final initialVisitors = _generateMockData(1, pageSize);
visitors.assignAll(initialVisitors);
final result = await _fetchVisitorData(pageNum: currentPage.value);
visitors.assignAll(result['records']);
isLoading.value = false;
hasMore.value = initialVisitors.length == pageSize;
final int current = result['current'] ?? 1;
final int total = result['pages'] ?? 1;
hasMore.value = current < total;
}
//
void onRefresh() async {
currentPage.value = 1;
hasMore.value = true;
await Future.delayed(Duration(milliseconds: 1000)); //
final result = await _fetchVisitorData(pageNum: currentPage.value);
final newVisitors = _generateMockData(1, pageSize);
visitors.assignAll(newVisitors);
visitors.clear();
visitors.addAll(result['records']);
final int current = result['current'] ?? 1;
final int total = result['pages'] ?? 1;
hasMore.value = current < total;
refreshController.finishRefresh();
refreshController.resetFooter();
hasMore.value = newVisitors.length == pageSize;
if (newVisitors.isEmpty) {
hasMore.value = false;
}
}
//
@ -62,20 +62,16 @@ class VisitorController extends GetxController {
if (!hasMore.value) {
return;
}
final result = await _fetchVisitorData(pageNum: currentPage.value + 1);
currentPage.value++;
await Future.delayed(Duration(milliseconds: 800)); //
final newVisitors = _generateMockData(currentPage.value, pageSize);
if (newVisitors.isEmpty) {
hasMore.value = false;
refreshController.finishLoad(IndicatorResult.noMore);
} else {
visitors.addAll(newVisitors);
// hasMore.value = true;
final int current = result['current'] as int;
final int total = result['pages'] as int;
hasMore.value = current < total;
visitors.addAll(result['records']);
if (hasMore.value) {
refreshController.finishLoad(IndicatorResult.success);
} else {
refreshController.finishLoad(IndicatorResult.noMore);
}
}
@ -85,12 +81,6 @@ class VisitorController extends GetxController {
Get.snackbar('成功', '已删除访客记录');
}
// 访
void clearAllVisitors() {
visitors.clear();
Get.snackbar('成功', '已清空所有访客记录');
}
// 访
int get todayVisitorsCount {
return visitors.length;
@ -101,46 +91,49 @@ class VisitorController extends GetxController {
return visitors.length;
}
//
List<VisitorModel> _generateMockData(int page, int size) {
if (page > 3) return []; // 3
final names = [
'张三', '李四', '王五', '赵六', '钱七', '孙八', '周九', '吴十',
'小明', '小红', '小刚', '小花', '大山', '小云', '星辰', '大海'
];
final avatars = [
'https://randomuser.me/api/portraits/men/1.jpg',
'https://randomuser.me/api/portraits/women/1.jpg',
'https://randomuser.me/api/portraits/men/2.jpg',
'https://randomuser.me/api/portraits/women/2.jpg',
'https://randomuser.me/api/portraits/men/3.jpg',
'https://randomuser.me/api/portraits/women/3.jpg',
'https://randomuser.me/api/portraits/men/4.jpg',
'https://randomuser.me/api/portraits/women/4.jpg',
];
final pages = [
'首页', '产品页', '关于我们', '博客', '联系方式', '服务页', '价格页', '案例页'
];
final startIndex = (page - 1) * size;
final endIndex = startIndex + size;
return List.generate(size, (index) {
final globalIndex = startIndex + index;
final isOnline = globalIndex % 3 == 0; // 3线
return VisitorModel(
miId: 'visitor_${globalIndex + 1}',
nickName: names[globalIndex % names.length],
profilePhoto: avatars[globalIndex % avatars.length],
visitTime: '2025-11-14 10:42:42',
onlineStatus: 2,
describeInfo: '阿萨德垃圾袋杰克伦敦撒娇克拉斯的健康拉屎的 金坷垃四大皆空拉屎的距离考试啊'
Future<Map<String, dynamic>> _fetchVisitorData({required int pageNum}) async {
try {
print('_fetchVisitorData - pageNum: $pageNum, pageSize: $pageSize');
// API获取数据
var response = await _userApi.getVisitorList(
pageNum: pageNum,
pageSize: pageSize,
);
});
if (response.data.isSuccess) {
final paginatedData = response.data.data;
// data是否为空
if (paginatedData == null) {
return {
'records': <MarriageData>[],
'current': pageNum,
'pages': 1,
'total': 0,
'size': pageSize,
};
}
// data PaginatedResponse<dynamic>使
// records dynamic MarriageData
final records = paginatedData.records
.map((item) => MarriageData.fromJson(item as Map<String, dynamic>))
.toList();
return {
'records': records,
'current': paginatedData.current,
'pages': paginatedData.pages,
'total': paginatedData.total,
'size': paginatedData.size,
};
} else {
//
throw Exception(response.data.message);
}
} catch (e) {
//
rethrow;
}
}
@override

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

75
lib/model/discover/visitor_model.dart

@ -1,75 +0,0 @@
class VisitorModel {
final String? miId;
final String? profilePhoto;
final String? nickName;
final int? height;
final String? visitTime;
final String? education;
final int? age;
final int? minimumIncome;
final int? maximumIncome;
final String? income;
final String? describeInfo;
final int? vip;
final int? miSessionType;
final int? genderCode;
final int? onlineStatus;
VisitorModel({
this.miId,
this.profilePhoto,
this.nickName,
this.height,
this.visitTime,
this.education,
this.age,
this.minimumIncome,
this.maximumIncome,
this.income,
this.describeInfo,
this.vip,
this.miSessionType,
this.genderCode,
this.onlineStatus,
});
factory VisitorModel.fromJson(Map<String, dynamic> json) {
return VisitorModel(
miId: json['miId'] as String?,
profilePhoto: json['profilePhoto'] as String?,
nickName: json['nickName'] as String?,
height: json['height'] as int?,
visitTime: json['visitTime'] as String?,
education: json['education'] as String?,
age: json['age'] as int?,
minimumIncome: json['minimumIncome'] as int?,
maximumIncome: json['maximumIncome'] as int?,
income: json['income'] as String?,
describeInfo: json['describeInfo'] as String?,
vip: json['vip'] as int?,
miSessionType: json['miSessionType'] as int?,
genderCode: json['genderCode'] as int?,
onlineStatus: json['onlineStatus'] as int?,
);
}
Map<String, dynamic> toJson() {
return {
'miId': miId,
'profilePhoto': profilePhoto,
'nickName': nickName,
'height': height,
'visitTime': visitTime,
'education': education,
'age': age,
'minimumIncome': minimumIncome,
'maximumIncome': maximumIncome,
'income': income,
'describeInfo': describeInfo,
'vip': vip,
'miSessionType': miSessionType,
'genderCode': genderCode,
'onlineStatus': onlineStatus,
};
}
}

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

7
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 =
@ -110,4 +114,7 @@ class ApiUrls {
'dating-agency-chat-audio/user/kicking/rtc-channel-user';
static const String applyMatchmaker =
'dating-agency-uec/user/apply/matchmaker';
static const String listVisitorInfo =
'dating-agency-service/user/page/dongwo/visitor-info';
}

21
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';
@ -21,6 +23,7 @@ import 'package:dating_touchme_app/network/api_urls.dart';
import 'package:retrofit/retrofit.dart';
import 'package:dio/dio.dart';
import '../model/home/marriage_data.dart';
import '../model/mine/authentication_data.dart';
import '../model/mine/chat_static_data.dart';
import '../model/mine/submit_order_data.dart';
@ -223,4 +226,22 @@ 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,
}
);
@GET(ApiUrls.listVisitorInfo)
Future<HttpResponse<BaseResponse<PaginatedResponse<MarriageData>>>> getVisitorList({
@Query('pageNum') required int pageNum,
@Query('pageSize') required int pageSize,
});
}

115
lib/network/user_api.g.dart

@ -1374,6 +1374,121 @@ 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;
}
@override
Future<HttpResponse<BaseResponse<PaginatedResponse<MarriageData>>>>
getVisitorList({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<PaginatedResponse<MarriageData>>>
>(
Options(method: 'GET', headers: _headers, extra: _extra)
.compose(
_dio.options,
'dating-agency-service/user/page/dongwo/visitor-info',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl),
),
);
final _result = await _dio.fetch<Map<String, dynamic>>(_options);
late BaseResponse<PaginatedResponse<MarriageData>> _value;
try {
_value = BaseResponse<PaginatedResponse<MarriageData>>.fromJson(
_result.data!,
(json) => PaginatedResponse<MarriageData>.fromJson(
json as Map<String, dynamic>,
(json) => MarriageData.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 ||

113
lib/pages/discover/visitor_list_page.dart

@ -7,7 +7,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import '../../controller/discover/visitor_controller.dart';
import '../../model/discover/visitor_model.dart';
import '../../model/home/marriage_data.dart';
class VisitorListPage extends StatefulWidget {
const VisitorListPage({super.key});
@ -31,28 +31,6 @@ class _VisitorListPagePageState extends State<VisitorListPage> {
)),
centerTitle: true,
backgroundColor: Colors.white,
actions: [
//
PopupMenuButton<String>(
onSelected: (value) {
if (value == 'clear') {
_showClearDialog();
} else if (value == 'sort') {
_showSortDialog();
}
},
tooltip: "",
padding: EdgeInsets.zero,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(14)),
color: Colors.white,
elevation: 8,
offset: Offset(32.w, 36.h), //
itemBuilder: (BuildContext context) => [
PopupMenuItem(value: 'sort', child: Text('排序方式')),
PopupMenuItem(value: 'clear', child: Text('清空记录')),
],
),
],
),
body: Obx(() {
if (visitorController.isLoading.value && visitorController.visitors.isEmpty) {
@ -76,17 +54,15 @@ class _VisitorListPagePageState extends State<VisitorListPage> {
Icon(Icons.people_outline, size: 80, color: Colors.grey[300]),
SizedBox(height: 16),
Text(
'暂无访客记录',
style: TextStyle(fontSize: 18, color: Colors.grey),
'暂无访客记录,点击刷新',
style: TextStyle(fontSize: 14, color: Colors.grey),
),
SizedBox(height: 8),
Text(
'下拉刷新获取数据',
style: TextStyle(color: Colors.grey),
),
],
),
);
).onTap((){
visitorController.loadInitialData();
});
}
return EasyRefresh(
@ -134,65 +110,10 @@ class _VisitorListPagePageState extends State<VisitorListPage> {
);
}
void _showClearDialog() {
Get.dialog(
AlertDialog(
title: Text('确认清空'),
content: Text('确定要清空所有访客记录吗?此操作不可恢复。'),
actions: [
TextButton(
onPressed: () => Get.back(),
child: Text('取消'),
),
TextButton(
onPressed: () {
visitorController.clearAllVisitors();
Get.back();
},
child: Text('确定', style: TextStyle(color: Colors.red)),
),
],
),
);
}
void _showSortDialog() {
Get.dialog(
AlertDialog(
title: Text('排序方式'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
ListTile(
title: Text('按访问时间'),
onTap: () {
//
Get.back();
},
),
ListTile(
title: Text('按访问时长'),
onTap: () {
//
Get.back();
},
),
ListTile(
title: Text('按访问次数'),
onTap: () {
//
Get.back();
},
),
],
),
),
);
}
}
class VisitorListItem extends StatelessWidget {
final VisitorModel visitor;
final MarriageData visitor;
const VisitorListItem({Key? key, required this.visitor}) : super(key: key);
@ -215,7 +136,7 @@ class VisitorListItem extends StatelessWidget {
borderRadius: BorderRadius.circular(8),
color: Colors.blue[100],
image: DecorationImage(
image: NetworkImage(visitor.profilePhoto!),
image: NetworkImage(visitor.profilePhoto),
fit: BoxFit.cover,
),
),
@ -227,26 +148,26 @@ class VisitorListItem extends StatelessWidget {
Row(
children: [
Text(
visitor.nickName!,
visitor.nickName,
style: TextStyle(
fontSize: 14,
),
),
Spacer(),
Text(
_formatTime(visitor.visitTime!),
style: TextStyle(
color: Colors.grey[500],
fontSize: 13,
),
),
// Text(
// _formatTime(visitor.visitTime!),
// style: TextStyle(
// color: Colors.grey[500],
// fontSize: 13,
// ),
// ),
],
),
SizedBox(height: 4),
SizedBox(
// height: 20, // 20
child: Text(
visitor.describeInfo!,
visitor.describeInfo,
style: TextStyle(
fontSize: 13,
color: Color.fromRGBO(51, 51, 51, 0.6),

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