feat: 请求数据和配置
This commit is contained in:
1 parent
557f900187
commit
9b0fe51fa4
21 files changed
+1026
-60
No files matched your search
@@ -39,17 +39,6 @@ class AppService {
|
||||
// 添加自定义拦截器
|
||||
_dio.interceptors.add(NyNetworkIntercept());
|
||||
|
||||
// 开发环境添加日志
|
||||
// if (!kReleaseMode) {
|
||||
// _dio.interceptors.add(TalkerDioLogger(
|
||||
// settings: TalkerDioLoggerSettings(
|
||||
// printRequestHeaders: true,
|
||||
// printRequestData: true,
|
||||
// printResponseData: true,
|
||||
// printResponseHeaders: false,
|
||||
// ),
|
||||
// ));
|
||||
// }
|
||||
}
|
||||
|
||||
/// 更新配置
|
||||
@@ -279,7 +268,6 @@ class ApiRequest {
|
||||
throw Exception("retry failed (unreachable)");
|
||||
}
|
||||
|
||||
// ============ 错误处理 ============
|
||||
|
||||
static HttpResult<T> _handleError<T>(DioException e) {
|
||||
final Response? resp = e.response;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// https://api-glimzodf.glimzodf.com/glimzodf/
|
||||
|
||||
class ApiString {
|
||||
static const String baseUrl = "https://api-glimzodf.glimzodf.com/";
|
||||
static const String baseUrl = "https://api-glimzodf.glimzodf.com/glimzodf";
|
||||
|
||||
static const String appName = 'Novyronst';
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import 'dart:convert';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:logger/logger.dart';
|
||||
import 'package:novyronst/common/help/help_log.dart';
|
||||
import 'package:novyronst/common/help/help_time.dart';
|
||||
import 'package:novyronst/common/help/help_token.dart';
|
||||
|
||||
@@ -11,19 +11,18 @@ import '../help/help_encrypt.dart';
|
||||
|
||||
/// 网络请求拦截器
|
||||
class NyNetworkIntercept extends Interceptor {
|
||||
final bool enableLog = !kReleaseMode;
|
||||
final Logger _logger = Logger();
|
||||
|
||||
|
||||
@override
|
||||
Future<void> onRequest(RequestOptions options, RequestInterceptorHandler handler) async {
|
||||
// 添加公共请求头
|
||||
|
||||
await _addRequestHeaders(options);
|
||||
|
||||
// 打印请求日志
|
||||
_logInfo("🔶 REQUEST [${options.method.toUpperCase()}] ${options.uri}");
|
||||
_logDebug("Headers: ${options.headers}");
|
||||
HelpLog.print("🔶 REQUEST [${options.method.toUpperCase()}] ${options.uri}");
|
||||
HelpLog.print("Headers: ${options.headers}");
|
||||
if (options.data != null) {
|
||||
_logDebug("Payload: ${options.data}");
|
||||
HelpLog.print("Payload: ${options.data}");
|
||||
}
|
||||
|
||||
handler.next(options);
|
||||
@@ -31,7 +30,7 @@ class NyNetworkIntercept extends Interceptor {
|
||||
|
||||
@override
|
||||
void onResponse(Response response, ResponseInterceptorHandler handler) {
|
||||
_logInfo("🟢 RESPONSE [${response.statusCode}] ${response.requestOptions.uri}");
|
||||
HelpLog.print("🟢 RESPONSE [${response.statusCode}] ${response.requestOptions.uri}");
|
||||
// _logDebug("Body: ${response.data}");
|
||||
|
||||
// 处理 401 / 402 Token 过期
|
||||
@@ -56,7 +55,7 @@ class NyNetworkIntercept extends Interceptor {
|
||||
final deStr = HelpEncrypt.deStr(response.data);
|
||||
response.data = jsonDecode(deStr);
|
||||
} catch (e) {
|
||||
_logError("解密失败: $e");
|
||||
HelpLog.print("解密失败: $e");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,14 +64,13 @@ class NyNetworkIntercept extends Interceptor {
|
||||
|
||||
@override
|
||||
void onError(DioException err, ErrorInterceptorHandler handler) {
|
||||
_logError("🔴 Error: ${err.message}");
|
||||
HelpLog.print("🔴 Error: ${err.message}", tag: 'in onError');
|
||||
handler.next(err);
|
||||
}
|
||||
|
||||
// ============ 私有方法 ============
|
||||
|
||||
Future<void> _addRequestHeaders(RequestOptions options) async {
|
||||
// 开发模式添加 security: false
|
||||
if (!kReleaseMode) {
|
||||
options.headers['security'] = 'false';
|
||||
}
|
||||
@@ -80,7 +78,6 @@ class NyNetworkIntercept extends Interceptor {
|
||||
// 注入 Token
|
||||
final tokenManager = HelpToken();
|
||||
final token = tokenManager.get();
|
||||
// print('查看token: $token');
|
||||
if (token.isNotEmpty) {
|
||||
options.headers['Authorization'] = 'Bearer $token';
|
||||
}
|
||||
@@ -104,7 +101,6 @@ class NyNetworkIntercept extends Interceptor {
|
||||
'device-gaid': '',
|
||||
});
|
||||
|
||||
// 处理 prevToken(从请求体中提取)
|
||||
await _handleOldToken(options);
|
||||
}
|
||||
|
||||
@@ -117,25 +113,11 @@ class NyNetworkIntercept extends Interceptor {
|
||||
options.headers['Authorization'] = prevToken.toString();
|
||||
}
|
||||
}
|
||||
} catch (_) {
|
||||
// 非 JSON 请求跳过
|
||||
}
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
void _logInfo(String message) {
|
||||
if (enableLog) _logger.i(message);
|
||||
}
|
||||
|
||||
void _logDebug(String message) {
|
||||
if (enableLog) _logger.d('💡 $message');
|
||||
}
|
||||
|
||||
void _logError(String message) {
|
||||
if (enableLog) _logger.e(message);
|
||||
}
|
||||
|
||||
void _handleError(dynamic e, bool error) {
|
||||
_logError("🔴 Error: $e");
|
||||
// 这里可以根据需要处理错误提示
|
||||
HelpLog.print("🔴 Error: $e", tag: 'in ---- _handleError');
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
import 'package:novyronst/common/api/api_request.dart';
|
||||
import 'package:novyronst/common/api/api_string.dart';
|
||||
import 'package:novyronst/common/help/help_log.dart';
|
||||
import 'package:novyronst/common/help/help_token.dart';
|
||||
import 'package:novyronst/common/model/novyronst_user.dart';
|
||||
import 'package:novyronst/common/model/register_model.dart';
|
||||
|
||||
@@ -38,4 +39,65 @@ class UserRequest {
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
static Future eventCreateHis({
|
||||
required String shortPlayId,
|
||||
required String videoId
|
||||
}) {
|
||||
// {"short_play_id": shortPlayId, "video_id": videoId}
|
||||
Map<String, dynamic> params = {"short_play_id": shortPlayId, "video_id": videoId};
|
||||
return ApiRequest.post(ApiStringUser.eventCreateHistory, data: params).then((value) {
|
||||
HelpLog.print(value.data, tag: "eventCreateHis");
|
||||
});
|
||||
}
|
||||
|
||||
static Future eventEnterApp() {
|
||||
return ApiRequest.post(ApiStringUser.eventUserEnterApp).then((value) {});
|
||||
}
|
||||
|
||||
static Future<bool> eventOnline({String? oldToken}) {
|
||||
String token = HelpToken().get();
|
||||
if (token == '') return Future<bool>.value(false);
|
||||
final body = <String, dynamic>{};
|
||||
if (oldToken != null) body['token'] = oldToken;
|
||||
return ApiRequest.post(ApiStringUser.eventUserOnline, data: body).then((value) {
|
||||
return value.isSuccess;
|
||||
});
|
||||
}
|
||||
|
||||
static Future<bool> eventOLeaveApp({String? oldToken}) {
|
||||
String token = HelpToken().get();
|
||||
if (token == '') return Future<bool>.value(false);
|
||||
final body = <String, dynamic>{};
|
||||
if (oldToken != null) body['token'] = oldToken;
|
||||
return ApiRequest.post(ApiStringUser.eventUserLeaveApp, data: body).then((value) {
|
||||
return value.isSuccess;
|
||||
});
|
||||
}
|
||||
|
||||
// 上报播放时长
|
||||
static Future eventPlaySeconds({
|
||||
required int shortPlayId,
|
||||
required int videoId,
|
||||
required int seconds,
|
||||
}) {
|
||||
return ApiRequest.post(ApiStringUser.eventPlaySeconds, data: {
|
||||
"short_play_id": shortPlayId,
|
||||
"video_id": videoId,
|
||||
"play_seconds": seconds,
|
||||
}).then((value) {});
|
||||
}
|
||||
|
||||
// 上报观看时长
|
||||
static Future eventWatchTime({
|
||||
required int shortPlayId,
|
||||
required int seconds,
|
||||
}) {
|
||||
return ApiRequest.post(ApiStringUser.eventWatchTime, data: {
|
||||
"short_play_id": shortPlayId,
|
||||
// 时间戳的毫秒数
|
||||
"request_id": DateTime.now().millisecondsSinceEpoch,
|
||||
"duration": seconds,
|
||||
}).then((value) {});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,181 @@
|
||||
|
||||
|
||||
import 'package:novyronst/common/api/api_request.dart';
|
||||
import 'package:novyronst/common/api/api_string.dart';
|
||||
import 'package:novyronst/common/help/help_log.dart';
|
||||
import 'package:novyronst/common/model/ny_category_model.dart';
|
||||
import 'package:novyronst/common/model/ny_drama_model.dart';
|
||||
import 'package:novyronst/common/model/ny_home_model.dart';
|
||||
|
||||
import '../model/ny_detail_model.dart';
|
||||
|
||||
class VideoRequest {
|
||||
static Future<List<NyHomeModel>> getHomeData() {
|
||||
return ApiRequest.get(ApiStringVideo.getHomeModules).then((value) {
|
||||
if (value.isSuccess) {
|
||||
List? list = value.data['data']['list'];
|
||||
List<NyHomeModel> homeList = [];
|
||||
if (list != null) {
|
||||
homeList = list.map((e) => NyHomeModel.fromJson(e)).toList();
|
||||
}
|
||||
return homeList;
|
||||
}
|
||||
return [];
|
||||
});
|
||||
}
|
||||
|
||||
static Future<List<NyCategoryModel>> getCategoriesList() {
|
||||
return ApiRequest.get(ApiStringVideo.getCategoriesList).then((value) {
|
||||
// SkyLog.print('vvvvv: ${value.data}');
|
||||
if (!value.isSuccess) return [];
|
||||
|
||||
Map<String, dynamic> data = value.data['data'];
|
||||
List? list = data['list'];
|
||||
|
||||
List<NyCategoryModel> categoryList = [];
|
||||
if (list != null) {
|
||||
// id 28 不显示,删除
|
||||
categoryList = list.map((e) => NyCategoryModel.fromJson(e)).toList();
|
||||
categoryList.removeWhere((element) => element.id == 28);
|
||||
categoryList.removeWhere((element) => element.name.length >= 10);
|
||||
}
|
||||
return categoryList;
|
||||
});
|
||||
}
|
||||
|
||||
static Future<List<NyDramaModel>> getCategoriesDetail({
|
||||
required int categoryId,
|
||||
int page = 1,
|
||||
int pageSize = 20,
|
||||
}) {
|
||||
return ApiRequest.fetchPage<NyDramaModel>(
|
||||
ApiStringVideo.getCategoriesDetail,
|
||||
page: page,
|
||||
pageSize: pageSize,
|
||||
extraParams: {'category_id': categoryId},
|
||||
fromJson: (json) => NyDramaModel.fromJson(json),
|
||||
);
|
||||
}
|
||||
|
||||
// getSearchHots
|
||||
static Future<List<NyDramaModel>> getSearchHots() {
|
||||
return ApiRequest.get(ApiStringVideo.getSearchHots).then((value) {
|
||||
if (value.isSuccess) {
|
||||
HelpLog.print('getSearchHots: ${value.data}');
|
||||
List list = parseDataForList(value.data);
|
||||
return list.map((e) => NyDramaModel.fromJson(e)).toList();
|
||||
}
|
||||
return [];
|
||||
});
|
||||
}
|
||||
|
||||
// search
|
||||
static Future<List<NyDramaModel>> search({required String keyword}) {
|
||||
return ApiRequest.get(ApiStringVideo.getSearch, queryParameters: {
|
||||
'search': keyword,
|
||||
}).then((value) {
|
||||
if (value.isSuccess) {
|
||||
HelpLog.print('getSearchHots: ${value.data}');
|
||||
List list = parseDataForList(value.data);
|
||||
return list.map((e) => NyDramaModel.fromJson(e)).toList();
|
||||
}
|
||||
return [];
|
||||
});
|
||||
}
|
||||
|
||||
//getCollections
|
||||
static Future<List<NyDramaModel>> getCollections({
|
||||
int page = 1,
|
||||
int pageSize = 10,
|
||||
}) {
|
||||
Map<String, dynamic> params = _setPage(page: page, pageSize: pageSize);
|
||||
return ApiRequest.get(
|
||||
ApiStringVideo.getCollections,
|
||||
queryParameters: params,
|
||||
).then((value) {
|
||||
if (value.isSuccess) {
|
||||
HelpLog.print('getCollections: ${value.data}');
|
||||
List list = parseDataForList(value.data);
|
||||
return list.map((e) => NyDramaModel.fromJson(e)).toList();
|
||||
}
|
||||
return [];
|
||||
});
|
||||
}
|
||||
|
||||
// getHistory
|
||||
static Future<List<NyDramaModel>> getHistory({
|
||||
int page = 1,
|
||||
int pageSize = 10,
|
||||
}) {
|
||||
Map<String, dynamic> params = _setPage(page: page, pageSize: pageSize);
|
||||
return ApiRequest.get(
|
||||
ApiStringVideo.getHistories,
|
||||
queryParameters: params,
|
||||
).then((value) {
|
||||
if (value.isSuccess) {
|
||||
HelpLog.print('getHistory: ${value.data}');
|
||||
List list = parseDataForList(value.data);
|
||||
return list.map((e) => NyDramaModel.fromJson(e)).toList();
|
||||
}
|
||||
return [];
|
||||
});
|
||||
}
|
||||
|
||||
// getVideoDetail
|
||||
static Future<NyDetailModel?> getVideoDetail({
|
||||
required int shortPlayId,
|
||||
required int shortPlayVideoId,
|
||||
}) {
|
||||
Map<String, dynamic> params = {};
|
||||
params['short_play_id'] = shortPlayId;
|
||||
params['short_play_video_id'] = shortPlayVideoId;
|
||||
return ApiRequest.get(
|
||||
ApiStringVideo.getVideoDetail,
|
||||
queryParameters: params,
|
||||
).then((value) {
|
||||
if (value.isSuccess) {
|
||||
HelpLog.print('getVideoDetail: ${value.data['data']}');
|
||||
return NyDetailModel.fromJson(value.data['data']);
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
// collect
|
||||
static Future<bool> collect({
|
||||
required int shortPlayId,
|
||||
required int videoId,
|
||||
}) {
|
||||
Map<String, dynamic> params = {};
|
||||
params['short_play_id'] = shortPlayId;
|
||||
params['video_id'] = videoId;
|
||||
return ApiRequest.post(ApiStringVideo.collect, data: params).then((value) {
|
||||
HelpLog.print('collecttttt: ${value.data}');
|
||||
if (value.isSuccess) {}
|
||||
return value.isSuccess;
|
||||
});
|
||||
}
|
||||
|
||||
// cancelCollect
|
||||
static Future<bool> cancelCollect({required int shortPlayId}) {
|
||||
Map<String, dynamic> params = {};
|
||||
params['short_play_id'] = shortPlayId;
|
||||
return ApiRequest.post(ApiStringVideo.cancelCollect, data: params).then((
|
||||
value,
|
||||
) {
|
||||
HelpLog.print('cancelCollectttt: ${value.data}');
|
||||
if (value.isSuccess) {}
|
||||
return value.isSuccess;
|
||||
});
|
||||
}
|
||||
|
||||
static Map<String, dynamic> _setPage({int page = 1, int pageSize = 10}) {
|
||||
return {'current_page': page, 'page_size': pageSize};
|
||||
}
|
||||
|
||||
static List parseDataForList(Map<String, dynamic> data) {
|
||||
Map<String, dynamic> map = data['data'];
|
||||
List? listData = map['list'];
|
||||
return listData ?? [];
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user