login_util.dart 4.22 KB
import 'package:appframe/config/constant.dart';
import 'package:appframe/config/locator.dart';
import 'package:appframe/config/routes.dart';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

/// 登录成功后的公共处理逻辑
class LoginUtil {
  /// 处理登录成功后的数据解析、缓存持久化和路由跳转
  ///
  /// [data] 登录接口返回的 data 字段
  /// [visitor] 是否为游客(0=非游客,1=游客)
  /// [loginType] 登录类型,router=跳转路由,reload=重新加载
  static void handleLoginSuccess(Map<String, dynamic> data, int visitor, String loginType) {
    var roles = data['roles'];
    // 过滤出家长角色的数据
    if (roles?.isNotEmpty ?? false) {
      roles.removeWhere((element) => element['userType'] != 2);
    } else {
      roles = [];
    }

    var sessionCode = data['sessionCode'];
    var userCode = data['userCode'];
    var classCode = '';
    var userType = 0;
    var stuId = '';
    var className = '';
    var stuName = '';
    var relation = '';

    var sharedPreferences = getIt.get<SharedPreferences>();

    if (roles.isNotEmpty) {
      var role = roles[0];
      classCode = role['classCode'];
      userType = role['userType'];
      stuId = role['stuId'];
      className = role['className'];
      stuName = role['stuName'];
      relation = role['relation'] ?? '';

      // 将角色中的班级数据处理后,进行缓存
      List<String> classIdList = [];
      for (var role in roles) {
        classIdList.add(role['classCode'] as String);
      }
      debugPrint('classCodeIds:-------------- $classIdList');
      sharedPreferences.setStringList(Constant.classIdSetKey, classIdList);
    } else {
      sharedPreferences.setStringList(Constant.classIdSetKey, []);
    }

    var preUserCode = sharedPreferences.getString('pre_userCode') ?? '';
    if (userCode != preUserCode) {
      // 新用户登录
      sharedPreferences.setString('pre_userCode', userCode);
      sharedPreferences.setString('pre_classCode', classCode);
      sharedPreferences.setInt('pre_userType', userType);
      sharedPreferences.setString('pre_stuId', stuId);
    } else {
      // 前一个登录用户重新登录
      var preClassCode = sharedPreferences.getString('pre_classCode') ?? '';
      var preUserType = sharedPreferences.getInt('pre_userType') ?? 0;
      var preStuId = sharedPreferences.getString('pre_stuId') ?? '';

      if (preClassCode != '' &&
          roles.any((element) =>
              element['classCode'] == preClassCode &&
              element['userType'] == preUserType &&
              element['stuId'] == preStuId)) {
        classCode = preClassCode;
        userType = preUserType;
        stuId = preStuId;
      } else {
        sharedPreferences.setString('pre_userCode', userCode);
        sharedPreferences.setString('pre_classCode', classCode);
        sharedPreferences.setInt('pre_userType', userType);
        sharedPreferences.setString('pre_stuId', stuId);
      }
    }

    sharedPreferences.setInt('auth_visitor', visitor);
    sharedPreferences.setString('auth_sessionCode', sessionCode);
    sharedPreferences.setString('auth_userCode', userCode);
    sharedPreferences.setString('auth_classCode', classCode);
    sharedPreferences.setInt('auth_userType', userType);
    sharedPreferences.setString('auth_stuId', stuId);
    sharedPreferences.setString('auth_className', className);
    sharedPreferences.setString('auth_stuName', stuName);
    sharedPreferences.setString('auth_relation', relation);

    if (loginType == 'router') {
      router.go(
        '/web',
        extra: {
          'visitor': visitor,
          'sessionCode': sessionCode,
          'userCode': userCode,
          'classCode': classCode,
          'userType': userType,
          'stuId': stuId,
        },
      );
    } else if (loginType == 'reload') {
      // // 通知当前 WebCubit 更新身份信息并重新加载 H5,避免销毁重建整个页面
      // WebCubitHolder.instance?.reloadWithIdentity(
      //   visitor: 0,
      //   sessionCode: sessionCode,
      //   userCode: userCode,
      //   classCode: classCode,
      //   userType: userType,
      //   stuId: stuId,
      // );
      router.go('/reload');
    }

  }
}