| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- import 'package:path/path.dart' as path;
- import 'package:dio/dio.dart';
- import 'package:sino_med_cloud/core/constants/api_constants.dart';
- import 'package:sino_med_cloud/core/network/dio_client.dart';
- import 'package:sino_med_cloud/core/storage/local_storage.dart';
- import 'package:sino_med_cloud/core/utils/logger.dart';
- import '../data/auth_model.dart';
- /// 登录服务类
- class LoginService {
- /// 密码登录
- ///
- /// [mobile] 手机号
- /// [password] 密码(已加密)
- /// [loginSystem] 登录系统标识
- /// [loginType] 登录类型
- ///
- /// 返回 [AuthModel] 认证模型,如果登录失败则抛出异常
- static Future<AuthModel> passwordLogin({
- required String mobile,
- required String password,
- required String loginSystem,
- required String loginType,
- }) async {
- try {
- final parame = {
- "mobile": mobile,
- "login_system": loginSystem,
- "password": password,
- "login_type": loginType,
- };
- AppLogger.d('密码登录请求参数: $parame');
- final response = await DioClient.post<Map<String, dynamic>>(
- path.join(ApiConstants.baseUrl, ApiConstants.login),
- fromJsonT: (json) => json as Map<String, dynamic>,
- data: parame,
- );
- if (response.success && response.code == 20000) {
- AppLogger.d('密码登录成功: ${response.data}');
- final jsonData = response.data!;
-
- // 解析为 AuthModel
- final authModel = AuthModel.fromJson(jsonData);
-
- // 保存到本地存储
- await _saveAuthData(authModel);
-
- return authModel;
- } else {
- final errorMsg = response.msg ?? '登录失败';
- AppLogger.d('密码登录失败: $errorMsg');
- throw Exception(errorMsg);
- }
- } catch (e) {
- AppLogger.e('密码登录错误', e);
- rethrow;
- }
- }
- /// 发送验证码
- ///
- /// [mobile] 手机号
- /// [scope] 验证码作用域,默认为 "yun-his-login-sms-send"
- ///
- /// 返回验证码字符串,如果发送失败则抛出异常
- static Future<String> sendSmsCode({
- required String mobile,
- String scope = "yun-his-login-sms-send",
- }) async {
- try {
- final parame = {
- "mobile": mobile,
- "scope": scope,
- };
- AppLogger.d('发送验证码请求参数: $parame');
- final response = await DioClient.post<Map<String, dynamic>>(
- path.join(ApiConstants.baseUrl, ApiConstants.sendSmsCode),
- fromJsonT: (json) => json as Map<String, dynamic>,
- data: parame,
- );
- if (response.success && response.code == 20000) {
- AppLogger.d('发送验证码成功: ${response.data}');
- final jsonData = response.data!;
- final smsCode = jsonData['code'] as String;
- return smsCode;
- } else {
- final errorMsg = response.msg ?? '发送验证码失败';
- AppLogger.d('发送验证码失败: $errorMsg');
- throw Exception(errorMsg);
- }
- } catch (e) {
- AppLogger.e('发送验证码错误', e);
- rethrow;
- }
- }
- /// 验证码登录
- ///
- /// [mobile] 手机号
- /// [smsCode] 验证码
- /// [loginSystem] 登录系统标识
- /// [loginType] 登录类型
- ///
- /// 返回 [AuthModel] 认证模型,如果登录失败则抛出异常
- static Future<AuthModel> smsLogin({
- required String mobile,
- required String smsCode,
- required String loginSystem,
- required String loginType,
- }) async {
- try {
- final parame = {
- "mobile": mobile,
- "sms_code": smsCode,
- "login_system": loginSystem,
- "login_type": loginType,
- };
- AppLogger.d('验证码登录请求参数: $parame');
- final response = await DioClient.post<Map<String, dynamic>>(
- path.join(ApiConstants.baseUrl, ApiConstants.login),
- fromJsonT: (json) => json as Map<String, dynamic>,
- data: parame,
- );
- if (response.success && response.code == 20000) {
- AppLogger.d('验证码登录成功: ${response.data}');
- final jsonData = response.data!;
-
- // 解析为 AuthModel
- final authModel = AuthModel.fromJson(jsonData);
-
- // 保存到本地存储
- await _saveAuthData(authModel);
-
- return authModel;
- } else {
- final errorMsg = response.msg ?? '登录失败';
- AppLogger.d('验证码登录失败: $errorMsg');
- throw Exception(errorMsg);
- }
- } catch (e) {
- AppLogger.e('验证码登录错误', e);
- rethrow;
- }
- }
- /// 保存认证数据到本地存储
- static Future<void> _saveAuthData(AuthModel authModel) async {
- // 保存 Token(会自动初始化)
- await LocalStorage.saveToken(authModel.accessToken);
-
- // 保存用户信息(会自动初始化)
- await LocalStorage.saveUserInfo(authModel.userInfo.toJson());
-
- // 保存机构信息列表(会自动初始化)
- final institutionInfoList = authModel.institutionInfo
- .map((item) => item.toJson())
- .toList();
- await LocalStorage.saveInstitutionInfo(institutionInfoList);
- }
- }
|