LoginManager.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. using UnityEngine;
  2. using UnityEngine.SceneManagement;
  3. public class LoginManager : MonoBehaviour
  4. {
  5. public static LoginManager Instance { get; private set; }
  6. [Header("场景配置")]
  7. public string menuSceneName = "MenuScene";
  8. public string loginSceneName = "LoginScene";
  9. [Header("用户数据")]
  10. public UserData currentUser;
  11. public bool isLoggedIn { get; private set; }
  12. private NetworkManager networkManager;
  13. private const string PLAYER_PREFS_TOKEN = "auth_token";
  14. private const string PLAYER_PREFS_USER_ID = "user_id";
  15. private const string PLAYER_PREFS_USERNAME = "username";
  16. private const string PLAYER_PREFS_EMAIL = "email";
  17. private const string PLAYER_PREFS_STUDY_ABILITY = "study_ability";
  18. private const string PLAYER_PREFS_CURRENT_LEVEL = "current_level";
  19. private const string PLAYER_PREFS_EXPERIENCE = "experience";
  20. private void Awake()
  21. {
  22. if (Instance == null)
  23. {
  24. Instance = this;
  25. DontDestroyOnLoad(gameObject);
  26. }
  27. else
  28. {
  29. Destroy(gameObject);
  30. }
  31. }
  32. private void Start()
  33. {
  34. networkManager = NetworkManager.Instance;
  35. if (networkManager == null)
  36. {
  37. GameObject networkObj = new GameObject("NetworkManager");
  38. networkManager = networkObj.AddComponent<NetworkManager>();
  39. }
  40. CheckAutoLogin();
  41. }
  42. private void CheckAutoLogin()
  43. {
  44. string savedToken = PlayerPrefs.GetString(PLAYER_PREFS_TOKEN, "");
  45. if (!string.IsNullOrEmpty(savedToken))
  46. {
  47. Debug.Log("检测到保存的token,尝试自动登录...");
  48. networkManager.SetAuthToken(savedToken);
  49. int userId = PlayerPrefs.GetInt(PLAYER_PREFS_USER_ID, -1);
  50. if (userId != -1)
  51. {
  52. currentUser = new UserData
  53. {
  54. userId = userId,
  55. username = PlayerPrefs.GetString(PLAYER_PREFS_USERNAME, ""),
  56. email = PlayerPrefs.GetString(PLAYER_PREFS_EMAIL, ""),
  57. studyAbility = PlayerPrefs.GetInt(PLAYER_PREFS_STUDY_ABILITY, 1),
  58. currentLevel = PlayerPrefs.GetInt(PLAYER_PREFS_CURRENT_LEVEL, 1),
  59. experience = PlayerPrefs.GetInt(PLAYER_PREFS_EXPERIENCE, 0),
  60. token = savedToken
  61. };
  62. isLoggedIn = true;
  63. Debug.Log($"自动登录成功!用户: {currentUser.username}");
  64. RefreshUserProfileAndEnterGame();
  65. }
  66. }
  67. }
  68. private void RefreshUserProfileAndEnterGame()
  69. {
  70. if (networkManager == null)
  71. {
  72. EnterGame();
  73. return;
  74. }
  75. networkManager.GetUserProfile(
  76. response =>
  77. {
  78. if (response != null && response.success && response.data != null)
  79. {
  80. response.data.token = currentUser != null ? currentUser.token : "";
  81. currentUser = response.data;
  82. SaveUserData(currentUser);
  83. if (AchievementManager.Instance != null)
  84. {
  85. AchievementManager.Instance.LoadAchievements();
  86. }
  87. }
  88. EnterGame();
  89. },
  90. error =>
  91. {
  92. Debug.LogWarning($"自动登录刷新用户资料失败: {error}");
  93. if (error.Contains("401") || error.Contains("Unauthorized"))
  94. {
  95. ClearUserData();
  96. networkManager.ClearAuthToken();
  97. currentUser = null;
  98. isLoggedIn = false;
  99. SceneManager.LoadScene(loginSceneName);
  100. return;
  101. }
  102. EnterGame();
  103. }
  104. );
  105. }
  106. public void Login(string username, string password, System.Action<UserData> onSuccess, System.Action<string> onError)
  107. {
  108. LoginRequest loginRequest = new LoginRequest
  109. {
  110. username = username,
  111. password = password
  112. };
  113. StartCoroutine(networkManager.PostRequest<LoginResponse>("/auth/login", loginRequest,
  114. response =>
  115. {
  116. if (response.success)
  117. {
  118. currentUser = response.data;
  119. isLoggedIn = true;
  120. networkManager.SetAuthToken(currentUser.token);
  121. SaveUserData(currentUser);
  122. Debug.Log($"登录成功!用户: {currentUser.username}, 学习能力: {currentUser.studyAbility}");
  123. if (AchievementManager.Instance != null)
  124. {
  125. AchievementManager.Instance.LoadAchievements();
  126. }
  127. onSuccess?.Invoke(currentUser);
  128. EnterGame();
  129. }
  130. else
  131. {
  132. Debug.LogError($"登录失败: {response.message}");
  133. onError?.Invoke(response.message);
  134. }
  135. },
  136. error =>
  137. {
  138. Debug.LogError($"登录请求失败: {error}");
  139. onError?.Invoke(error);
  140. }
  141. ));
  142. }
  143. public void Register(string username, string password, string email, System.Action<UserData> onSuccess, System.Action<string> onError)
  144. {
  145. RegisterRequest registerRequest = new RegisterRequest
  146. {
  147. username = username,
  148. password = password,
  149. email = email
  150. };
  151. StartCoroutine(networkManager.PostRequest<RegisterResponse>("/auth/register", registerRequest,
  152. response =>
  153. {
  154. if (response.success)
  155. {
  156. Debug.Log($"注册成功!用户: {response.data.username}");
  157. onSuccess?.Invoke(response.data);
  158. }
  159. else
  160. {
  161. Debug.LogError($"注册失败: {response.message}");
  162. onError?.Invoke(response.message);
  163. }
  164. },
  165. error =>
  166. {
  167. Debug.LogError($"注册请求失败: {error}");
  168. onError?.Invoke(error);
  169. }
  170. ));
  171. }
  172. public void GuestLogin(System.Action<UserData> onSuccess, System.Action<string> onError)
  173. {
  174. Debug.Log("启动游客模式...");
  175. currentUser = new UserData
  176. {
  177. userId = -1,
  178. username = "Guest",
  179. email = "guest@local.com",
  180. studyAbility = 1,
  181. currentLevel = 1,
  182. experience = 0,
  183. token = ""
  184. };
  185. isLoggedIn = true;
  186. Debug.Log($"游客模式启动成功!默认学习能力: {currentUser.studyAbility}");
  187. if (AchievementManager.Instance != null)
  188. {
  189. AchievementManager.Instance.LoadAchievements();
  190. }
  191. onSuccess?.Invoke(currentUser);
  192. EnterGame();
  193. }
  194. public void Logout()
  195. {
  196. currentUser = null;
  197. isLoggedIn = false;
  198. networkManager.ClearAuthToken();
  199. ClearUserData();
  200. Debug.Log("已退出登录");
  201. SceneManager.LoadScene(loginSceneName);
  202. }
  203. public void UpdateUserData(UserData newData)
  204. {
  205. currentUser = newData;
  206. SaveUserData(currentUser);
  207. }
  208. private void SaveUserData(UserData user)
  209. {
  210. if (user.userId == -1)
  211. {
  212. Debug.Log("游客模式,不保存用户数据");
  213. return;
  214. }
  215. PlayerPrefs.SetString(PLAYER_PREFS_TOKEN, user.token);
  216. PlayerPrefs.SetInt(PLAYER_PREFS_USER_ID, user.userId);
  217. PlayerPrefs.SetString(PLAYER_PREFS_USERNAME, user.username);
  218. PlayerPrefs.SetString(PLAYER_PREFS_EMAIL, user.email ?? "");
  219. PlayerPrefs.SetInt(PLAYER_PREFS_STUDY_ABILITY, Mathf.Max(1, user.studyAbility));
  220. PlayerPrefs.SetInt(PLAYER_PREFS_CURRENT_LEVEL, Mathf.Max(1, user.currentLevel));
  221. PlayerPrefs.SetInt(PLAYER_PREFS_EXPERIENCE, Mathf.Max(0, user.experience));
  222. PlayerPrefs.Save();
  223. Debug.Log("用户数据已保存");
  224. }
  225. private void ClearUserData()
  226. {
  227. PlayerPrefs.DeleteKey(PLAYER_PREFS_TOKEN);
  228. PlayerPrefs.DeleteKey(PLAYER_PREFS_USER_ID);
  229. PlayerPrefs.DeleteKey(PLAYER_PREFS_USERNAME);
  230. PlayerPrefs.DeleteKey(PLAYER_PREFS_EMAIL);
  231. PlayerPrefs.DeleteKey(PLAYER_PREFS_STUDY_ABILITY);
  232. PlayerPrefs.DeleteKey(PLAYER_PREFS_CURRENT_LEVEL);
  233. PlayerPrefs.DeleteKey(PLAYER_PREFS_EXPERIENCE);
  234. PlayerPrefs.Save();
  235. Debug.Log("用户数据已清除");
  236. }
  237. private void EnterGame()
  238. {
  239. Debug.Log("进入菜单场景...");
  240. SceneManager.LoadScene(menuSceneName);
  241. }
  242. public UserData GetCurrentUser()
  243. {
  244. return currentUser;
  245. }
  246. public int GetStudyAbility()
  247. {
  248. return currentUser == null ? 1 : Mathf.Max(1, currentUser.studyAbility);
  249. }
  250. public void SetStudyAbility(int ability)
  251. {
  252. if (currentUser != null)
  253. {
  254. currentUser.studyAbility = ability;
  255. SaveUserData(currentUser);
  256. }
  257. }
  258. public void SetProgress(int studyAbility, int currentLevel, int experience)
  259. {
  260. if (currentUser != null)
  261. {
  262. currentUser.studyAbility = Mathf.Max(1, studyAbility);
  263. currentUser.currentLevel = Mathf.Max(1, currentLevel);
  264. currentUser.experience = Mathf.Max(0, experience);
  265. SaveUserData(currentUser);
  266. }
  267. }
  268. public bool IsGuest()
  269. {
  270. return currentUser != null && currentUser.userId == -1;
  271. }
  272. }