RegisterUIController.cs 9.6 KB

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