| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321 |
- using UnityEngine;
- using UnityEngine.SceneManagement;
- public class LoginManager : MonoBehaviour
- {
- public static LoginManager Instance { get; private set; }
-
- [Header("场景配置")]
- public string menuSceneName = "MenuScene";
- public string loginSceneName = "LoginScene";
-
- [Header("用户数据")]
- public UserData currentUser;
- public bool isLoggedIn { get; private set; }
-
- private NetworkManager networkManager;
-
- private const string PLAYER_PREFS_TOKEN = "auth_token";
- private const string PLAYER_PREFS_USER_ID = "user_id";
- private const string PLAYER_PREFS_USERNAME = "username";
- private const string PLAYER_PREFS_EMAIL = "email";
- private const string PLAYER_PREFS_STUDY_ABILITY = "study_ability";
- private const string PLAYER_PREFS_CURRENT_LEVEL = "current_level";
- private const string PLAYER_PREFS_EXPERIENCE = "experience";
-
- private void Awake()
- {
- if (Instance == null)
- {
- Instance = this;
- DontDestroyOnLoad(gameObject);
- }
- else
- {
- Destroy(gameObject);
- }
- }
-
- private void Start()
- {
- networkManager = NetworkManager.Instance;
-
- if (networkManager == null)
- {
- GameObject networkObj = new GameObject("NetworkManager");
- networkManager = networkObj.AddComponent<NetworkManager>();
- }
-
- CheckAutoLogin();
- }
-
- private void CheckAutoLogin()
- {
- string savedToken = PlayerPrefs.GetString(PLAYER_PREFS_TOKEN, "");
-
- if (!string.IsNullOrEmpty(savedToken))
- {
- Debug.Log("检测到保存的token,尝试自动登录...");
- networkManager.SetAuthToken(savedToken);
-
- int userId = PlayerPrefs.GetInt(PLAYER_PREFS_USER_ID, -1);
- if (userId != -1)
- {
- currentUser = new UserData
- {
- userId = userId,
- username = PlayerPrefs.GetString(PLAYER_PREFS_USERNAME, ""),
- email = PlayerPrefs.GetString(PLAYER_PREFS_EMAIL, ""),
- studyAbility = PlayerPrefs.GetInt(PLAYER_PREFS_STUDY_ABILITY, 1),
- currentLevel = PlayerPrefs.GetInt(PLAYER_PREFS_CURRENT_LEVEL, 1),
- experience = PlayerPrefs.GetInt(PLAYER_PREFS_EXPERIENCE, 0),
- token = savedToken
- };
-
- isLoggedIn = true;
- Debug.Log($"自动登录成功!用户: {currentUser.username}");
- RefreshUserProfileAndEnterGame();
- }
- }
- }
- private void RefreshUserProfileAndEnterGame()
- {
- if (networkManager == null)
- {
- EnterGame();
- return;
- }
- networkManager.GetUserProfile(
- response =>
- {
- if (response != null && response.success && response.data != null)
- {
- response.data.token = currentUser != null ? currentUser.token : "";
- currentUser = response.data;
- SaveUserData(currentUser);
- if (AchievementManager.Instance != null)
- {
- AchievementManager.Instance.LoadAchievements();
- }
- }
- EnterGame();
- },
- error =>
- {
- Debug.LogWarning($"自动登录刷新用户资料失败: {error}");
- if (error.Contains("401") || error.Contains("Unauthorized"))
- {
- ClearUserData();
- networkManager.ClearAuthToken();
- currentUser = null;
- isLoggedIn = false;
- SceneManager.LoadScene(loginSceneName);
- return;
- }
- EnterGame();
- }
- );
- }
-
- public void Login(string username, string password, System.Action<UserData> onSuccess, System.Action<string> onError)
- {
- LoginRequest loginRequest = new LoginRequest
- {
- username = username,
- password = password
- };
-
- StartCoroutine(networkManager.PostRequest<LoginResponse>("/auth/login", loginRequest,
- response =>
- {
- if (response.success)
- {
- currentUser = response.data;
- isLoggedIn = true;
-
- networkManager.SetAuthToken(currentUser.token);
-
- SaveUserData(currentUser);
-
- Debug.Log($"登录成功!用户: {currentUser.username}, 学习能力: {currentUser.studyAbility}");
- if (AchievementManager.Instance != null)
- {
- AchievementManager.Instance.LoadAchievements();
- }
-
- onSuccess?.Invoke(currentUser);
-
- EnterGame();
- }
- else
- {
- Debug.LogError($"登录失败: {response.message}");
- onError?.Invoke(response.message);
- }
- },
- error =>
- {
- Debug.LogError($"登录请求失败: {error}");
- onError?.Invoke(error);
- }
- ));
- }
-
- public void Register(string username, string password, string email, System.Action<UserData> onSuccess, System.Action<string> onError)
- {
- RegisterRequest registerRequest = new RegisterRequest
- {
- username = username,
- password = password,
- email = email
- };
-
- StartCoroutine(networkManager.PostRequest<RegisterResponse>("/auth/register", registerRequest,
- response =>
- {
- if (response.success)
- {
- Debug.Log($"注册成功!用户: {response.data.username}");
- onSuccess?.Invoke(response.data);
- }
- else
- {
- Debug.LogError($"注册失败: {response.message}");
- onError?.Invoke(response.message);
- }
- },
- error =>
- {
- Debug.LogError($"注册请求失败: {error}");
- onError?.Invoke(error);
- }
- ));
- }
-
- public void GuestLogin(System.Action<UserData> onSuccess, System.Action<string> onError)
- {
- Debug.Log("启动游客模式...");
-
- currentUser = new UserData
- {
- userId = -1,
- username = "Guest",
- email = "guest@local.com",
- studyAbility = 1,
- currentLevel = 1,
- experience = 0,
- token = ""
- };
-
- isLoggedIn = true;
-
- Debug.Log($"游客模式启动成功!默认学习能力: {currentUser.studyAbility}");
- if (AchievementManager.Instance != null)
- {
- AchievementManager.Instance.LoadAchievements();
- }
-
- onSuccess?.Invoke(currentUser);
-
- EnterGame();
- }
-
- public void Logout()
- {
- currentUser = null;
- isLoggedIn = false;
-
- networkManager.ClearAuthToken();
-
- ClearUserData();
-
- Debug.Log("已退出登录");
-
- SceneManager.LoadScene(loginSceneName);
- }
-
- public void UpdateUserData(UserData newData)
- {
- currentUser = newData;
- SaveUserData(currentUser);
- }
-
- private void SaveUserData(UserData user)
- {
- if (user.userId == -1)
- {
- Debug.Log("游客模式,不保存用户数据");
- return;
- }
-
- PlayerPrefs.SetString(PLAYER_PREFS_TOKEN, user.token);
- PlayerPrefs.SetInt(PLAYER_PREFS_USER_ID, user.userId);
- PlayerPrefs.SetString(PLAYER_PREFS_USERNAME, user.username);
- PlayerPrefs.SetString(PLAYER_PREFS_EMAIL, user.email ?? "");
- PlayerPrefs.SetInt(PLAYER_PREFS_STUDY_ABILITY, Mathf.Max(1, user.studyAbility));
- PlayerPrefs.SetInt(PLAYER_PREFS_CURRENT_LEVEL, Mathf.Max(1, user.currentLevel));
- PlayerPrefs.SetInt(PLAYER_PREFS_EXPERIENCE, Mathf.Max(0, user.experience));
- PlayerPrefs.Save();
-
- Debug.Log("用户数据已保存");
- }
-
- private void ClearUserData()
- {
- PlayerPrefs.DeleteKey(PLAYER_PREFS_TOKEN);
- PlayerPrefs.DeleteKey(PLAYER_PREFS_USER_ID);
- PlayerPrefs.DeleteKey(PLAYER_PREFS_USERNAME);
- PlayerPrefs.DeleteKey(PLAYER_PREFS_EMAIL);
- PlayerPrefs.DeleteKey(PLAYER_PREFS_STUDY_ABILITY);
- PlayerPrefs.DeleteKey(PLAYER_PREFS_CURRENT_LEVEL);
- PlayerPrefs.DeleteKey(PLAYER_PREFS_EXPERIENCE);
- PlayerPrefs.Save();
-
- Debug.Log("用户数据已清除");
- }
-
- private void EnterGame()
- {
- Debug.Log("进入菜单场景...");
- SceneManager.LoadScene(menuSceneName);
- }
-
- public UserData GetCurrentUser()
- {
- return currentUser;
- }
-
- public int GetStudyAbility()
- {
- return currentUser == null ? 1 : Mathf.Max(1, currentUser.studyAbility);
- }
-
- public void SetStudyAbility(int ability)
- {
- if (currentUser != null)
- {
- currentUser.studyAbility = ability;
- SaveUserData(currentUser);
- }
- }
- public void SetProgress(int studyAbility, int currentLevel, int experience)
- {
- if (currentUser != null)
- {
- currentUser.studyAbility = Mathf.Max(1, studyAbility);
- currentUser.currentLevel = Mathf.Max(1, currentLevel);
- currentUser.experience = Mathf.Max(0, experience);
- SaveUserData(currentUser);
- }
- }
-
- public bool IsGuest()
- {
- return currentUser != null && currentUser.userId == -1;
- }
- }
|