using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; using UnityEngine.Networking; using System.Text.RegularExpressions; using DG.Tweening; using Newtonsoft.Json; using JCUnityLib; using JCUnityLib.UI; using Newtonsoft.Json.Linq; /* 注册界面 */ public class RegisterView : MonoBehaviour { [SerializeField] GameObject registerContainer; [SerializeField] GameObject improveContainer; [SerializeField] GameObject registerInUser; [SerializeField] GameObject registerInPWD1; [SerializeField] GameObject registerInPWD2; [SerializeField] GameObject registerInEmail; [SerializeField] GameObject registerInPhone; [SerializeField] GameObject registerInCaptcha; [SerializeField] GameObject registerInNickname; [SerializeField] GameObject registerInGender; [SerializeField] GameObject registerInBirthday; [SerializeField] GameObject registerInLocation; [SerializeField] GameObject btnNext; [SerializeField] GameObject btnSave; [SerializeField] GameObject lineTip; [SerializeField] GameObject agreenment; [SerializeField] GameObject passwordTip; [SerializeField] Button SendBtn; [SerializeField] Text SendBtnText; InputField _inputRelateAccount; string sendCodeAccount; InputField _inputValidateCode; //状态记录 public int captcha_Register = -222222222; public string captcha_Register_str = ""; void OnEnable() { InitPage(); //弹出协议,不同意则退出注册 AgreementPopup agreementPopup = transform.parent.Find("AgreementPopup").GetComponent(); agreementPopup.onDisagree = () => { agreementPopup.onDisagree = null; GameObject.FindObjectOfType().showLoginView(); }; agreementPopup.gameObject.SetActive(true); } void Start() { InitInputLimit(); //把账户视为手机号或者邮箱 _inputRelateAccount = GetGameObjectInputField(registerInUser); _inputValidateCode = GetGameObjectInputField(registerInPhone); if (CommonConfig.serverIndex == 0) { //国内使用手机注册 SetLoginValidateType(LoginValidateType.Phone); } else { //国外使用邮箱注册 SetLoginValidateType(LoginValidateType.Email); } SendBtnText.text = TextAutoLanguage2.GetTextByKey("common_send"); } void InitInputLimit() { GameObject[] inputNodes = {registerInPWD1, registerInPWD2}; foreach (var inputNode in inputNodes) { InputField inputField = GetInputField(inputNode); inputField.onValueChanged.AddListener(delegate(string text) { Match match = new Regex("[^A-Za-z0-9]").Match(text); if (match.Success) { inputField.text = text.Replace(match.Value, ""); } //if (_LoginValidateType == LoginValidateType.Email) //{ // Match matchEmail = new Regex("^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$").Match(text); // if (matchEmail.Success) // { // inputField.text = text.Replace(matchEmail.Value, ""); // } //} //else { // Match match = new Regex("[^A-Za-z0-9]").Match(text); // if (match.Success) // { // inputField.text = text.Replace(match.Value, ""); // } //} }); } } void InitPage(bool isNext = false) { registerContainer.SetActive(!isNext); //registerInUser.SetActive(!isNext); //registerInPWD1.SetActive(!isNext); //registerInPWD2.SetActive(!isNext); //registerInPhone.SetActive(!isNext); //registerInCaptcha.SetActive(!isNext); btnNext.SetActive(!isNext); agreenment.SetActive(!isNext); //var btnNextTF = btnNext.transform as RectTransform; //var btnNextAP = btnNextTF.anchoredPosition; //btnNextAP.y = -540; //btnNextTF.anchoredPosition = btnNextAP; //registerInEmail.SetActive(!isNext && CommonConfig.serverIndex == 1); //registerInPhone.SetActive(!isNext && CommonConfig.serverIndex == 0); //if (CommonConfig.banBindRelateAccount) //{ // registerInEmail.SetActive(false); // registerInPhone.SetActive(false); //} //lineTip.SetActive(registerInEmail.activeSelf && registerInPhone.activeSelf); //if (registerInEmail.activeSelf) btnNextAP.y -= 14; //if (registerInPhone.activeSelf) btnNextAP.y -= 14; improveContainer.SetActive(isNext); //registerInNickname.SetActive(isNext); //registerInGender.SetActive(isNext); //registerInBirthday.SetActive(isNext); //registerInLocation.SetActive(isNext); btnSave.SetActive(isNext); if (isNext) { GetLocation(); } else { ChnageCaptcha(); } } InputField GetInputField(GameObject inputNode) { return inputNode.transform.Find("InputField").GetComponent(); } InputField GetGameObjectInputField(GameObject inputNode) { return inputNode.transform.Find("GameObject/InputField").GetComponent(); } public void ChnageCaptcha() { StartCoroutine(CaptchaController.Instance.GetCaptcha( registerInCaptcha.transform.Find("GameObject/Mask/CodeImage").GetComponent(), (code) => { captcha_Register_str = code.ToString(); } )); //captcha_Register_str = CaptchaController.Instance.GetCaptchaV2(registerInCaptcha.transform.Find("GameObject/Mask/CodeImage").GetComponent()); } string _bindingEmail = ""; public void OnClick_BindEmail() { RelateValidateView relateValidateView = Instantiate(SceneResourceManager.Instance.GetPrefab("RelateValidateView")) .GetComponent(); CanvasUtils.PlusSortOrder(gameObject.GetComponentInParent().gameObject, relateValidateView.gameObject, 1); relateValidateView.InitForEmail2(); relateValidateView.onValidateSuccess = (a, b, c) => { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByKey("RelateValidateView-pass1")); relateValidateView.CloseView(); GetInputField(registerInEmail).text = _bindingEmail = a; }; } string _bindingPhone = ""; //public void OnClick_BindPhone() //{ // RelateValidateView relateValidateView = // Instantiate(SceneResourceManager.Instance.GetPrefab("RelateValidateView")) // .GetComponent(); // CanvasUtils.PlusSortOrder(gameObject.GetComponentInParent().gameObject, relateValidateView.gameObject, 1); // relateValidateView.InitForPhone2(); // relateValidateView.onValidateSuccess = (a, b, c) => { // PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByKey("RelateValidateView-pass1")); // relateValidateView.CloseView(); // GetInputField(registerInPhone).text = _bindingPhone = a; // }; //} public enum LoginValidateType { Email, Phone } private LoginValidateType _LoginValidateType = LoginValidateType.Email; public void SetLoginValidateType(LoginValidateType _loginValidateType) { _LoginValidateType = _loginValidateType; LanguageEnum languageEnum = TextAutoLanguage2.GetLanguage(); if (_LoginValidateType == LoginValidateType.Email) { _inputRelateAccount.contentType = InputField.ContentType.EmailAddress; _inputRelateAccount.characterLimit = 32; registerInUser.transform.Find("Text").GetComponent().text = TextAutoLanguage2.GetTextByKey("register_email2"); _inputRelateAccount.transform.Find("Placeholder").GetComponent().text = TextAutoLanguage2.GetTextByKey("RelateValidateView-email1"); //输入框文案 registerInPhone.transform.Find("Text").GetComponent().text = TextAutoLanguage2.GetTextByKey("RelateValidateView-email001"); //输入框提示 Text _tempCodeText = _inputValidateCode.transform.Find("Placeholder").GetComponent(); //_tempCodeText.fontSize = languageEnum == LanguageEnum.Chinese ? 24 : 20; _tempCodeText.text = TextAutoLanguage2.GetTextByKey("RelateValidateView-email201"); //RelateValidateView-email2 //发送按钮 registerInPhone.transform.Find("GameObject/Send/Text").GetComponent().text = TextAutoLanguage2.GetTextByKey("common_send"); //RelateValidateView-email3 } else if (_LoginValidateType == LoginValidateType.Phone) { _inputRelateAccount.contentType = InputField.ContentType.IntegerNumber; _inputRelateAccount.characterLimit = 11; registerInUser.transform.Find("Text").GetComponent().text = TextAutoLanguage2.GetTextByKey("register_phone2"); _inputRelateAccount.transform.Find("Placeholder").GetComponent().text = TextAutoLanguage2.GetTextByKey("RelateValidateView-phone1"); registerInPhone.transform.Find("Text").GetComponent().text = TextAutoLanguage2.GetTextByKey("RelateValidateView-phone0"); Text _tempCodeText = _inputValidateCode.transform.Find("Placeholder").GetComponent(); //_tempCodeText.fontSize = languageEnum == LanguageEnum.Chinese ? 24 : 20; _tempCodeText.text = TextAutoLanguage2.GetTextByKey("RelateValidateView-phone2"); //RelateValidateView-phone2 registerInPhone.transform.Find("GameObject/Send/Text").GetComponent().text = TextAutoLanguage2.GetTextByKey("common_send");//RelateValidateView-phone3 } } [SerializeField] GameObject _prefabValidateJigsawView; static long _throttlerBtnSend_phone_reg = 0; long _throttlerBtnSend_reg { get { return _throttlerBtnSend_phone_reg; } set { _throttlerBtnSend_phone_reg = value; } } public void OnClick_SendCode() { if (_LoginValidateType == LoginValidateType.Email) { string email = _inputRelateAccount.text; sendCodeAccount = email; if (!ValidateHelper.IsEmail(email)) { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByKey("RelateValidateView-a0")); return; } } else if (_LoginValidateType == LoginValidateType.Phone) { //记录一个发送code时候的号码,下一步时候判定一下是否同一个号码,不是的话提示重新发送,和检测一下合理性 string phone = _inputRelateAccount.text; sendCodeAccount = phone; if (!ValidateHelper.IsMobilePhone(phone)) { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByKey("RelateValidateView-a1")); return; } } //验证码再次发送需要间隔60秒 long gapTime = TimeUtils.GetTimestamp() - _throttlerBtnSend_reg; long maxTime = 60 * 1000; if (gapTime < maxTime) { long second = (maxTime - gapTime) / 1000; if (second <= 0) second = 1; PopupMgr.ins.ShowTip(string.Format(TextAutoLanguage2.GetTextByKey("RelateValidateView-a2"), second)); return; } //打开拼图验证 GameObject gameObjectValidateJigsawView = Instantiate(_prefabValidateJigsawView); //CanvasUtils.PlusSortOrder(gameObject, gameObjectValidateJigsawView, 1); ValidateJigsawView validateJigsawView = gameObjectValidateJigsawView.GetComponent(); validateJigsawView.onComplete = RequestSendValidateCode; validateJigsawView.SetTextLabel(TextAutoLanguage2.GetTextByKey("ValidateJigsawView_label")); validateJigsawView.SetTextTip(TextAutoLanguage2.GetTextByKey("ValidateJigsawView_tip")); validateJigsawView.SetTextOK(TextAutoLanguage2.GetTextByKey("ValidateJigsawView_ok")); } bool bSend = false; private void Update() { if (bSend) { //验证码再次发送需要间隔60秒 if (SendBtn.IsInteractable()) SendBtn.interactable = false; long gapTime = TimeUtils.GetTimestamp() - _throttlerBtnSend_reg; long maxTime = 60 * 1000; long second = (maxTime - gapTime) / 1000; if (second <= 0) second = 0; SendBtnText.text = second + " S"; if (second == 0) { bSend = false; SendBtnText.text = TextAutoLanguage2.GetTextByKey("common_send"); } } else { //停止计时 if (!SendBtn.IsInteractable()) SendBtn.interactable = true; } } void RequestSendValidateCode() { //限流时间点记录 _throttlerBtnSend_reg = TimeUtils.GetTimestamp(); bSend = true; //请求服务端接口 if (_LoginValidateType == LoginValidateType.Email) { string email = _inputRelateAccount.text; StartCoroutine(EmailValidateController.Instance.SendEmailValidateCode(email, (res) => { if (res.code == 0) PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("RelateValidateView-b0")); else PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("RelateValidateView-b1")); })); } else if (_LoginValidateType == LoginValidateType.Phone) { string phone = _inputRelateAccount.text; StartCoroutine(PhoneValidateController.Instance.SendPhoneValidateCode(phone, (res) => { if (res.code == 0) PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("RelateValidateView-b2")); else PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("RelateValidateView-b3")); })); } } Throttler _throttlerBtnSubmit = new Throttler(3000); public void OnClick_BtnSubmit() { if (_LoginValidateType == LoginValidateType.Email) { string email = _inputRelateAccount.text; if (!ValidateHelper.IsEmail(email)) { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByKey("RelateValidateView-a0")); return; } } else if (_LoginValidateType == LoginValidateType.Phone) { string phone = _inputRelateAccount.text; if (!ValidateHelper.IsMobilePhone(phone)) { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByKey("RelateValidateView-a1")); return; } } string code = _inputValidateCode.text; if (code.Length != 6) { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByKey("RelateValidateView-a3")); return; } if (!_throttlerBtnSubmit.CanPass()) { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("操作过于频繁")); return; } RequestSubmit(); } void RequestSubmit() { if (_LoginValidateType == LoginValidateType.Email) { string email = _inputRelateAccount.text; string code = _inputValidateCode.text; StartCoroutine(EmailValidateController.Instance.ValidateEmail(email, code, (res) => { if (res.code == 0) { JObject data = res.data as JObject; string arg0 = data.Value("email"); long arg1 = data.Value("timestamp"); string arg2 = data.Value("sign"); Debug.Log($"邮箱验证成功 {arg0} {arg1} {arg2}"); _bindingEmail = arg0; RegisterNext(); } else PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByKey("RelateValidateView-c0")); })); } else if (_LoginValidateType == LoginValidateType.Phone) { string phone = _inputRelateAccount.text; string code = _inputValidateCode.text; StartCoroutine(PhoneValidateController.Instance.ValidatePhone(phone, code, (res) => { if (res.code == 0) { JObject data = res.data as JObject; string arg0 = data.Value("phone"); long arg1 = data.Value("timestamp"); string arg2 = data.Value("sign"); Debug.Log($"手机验证成功 {arg0} {arg1} {arg2}"); _bindingPhone = arg0; RegisterNext(); } else PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByKey("RelateValidateView-c1")); })); } } private string usrRecord = ""; private string pwdRecord = ""; JCUnityLib.Throttler throttlerRegisterNext = new JCUnityLib.Throttler(2000); public void onDetectPassword() { InputField pwd1 = GetInputField(registerInPWD1); InputField pwd2 = GetInputField(registerInPWD2); passwordTip.SetActive(pwd1.text != pwd2.text); } void TestNav() { InputField user = GetGameObjectInputField(registerInUser); InputField pwd1 = GetInputField(registerInPWD1); usrRecord = user.text; pwdRecord = pwd1.text; InputField nickname = GetInputField(registerInNickname); if (_LoginValidateType == LoginValidateType.Email) { //邮箱裁剪一下 string[] arry = usrRecord.Trim().Split("@"); nickname.text = arry[0]; } else { //手机直接设置电话号码 nickname.text = usrRecord; } InitPage(true); LoginView.ins.FillLoginInput(usrRecord, pwdRecord); } public void RegisterNext() { //TestNav(); //return; //检测是否绑定手机号和邮箱号,没有进行绑定。绑定后再调用此流程 if (!CommonConfig.banBindRelateAccount) { if (string.IsNullOrEmpty(_bindingEmail) && string.IsNullOrEmpty(_bindingPhone)) { OnClick_BtnSubmit(); return; } } //这里变成手机号或者邮箱号了 if (_LoginValidateType == LoginValidateType.Email) { if (!ValidateHelper.IsEmail(_inputRelateAccount.text)) { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByKey("RelateValidateView-a0")); return; } } else if (_LoginValidateType == LoginValidateType.Phone) { if (!ValidateHelper.IsMobilePhone(_inputRelateAccount.text)) { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByKey("RelateValidateView-a1")); return; } } //更换账户后请重新发送验证码 if (sendCodeAccount != _inputRelateAccount.text) { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByKey("RelateValidateView-a11")); return; } //if (user.text.Length < 6) { // PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("账号长度至少6位")); // return; //} InputField pwd1 = GetInputField(registerInPWD1); if (pwd1.text.Length < 6) { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("密码长度至少6位")); return; } InputField pwd2 = GetInputField(registerInPWD2); if (pwd1.text != pwd2.text) { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("两次输入的密码不一致")); passwordTip.SetActive(true); return; } // if (!CommonConfig.banBindRelateAccount) // { // if (string.IsNullOrEmpty(_bindingEmail) && string.IsNullOrEmpty(_bindingPhone)) { // if (CommonConfig.serverIndex == 0) PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("至少需要绑定邮箱号或者手机号")); // else PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("尚未绑定邮箱号")); // return; // } // } //if (registerInEmail.activeSelf && string.IsNullOrEmpty(_bindingEmail)) { // PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("尚未绑定邮箱号")); // return; //} //if (registerInPhone.activeSelf && string.IsNullOrEmpty(_bindingPhone)) { // PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("尚未绑定手机号")); // return; //} InputField captcha = GetGameObjectInputField(registerInCaptcha); if (!captcha.text.Equals(captcha_Register_str)) { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("验证码错误")); return; } if (!AgreenmentOption.ins.IsAgreementChecked()) { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("请阅读并同意App协议")); return; } if (throttlerRegisterNext.CanPass() == false) { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("操作过于频繁")); return; } usrRecord = _inputRelateAccount.text; pwdRecord = pwd1.text; if (CommonConfig.banBindRelateAccount) { StartCoroutine(LoginController.Instance.Register( usrRecord, pwdRecord, (res) => { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey(res.msg)); if (res.code == 0) { //设置默认名字,为当前注册的账户信息 InputField nickname = GetInputField(registerInNickname); if (_LoginValidateType == LoginValidateType.Email) { //邮箱裁剪一下 //string[] arry = usrRecord.Trim().Split("@"); //nickname.text = arry[0]; nickname.text = usrRecord; } else { //手机直接设置电话号码 nickname.text = usrRecord; } InitPage(true); //前往完善用户信息 LoginView.ins.FillLoginInput(usrRecord, pwdRecord); } } )); return; } StartCoroutine(LoginController.Instance.Register2( usrRecord, pwdRecord, _bindingEmail, _bindingPhone, (res) => { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey(res.msg)); if (res.code == 0) { //设置默认名字,为当前注册的账户信息 InputField nickname = GetInputField(registerInNickname); if (_LoginValidateType == LoginValidateType.Email) { //邮箱裁剪一下 //string[] arry = usrRecord.Trim().Split("@"); nickname.text = usrRecord; } else { //手机直接设置电话号码 nickname.text = usrRecord; } InitPage(true); //前往完善用户信息 LoginView.ins.FillLoginInput(usrRecord, pwdRecord); } } )); } JCUnityLib.Throttler throttlerRegisterSave = new JCUnityLib.Throttler(2000); public void RegisterSave() { InputField nickname = GetInputField(registerInNickname); string text_nickname = nickname.text.Trim(); if (text_nickname.Length == 0) { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("请输入游戏昵称")); return; } int gender = 0; Transform toggleGroup = registerInGender.transform.Find("ToggleGroup"); for (int i = 0; i < toggleGroup.childCount; i++) { if (toggleGroup.GetChild(i).GetComponent().isOn) { gender = i == 0 ? 1 : 2; break; } } InputField birthday = GetInputField(registerInBirthday); string text_birthday = birthday.text; if (text_birthday.Length != 10) { text_birthday = "2000-01-01"; // PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("未填写出生日期")); // return; } InputField location = GetInputField(registerInLocation); if (location.text.Length == 0) { countryCode = ""; stateCode = ""; cityCode = ""; // PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("未填写所在地区")); // return; } if (!AgreenmentOption.ins.IsAgreementChecked()) { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("请阅读并同意App协议")); return; } if (throttlerRegisterSave.CanPass() == false) { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("操作过于频繁")); return; } StartCoroutine(LoginController.Instance.CompleteUserInfo( usrRecord, pwdRecord, text_nickname, gender, text_birthday, countryCode, stateCode, cityCode ,(res) => { PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey(res.msg)); if (res.code == 0) { GameObject.FindObjectOfType().showLoginView(); } } )); } #region Picker [SerializeField] GameObject datePickerPrefab; public void OpenDatePicker() { GameObject o = GameObject.Instantiate(datePickerPrefab); //o.GetComponentInChildren().onEnter += (JC.Unity.Picker.DatePickerGroup picker) => { // GetInputField(registerInBirthday).text = picker.GetSelectDateStr(); //}; o.GetComponentInChildren().onEnter += (DatePickerGroupNew picker) => { GetInputField(registerInBirthday).text = picker.GetSelectDateStr(); }; } [SerializeField] GameObject locationPickerPrefab; private string countryCode = "", stateCode = "", cityCode = ""; public void OpenLocationPicker() { // GameObject o = GameObject.Instantiate(locationPickerPrefab); // o.GetComponentInChildren().onEnter += (JC.Unity.Picker.LocationInfo info) => { // countryCode = info.GetCountryRegion().Item2; // stateCode = info.GetState().Item2; // cityCode = info.GetCity().Item2; // GetInputField(registerInLocation).text = // info.GetCountryRegion().Item1 + " " + // info.GetState().Item1 + " " + // info.GetCity().Item1; // }; //2022-12-6 gps获取地理位置 GetLocation(); } void GetLocation() { try { System.Action eOnAgree = () => { GPSTool.GetAddress((address) => { if (address != null) { countryCode = address[0]; stateCode = address[1]; cityCode = address[2]; GetInputField(registerInLocation).text = countryCode + " " + stateCode + " " + cityCode; } }); }; if (!HomeView.ShowProminentBeforeConnectBLE(eOnAgree)) eOnAgree.Invoke(); } catch (System.Exception e) { Debug.LogError(e); } } #endregion }