Browse Source

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

ios
王子贤 3 months ago
parent
commit
04c83e7f9b
5 changed files with 138 additions and 71 deletions
  1. 18
      android/app/buildSystem/app.csr
  2. 137
      lib/controller/discover/visitor_controller.dart
  3. 3
      lib/network/api_urls.dart
  4. 8
      lib/network/user_api.dart
  5. 43
      lib/network/user_api.g.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-----

137
lib/controller/discover/visitor_controller.dart

@ -2,6 +2,8 @@
import 'package:easy_refresh/easy_refresh.dart'; import 'package:easy_refresh/easy_refresh.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../../model/discover/visitor_model.dart'; import '../../model/discover/visitor_model.dart';
import '../../model/home/marriage_data.dart';
import '../../network/user_api.dart';
class VisitorController extends GetxController { class VisitorController extends GetxController {
// 访 // 访
@ -18,42 +20,42 @@ class VisitorController extends GetxController {
final int pageSize = 15; final int pageSize = 15;
var hasMore = true.obs; var hasMore = true.obs;
var isLoading = false.obs; var isLoading = false.obs;
late final UserApi _userApi;
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
_userApi = Get.find<UserApi>();
_loadInitialData(); _loadInitialData();
} }
// //
void _loadInitialData() async { void _loadInitialData() async {
isLoading.value = true; 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; 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 { void onRefresh() async {
currentPage.value = 1;
hasMore.value = true; 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.finishRefresh();
refreshController.resetFooter(); refreshController.resetFooter();
hasMore.value = newVisitors.length == pageSize;
if (newVisitors.isEmpty) {
hasMore.value = false;
}
} }
// //
@ -62,20 +64,16 @@ class VisitorController extends GetxController {
if (!hasMore.value) { if (!hasMore.value) {
return; return;
} }
final result = await _fetchVisitorData(pageNum: currentPage.value + 1);
currentPage.value++; 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); refreshController.finishLoad(IndicatorResult.success);
} else {
refreshController.finishLoad(IndicatorResult.noMore);
} }
} }
@ -85,12 +83,6 @@ class VisitorController extends GetxController {
Get.snackbar('成功', '已删除访客记录'); Get.snackbar('成功', '已删除访客记录');
} }
// 访
void clearAllVisitors() {
visitors.clear();
Get.snackbar('成功', '已清空所有访客记录');
}
// 访 // 访
int get todayVisitorsCount { int get todayVisitorsCount {
return visitors.length; return visitors.length;
@ -101,46 +93,49 @@ class VisitorController extends GetxController {
return visitors.length; 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 @override

3
lib/network/api_urls.dart

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

8
lib/network/user_api.dart

@ -23,6 +23,7 @@ import 'package:dating_touchme_app/network/api_urls.dart';
import 'package:retrofit/retrofit.dart'; import 'package:retrofit/retrofit.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import '../model/home/marriage_data.dart';
import '../model/mine/authentication_data.dart'; import '../model/mine/authentication_data.dart';
import '../model/mine/chat_static_data.dart'; import '../model/mine/chat_static_data.dart';
import '../model/mine/submit_order_data.dart'; import '../model/mine/submit_order_data.dart';
@ -226,6 +227,7 @@ abstract class UserApi {
@Body() Map<String, dynamic> data, @Body() Map<String, dynamic> data,
); );
@GET(ApiUrls.userGetDongwoOwnUserCount) @GET(ApiUrls.userGetDongwoOwnUserCount)
Future<HttpResponse<BaseResponse<UserCountData>>> userGetDongwoOwnUserCount(); Future<HttpResponse<BaseResponse<UserCountData>>> userGetDongwoOwnUserCount();
@ -236,4 +238,10 @@ abstract class UserApi {
@Query('pageSize') required int pageSize, @Query('pageSize') required int pageSize,
} }
); );
@GET(ApiUrls.listVisitorInfo)
Future<HttpResponse<BaseResponse<PaginatedResponse<MarriageData>>>> getVisitorList({
@Query('pageNum') required int pageNum,
@Query('pageSize') required int pageSize,
});
} }

43
lib/network/user_api.g.dart

@ -1446,6 +1446,49 @@ class _UserApi implements UserApi {
return httpResponse; 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) { RequestOptions _setStreamType<T>(RequestOptions requestOptions) {
if (T != dynamic && if (T != dynamic &&
!(requestOptions.responseType == ResponseType.bytes || !(requestOptions.responseType == ResponseType.bytes ||

Loading…
Cancel
Save