forked from BeyondDimension/SteamTools
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathModelValidatorProvider.cs
185 lines (156 loc) · 6.6 KB
/
ModelValidatorProvider.cs
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
/* (模型验证提供者)模块说明
* 模型类 应当继承接口 IReadOnlyXXX 或 IReadOnlyNullableXXX
* IXXX接口 不继承 IReadOnly 或 IReadOnlyNullable
* 所以 应当 使用 IReadOnlyXXX 或 IReadOnlyNullableXXX
* IXXX 实现 get, set 常用于表中的字段
* IReadOnlyXXX 仅实现get,用于验证字段值是否正确
* IReadOnlyNullableXXX 基本同上,不同在于允许 null 值,如果字段类型有Empty,则通常Empty等效于null
* ----------------------------------------------------------------------
* 添加一个新的列的验证,例:
* 定义一个 IXXX接口
* 定义一个 IReadOnlyXXX接口
* 如果允许null值,则再定义一个 IReadOnlyNullableXXX 接口
* ----------------------------------------------------------------------
* 验证过滤字段参数 params Type[] ignores
* 传入的类型 为接口 IXXX 或 IReadOnlyXXX 或 IReadOnlyNullableXXX 三者等效
* 实现逻辑:通过反射Name字符串截取获取XXX作为比较
* ----------------------------------------------------------------------
* 对于模型类中某一个字段XXX,要么此类继承 IReadOnlyXXX 要么继承 IReadOnlyNullableXXX 不能同时继承两者
* ----------------------------------------------------------------------
* 如果对于某一个模型类中的某个类型,需要对另一个字段进行不同的验证,可添加新的类型字段接口
* 在 ColumnValidate 验证逻辑中 添加新的 is IXXX t switch(t.X) 进行不同的验证
* ----------------------------------------------------------------------
* 如果需要根据不同的模型类,进行输出不同的 errorMessage 原理同上
*/
using System.Application.Columns;
using static System.Application.Services.Implementation.ModelValidator;
namespace System.Application
{
/// <summary>
/// 模型验证提供者
/// </summary>
public static class ModelValidatorProvider
{
public static void Init()
{
AddColumnValidate<IReadOnlyPhoneNumber>(ColumnValidate);
AddColumnValidate<IReadOnlySmsCode>(ColumnValidate);
//AddColumnValidate<IReadOnlyBirthDate>(ColumnValidate);
//AddColumnValidate<IReadOnlyGender>(ColumnValidate);
AddColumnValidate<IReadOnlyAvatar>(ColumnValidate);
AddColumnValidate<IReadOnlyNickName>(ColumnValidate);
}
#region ColumnValidates
static string? ColumnValidate(IReadOnlyPhoneNumber value)
{
if (string.IsNullOrEmpty(value.PhoneNumber))
{
return Constants.请输入手机号码哦;
}
if (!IsPhoneNumberCorrect(value.PhoneNumber))
{
return Constants.请输入正确的手机号码哦;
}
return null;
}
static string? ColumnValidate(IReadOnlySmsCode value)
{
if (string.IsNullOrEmpty(value.SmsCode))
{
return Constants.请输入短信验证码哦;
}
if (!IsSmsCodeCorrect(value.SmsCode))
{
return Constants.短信验证码不正确;
}
return null;
}
//static string? ColumnValidate(IReadOnlyBirthDate value)
//{
// if (value.BirthDate == default)
// {
// return Constants.请输入年龄;
// }
// return null;
//}
//static string? ColumnValidate(IReadOnlyGender value)
//{
// if (!value.Gender.IsDefined())
// {
// return Constants.请选择性别;
// }
// return null;
//}
static string? ColumnValidate(IReadOnlyAvatar value)
{
if (value.Avatar == default)
{
return Constants.请选择头像;
}
return null;
}
static string? ColumnValidate(IReadOnlyNickName value)
{
if (string.IsNullOrWhiteSpace(value.NickName))
{
return Constants.请输入昵称;
}
else if (value.NickName.Length > Lengths.NickName)
{
return string.Format(Constants.昵称最大长度不能超过_, Lengths.NickName);
}
return null;
}
#endregion
#region Validates
/// <summary>
/// 验证字符串是否为正确的手机号码
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
static bool IsPhoneNumberCorrect(string value)
// 纯数字, 1开头,11位手机号码
=> !(value.Length != Lengths.PhoneNumber || value[0] != '1' || !value.IsDigital());
/// <summary>
/// 验证字符串是否为正确的短信验证码
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
static bool IsSmsCodeCorrect(string value)
=> !(value.Length != Lengths.SMS_CAPTCHA || !value.IsDigital());
#endregion
private static class Constants
{
public const string 请输入手机号码哦 = "请输入手机号码哦";
public const string 请输入正确的手机号码哦 = "请输入正确的手机号码哦";
public const string 请输入短信验证码哦 = "请输入短信验证码哦";
public const string 短信验证码不正确 = "短信验证码不正确";
//public const string 请输入年龄 = "请选择年龄";
//public const string 请选择性别 = "请选择性别";
public const string 请选择头像 = "请选择头像";
public const string 请输入昵称 = "请输入昵称";
public const string 昵称最大长度不能超过_ = "昵称最大长度不能超过{0}个字";
public const string 请输入邀请码哦 = "请输入邀请码哦";
public const string 请输入正确的邀请码哦 = "请输入正确的邀请码哦";
}
public static class Lengths
{
/// <summary>
/// 颜色16进制值,#AARRGGBB
/// </summary>
public const int ColorHex = 9;
/// <summary>
/// 手机号码
/// </summary>
public const int PhoneNumber = PhoneNumberHelper.Length;
/// <summary>
/// 昵称
/// </summary>
public const int NickName = 20;
/// <summary>
/// 短信验证码
/// </summary>
public const int SMS_CAPTCHA = 6;
}
}
}