黄学彪
2020-12-16 0d9f64668fd7350d6a21fd157e32009a96d98134
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
using Shared.Common;
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
 
namespace Shared.Phone
{
    public class HdlCheckLogic
    {
        #region ■ 变量声明___________________________
 
        /// <summary>
        /// 个人中心的检测逻辑
        /// </summary>
        private static HdlCheckLogic m_Current = null;
        /// <summary>
        /// 个人中心的检测逻辑
        /// </summary>
        public static HdlCheckLogic Current
        {
            get
            {
                if (m_Current == null)
                {
                    m_Current = new HdlCheckLogic();
                }
                return m_Current;
            }
        }
 
        #endregion
 
        #region ■ 各种正确检测_______________________
 
        /// <summary>
        /// 判断是否包含大写字母
        /// </summary>
        /// <returns><c>true</c>, if contain upper was checked, <c>false</c> otherwise.</returns>
        /// <param name="value">Value.</param>
        public bool CheckContainUpper(string value)
        {
            Regex reg = new Regex("[A-Z]+");
            return reg.IsMatch(value);
        }
 
        /// <summary>
        /// 判断是否包含小写字母
        /// </summary>
        /// <returns><c>true</c>, if contain lower was checked, <c>false</c> otherwise.</returns>
        /// <param name="value">Value.</param>
        public bool CheckContainLower(string value)
        {
            Regex reg = new Regex("[a-z]+");
            return reg.IsMatch(value);
        }
 
        /// <summary>
        /// 判断是否包含数字
        /// </summary>
        /// <returns><c>true</c>, if contain lower was checked, <c>false</c> otherwise.</returns>
        /// <param name="value">Value.</param>
        public bool CheckContainNum(string value)
        {
            Regex reg = new Regex("[0-9]+");
            return reg.IsMatch(value);
        }
 
        /// <summary>
        /// 判断是否包含符号
        /// </summary>
        /// <returns><c>true</c>, if contain lower was checked, <c>false</c> otherwise.</returns>
        /// <param name="value">Value.</param>
        public bool CheckContainSymbol(string value)
        {
            Regex reg = new Regex("([^a-z0-9A-Z])+");
            return reg.IsMatch(value);
        }
 
        /// <summary>
        /// 检测邮箱是否合法
        /// </summary>
        /// <param name="email"></param>
        /// <returns></returns>
        public bool CheckEmail(string email)
        {
            string emailRegexStr = "^\\s*([A-Za-z0-9_-]+(\\.\\w+)*@(\\w+\\.)+\\w{2,5})\\s*$";
            Regex reg = new Regex(emailRegexStr);
            return reg.IsMatch(email);
        }
 
        /// <summary>
        /// 检测手机号是否合法
        /// </summary>
        /// <param name="phoneNumber">手机号</param>
        /// <param name="areaCode">地区代码</param>
        /// <returns></returns>
        public bool CheckPhoneNumber(string phoneNumber, string areaCode)
        {
            //校验外国手机号
            if (areaCode != "86")
            {
                Regex reg = new Regex("^[0-9]*$");
                return reg.IsMatch(phoneNumber);
            }
 
            //校验国内手机号
            if (phoneNumber.Length > 11)
            {
                return false;
            }
            else if (phoneNumber.Length == 11)
            {
                Regex reg = new Regex("^[1][0-9]{10}$");
                return reg.IsMatch(phoneNumber);
            }
            else
            {
                //正则表达式判断是否数字
                Regex reg = new Regex("^[0-9]*$");
                return reg.IsMatch(phoneNumber);
            }
        }
 
        /// <summary>
        /// 检测字符串是否是纯数字
        /// </summary>
        /// <param name="i_text"></param>
        /// <returns></returns>
        public bool CheckIsNumber(string i_text)
        {
            foreach (var c in i_text)
            {
                if (char.IsNumber(c) == false)
                {
                    return false;
                }
            }
            return true;
        }
 
        /// <summary>
        /// 检查密码长度合法性
        /// </summary>
        /// <param name="password"></param>
        /// <returns></returns>
        public bool CheckPwdLength(string password)
        {
            if (password.Trim().Length >= 6 && password.Trim().Length <= 13)
            {
                return true;
            }
            return false;
        }
 
        #endregion
 
        #region ■ 检测网关错误状态码_________________
 
        /// <summary>
        /// <para>检测网关返回的共通错误状态码(返回null则代表没有错误),支持状态码为</para>
        /// <para>1:网关无法解析命令数据。</para> 
        /// <para>2:协调器正在升级或备份/恢复数据</para> 
        /// <para>3:操作设备/组/场景不存在</para> 
        /// <para>4:其他错误</para> 
        /// <para>5:数据传输错误(在某次客户端向网关发送数据的过程中,网关在合理时间范围内接收客户端数据不完整导致该错误发生。如客户端向网关一次发送100个字节的数据,但网关等待接收了一秒只接收了80个字节。发生该错误,网关将主动关闭客户端连接)</para> 
        /// </summary>
        /// <param name="resultData">网关返回的resultData,里面有【errorResponData】这个东西的那种对象</param>
        /// <returns></returns>
        public string CheckGatewayErrorCode(object resultData)
        {
            if (resultData == null)
            {
                return null;
            }
            Type myType = resultData.GetType();
            object errorObj = myType.InvokeMember("errorResponData", System.Reflection.BindingFlags.GetField, null, resultData, null);
            if (errorObj == null)
            {
                return null;
            }
            Type type = errorObj.GetType();
            var code = type.InvokeMember("Error", System.Reflection.BindingFlags.GetField, null, errorObj, null);
            int errorCode = Convert.ToInt32(code);
 
            return CheckGatewayErrorCode(errorCode);
        }
 
        /// <summary>
        /// <para>检测网关返回的共通错误状态码(返回null则代表没有错误),支持状态码为</para>
        /// <para>1:网关无法解析命令数据。</para> 
        /// <para>2:协调器正在升级或备份/恢复数据</para> 
        /// <para>3:操作设备/组/场景不存在</para> 
        /// <para>4:其他错误</para> 
        /// <para>5:数据传输错误(在某次客户端向网关发送数据的过程中,网关在合理时间范围内接收客户端数据不完整导致该错误发生。如客户端向网关一次发送100个字节的数据,但网关等待接收了一秒只接收了80个字节。发生该错误,网关将主动关闭客户端连接)</para> 
        /// </summary>
        /// <param name="errorCode">错误代码</param>
        /// <returns></returns>
        public string CheckGatewayErrorCode(int errorCode)
        {
            if (errorCode == 1)
            {
                //网关无法解析命令数据
                return Language.StringByID(R.MyInternationalizationString.uGatewayCannotResolveCommand);
            }
            else if (errorCode == 2)
            {
                //协调器正在升级或备份或恢复数据中
                return Language.StringByID(R.MyInternationalizationString.uCoordinatorIsUpOrBackupOrRecovering);
            }
            else if (errorCode == 3)
            {
                //目标设备不存在
                return Language.StringByID(R.MyInternationalizationString.uTargetDeviceIsNotExsit);
            }
            else if (errorCode == 4)
            {
                //出现未知错误,请稍后再试
                return Language.StringByID(R.MyInternationalizationString.uUnKnowErrorAndResetAgain);
            }
            else if (errorCode == 5)
            {
                //数据传输错误,请稍后再试
                return Language.StringByID(R.MyInternationalizationString.uDataTransmissionFailAndResetAgain);
            }
            return null;
        }
 
        #endregion
 
        #region ■ 检测接口返回的状态码_______________
 
        /// <summary>
        /// 检测接口返回的状态码
        /// </summary>
        /// <param name="i_response">云端返回的东西</param>
        /// <param name="i_mode">是否显示访问接口失败的tip消息</param>
        /// <returns></returns>
        public bool CheckNetCode(ResponsePack i_response, ShowNetCodeMode i_mode)
        {
            //为了节省代码,这样整而已
            if (i_response == null)
            {
                //网关连接失败,请确认网络
                HdlMessageLogic.Current.ShowNotNetTipMsg(i_mode);
                return false;
            }
            if (i_response.Code != HttpMessageEnum.A成功)
            {
                HdlMessageLogic.Current.ShowNetCodeTipMsg(i_mode, i_response);
                return false;
            }
            return true;
        }
 
        #endregion
 
        #region ■ 检测账号是否已经退出_______________
 
        /// <summary>
        /// 检测账号是否已经退出 true:已经退出 false:没有退出
        /// </summary>
        /// <returns></returns>
        public bool IsAccountLoginOut()
        {
            return Config.Instance.HomeId == string.Empty;
        }
 
        #endregion
 
        #region ■ 二次安全验证_______________________
 
        /// <summary>
        /// 执行二次安全验证(三种验证的标题使用默认值:Touch ID验证,密码验证,手势验证)
        /// </summary>
        /// <param name="SuccessAction">如果设置有验证方式,并且验证成功后才会调用的回调函数,不然不会调用这个东西</param>
        /// <param name="NotSettionAction">如果完全没有设置有验证方式,才会调用的回调函数,不然不会调用这个东西(取消输入不会调用这个东西)</param>
        public void CheckSecondarySecurity(Action SuccessAction, Action NotSettionAction = null)
        {
            CheckSecondarySecurity(
                Language.StringByID(R.MyInternationalizationString.uTouchIDCheck),
                Language.StringByID(R.MyInternationalizationString.uPasswordAuthentication),
                Language.StringByID(R.MyInternationalizationString.uGestureAuthentication),
                SuccessAction, NotSettionAction);
        }
 
        /// <summary>
        /// 执行二次安全验证
        /// </summary>
        /// <param name="i_TouchText">Touch ID验证的显示文本</param>
        /// <param name="i_PasswordText">密码验证的显示文本</param>
        /// <param name="i_GestureText">手势验证的显示文本</param>
        /// <param name="SuccessAction">如果设置有验证方式,并且验证成功后才会调用的回调函数,不然不会调用这个东西</param>
        /// <param name="NotSettionAction">如果完全没有设置有验证方式,才会调用的回调函数,不然不会调用这个东西(取消输入不会调用这个东西)</param>
        public void CheckSecondarySecurity(string i_TouchText, string i_PasswordText, string i_GestureText, Action SuccessAction, Action NotSettionAction = null)
        {
            //先把这个东西置空
            TouchIDUtils.Instance.OnHDLTouchIDStateBackEvent = null;
 
            TouchIDUtils.TouchIDSupperType type = TouchIDUtils.getTouchIDSupperType();
            if (type == TouchIDUtils.TouchIDSupperType.TouchID && HdlUserCenterResourse.AccountOption.FingerprintAuthentication == true)
            {
                //Touch ID验证
                TouchIDUtils.Instance.OnHDLTouchIDStateBackEvent += (sender2, e2) =>
                {
                    if (e2 == TouchIDUtils.TouchIDState.Success)
                    {
                        //TouchID验证成功
                        SuccessAction?.Invoke();
                        SuccessAction = null;
                        TouchIDUtils.Instance.OnHDLTouchIDStateBackEvent = null;
                    }
                    else if (e2 == TouchIDUtils.TouchIDState.InputPassword)
                    {
                        //密码验证
                        if (string.IsNullOrEmpty(HdlUserCenterResourse.AccountOption.PswAuthentication) == false)
                        {
                            var form = new PswSecondarySecurityForm();
                            form.AddForm(i_TouchText, i_PasswordText, i_GestureText, SuccessAction);
                        }
                        //手势验证
                        else if (string.IsNullOrEmpty(HdlUserCenterResourse.AccountOption.GestureAuthentication) == false)
                        {
                            var form = new PswGestureSecirityForm();
                            form.AddForm(i_TouchText, i_PasswordText, i_GestureText, SuccessAction);
                        }
                        else
                        {
                            //没有设置密码验证
                            var alert = new ShowMsgControl(ShowMsgType.Tip, Language.StringByID(R.MyInternationalizationString.uPasswordAuthenticationNotSettion));
                            alert.Show();
                        }
                    }
                };
                TouchIDUtils.Instance.showTouchIDWithDescribe(null, null);
                NotSettionAction = null;
            }
            else if (string.IsNullOrEmpty(HdlUserCenterResourse.AccountOption.PswAuthentication) == false)
            {
                //密码验证
                var form = new PswSecondarySecurityForm();
                form.AddForm(i_TouchText, i_PasswordText, i_GestureText, SuccessAction);
                NotSettionAction = null;
            }
            else if (string.IsNullOrEmpty(HdlUserCenterResourse.AccountOption.GestureAuthentication) == false)
            {
                //手势验证
                var form = new PswGestureSecirityForm();
                form.AddForm(i_TouchText, i_PasswordText, i_GestureText, SuccessAction);
                NotSettionAction = null;
            }
            else
            {
                //完全没有设置有任何验证方式
                SuccessAction = null;
                NotSettionAction?.Invoke();
                NotSettionAction = null;
            }
        }
 
        #endregion
    }
}