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 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>( path.join(ApiConstants.baseUrl, ApiConstants.login), fromJsonT: (json) => json as Map, 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 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>( path.join(ApiConstants.baseUrl, ApiConstants.sendSmsCode), fromJsonT: (json) => json as Map, 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 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>( path.join(ApiConstants.baseUrl, ApiConstants.login), fromJsonT: (json) => json as Map, 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 _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); } }