黄学彪
2020-12-17 9f326f4000847e6167d8166fa2f6a66f53cb3734
ZigbeeApp/Shared/Phone/Common/Logic/HdlAccountLogic.cs
New file
@@ -0,0 +1,1206 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using Shared.Common;
namespace Shared.Phone
{
    /// <summary>
    /// 登陆界面的逻辑
    /// </summary>
    public class HdlAccountLogic
    {
        #region ■ 变量声明___________________________
        /// <summary>
        /// 登陆界面的逻辑
        /// </summary>
        private static HdlAccountLogic m_Current;
        /// <summary>
        /// 登陆界面的逻辑
        /// </summary>
        public static HdlAccountLogic Current
        {
            get
            {
                if (m_Current == null)
                {
                    m_Current = new HdlAccountLogic();
                }
                return m_Current;
            }
        }
        #endregion
        #region ■ 账号注册___________________________
        /// <summary>
        /// 注册账号,并返回已翻译的错误信息(返回null代表成功)
        /// </summary>
        /// <param name="i_account">手机号或者邮箱</param>
        /// <param name="i_password">密码</param>
        /// <param name="i_verifyCode">验证码</param>
        /// <returns></returns>
        public string RegisterAccount(string i_account, string i_password, string i_verifyCode)
        {
            string accountName = i_account.Contains("@") == true ? "memberEmail" : "memberPhone";
            var dicBody = new Dictionary<string, string>();
            dicBody["memberName"] = i_account;
            dicBody[accountName] = i_account;
            dicBody["loginPwd"] = i_password;
            dicBody["verifyCode"] = i_verifyCode;
            var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("smart-footstone/member/oauth/register", RestSharp.Method.POST, dicBody, null, null, CheckMode.A不检测, false, 5, true);
            if (result == null)
            {
                //注册失败
                return HdlMessageLogic.Current.TranslateHttpCode(HttpMessageEnum.A10017);
            }
            if (result.Code == HttpMessageEnum.A成功)
            {
                return null;
            }
            //获取翻译
            string errorMsg = HdlMessageLogic.Current.TranslateHttpCode(result.Code);
            if (errorMsg == null)
            {
                //注册失败
                return HdlMessageLogic.Current.TranslateHttpCode(HttpMessageEnum.A10017);
            }
            return errorMsg;
        }
        #endregion
        #region ■ 发送验证码_________________________
        /// <summary>
        /// 发送验证码到邮箱,并返回已翻译的错误信息(返回null代表成功)
        /// </summary>
        /// <param name="i_email">邮箱</param>
        /// <param name="codeType">验证码的类型</param>
        /// <param name="i_codeTime">验证码过期时间(秒)</param>
        /// <returns></returns>
        public string SendVeriCodeToEmail(string i_email, VerCodeType codeType, int i_codeTime = 300)
        {
            //去获取它的区域地址(null:无法联网 空字符串:账号不存在 非空:正常获取)
            var strUrl = this.GetAccoutRegionInfo(i_email);
            if (strUrl == null)
            {
                //发送验证码失败
                return HdlMessageLogic.Current.TranslateHttpCode(HttpMessageEnum.A10210);
            }
            //检测接口返回的账号的Url是否有问题
            var errorMsg = this.CheckAccoutRegionUrlByCodeType(strUrl, codeType);
            if (errorMsg != null)
            {
                return errorMsg;
            }
            var pra = new { mail = i_email, verifyType = (int)codeType, expireSecond = i_codeTime };
            //请求Url的完成路径(发送验证码需要另外获取地址)
            var fullUrl = strUrl + "/smart-footstone/verification/message/send";
            var result = HdlHttpLogic.Current.DoRequestZigbeeHttps(fullUrl, Config.Instance.Token, RestSharp.Method.POST, pra, null, null, CheckMode.A不检测, 3, true);
            //转换数据
            var respone = HdlHttpLogic.Current.ConvertData(result);
            if (respone == null)
            {
                //发送验证码失败
                return HdlMessageLogic.Current.TranslateHttpCode(HttpMessageEnum.A10210);
            }
            if (respone.Code == HttpMessageEnum.A成功)
            {
                return null;
            }
            //获取翻译
            errorMsg = HdlMessageLogic.Current.TranslateHttpCode(respone.Code);
            if (errorMsg == null)
            {
                //发送验证码失败
                return HdlMessageLogic.Current.TranslateHttpCode(HttpMessageEnum.A10210);
            }
            return errorMsg;
        }
        /// <summary>
        /// 发送验证码到手机,并返回已翻译的错误信息(返回null代表成功)
        /// </summary>
        /// <param name="i_areaCode">地区码</param>
        /// <param name="i_phone">手机号</param>
        /// <param name="codeType">验证码的类型</param>
        /// <param name="i_lanType">CHINESE or ENGLISH,当不指定时,默认使用底层变量</param>
        /// <param name="i_codeTime">验证码过期时间(秒)</param>
        /// <returns></returns>
        public string SendVeriCodeToPhone(string i_areaCode, string i_phone, VerCodeType codeType, string i_lanType = null, int i_codeTime = 300)
        {
            //去获取它的区域地址(null:无法联网 空字符串:账号不存在 非空:正常获取)
            var strUrl = this.GetAccoutRegionInfo(i_phone);
            if (strUrl == null)
            {
                //发送验证码失败
                return HdlMessageLogic.Current.TranslateHttpCode(HttpMessageEnum.A10210);
            }
            //检测接口返回的账号的Url是否有问题
            var errorMsg = this.CheckAccoutRegionUrlByCodeType(strUrl, codeType);
            if (errorMsg != null)
            {
                return errorMsg;
            }
            if (i_lanType == null)
            {
                i_lanType = Config.Instance.HttpLanguage;
            }
            var pra = new { phone = i_phone, phonePrefix = i_areaCode, languageType = i_lanType, verifyType = (int)codeType, expireSecond = i_codeTime };
            //请求Url的完成路径(发送验证码需要另外获取地址)
            var fullUrl = strUrl + "/smart-footstone/verification/message/send";
            var result = HdlHttpLogic.Current.DoRequestZigbeeHttps(fullUrl, Config.Instance.Token, RestSharp.Method.POST, pra, null, null, CheckMode.A不检测, 3, true);
            //转换数据
            var respone = HdlHttpLogic.Current.ConvertData(result);
            if (respone == null)
            {
                //发送验证码失败
                return HdlMessageLogic.Current.TranslateHttpCode(HttpMessageEnum.A10210);
            }
            if (respone.Code == HttpMessageEnum.A成功)
            {
                return null;
            }
            //获取翻译
            errorMsg = HdlMessageLogic.Current.TranslateHttpCode(respone.Code);
            if (errorMsg == null)
            {
                //发送验证码失败
                return HdlMessageLogic.Current.TranslateHttpCode(HttpMessageEnum.A10210);
            }
            return errorMsg;
        }
        /// <summary>
        /// 校验验证码
        /// </summary>
        /// <param name="i_account">手机号或者邮箱</param>
        /// <param name="codeType">验证码的类型</param>
        /// <param name="i_verifyCode">验证码</param>
        /// <returns></returns>
        public bool CheckVeriCode(string i_account, VerCodeType codeType, string i_verifyCode)
        {
            //去获取它的区域地址(null:无法联网 空字符串:账号不存在 非空:正常获取)
            var strUrl = this.GetAccoutRegionInfo(i_account);
            if (strUrl == null)
            {
                //发送验证码失败
                return false;
            }
            //检测接口返回的账号的Url是否有问题
            var errorMsg = this.CheckAccoutRegionUrlByCodeType(strUrl, codeType);
            if (errorMsg != null)
            {
                return false;
            }
            string accountName = i_account.Contains("@") == true ? "mail" : "phone";
            var dicBody = new Dictionary<string, string>();
            dicBody[accountName] = i_account;
            dicBody["verifyType"] = ((int)codeType).ToString();
            dicBody["verifyCode"] = i_verifyCode;
            //请求Url的完成路径(校验验证码需要另外获取地址)
            var fullUrl = strUrl + "/smart-footstone/verification/message/check";
            var result = HdlHttpLogic.Current.DoRequestZigbeeHttps(fullUrl, Config.Instance.Token, RestSharp.Method.POST, dicBody, null, null, CheckMode.A不检测, 3, true);
            //转换数据
            var respone = HdlHttpLogic.Current.ConvertData(result);
            if (respone == null)
            {
                return false;
            }
            return respone.Code == HttpMessageEnum.A成功;
        }
        /// <summary>
        /// 检测接口返回的账号的Url是否有问题(null:没问题 非null:已经翻译了的错误信息)
        /// </summary>
        /// <param name="i_url">接口返回的账号的Url(null的话不要调用)</param>
        /// <param name="codeType">验证码类型</param>
        /// <returns></returns>
        private string CheckAccoutRegionUrlByCodeType(string i_url, VerCodeType codeType)
        {
            if (codeType == VerCodeType.A注册)
            {
                //账号已经注册
                if (i_url != string.Empty) { return HdlMessageLogic.Current.TranslateHttpCode(HttpMessageEnum.A10016); }
            }
            else if (codeType == VerCodeType.A找回密码)
            {
                //账号不存在
                if (i_url == string.Empty) { return HdlMessageLogic.Current.TranslateHttpCode(HttpMessageEnum.A10010); }
            }
            else if (codeType == VerCodeType.A登陆)
            {
                //账号不存在
                if (i_url == string.Empty) { return HdlMessageLogic.Current.TranslateHttpCode(HttpMessageEnum.A10010); }
            }
            else if (codeType == VerCodeType.A绑定)
            {
                //账号已经注册
                if (i_url != string.Empty) { return HdlMessageLogic.Current.TranslateHttpCode(HttpMessageEnum.A10016); }
            }
            else if (codeType == VerCodeType.A其他)
            {
                //账号不存在
                if (i_url == string.Empty) { return HdlMessageLogic.Current.TranslateHttpCode(HttpMessageEnum.A10010); }
            }
            return null;
        }
        #endregion
        #region ■ 账号密码登陆_______________________
        /// <summary>
        /// 自动登陆(可能状态码:Sucess  PswError  NotNetWork  OtherError)
        /// </summary>
        public AccountStatu AutoLoginByRefreshToken()
        {
            //初始化账号所在的区域地址(-1:获取不到,云端上没这个账号 1:正常 2:无网)
            var result = this.InitAccoutRegionInfo(Config.Instance.Account);
            if (result != AccountStatu.Sucess)
            {
                //没网,或者账号不存在,都不用往下走
                return result;
            }
            result = AccountStatu.OtherError;
            //登陆
            var revertObj = this.LoginByRefreshToken();
            if (revertObj == null)
            {
                //没有网络
                result = AccountStatu.NotNetWork;
            }
            else if (revertObj.Code == HttpMessageEnum.A成功)
            {
                //上报设备ID
                this.PushDeviceIdToDB();
                result = AccountStatu.Sucess;
            }
            //没网,或者是有网并且登陆成功时,刷新个人信息
            if (result == AccountStatu.Sucess || result == AccountStatu.NotNetWork)
            {
                //初始化登陆账号的信息(登陆的,这里成不成功都无所谓)
                this.InitUserAccoutInfo(true, result == AccountStatu.Sucess);
            }
            return result;
        }
        /// <summary>
        /// 账号密码登陆(成功时,自动刷新Config)
        /// </summary>
        /// <param name="i_account">账号</param>
        /// <param name="i_password">密码</param>
        public ResponsePack LoginByPassword(string i_account, string i_password)
        {
            //初始化账号所在的区域地址(可能状态码:Sucess  NotAccount  NotNetWork)
            var result = this.InitAccoutRegionInfo(i_account);
            if (result == AccountStatu.NotAccount)
            {
                //账号不存在
                return new ResponsePack { Code = HttpMessageEnum.A10010 };
            }
            if (result == AccountStatu.NotNetWork)
            {
                //没网,不用往下走
                return null;
            }
            //登陆
            var pra = new { grantType = "password", account = i_account, loginPwd = i_password };
            var revertObj = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("smart-footstone/member/oauth/login", RestSharp.Method.POST, pra, null, null, CheckMode.A不检测, false, 3, true);
            if (revertObj != null && revertObj.Code == HttpMessageEnum.A成功)
            {
                //云端不再返回账号字段
                Config.Instance.Account = i_account;
                //根据登陆之后,云端返回的数据,刷新Config
                this.RefreshConfigDataByLoginData(revertObj);
                //初始化登陆账号的信息(登陆的,这里成不成功都无所谓)
                this.InitUserAccoutInfo(true, true);
            }
            return revertObj;
        }
        /// <summary>
        /// 验证码登陆(成功时,自动刷新Config)
        /// </summary>
        /// <param name="i_account">手机或者邮箱</param>
        /// <param name="i_verifyCode">验证码</param>
        public ResponsePack LoginByVerifyCode(string i_account, string i_verifyCode)
        {
            //初始化账号所在的区域地址(-1:获取不到,云端上没这个账号 1:正常 2:无网)
            var result = this.InitAccoutRegionInfo(i_account);
            if (result == AccountStatu.NotAccount)
            {
                //账号不存在
                return new ResponsePack { Code = HttpMessageEnum.A10010 };
            }
            if (result == AccountStatu.NotNetWork)
            {
                //没网,不用往下走
                return null;
            }
            var pra = new { grantType = "verify", account = i_account, verifyCode = i_verifyCode };
            //登陆接口特殊,需要快一点访问,设置3秒超时
            var revertObj = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("smart-footstone/member/oauth/login", RestSharp.Method.POST, pra, null, null, CheckMode.A不检测, false, 3, true);
            if (revertObj != null && revertObj.Code == HttpMessageEnum.A成功)
            {
                //根据登陆之后,云端返回的数据,刷新Config
                this.RefreshConfigDataByLoginData(revertObj);
                //初始化登陆账号的信息 -1:无网 1:正常 2:登陆不进去 3:权限变更了
                this.InitUserAccoutInfo(true, true);
            }
            return revertObj;
        }
        /// <summary>
        /// 用【刷新Token】登陆(成功时,自动刷新Config)
        /// </summary>
        public ResponsePack LoginByRefreshToken()
        {
            var pra = new { grantType = "refresh_token", refreshToken = Config.Instance.RefreshToken };
            //登陆接口特殊,需要快一点访问,设置3秒超时
            var revertObj = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("smart-footstone/member/oauth/login", RestSharp.Method.POST, pra, null, null, CheckMode.A不检测, false, 3, true);
            if (revertObj != null && revertObj.Code == HttpMessageEnum.A成功)
            {
                //根据登陆之后,云端返回的数据,刷新Config
                this.RefreshConfigDataByLoginData(revertObj);
            }
            return revertObj;
        }
        /// <summary>
        /// 根据登陆之后,云端返回的数据,刷新Config
        /// </summary>
        /// <param name="i_response">根据登陆之后,云端返回的数据</param>
        private void RefreshConfigDataByLoginData(ResponsePack i_response)
        {
            //存储数据
            var result = Newtonsoft.Json.JsonConvert.DeserializeObject<UserLoginRes>(i_response.Data.ToString());
            //标记上一次是不是同一个账号登陆
            Config.Instance.TheSameLoginAccount = Config.Instance.Guid == result.UserId;
            Config.Instance.Guid = result.UserId;
            Config.Instance.LoginDateTime = DateTime.Now;
            Config.Instance.Token = result.AccessToken;
            Config.Instance.RefreshToken = result.RefreshToken;
            Config.Instance.HeaderPrefix = result.HeaderPrefix;
            Config.Instance.Save();
        }
        #endregion
        #region ■ 绑定账号___________________________
        /// <summary>
        /// 绑定账号,并返回已翻译的错误信息(返回null代表成功)
        /// </summary>
        /// <param name="i_account">邮箱或者手机</param>
        /// <param name="i_veriCode">验证码</param>
        /// <returns></returns>
        public string BindAccount(string i_account, string i_veriCode)
        {
            bool isEmail = i_account.Contains("@");
            string keyValue = isEmail == true ? "memberMail" : "memberPhone";
            var pra = new Dictionary<string, string>();
            pra[keyValue] = i_account;
            pra["verifyCode"] = i_veriCode;
            var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("smart-footstone/member/memberInfo/bindWithAccount", RestSharp.Method.POST, pra, null, null, CheckMode.A不检测, false, 3, true);
            if (result == null)
            {
                if (isEmail == true)
                {
                    //绑定邮箱失败
                    return Language.StringByID(R.MyInternationalizationString.uBindEmailFail);
                }
                else
                {
                    //绑定手机失败
                    return Language.StringByID(R.MyInternationalizationString.uBindPhoneFail);
                }
            }
            if (result.Code == HttpMessageEnum.A成功)
            {
                return null;
            }
            //获取翻译
            string errorMsg = HdlMessageLogic.Current.TranslateHttpCode(result.Code);
            if (errorMsg == null)
            {
                if (isEmail == true)
                {
                    //绑定邮箱失败
                    return Language.StringByID(R.MyInternationalizationString.uBindEmailFail);
                }
                else
                {
                    //绑定手机失败
                    return Language.StringByID(R.MyInternationalizationString.uBindPhoneFail);
                }
            }
            return errorMsg;
        }
        #endregion
        #region ■ 修改密码___________________________
        /// <summary>
        /// 修改密码
        /// </summary>
        /// <param name="i_oldPsw">旧密码</param>
        /// <param name="i_newPsw">新密码</param>
        /// <returns></returns>
        public bool EditorPassword(string i_oldPsw, string i_newPsw)
        {
            var pra = new { loginPwd = i_oldPsw, loginNewPwd = i_newPsw };
            var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("smart-footstone/member/memberInfo/updatePwd", RestSharp.Method.POST, pra, null, null, CheckMode.A不检测, false, 5, true);
            //检测状态码
            if (HdlCheckLogic.Current.CheckNetCode(result, ShowNetCodeMode.YES) == false)
            {
                return false;
            }
            return true;
        }
        #endregion
        #region ■ 重置密码___________________________
        /// <summary>
        /// 重置密码,并返回已翻译的错误信息(返回null代表成功)
        /// </summary>
        /// <param name="i_account">邮箱或者手机号</param>
        /// <param name="i_newPsw">新密码</param>
        /// <param name="i_verifyCode">验证码</param>
        /// <returns></returns>
        public string ResetPassword(string i_account, string i_newPsw, string i_verifyCode)
        {
            string accountName = i_account.Contains("@") == true ? "memberEmail" : "memberPhone";
            var dicBody = new Dictionary<string, string>();
            dicBody[accountName] = i_account;
            dicBody["loginPwd"] = i_newPsw;
            dicBody["verifyCode"] = i_verifyCode;
            var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("smart-footstone/member/oauth/forgetPwd", RestSharp.Method.POST, dicBody, null, null, CheckMode.A不检测, false, 5, true);
            if (result == null)
            {
                //重置密码失败
                return Language.StringByID(R.MyInternationalizationString.uReSetPasswordFail);
            }
            if (result.Code == HttpMessageEnum.A成功)
            {
                return null;
            }
            //获取翻译
            string errorMsg = HdlMessageLogic.Current.TranslateHttpCode(result.Code);
            if (errorMsg == null)
            {
                //重置密码失败
                return Language.StringByID(R.MyInternationalizationString.uReSetPasswordFail);
            }
            return errorMsg;
        }
        #endregion
        #region ■ 重新登录___________________________
        /// <summary>
        /// 重新登录
        /// </summary>
        /// <param name="account">账号</param>
        /// <param name="noticeDb">是否通知云端</param>
        public void ReLoginAgain(string account = "", bool noticeDb = true)
        {
            if (Config.Instance.Home.IsVirtually == true)
            {
                //如果是虚拟住宅
                HdlThreadLogic.Current.RunMain(() =>
                {
                    //设定一个时间
                    Config.Instance.LoginDateTime = new DateTime(1970, 1, 1);
                    Config.Instance.Save();
                    //清空当前住宅id
                    Config.Instance.HomeId = string.Empty;
                    //收起左菜单
                    CommonPage.Instance.CloseLeftMenu();
                    //关闭全部弹窗
                    ShowMsgControl.CloseAllMsgDialog();
                    //关闭所有打开了的界面
                    HdlFormLogic.Current.CloseAllOpenForm(null, false);
                    //显示登陆画面
                    var formLogin = new Login.AccountLoginForm();
                    Shared.Common.CommonPage.Instance.AddChidren(formLogin);
                    formLogin.ShowForm(account);
                });
                return;
            }
            //关闭所有接收
            HdlGatewayReceiveLogic.Current.RemoveAllEvent();
            //清除升级列表
            HdlFirmwareUpdateResourse.dicUpdateList.Clear();
            HdlThreadLogic.Current.RunThread(() =>
            {
                //检测APP是否能够退出
                while (HdlUserCenterResourse.AccountOption.AppCanSignout == false)
                {
                    System.Threading.Thread.Sleep(500);
                }
                //设定一个时间
                Config.Instance.LoginDateTime = new DateTime(1970, 1, 1);
                Config.Instance.Save();
                //清空当前住宅id
                Config.Instance.HomeId = string.Empty;
                HdlGatewayLogic.Current.ClearAllRealGatewayConection(false);
                //断开远程Mqtt连接
                HdlThreadLogic.Current.RunThread(async () =>
                {
                    await ZigBee.Device.ZbGateway.CloseRemoteConnectionOnForce();
                }, ShowErrorMode.NO);
                HdlThreadLogic.Current.RunMain(() =>
                {
                    //收起左菜单
                    CommonPage.Instance.CloseLeftMenu();
                    //关闭所有打开了的界面
                    HdlFormLogic.Current.CloseAllOpenForm(null, false);
                    //显示登陆画面
                    var formLogin = new Login.AccountLoginForm();
                    Shared.Common.CommonPage.Instance.AddChidren(formLogin);
                    formLogin.ShowForm(account);
                });
                if (noticeDb == true)
                {
                    //通知云端,已经退出登陆
                    this.SignOutClearData();
                }
            });
        }
        #endregion
        #region ■ 上传头像___________________________
        /// <summary>
        /// 上传头像
        /// </summary>
        /// <param name="byteData">图像的byte数据</param>
        /// <param name="mode">失败时是否显示tip消息</param>
        /// <returns></returns>
        public bool UpLoadUserIconImage(byte[] byteData, ShowNetCodeMode mode = ShowNetCodeMode.YES)
        {
            var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("home-wisdom/head/portrait/upload", RestSharp.Method.POST, byteData);
            //检测状态码
            if (HdlCheckLogic.Current.CheckNetCode(result, mode) == false)
            {
                return false;
            }
            return true;
        }
        #endregion
        #region ■ 编辑用户名称_______________________
        /// <summary>
        /// 编辑用户昵称
        /// </summary>
        /// <param name="i_nikeName">用户昵称</param>
        /// <param name="mode">失败时是否显示tip消息</param>
        /// <returns></returns>
        public bool EditorUserNikeName(string i_nikeName, ShowNetCodeMode mode = ShowNetCodeMode.YES)
        {
            var pra = new { memberName = i_nikeName };
            var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("smart-footstone/member/memberInfo/updateMemberInfo", RestSharp.Method.POST, pra, null, null, CheckMode.A不检测, false, 3, true);
            //检测状态码
            if (HdlCheckLogic.Current.CheckNetCode(result, mode) == false)
            {
                return false;
            }
            return true;
        }
        #endregion
        #region ■ 初始化登陆账号的信息_______________
        /// <summary>
        /// 初始化登陆账号的信息(可能的状态码:Sucess  NotNetWork)
        /// </summary>
        /// <param name="reLoad">是否从新从本地加载(重新初始化登陆账号的信息,不需要重新加载)</param>
        /// <param name="tryHttp">是否尝试访问网络</param>
        /// <returns></returns>
        private AccountStatu InitUserAccoutInfo(bool reLoad, bool tryHttp)
        {
            //预创建用户信息【文件夹】
            HdlFileLogic.Current.CreateDirectory(HdlFileNameResourse.AccountDirectory);
            HdlFileLogic.Current.CreateDirectory(HdlFileNameResourse.UserPictrueDirectory);
            //加载账号配置信息
            HdlUserCenterResourse.AccountOption = HdlUserCenterResourse.AccountOption.Load();
            if (reLoad == true)
            {
                //获取本地记录的用户信息
                HdlUserCenterResourse.UserInfo = GetUserInformationFromLocation();
            }
            var netStatu = tryHttp == true ? AccountStatu.Sucess : AccountStatu.NotNetWork;
            //只要能联网,就去获取它的账号信息
            if (netStatu == AccountStatu.Sucess)
            {
                //访问接口
                var resultData = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("smart-footstone/member/memberInfo/getMemberInfo", RestSharp.Method.POST, null, null, null, CheckMode.A不检测, false, 3, true);
                if (resultData != null && resultData.Code == HttpMessageEnum.A成功)
                {
                    var persionData = Newtonsoft.Json.JsonConvert.DeserializeObject<PersionInfoResult>(resultData.Data.ToString());
                    //赋值
                    HdlUserCenterResourse.UserInfo.NickName = persionData.MemberName;
                    HdlUserCenterResourse.UserInfo.PhoneAreaCode = persionData.MemberPhonePrefix;
                    HdlUserCenterResourse.UserInfo.UserPhone = persionData.MemberPhone;
                    HdlUserCenterResourse.UserInfo.UserEmail = persionData.MemberEmail;
                    //初始化数字和手势密码
                    this.InitNumberAndGesturePassword();
                }
                else
                {
                    netStatu = AccountStatu.NotNetWork;
                }
            }
            HdlUserCenterResourse.UserInfo.Account = Config.Instance.Account;
            if (string.IsNullOrEmpty(HdlUserCenterResourse.UserInfo.NickName) == true)
            {
                //没有昵称的时候,把账号作为昵称
                HdlUserCenterResourse.UserInfo.NickName = Config.Instance.Account;
            }
            if (netStatu != AccountStatu.NotNetWork)
            {
                //保存缓存
                HdlUserCenterResourse.AccountOption.Save();
            }
            //保存用户的登陆信息到本地
            this.SaveUserInformationToLocation();
            //后台去下载账号的头像
            if (netStatu == AccountStatu.Sucess)
            {
                HdlThreadLogic.Current.RunThread(() =>
                {
                    //下载头像
                    var imageData = this.DownLoadAccountPictrue(Config.Instance.Account);
                    if (imageData != null && imageData.Length > 0)
                    {
                        //写入头像内容
                        HdlFileLogic.Current.SaveByteToFile(HdlFileNameResourse.UserHeadIconFile, imageData);
                    }
                }, ShowErrorMode.NO);
            }
            return netStatu;
        }
        /// <summary>
        /// 重新初始化登陆账号的信息(网络变更的时候调用 可能的状态码:Sucess  NotNetWork  AuthorityChangd  TokenTimeOunt)
        /// </summary>
        /// <returns></returns>
        public AccountStatu ReInitUserAccoutInfo()
        {
            if (Config.Instance.Home.Id == string.Empty)
            {
                //如果处在登陆界面时
                return AccountStatu.NotNetWork;
            }
            //重新刷新Token
            var respone = this.LoginByRefreshToken();
            if (respone == null) { return AccountStatu.NotNetWork; }
            if (respone.Code != HttpMessageEnum.A成功)
            {
                HdlThreadLogic.Current.RunMain(() =>
                {
                    //登陆Token已经过期,请重新登陆
                    string msg = Language.StringByID(R.MyInternationalizationString.uLoginTokenIsTimeOutPleaseLoginAgain);
                    HdlMessageLogic.Current.ShowMassage(ShowMsgType.Tip, msg);
                    this.ReLoginAgain(HdlUserCenterResourse.UserInfo.Account, false);
                });
                return AccountStatu.TokenTimeOunt;
            }
            //重新获取住宅列表
            var listHouse = HdlResidenceLogic.Current.GetHomeListsFromDb(ShowNetCodeMode.No);
            if (listHouse == null)
            {
                //断网,获取不到住宅
                return AccountStatu.NotNetWork;
            }
            //检测当前这个住宅还在吗
            bool houseIsEsixt = false;
            foreach (var houseInfo in listHouse)
            {
                //刷新住宅信息
                HdlResidenceLogic.Current.RefreshResidenceMemory(houseInfo);
                if (houseInfo.Id == Config.Instance.Home.Id)
                {
                    houseIsEsixt = true;
                }
            }
            if (houseIsEsixt == false)
            {
                //当前这个住宅不见了,让他重新登陆
                return AccountStatu.TokenTimeOunt;
            }
            //刷新账号的权限(可能的状态码:Sucess  AuthorityChangd)
            var result22 = this.RefreshAccountAuthority();
            if (result22 == AccountStatu.AuthorityChangd)
            {
                HdlThreadLogic.Current.RunMain(() =>
                {
                    //您的权限已经变更,请重新登陆
                    string msg = Language.StringByID(R.MyInternationalizationString.uYouAccessHadChangedPleaseTakeToAdmin);
                    HdlMessageLogic.Current.ShowMassage(ShowMsgType.Tip, msg);
                    this.ReLoginAgain(HdlUserCenterResourse.UserInfo.Account, false);
                });
                return result22;
            }
            //重新初始化主人的token(管理员专用)
            var success = this.InitMasterToken();
            if (success == false)
            {
                return AccountStatu.NotNetWork;
            }
            //重新初始化账号信息
            var result = InitUserAccoutInfo(false, true);
            if (result == AccountStatu.Sucess)
            {
                //如果有网关没有绑定,则去绑定网关
                HdlGatewayLogic.Current.ResetComandToBindBackupGateway();
                //同步云端的网关id,如果本地拥有云端不存在的id,则表示应该被换绑了,直接删除
                HdlGatewayLogic.Current.SynchronizeDbGateway();
            }
            return result;
        }
        /// <summary>
        /// 刷新账号的权限(可能的状态码:Sucess  AuthorityChangd)
        /// </summary>
        /// <returns></returns>
        public AccountStatu RefreshAccountAuthority()
        {
            //取当前旧值
            int oldAuthorityNo = HdlUserCenterResourse.ResidenceOption.OldAuthorityNo;
            if (Config.Instance.Home.IsOtherShare == false)
            {
                //身份:管理员
                HdlUserCenterResourse.ResidenceOption.AuthorityNo = 1;
                HdlUserCenterResourse.ResidenceOption.AuthorityText = Language.StringByID(R.MyInternationalizationString.Administrator);
            }
            else if (Config.Instance.Home.AccountType == 1)
            {
                //身份:成员(拥有管理员权限)
                HdlUserCenterResourse.ResidenceOption.AuthorityNo = 2;
                HdlUserCenterResourse.ResidenceOption.AuthorityText = Language.StringByID(R.MyInternationalizationString.uMemberHadActionAuthority);
            }
            else
            {
                //身份:成员
                HdlUserCenterResourse.ResidenceOption.AuthorityNo = 3;
                HdlUserCenterResourse.ResidenceOption.AuthorityText = Language.StringByID(R.MyInternationalizationString.uMember);
            }
            //保存
            HdlUserCenterResourse.ResidenceOption.Save();
            //然后值盖过去
            HdlUserCenterResourse.ResidenceOption.OldAuthorityNo = HdlUserCenterResourse.ResidenceOption.AuthorityNo;
            //UserInfo.OldAuthorityNo==0代表本地还没有生成文件,这个时候不需要处理
            if (HdlUserCenterResourse.ResidenceOption.AuthorityNo != oldAuthorityNo
                && oldAuthorityNo != 0)
            {
                //切换网络时,需要对这个值进行踢人下线
                return AccountStatu.AuthorityChangd;
            }
            return AccountStatu.Sucess;
        }
        /// <summary>
        /// 初始化账号的Url区域地址(可能状态码:Sucess  NotAccount  NotNetWork)
        /// </summary>
        /// <returns></returns>
        private AccountStatu InitAccoutRegionInfo(string i_account)
        {
            var regionUrl = this.GetAccoutRegionInfo(i_account);
            if (regionUrl == null)
            {
                return AccountStatu.NotNetWork;
            }
            if (regionUrl == string.Empty)
            {
                return AccountStatu.NotAccount;
            }
            //变更地址
            HdlHttpLogic.Current.RequestHttpsHost = regionUrl;
            return AccountStatu.Sucess;
        }
        /// <summary>
        /// 获取账号的区域信息(null:无法联网 空字符串:账号不存在 非空:正常获取)
        /// </summary>
        /// <param name="i_account">手机或者邮箱</param>
        /// <returns></returns>
        private string GetAccoutRegionInfo(string i_account)
        {
            var pra = new { account = i_account };
            var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("smart-footstone/region/regionByAccount", RestSharp.Method.POST, pra, null, null, CheckMode.A不检测, false, 3, true);
            if (result == null)
            {
                return null;
            }
            if (result.Code != HttpMessageEnum.A成功)
            {
                return string.Empty;
            }
            var info = Newtonsoft.Json.JsonConvert.DeserializeObject<AccoutRegionInfo>(result.Data.ToString());
            return info.RegionUrl;
        }
        /// <summary>
        /// 保存用户的登陆信息到本地
        /// </summary>
        private void SaveUserInformationToLocation()
        {
            //写入内容
            HdlFileLogic.Current.SaveFileContent(HdlFileNameResourse.UserInfoFile, HdlUserCenterResourse.UserInfo);
            string iconFile = HdlFileNameResourse.UserHeadIconFile;
            if (System.IO.File.Exists(iconFile) == false)
            {
                //搞一下主人的默认头像
                string defultFile = IO.FileUtils.GetImageFilePath("Center/Admin.png");
                if (defultFile == string.Empty)
                {
                    return;
                }
                //复制过去
                System.IO.File.Copy(defultFile, iconFile);
            }
        }
        /// <summary>
        /// 从本地获取用户的登陆信息
        /// </summary>
        /// <returns></returns>
        private UserInformation GetUserInformationFromLocation()
        {
            var value = HdlFileLogic.Current.ReadFileTextContent(HdlFileNameResourse.UserInfoFile);
            if (value == null)
            {
                return new UserInformation();
            }
            var info = Newtonsoft.Json.JsonConvert.DeserializeObject<UserInformation>(value);
            return info;
        }
        /// <summary>
        /// 账号的区域地址信息
        /// </summary>
        private class AccoutRegionInfo
        {
            /// <summary>
            /// 账号的区域地址(如果为空,代表账号不存在)
            /// </summary>
            public string RegionUrl = string.Empty;
        }
        #endregion
        #region ■ 初始化主人的Token__________________
        /// <summary>
        /// 初始化主人的token
        /// </summary>
        public bool InitMasterToken()
        {
            if (HdlUserCenterResourse.ResidenceOption.AuthorityNo != 2)
            {
                //此接口只能管理员调用
                return true;
            }
            var pra = new { homeId = Config.Instance.Home.Id };
            var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("home-wisdom/app/child/account/debug", RestSharp.Method.POST, pra);
            if (result == null || result.Code != HttpMessageEnum.A成功)
            {
                return false;
            }
            var data = Newtonsoft.Json.JsonConvert.DeserializeObject<UserLoginRes>(result.Data.ToString());
            //记录起这两个token
            Config.Instance.MasterToken = data.AccessToken;
            return true;
        }
        #endregion
        #region ■ 初始化数字和手势密码_______________
        /// <summary>
        /// 初始化数字和手势密码
        /// </summary>
        /// <returns></returns>
        private bool InitNumberAndGesturePassword()
        {
            //读取云端数据
            var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("smart-footstone/member/memberInfo/getLockCode", RestSharp.Method.POST, null, null, null, CheckMode.A不检测, false, 3, true);
            if (result != null)
            {
                if (result.Code == HttpMessageEnum.A成功)
                {
                    var info = Newtonsoft.Json.JsonConvert.DeserializeObject<NumberAndGesturePasswordInfo>(result.Data.ToString());
                    //手势密码
                    HdlUserCenterResourse.AccountOption.GestureAuthentication = info.GestureCode;
                    //密码验证
                    HdlUserCenterResourse.AccountOption.PswAuthentication = info.DigitCode;
                    return true;
                }
                //未配置 则清空
                else if (result.Code == HttpMessageEnum.A11005)
                {
                    //手势密码
                    HdlUserCenterResourse.AccountOption.GestureAuthentication = string.Empty;
                    //密码验证
                    HdlUserCenterResourse.AccountOption.PswAuthentication = string.Empty;
                }
            }
            return false;
        }
        /// <summary>
        /// 编辑数字和手势密码
        /// </summary>
        /// <param name="i_numPsw">数字密码,如果不更新,请置为null</param>
        /// <param name="i_gesturePsw">手势密码,如果不更新,请置为null</param>
        /// <returns></returns>
        public bool EditorNumberAndGesturePassword(string i_numPsw, string i_gesturePsw)
        {
            var pra = new Dictionary<string, string>();
            if (i_numPsw != null) { pra["digitCode"] = i_numPsw; }
            if (i_gesturePsw != null) { pra["gestureCode"] = i_gesturePsw; }
            var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("smart-footstone/member/memberInfo/setLockCode", RestSharp.Method.POST, pra, null, null, CheckMode.A不检测, false, 3, true);
            if (result != null && result.Code == HttpMessageEnum.A成功)
            {
                return true;
            }
            return false;
        }
        /// <summary>
        /// 数字和手势密码
        /// </summary>
        private class NumberAndGesturePasswordInfo
        {
            /// <summary>
            /// 手势密码
            /// </summary>
            public string GestureCode = string.Empty;
            /// <summary>
            /// 数字
            /// </summary>
            public string DigitCode = string.Empty;
        }
        #endregion
        #region ■ 下载指定账号的头像_________________
        /// <summary>
        /// 下载指定账号的头像
        /// </summary>
        /// <param name="i_account">邮箱或者手机号</param>
        /// <returns></returns>
        public byte[] DownLoadAccountPictrue(string i_account)
        {
            var pra = new { account = i_account };
            var result = HdlHttpLogic.Current.RequestByteFromZigbeeHttps("home-wisdom/app/head/portrait/downWithAccount", RestSharp.Method.POST, pra);
            if (result != null && result.Length == 0)
            {
                result = null;
            }
            return result;
        }
        #endregion
        #region ■ 一般方法___________________________
        /// <summary>
        /// 退出登录时调用,清除推送数据
        /// </summary>
        public void SignOutClearData()
        {
            //通知云端,已经退出登陆
            var pra = new { pushId = Config.Instance.PushId };
            var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("smart-footstone/app/push-information/delete", RestSharp.Method.POST, pra);
            if (result == null)
            {
                //调试:记录极光ID
                HdlLogLogic.Current.WriteOtherText(HdlFileNameResourse.JiguangFile, "SignOut:" + Config.Instance.RegistrationID + " fail,receive obj is null", false, true);
            }
            else
            {
                //调试:记录极光ID
                HdlLogLogic.Current.WriteOtherText(HdlFileNameResourse.JiguangFile, "SignOut:" + Config.Instance.RegistrationID + " result:" + result.Code, false, true);
            }
        }
        /// <summary>
        /// 登录成功后上报设备id等相关信息给后端
        /// </summary>
        /// <returns>返回状态码</returns>
        public string PushDeviceIdToDB()
        {
            try
            {
                string deviceAlias;
                string deviceType;
#if iOS
                deviceAlias = UIKit.UIDevice.CurrentDevice.Name;
                deviceType = "IOS";
#elif Android
                deviceAlias = Android.OS.Build.Manufacturer;
                deviceType = "Android";
#endif
                var pra = new { deviceName = deviceAlias, deviceType = deviceType, produce = false, pushToken = Config.Instance.RegistrationID, software = "Evoyo" };
                var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("smart-footstone/app/push-information/add", RestSharp.Method.POST, pra);
                if (result == null)
                {
                    //调试:记录极光ID
                    HdlLogLogic.Current.WriteOtherText(HdlFileNameResourse.JiguangFile, "send:" + Config.Instance.RegistrationID + " fail,receive obj is null", false, true);
                    return null;
                }
                //调试:记录极光ID
                HdlLogLogic.Current.WriteOtherText(HdlFileNameResourse.JiguangFile, "send:" + Config.Instance.RegistrationID + " result:" + result.Code, false, true);
                if (result.Code == HttpMessageEnum.A成功)
                {
                    Config.Instance.PushId = result.Data.ToString();
                    Config.Instance.Save();
                }
                return result.Code;
            }
            catch
            {
                return null;
            }
        }
        #endregion
        #region ■ 结构体_____________________________
        /// <summary>
        /// 个人信息
        /// </summary>
        private class PersionInfoResult
        {
            /// <summary>
            /// 昵称
            /// </summary>
            public string MemberName = string.Empty;
            /// <summary>
            /// 邮箱
            /// </summary>
            public string MemberEmail = string.Empty;
            /// <summary>
            /// 手机
            /// </summary>
            public string MemberPhone = string.Empty;
            /// <summary>
            /// 手机的地区码
            /// </summary>
            public string MemberPhonePrefix = string.Empty;
        }
        /// <summary>
        /// 登陆结果
        /// </summary>
        private class UserLoginRes
        {
            /// <summary>
            /// 账号
            /// </summary>
            public string Account = string.Empty;
            /// <summary>
            /// 令牌类型,没啥用
            /// </summary>
            public string TokenType = string.Empty;
            /// <summary>
            /// 这个是新接口的Guid,也是账号id
            /// </summary>
            public string UserId = string.Empty;
            /// <summary>
            /// 添加到Token头部的东西(不要理它,只给底层使用)
            /// </summary>
            public string HeaderPrefix = string.Empty;
            /// <summary>
            /// Token(不用记录什么有效期,如果登陆失败,就拿RefreshToken去刷新)
            /// </summary>
            public string AccessToken = string.Empty;
            /// <summary>
            /// 刷新accessToken用的token(不用记录什么有效期,如果刷新失败,就踢人即可)
            /// </summary>
            public string RefreshToken = string.Empty;
        }
        #endregion
    }
}