login_service.dart 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import 'package:path/path.dart' as path;
  2. import 'package:dio/dio.dart';
  3. import 'package:sino_med_cloud/core/constants/api_constants.dart';
  4. import 'package:sino_med_cloud/core/network/dio_client.dart';
  5. import 'package:sino_med_cloud/core/storage/local_storage.dart';
  6. import 'package:sino_med_cloud/core/utils/logger.dart';
  7. import '../data/auth_model.dart';
  8. /// 登录服务类
  9. class LoginService {
  10. /// 密码登录
  11. ///
  12. /// [mobile] 手机号
  13. /// [password] 密码(已加密)
  14. /// [loginSystem] 登录系统标识
  15. /// [loginType] 登录类型
  16. ///
  17. /// 返回 [AuthModel] 认证模型,如果登录失败则抛出异常
  18. static Future<AuthModel> passwordLogin({
  19. required String mobile,
  20. required String password,
  21. required String loginSystem,
  22. required String loginType,
  23. }) async {
  24. try {
  25. final parame = {
  26. "mobile": mobile,
  27. "login_system": loginSystem,
  28. "password": password,
  29. "login_type": loginType,
  30. };
  31. AppLogger.d('密码登录请求参数: $parame');
  32. final response = await DioClient.post<Map<String, dynamic>>(
  33. path.join(ApiConstants.baseUrl, ApiConstants.login),
  34. fromJsonT: (json) => json as Map<String, dynamic>,
  35. data: parame,
  36. );
  37. if (response.success && response.code == 20000) {
  38. AppLogger.d('密码登录成功: ${response.data}');
  39. final jsonData = response.data!;
  40. // 解析为 AuthModel
  41. final authModel = AuthModel.fromJson(jsonData);
  42. // 保存到本地存储
  43. await _saveAuthData(authModel);
  44. return authModel;
  45. } else {
  46. final errorMsg = response.msg ?? '登录失败';
  47. AppLogger.d('密码登录失败: $errorMsg');
  48. throw Exception(errorMsg);
  49. }
  50. } catch (e) {
  51. AppLogger.e('密码登录错误', e);
  52. rethrow;
  53. }
  54. }
  55. /// 发送验证码
  56. ///
  57. /// [mobile] 手机号
  58. /// [scope] 验证码作用域,默认为 "yun-his-login-sms-send"
  59. ///
  60. /// 返回验证码字符串,如果发送失败则抛出异常
  61. static Future<String> sendSmsCode({
  62. required String mobile,
  63. String scope = "yun-his-login-sms-send",
  64. }) async {
  65. try {
  66. final parame = {
  67. "mobile": mobile,
  68. "scope": scope,
  69. };
  70. AppLogger.d('发送验证码请求参数: $parame');
  71. final response = await DioClient.post<Map<String, dynamic>>(
  72. path.join(ApiConstants.baseUrl, ApiConstants.sendSmsCode),
  73. fromJsonT: (json) => json as Map<String, dynamic>,
  74. data: parame,
  75. );
  76. if (response.success && response.code == 20000) {
  77. AppLogger.d('发送验证码成功: ${response.data}');
  78. final jsonData = response.data!;
  79. final smsCode = jsonData['code'] as String;
  80. return smsCode;
  81. } else {
  82. final errorMsg = response.msg ?? '发送验证码失败';
  83. AppLogger.d('发送验证码失败: $errorMsg');
  84. throw Exception(errorMsg);
  85. }
  86. } catch (e) {
  87. AppLogger.e('发送验证码错误', e);
  88. rethrow;
  89. }
  90. }
  91. /// 验证码登录
  92. ///
  93. /// [mobile] 手机号
  94. /// [smsCode] 验证码
  95. /// [loginSystem] 登录系统标识
  96. /// [loginType] 登录类型
  97. ///
  98. /// 返回 [AuthModel] 认证模型,如果登录失败则抛出异常
  99. static Future<AuthModel> smsLogin({
  100. required String mobile,
  101. required String smsCode,
  102. required String loginSystem,
  103. required String loginType,
  104. }) async {
  105. try {
  106. final parame = {
  107. "mobile": mobile,
  108. "sms_code": smsCode,
  109. "login_system": loginSystem,
  110. "login_type": loginType,
  111. };
  112. AppLogger.d('验证码登录请求参数: $parame');
  113. final response = await DioClient.post<Map<String, dynamic>>(
  114. path.join(ApiConstants.baseUrl, ApiConstants.login),
  115. fromJsonT: (json) => json as Map<String, dynamic>,
  116. data: parame,
  117. );
  118. if (response.success && response.code == 20000) {
  119. AppLogger.d('验证码登录成功: ${response.data}');
  120. final jsonData = response.data!;
  121. // 解析为 AuthModel
  122. final authModel = AuthModel.fromJson(jsonData);
  123. // 保存到本地存储
  124. await _saveAuthData(authModel);
  125. return authModel;
  126. } else {
  127. final errorMsg = response.msg ?? '登录失败';
  128. AppLogger.d('验证码登录失败: $errorMsg');
  129. throw Exception(errorMsg);
  130. }
  131. } catch (e) {
  132. AppLogger.e('验证码登录错误', e);
  133. rethrow;
  134. }
  135. }
  136. /// 保存认证数据到本地存储
  137. static Future<void> _saveAuthData(AuthModel authModel) async {
  138. // 保存 Token(会自动初始化)
  139. await LocalStorage.saveToken(authModel.accessToken);
  140. // 保存用户信息(会自动初始化)
  141. await LocalStorage.saveUserInfo(authModel.userInfo.toJson());
  142. // 保存机构信息列表(会自动初始化)
  143. final institutionInfoList = authModel.institutionInfo
  144. .map((item) => item.toJson())
  145. .toList();
  146. await LocalStorage.saveInstitutionInfo(institutionInfoList);
  147. }
  148. }