ResetUIController.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. using Newtonsoft.Json;
  2. using System.Collections.Generic;
  3. using System.Net.Mail;
  4. using UnityEngine;
  5. using UnityEngine.UIElements;
  6. /* 本文件控制Reset UI document
  7. * 1. 显示和关闭Reset UI
  8. * 2. 显示和隐藏输入框
  9. * 3. 提交数据到服务器
  10. * 4. 显示错误信息
  11. */
  12. public class ResetUIController : MonoBehaviour
  13. {
  14. // Start is called once before the first execution of Update after the MonoBehaviour is created
  15. private Label message, errMsg;
  16. private TextField email, mobile, verification, password;
  17. private Button submit, cancel;
  18. private int condition = 0; // 0: 中文初始, 1: 其他语言初始, 2: 输入验证码和新的密码
  19. private Dictionary<string, string> errorMessageDict = new();
  20. private string errorText = string.Empty; // 错误信息汇总
  21. void OnEnable()
  22. {
  23. var root = GetComponent<UIDocument>().rootVisualElement;
  24. message = root.Q<Label>("message");
  25. email = root.Q<TextField>("email");
  26. mobile = root.Q<TextField>("mobile");
  27. verification = root.Q<TextField>("verification");
  28. password = root.Q<TextField>("password");
  29. submit = root.Q<Button>("submit");
  30. cancel = root.Q<Button>("cancel");
  31. errMsg = root.Q<Label>("error_msg");
  32. InitSetting();
  33. }
  34. // Update is called once per frame
  35. void Update()
  36. {
  37. FormatCheck();
  38. errMsg.text = errorText;
  39. }
  40. // 初始化语言和显示设定
  41. void InitSetting()
  42. {
  43. // 设置 shopping UI界面里面label和按键的语言显示
  44. string textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "resetUI", "button", "submit", EnviromentSetting.languageCode });
  45. submit.text = textValue;
  46. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "resetUI", "button", "cancel", EnviromentSetting.languageCode });
  47. cancel.text = textValue;
  48. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "resetUI", "text_field", "mobile", EnviromentSetting.languageCode });
  49. mobile.label = textValue;
  50. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "resetUI", "text_field", "email", EnviromentSetting.languageCode });
  51. email.label = textValue;
  52. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "resetUI", "text_field", "verification", EnviromentSetting.languageCode });
  53. verification.label = textValue;
  54. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "resetUI", "text_field", "password", EnviromentSetting.languageCode });
  55. password.label = textValue;
  56. errorMessageDict.Clear();
  57. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "resetUI", "error_msg", "password_too_short", EnviromentSetting.languageCode });
  58. errorMessageDict.Add("password_too_short", textValue);
  59. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "resetUI", "error_msg", "cannot_find_account", EnviromentSetting.languageCode });
  60. errorMessageDict.Add("cannot_find_account", textValue);
  61. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "resetUI", "error_msg", "wrong_verification_code", EnviromentSetting.languageCode });
  62. errorMessageDict.Add("wrong_verification_code", textValue);
  63. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "resetUI", "error_msg", "email_format_wrong", EnviromentSetting.languageCode });
  64. errorMessageDict.Add("email_format_wrong", textValue);
  65. cancel.clicked += CancelClick;
  66. submit.clicked += SubmitClick;
  67. if (EnviromentSetting.languageCode == "zh-cn")
  68. {
  69. condition = 0;
  70. }
  71. else
  72. {
  73. condition = 1;
  74. }
  75. ConditionSetting(condition);
  76. }
  77. // 根据condition的值来显示不同的UI
  78. void ConditionSetting(int conditionValue)
  79. {
  80. switch (conditionValue)
  81. {
  82. case 0:
  83. string textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "resetUI", "label", "message 0", EnviromentSetting.languageCode });
  84. message.text = textValue;
  85. email.style.display = DisplayStyle.None;
  86. mobile.style.display = DisplayStyle.Flex;
  87. verification.style.display = DisplayStyle.None;
  88. password.style.display = DisplayStyle.None;
  89. submit.SetEnabled(false);
  90. break;
  91. case 1:
  92. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "resetUI", "label", "message 1", EnviromentSetting.languageCode });
  93. message.text = textValue;
  94. email.style.display = DisplayStyle.Flex;
  95. mobile.style.display = DisplayStyle.None;
  96. verification.style.display = DisplayStyle.None;
  97. password.style.display = DisplayStyle.None;
  98. submit.SetEnabled(false);
  99. break;
  100. case 2:
  101. textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "resetUI", "label", "message 2", EnviromentSetting.languageCode });
  102. message.text = textValue;
  103. email.SetEnabled(false);
  104. mobile.SetEnabled(false);
  105. verification.style.display = DisplayStyle.Flex;
  106. password.style.display = DisplayStyle.Flex;
  107. submit.SetEnabled(false);
  108. break;
  109. //case 3:
  110. // textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "resetUI", "label", "message 3", EnviromentSetting.languageCode });
  111. // message.text = textValue;
  112. // email.SetEnabled(false);
  113. // mobile.SetEnabled(false);
  114. // verification.style.display = DisplayStyle.Flex;
  115. // password.style.display = DisplayStyle.None;
  116. // submit.SetEnabled(false);
  117. // break;
  118. //case 4:
  119. // textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "resetUI", "label", "message 4", EnviromentSetting.languageCode });
  120. // message.text = textValue;
  121. // email.SetEnabled(false);
  122. // mobile.SetEnabled(false);
  123. // verification.style.display = DisplayStyle.None;
  124. // password.style.display = DisplayStyle.Flex;
  125. // submit.SetEnabled(false);
  126. // break;
  127. }
  128. }
  129. void SubmitClick()
  130. {
  131. if (condition <= 1)
  132. {
  133. // 申请验证码阶段
  134. RequestVerificationCodePost();
  135. }
  136. else if (condition ==2)
  137. {
  138. // 输入验证码阶段和输入新密码阶段
  139. NewPassowrdRequest();
  140. }
  141. }
  142. void RequestVerificationCodePost()
  143. {
  144. // 申请验证码
  145. // POST数据到服务器
  146. string url = "/api/reset/password/step1/";
  147. Dictionary<string, string> formData = new();
  148. WWWForm form = new();
  149. form.AddField("UUID", EnviromentSetting.UUID);
  150. if (EnviromentSetting.languageCode == "zh-cn")
  151. {
  152. form.AddField("mobile", mobile.text);
  153. }
  154. else
  155. {
  156. form.AddField("email", email.text);
  157. }
  158. form.AddField("UUID", EnviromentSetting.UUID);
  159. form.AddField("language_code", EnviromentSetting.languageCode);
  160. StartCoroutine(WebController.PostRequest(url, form, callback: RequestVerificationCodeCallback));
  161. errorText = string.Empty;
  162. }
  163. void RequestVerificationCodeCallback(string json)
  164. {
  165. var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
  166. if (data != null && data["status"] == "success")
  167. {
  168. if (data["message"] == "verification sent")
  169. {
  170. // 发送验证码成功
  171. condition = 2;
  172. ConditionSetting(condition);
  173. }
  174. }
  175. else if (data != null && data["status"] == "error")
  176. {
  177. // 找不到对应的账户
  178. if (data["message"] == "cannot find account")
  179. {
  180. errorText += errorMessageDict["cannot_find_account"];
  181. }
  182. }
  183. }
  184. void NewPassowrdRequest()
  185. {
  186. // 检查验证码
  187. string url = "/api/reset/password/step2/";
  188. Dictionary<string, string> formData = new();
  189. WWWForm form = new();
  190. form.AddField("UUID", EnviromentSetting.UUID);
  191. if (EnviromentSetting.languageCode == "zh-cn")
  192. {
  193. form.AddField("mobile", mobile.text);
  194. }
  195. else
  196. {
  197. form.AddField("email", email.text);
  198. }
  199. form.AddField("UUID", EnviromentSetting.UUID);
  200. form.AddField("language_code", EnviromentSetting.languageCode);
  201. form.AddField("verification_code", verification.text);
  202. form.AddField("password", password.text);
  203. StartCoroutine(WebController.PostRequest(url, form, callback: NewPasswordCallback));
  204. errorText = string.Empty;
  205. }
  206. void NewPasswordCallback(string json)
  207. {
  208. var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
  209. if (data != null && data["status"] == "success")
  210. {
  211. string msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "resetUI", "label", "new_password_success", EnviromentSetting.languageCode });
  212. MessageBoxController.ShowMessage(msg, () => MaskTransitions.TransitionManager.Instance.LoadLevel("Home"));
  213. }
  214. else if (data != null && data["status"] == "error")
  215. {
  216. // 验证码错误
  217. if (data["message"] == "wrong verification code")
  218. {
  219. errorText += errorMessageDict["wrong_verification_code"];
  220. }
  221. }
  222. }
  223. void CancelClick()
  224. {
  225. var uiPlaceholder = GameObject.Find("Canvas Placeholder");
  226. if (uiPlaceholder != null)
  227. {
  228. var resetUI = uiPlaceholder.transform.Find("Reset Pasword").gameObject;
  229. var loginCanvas = uiPlaceholder.transform.Find("Login Canvas").gameObject;
  230. resetUI.SetActive(false);
  231. loginCanvas.SetActive(true);
  232. }
  233. }
  234. // 检查输入的内容是否为空,输入不为空的时候Submit按钮可用
  235. void FormatCheck()
  236. {
  237. switch (condition)
  238. {
  239. case 0:
  240. {
  241. if (mobile.value != "")
  242. {
  243. submit.SetEnabled(true);
  244. }
  245. else
  246. {
  247. submit.SetEnabled(false);
  248. }
  249. break;
  250. }
  251. case 1:
  252. {
  253. if (email.value != "" && IsValidEmail(email.text))
  254. {
  255. submit.SetEnabled(true);
  256. }
  257. else
  258. {
  259. submit.SetEnabled(false);
  260. }
  261. break;
  262. }
  263. case 2:
  264. {
  265. if (verification.value != "" && password.text.Length>=8)
  266. {
  267. submit.SetEnabled(true);
  268. }
  269. else
  270. {
  271. submit.SetEnabled(false);
  272. }
  273. break;
  274. }
  275. }
  276. }
  277. #region 格式验证区
  278. // email 格式检测
  279. private bool IsValidEmail(string email)
  280. {
  281. try
  282. {
  283. var addr = new MailAddress(email);
  284. return addr.Address == email;
  285. }
  286. catch
  287. {
  288. return false;
  289. }
  290. }
  291. #endregion
  292. }