This commit is contained in:
root
2026-10-16 13:51:00 +08:00
parent 6bf949949c
commit 8fc899d0a9
3830 changed files with 11228 additions and 188377 deletions
+21 -5
View File
@@ -1,6 +1,7 @@
import '../core/network/api_client.dart';
import '../core/network/api_exception.dart';
import '../core/network/endpoints.dart';
import '../core/storage/token_store.dart';
import '../models/user_model.dart';
/// 认证服务(《03-接口文档》第 3 章)
@@ -8,13 +9,22 @@ class AuthService {
AuthService._();
/// 3.1 发送短信验证码 scene: register/login/reset
static Future<void> sendSmsCode(String phone, String scene) async {
await ApiClient.I.post(Endpoints.smsSend, data: {'phone': phone, 'scene': scene});
/// 返回开发模式验证码(短信通道未配置时服务端下发),生产通道下为 null
static Future<String?> sendSmsCode(String phone, String scene) async {
final data = await ApiClient.post<Map<String, dynamic>>(
Endpoints.smsSend,
data: {'phone': phone, 'scene': scene},
);
return data['dev_code'] as String?;
}
/// 3.2 发送邮箱验证码
static Future<void> sendEmailCode(String email, String scene) async {
await ApiClient.I.post(Endpoints.emailSend, data: {'email': email, 'scene': scene});
static Future<String?> sendEmailCode(String email, String scene) async {
final data = await ApiClient.post<Map<String, dynamic>>(
Endpoints.emailSend,
data: {'email': email, 'scene': scene},
);
return data['dev_code'] as String?;
}
/// 3.3 注册(type: phone/email,可带邀请码),返回 Token 对与用户信息
@@ -66,7 +76,13 @@ class AuthService {
}
/// 统一解析 Token 响应:access/refresh 入安全存储,user 转模型
static LoginResult _fromTokenData(Map<String, dynamic> data) {
static Future<LoginResult> _fromTokenData(Map<String, dynamic> data) async {
// 登录/注册响应携带新 token 对,必须先落存储(否则登录态判定与后续请求鉴权全挂)
final access = data['access_token'] as String?;
final refresh = data['refresh_token'] as String?;
if (access != null && access.isNotEmpty && refresh != null && refresh.isNotEmpty) {
await TokenStore.save(access: access, refresh: refresh);
}
final user = UserModel.fromJson((data['user'] as Map<String, dynamic>?) ?? const {});
final trial = data['trial_granted'] as Map<String, dynamic>?;
return LoginResult(
+9
View File
@@ -34,6 +34,15 @@ class VideoService {
static Future<Map<String, dynamic>> fetchDetail(int videoId) =>
ApiClient.get<Map<String, dynamic>>(Endpoints.videoDetail(videoId));
/// 当前视频所属系列 + 全部集数(播放器抽屉用)
static Future<Map<String, dynamic>> fetchVideoSeries(int videoId) async {
try {
return await ApiClient.get<Map<String, dynamic>>(Endpoints.videoSeries(videoId));
} catch (_) {
return {'has_series': false};
}
}
/// 5.3 观看上报(计费):开始播放时调用,客户端已按 video_id+日期 本地去重
static Future<WatchResult> reportWatch(int videoId, {int? position}) async {
final data = await ApiClient.post<Map<String, dynamic>>(