#first commit

This commit is contained in:
cc
2026-01-11 19:42:22 +08:00
commit f70d6cace6
167 changed files with 6699 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
import '../models/user_model.dart';
abstract class AuthHttpDataSource {
Future<UserModel> login(String username, String password, int sourceType);
}

View File

@@ -0,0 +1,29 @@
import 'package:dio/dio.dart';
import '../../models/user_model.dart';
import '../auth_http_datasource.dart';
class AuthHttpDataSourceImpl implements AuthHttpDataSource {
final Dio dio;
AuthHttpDataSourceImpl(this.dio);
@override
Future<UserModel> login(String username, String password, sourceType) async {
final response = await dio.post(
'/auth',
data: {
'username': username,
'password': password,
'sourceType': sourceType,
},
);
if (response.statusCode == 200) {
print('runtimeType = ${response.data.runtimeType}');
return UserModel.fromJson(response.data);
} else {
throw Exception(response.data['message'] ?? 'Login failed');
}
}
}

View File

@@ -0,0 +1,62 @@
import '../../../../core/domain/entities/user_entity.dart';
class UserModel extends UserEntity {
UserModel({
required super.userId,
required super.username,
required super.nickname,
required super.token,
super.avatar,
super.email,
super.phone,
});
factory UserModel.fromJson(Map<String, dynamic> json) {
print(json);
return UserModel(
userId: json['userId'],
username: json['username'],
nickname: json['nickName'],
token: json['token'],
avatar: json['avatar'],
email: json['email'],
phone: json['phone'],
);
}
Map<String, dynamic> toJson() {
return {
'userId': userId,
'username': username,
'nickName': nickname,
'token': token,
'avatar': avatar,
'email': email,
'phone': phone,
};
}
toEntity() {
return UserEntity(
userId: userId,
username: username,
nickname: nickname,
token: token,
avatar: avatar,
email: email,
phone: phone,
);
}
factory UserModel.fromEntity(UserEntity entity) {
return UserModel(
userId: entity.userId,
username: entity.username,
nickname: entity.nickname,
token: entity.token,
avatar: entity.avatar,
email: entity.email,
phone: entity.phone,
);
}
}

View File

@@ -0,0 +1,37 @@
import 'package:maibu_satabot_v2/core/storage/user_storage.dart';
import '../../../../core/domain/entities/user_entity.dart';
import '../../domain/repositories/auth_repository.dart';
import '../datasources/auth_http_datasource.dart';
class AuthRepositoryImpl implements AuthRepository {
final AuthHttpDataSource remote;
final UserStorage localTokenStorage;
AuthRepositoryImpl({required this.remote, required this.localTokenStorage});
@override
// 注意 1:返回类型应该是 Domain 层的 UserEntity,而不是 UserModel
Future<UserEntity> login(
String username,
String password,
int sourceType,
) async {
try {
// 1. 从数据源获取 Data Model
final userModel = await remote.login(username, password, sourceType);
// 2. 职责核心:将 Model 转换为 Entity (解耦业务与 JSON 结构)
if (userModel != null) {
await localTokenStorage.saveUser(userModel);
}
// 2. 只返回纯粹的用户信息实体
return userModel.toEntity();
} catch (e) {
// 3. 职责核心:异常翻译
// 不直接抛出 Dio 异常,而是抛出业务层定义的自定义异常或返回 Failure
throw Exception(e.toString());
}
}
}