UserInfoController.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. using Newtonsoft.Json;
  2. using System.Collections.Generic;
  3. using System.Net.Mail;
  4. using UnityEngine;
  5. using UnityEngine.SceneManagement;
  6. using UnityEngine.UIElements;
  7. /* 这个controller用来控制用户修改注册信息代码
  8. * 本文件大量代码从RegisterUIController.cs复制过来,任何修复需要同时考虑同步
  9. */
  10. public class UserInfoController : MonoBehaviour
  11. {
  12. private TextField userName, password, mobile, email;
  13. private Button confirm, cancel, logout, deleteAccount;
  14. private Label errorMsgLabel;
  15. private VisualElement feedback;
  16. private string errorText = null; // 错误信息汇总
  17. private string deleteAlertMsg;
  18. private Dictionary<string, string> errorMessageDict = new();
  19. // Start is called once before the first execution of Update after the MonoBehaviour is created
  20. void OnEnable()
  21. {
  22. var root = GetComponent<UIDocument>().rootVisualElement;
  23. userName = root.Q<TextField>("name");
  24. password = root.Q<TextField>("password");
  25. mobile = root.Q<TextField>("mobile");
  26. email = root.Q<TextField>("email");
  27. confirm = root.Q<VisualElement>("confirmArea").Q<Button>("confirm");
  28. cancel = root.Q<VisualElement>("confirmArea").Q<Button>("cancel");
  29. errorMsgLabel = root.Q<Label>("error_msg");
  30. logout = root.Q<Button>("logout");
  31. deleteAccount = root.Q<Button>("delete_account");
  32. feedback = root.Q<VisualElement>("feedback");
  33. logout.clicked += LogoutClick;
  34. confirm.clicked += ConfirmClick;
  35. cancel.clicked += CancelClick;
  36. errorMessageDict.Clear();
  37. InitSetting();
  38. UserInfoLoad();
  39. feedback.RegisterCallback<ClickEvent>(ev => FeedbackClick());
  40. }
  41. // Update is called once per frame
  42. //void Update()
  43. //{
  44. //}
  45. // 绑定confirm按键按下事件
  46. void ConfirmClick()
  47. {
  48. Debug.Log("User info update page confirm btn clicked.");
  49. if (ContentCheckBeforePost())
  50. {
  51. // POST数据到服务器
  52. string url = "/api/user/update/";
  53. Dictionary<string, string> formData = new();
  54. WWWForm form = new();
  55. form.AddField("UUID", EnviromentSetting.UUID);
  56. form.AddField("mobile_number", mobile.text);
  57. form.AddField("email", email.text);
  58. form.AddField("password", password.text);
  59. form.AddField("user_name", userName.text);
  60. form.AddField("user_id", UserProperty.userId);
  61. form.AddField("client_language", EnviromentSetting.languageCode);
  62. StartCoroutine(WebController.PostRequest(url, form, callback: ConfirmClickCallback));
  63. }
  64. }
  65. void ConfirmClickCallback(string json)
  66. {
  67. // TODO 等返回信息确认后,验证逻辑
  68. var data = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
  69. if (data != null && data["status"].ToString() == "success")
  70. {
  71. var user_info = JsonConvert.DeserializeObject<Dictionary<string, string>>(data["user_info"].ToString());
  72. UserProperty.name = user_info["user_name"];
  73. UserProperty.coin = int.Parse(user_info["coin"]);
  74. UserProperty.mobile = user_info["mobile"];
  75. UserProperty.email = user_info["email"];
  76. UserProperty.level = user_info["level"];
  77. if (UserProperty.level == "pro") { EnviromentSetting.maxDogQty = 3; }
  78. UserProperty.isRegUser = bool.Parse(user_info["isRegUser"]);
  79. Debug.Log("Updated user id: " + UserProperty.userId);
  80. string msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "update_user_info_success", EnviromentSetting.languageCode });
  81. MessageBoxController.ShowMessage(msg, CancelClick);
  82. }
  83. else if (data != null && data["status"].ToString() == "error")
  84. {
  85. // 更新用户信息失败
  86. errorText = string.Empty; // 清空
  87. if (data["message"].ToString() == "duplicated mobile phone")
  88. {
  89. errorText += errorMessageDict["duplicated_mobile"];
  90. errorText += "<br>";
  91. }
  92. if (data["message"].ToString() == "duplicated email")
  93. {
  94. errorText += errorMessageDict["duplicated_email"];
  95. errorText += "<br>";
  96. }
  97. errorMsgLabel.text = errorText;
  98. }
  99. else
  100. {
  101. }
  102. }
  103. // 绑定取消按键,关闭用户信息更新菜单
  104. void CancelClick()
  105. {
  106. var uiPlaceholder = GameObject.Find("UI Placeholder");
  107. if (uiPlaceholder != null)
  108. {
  109. var thisUI = uiPlaceholder.transform.Find("User Info").gameObject;
  110. var vamUI = uiPlaceholder.transform.Find("VoiceAndMenu").gameObject;
  111. thisUI.SetActive(false);
  112. vamUI.SetActive(true);
  113. }
  114. }
  115. void FeedbackClick()
  116. {
  117. var uiPlaceholder = GameObject.Find("UI Placeholder");
  118. if (uiPlaceholder != null)
  119. {
  120. var FeedbackUI = uiPlaceholder.transform.Find("Feedback").gameObject;
  121. var UserInfoUI = uiPlaceholder.transform.Find("User Info").gameObject;
  122. FeedbackUI.SetActive(true);
  123. UserInfoUI.SetActive(false);
  124. }
  125. }
  126. // 初始化语言和显示设定
  127. void InitSetting()
  128. {
  129. // 设置 shopping UI界面里面label和按键的语言显示
  130. string textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "registerUI", "button", "confirm", EnviromentSetting.languageCode });
  131. confirm.text = textValue;
  132. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "registerUI", "button", "cancel", EnviromentSetting.languageCode });
  133. cancel.text = textValue;
  134. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "registerUI", "label", "name", EnviromentSetting.languageCode });
  135. userName.label = textValue;
  136. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "registerUI", "label", "password", EnviromentSetting.languageCode });
  137. password.label = textValue;
  138. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "registerUI", "label", "mobile", EnviromentSetting.languageCode });
  139. mobile.label = textValue;
  140. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "registerUI", "label", "email", EnviromentSetting.languageCode });
  141. email.label = textValue;
  142. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "registerUI", "error_msg", "duplicated_mobile", EnviromentSetting.languageCode });
  143. errorMessageDict.Add("duplicated_mobile", textValue);
  144. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "registerUI", "error_msg", "user_name_is_empty", EnviromentSetting.languageCode });
  145. errorMessageDict.Add("user_name_is_empty", textValue);
  146. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "registerUI", "error_msg", "password_too_short", EnviromentSetting.languageCode });
  147. errorMessageDict.Add("password_too_short", textValue);
  148. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "registerUI", "error_msg", "mobile_is_empty", EnviromentSetting.languageCode });
  149. errorMessageDict.Add("mobile_is_empty", textValue);
  150. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "registerUI", "error_msg", "email_is_empty", EnviromentSetting.languageCode });
  151. errorMessageDict.Add("email_is_empty", textValue);
  152. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "registerUI", "error_msg", "email_format_wrong", EnviromentSetting.languageCode });
  153. errorMessageDict.Add("email_format_wrong", textValue);
  154. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "registerUI", "error_msg", "duplicated_email", EnviromentSetting.languageCode });
  155. errorMessageDict.Add("duplicated_email", textValue);
  156. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "registerUI", "button", "logout", EnviromentSetting.languageCode });
  157. logout.text = textValue;
  158. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "registerUI", "button", "delete_account", EnviromentSetting.languageCode });
  159. deleteAccount.text = textValue;
  160. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "registerUI", "button", "logout", EnviromentSetting.languageCode });
  161. logout.text = textValue;
  162. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "registerUI", "alert_message", "delete_account", EnviromentSetting.languageCode });
  163. deleteAlertMsg = textValue;
  164. }
  165. // 清空TextField 内容
  166. void UserInfoLoad()
  167. {
  168. userName.value = UserProperty.name;
  169. //password.value = string.Empty;
  170. mobile.value = UserProperty.mobile;
  171. email.value = UserProperty.email;
  172. errorMsgLabel.text = string.Empty;
  173. }
  174. void LogoutClick()
  175. {
  176. PlayerPrefs.DeleteAll();
  177. SceneManager.LoadScene("Login");
  178. }
  179. #region 格式检测
  180. // POST之前的输入内容检测
  181. private bool ContentCheckBeforePost()
  182. {
  183. errorText = string.Empty; // 清空
  184. if (string.IsNullOrWhiteSpace(userName.value))
  185. {
  186. errorText += errorMessageDict["user_name_is_empty"];
  187. errorText += "<br>";
  188. }
  189. if (password.value.Length < 8)
  190. {
  191. errorText += errorMessageDict["password_too_short"];
  192. errorText += "<br>";
  193. }
  194. if (EnviromentSetting.languageCode == "zh-cn") // 中文检测内容
  195. {
  196. if (string.IsNullOrWhiteSpace(mobile.value))
  197. {
  198. errorText += errorMessageDict["mobile_is_empty"];
  199. errorText += "<br>";
  200. }
  201. }
  202. else // 非中文检测内容
  203. {
  204. if (string.IsNullOrWhiteSpace(email.value))
  205. {
  206. errorText += errorMessageDict["email_is_empty"];
  207. errorText += "<br>";
  208. }
  209. else if (!IsValidEmail(email.value))
  210. {
  211. errorText += errorMessageDict["email_format_wrong"];
  212. errorText += "<br>";
  213. }
  214. }
  215. if (string.IsNullOrWhiteSpace(errorText))
  216. {
  217. return true;
  218. }
  219. else
  220. {
  221. errorMsgLabel.text = errorText;
  222. return false;
  223. }
  224. }
  225. // email 格式检测
  226. private bool IsValidEmail(string email)
  227. {
  228. try
  229. {
  230. var addr = new MailAddress(email);
  231. return addr.Address == email;
  232. }
  233. catch
  234. {
  235. return false;
  236. }
  237. }
  238. #endregion
  239. }