表单验证 Validator v1.05

表单的验证一直是网页设计者头痛的问题,表单验证类 Validator就是为解决这个问题而写的,旨在使设计者从纷繁复杂的表单验证中解放出来,把精力集中于网页的设计和功能上的改进上。

Validator是基于JavaScript技术的伪静态类和对象的自定义属性,可以对网页中的表单项输入进行相应的验证,允许同一页面中同时验证多个表单,熟悉接口之后也可以对特定的表单项甚至仅仅是某个字符串进行验证。因为是伪静态类,所以在调用时不需要实例化,直接以"类名+.语法+属性或方法名"来调用。此外,Validator还提供3种不同的错误提示模式,以满足不同的需要。

Validator目前可实现的验证类型有:
[JavaScript] 版
Validator目前可实现的验证类型有:
1.是否为空;
2.中文字符;
3.双字节字符
4.英文;
5.数字;
6.整数;
7.实数;
8.Email地址;
9.使用HTTP协议的网址;
10.电话号码;
11.货币;
12.手机号码;
13.邮政编码;
14.身份证号码(1.05增强);
15.QQ号码;
16.日期;
17.符合安全规则的密码;
18.某项的重复值;
19.两数的关系比较;
20.判断输入值是否在(n, m)区间;
21.输入字符长度限制(可按字节比较);
22.对于具有相同名称的单选按钮的选中判断;
23.限制具有相同名称的多选按钮的选中数目;
24.自定义的正则表达式验证;
25.文件上传格式过滤(1.04)
运行环境(客户端):
在Windows Server 2003下用IE6.0+SP1和Mozilla Firefox 1.0测试通过;
在Lunix RedHat 9下的Netscape测试通过;

对于客户端的表单验证,这个基于JavaScript编写的Validator基本上都可以满足,具体可以下载CHM文件:Validator.CHM下载

示例:

代码如下:

[Ctrl+A 全选 提示:你可先修改部分代码,再点运行代码]

更新历史:

1.01
修正对12月份的日期验证(感谢flylg999)

1.03
修正Range验证类型时将数字当字符串比较的bug(感谢cncom和xtlhnhbb)
修正日期验证(感谢Papsam)
增加Username验证类型
增加对Phone验证类型时支持分机号

1.04
增加文件格式的过滤,用于上传时限制上传的文件格式

1.05
增强对身份证号码的验证

[ASP]版代码拷贝框

  1 < %
  2 Class Validator
  3 ' *************************************************
  4 '     Validator for ASP beta 2 服务器端脚本
  5 '     code by 我佛山人
  6 '     wfsr@cunite.com
  7 '     http://www.cunite.com
  8 ' *************************************************
  9      Private  Re, Dic
 10      Private  Separator
 11      Private  ErrorItem, ErrorMessage, ErrorMode, ErrorNo
 12      Private  FormName, FormIndex, FilePath, GetMethod
 13
 14      Private   Sub  Class_Initialize()
 15          Set  Re  =   New  RegExp
 16         Re.IgnoreCase  =   True
 17         Re.Global  =   True
 18          Set  Dic  =   CreateObject ( " Scripting.Dictionary " )
 19         Separator  =   " ,"
 20         ErrorItem  =   " "
 21         ErrorMessage  =   " "
 22         ErrorMode  =   5
 23         ErrorNo  =   1
 24         FilePath  =  Server.MapPath(Request.ServerVariables( " Script_Name " ))
 25         GetMethod  =   " FSO"
 26      End Sub
 27
 28      Private   Sub  Class_Terminate()
 29          Set  Re  =   Nothing
 30         Dic.RemoveAll()
 31          Set  Dic  =   Nothing
 32      End Sub
 33
 34      Public   Sub  Validate()
 35          IF  Request( " Submit " ) = ""   Then      Exit   Sub
 36          IF   Not  IsValidPost()  Then      Exit   Sub
 37
 38          With  Dic
 39             .Add  " Compare " " Compare( PostValue, operator, toObj)"
 40             .Add  " Custom " " Custom( PostValue,regexp )"
 41             .Add  " Date " " IsDateFormat( PostValue,format )"
 42             .Add  " Limit " " Limit( PostValue,min, max )"
 43             .Add  " LimitB " " LimitB( PostValue,min, max )"
 44             .Add  " Range " " Range( PostValue,min, max )"
 45             .Add  " Repeat " " IsEqual( PostValue, Request(toObj) )"
 46             .Add  " Group " " Group( PostValue,min, max )"
 47
 48             .Add  " NotEqual " " Op1 <> Op2"
 49             .Add  " GreaterThan " " Op1 > Op2"
 50             .Add  " GreaterThanEqual " " Op1 >= Op2"
 51             .Add  " LessThan " " Op1 < Op2"
 52             .Add  " LessThanEqual " " Op1 <= Op2"
 53             .Add  " Equal " " Op1 = Op2"
 54          End   With
 55
 56          Call  MatchCode()
 57
 58          IF  ErrorMessage  <>   ""   Then  DisplayError
 59      End Sub
 60
 61      Private   Sub  MatchCode()
 62          Dim  bI, bG, bM
 63          Dim  Str
 64
 65          Select   Case  GetMethod
 66              Case   " FSO "  :
 67                  Dim  FSO :  Set  FSO  =  Server. CreateObject ( " Scripting.FileSystemObject " )
 68                  Set  TS  =  FSO.OpenTextFile(FilePath,  1 false )
 69                 Str  =  TS.ReadAll()
 70                 TS.Close
 71                  Set  TS  =   Nothing
 72                  Set  FSO  =   Nothing
 73              Case   " XMLHTTP "  :
 74                  Dim  XHttp :  Set  XHttp  =  Server. CreateObject ( " MSXML2.XMLHTTP " )
 75                  With  XHttp
 76                      Call  .Open( " Get " " http:// " & Request.ServerVariables( " Server_Name " ) & Request.ServerVariables( " Script_Name " ),  False )
 77                      Call  .Send()
 78                     Str  = B2S(.responseBody)
 79                  End   With
 80                  Set  XHttp  =   Nothing
 81          End   Select
 82          Dim  itemString
 83          With  Re
 84             bI  =  .IgnoreCase
 85             bG  =  .Global
 86             bM  =  .MultiLine
 87             .IgnoreCase  =   True
 88             .Global  =   True
 89             .Pattern  =   " [/s/S]*<form [^>]+>([/s/S]+)<//form>[/s/S]*"
 90             Str  =  . Replace (Str,  " $1 " )
 91
 92             .Global  =   True
 93             .MultiLine  =   True
 94             .Pattern  =   " <//?(?!input|textarea|select)[^>]*>"
 95             Str  =  . Replace (Str,  "" )
 96
 97             .Pattern  =   " ^.*(<(?=input|textarea|select)[^>]*>).*$"
 98             Str  =  . Replace (Str,  " $1 " )
 99
100             .Pattern  =   " ([/r/n]+|^/s*)(?=<)"
101             Str  =  . Replace (Str,  "" )
102              While  Test( " dataType=([""/'])([^""/'>]+)/1 " , Str)
103                 .MultiLine  =   False
104                 .Pattern  =   " ^([^/n]+)/n([/s/S]*)$"
105                 itemString  =  . Replace (Str,  " $1 " )
106                 Str  =  . Replace (Str,  " $2 " )
107                 .Pattern  =   " (name|dataType|to1|min|max|msg|require|regexp|format)=([""/'])([^""/'>]+)/2"
108
109                  Dim  Matches :  Set  Matches  =  . Execute (itemString)
110                  Dim  Match, RetStr : RetStr  =   " "
111                     For   Each  Match in Matches
112                       RetStr  =  RetStr  &  Match.Value  &   "  : "
113                     Next
114                  Call  IsValid( Replace ( Replace ( Replace (RetStr,  "  : $ " "" ),  " to= " " toObj= " ),  " ""Require"" " " ""NotEmpty"" " ))
115              Wend
116             .IgnoreCase  =  bI
117             .Global  =  bG
118             .MultiLine  =  bM
119
120          End   With
121      End Sub
122
123      Private   Sub  IsValid(ByVal Str)
124          Dim  name, msg, dataType, toObj, min, max, require, regexp, format
125         min  =   1  : max  =   100  : require  =   " true "  : format  =   " YMD"
126          Execute  Str
127          Dim  PostValue : PostValue  =  Request(name)
128          Dim  Fun
129         
130          IF  require  =   " false "   AND  PostValue  =   ""   Then   Exit   Sub
131
132          IF  Dic.Exists(dataType)  Then     
133             Fun  =  Dic.Item(dataType) 
134          Else  Fun  =   " Is "   &  dataType  & " ( PostValue )"
135          End   IF
136
137          IF   Not   Eval (Fun)  Then   Call  AddError(name,msg)
138      End Sub
139
140      Private   Sub  DisplayError()
141         ErrorItem  =   Replace (ErrorItem,  " ^( "   &  Separator  &   " ) " "" )
142         ErrorMessage  =   Replace (ErrorMessage,  " ^( "   &  Separator  &   " ) " "" )
143          Select   Case  ErrorMode
144              Case   4  
145                 ErrorMessage  =   Join ( Split (ErrorMessage, Separator),  " </li><li> " )
146                 Response.Clear
147                 Response.Write  " <div style=""padding-left:100px;font:bold 12px Tahoma"">输入有错误:<br><ul><li> "   &   Replace (ErrorMessage,  " /b/d+: " "" &   " </li></ul>"
148                 Response.Write  " <br><a href='javascript:history.back()'>返回重填</a></div>"
149                 Response. End
150              Case   Else
151                 Response.Write( " <script defer>dispError("" "   &  ErrorItem  &   " "", "" "   &  ErrorMessage  &   " "",  "   &  ErrorMode  &   " , "" "   &  Separator  &   " "")</script> " )
152          End   Select
153      End Sub
154
155      Public   Function  IsEmail(ByVal Str)
156         IsEmail  =  Test( " ^/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*$ " , Str)
157      End Function
158
159      Public   Function  IsUrl(ByVal Str)
160         IsUrl  =  Test( " ^http:[A-Za-z0-9]+/.[A-Za-z0-9]+[//=/?%/-&_~`@[/]/':+!]*([^<>""])*$ " , Str)
161      End Function
162
163      Public   Function  IsNum(ByVal Str)
164         IsNum =  Test( " ^/d+$ " , Str)
165      End Function
166
167      Public   Function  IsQQ(ByVal Str)
168         IsQQ  =  Test( " ^[1-9]/d{4,8}$ " , Str)
169      End Function
170
171      Public   Function  IsZip(ByVal Str)
172         IsZip  =  Test( " ^[1-9]/d{5}$ " , Str)
173      End Function
174
175      Public   Function  IsIdCard(ByVal Str)
176         IsIdCard  =  Test( " ^/d{15}(/d{2}[A-Za-z0-9])?$ " , Str)
177      End Function
178
179      Public   Function  IsChinese(ByVal Str)
180         IsChinese  =  Test( " ^[/u0391-/uFFE5]+$ " , Str)
181      End Function
182
183      Public   Function  IsEnglish(ByVal Str)
184         IsEnglish  =  Test( " ^[A-Za-z]+$ " , Str)
185      End Function
186
187      Public   Function  IsMobile(ByVal Str)
188         IsMobile  =  Test( " ^((/(/d{3}/))|(/d{3}/-))?13/d{9}$ " , Str)
189      End Function
190
191      Public   Function  IsPhone(ByVal Str)
192         IsPhone  =  Test( " ^((/(/d{3}/))|(/d{3}/-))?(/(0/d{2,3}/)|0/d{2,3}-)?[1-9]/d{6,7}$ " , Str)
193      End Function
194
195      Public   Function  IsSafe(ByVal Str)
196         IsSafe  =  (Test( " ^(([A-Z]*|[a-z]*|/d*|[-_/~!@#/$%/^&/*/./(/)/[/]/{/}<>/?/'/""]*)|.{0,5})$|/s " , Str)  =   False )
197      End Function
198
199      Public   Function  IsNotEmpty(ByVal Str)
200         IsNotEmpty  =  LenB(Str)  >   0
201      End Function
202
203      Public   Function  IsDateFormat(ByVal Str, ByVal Format)
204          IF   Not   IsDate (Str)  Then
205             IsDateFormat  =   False
206              Exit   Function
207          End   IF
208
209          IF  Format  =   " YMD "   Then
210             IsDateFormat  =  Test( " ^((/d{4})|(/d{2}))([-./])(/d{1,2})/4(/d{1,2})$ " , Str)
211          Else  
212             IsDateFormat  =  Test( " ^(/d{1,2})([-./])(/d{1,2})//2((/d{4})|(/d{2}))$ " , Str)
213          End   IF
214      End Function
215
216      Public   Function  IsEqual(ByVal Src, ByVal Tar)
217         IsEqual  =  (Src  =  Tar)
218      End Function
219
220      Public   Function  Compare(ByVal Op1, ByVal Operator, ByVal Op2)
221         Compare  =   False
222          IF  Dic.Exists(Operator)  Then
223             Compare  =   Eval (Dic.Item(Operator))
224              Elseif  IsNotEmpty(Op1)  Then
225                 Compare  =   Eval (Op1  &   Operator  &  Op2 )
226          End   IF
227      End Function
228
229      Public   Function  Range(ByVal Src, ByVal Min, ByVal Max)
230         Min  =   CInt (Min) : Max  =   CInt (Max)
231         Range  =  (Min  <  Src  And  Src  <  Max)
232      End Function
233
234      Public   Function  Group(ByVal Src, ByVal Min, ByVal Max)
235         Min  =   CInt (Min) : Max  =   CInt (Max)
236          Dim  Num : Num  =   UBound ( Split (Src,  " , " ))  +   1
237         Group  =  Range(Num, Min  -   1 , Max  +   1 )
238      End Function
239
240      Public   Function  Custom(ByVal Str, ByVal Reg)
241         Custom  =  Test(Reg, Str)
242      End Function
243
244      Public   Function  Limit(ByVal Str, ByVal Min, ByVal Max)
245         Min  =   CInt (Min) : Max  =   CInt (Max)
246          Dim  L : L  =   Len (Str)
247         Limit  =  (Min  <=  L  And  L  <=  Max)
248      End Function
249
250      Public   Function  LimitB(ByVal Str, ByVal Min, ByVal Max)
251         Min  =   CInt (Min) : Max  =   CInt (Max)
252          Dim  L : L  = bLen(Str)
253         LimitB  =  (Min  <=  L  And  L  <=  Max)
254      End Function
255
256      Private   Function  Test(ByVal Pattern, ByVal Str)
257         Re.Pattern  =  Pattern
258         Test  =  Re.Test(Str)
259      End Function
260
261      Public   Function  bLen(ByVal Str)
262         bLen  =   Len ( Replace (Str,  " [^/x00-/xFF] " " .. " ))
263      End Function
264
265      Private   Function   Replace (ByVal Str, ByVal Pattern, ByVal ReStr)
266         Re.Pattern  =  Pattern
267          Replace   =      Re. Replace (Str, ReStr)
268      End Function
269
270      Private   Function  B2S(ByVal iStr) 
271          Dim  reVal : reVal =   " "
272          Dim  i, Code, nCode
273          For  i  =   1   to  LenB(iStr) 
274             Code  =  AscB(MidB(iStr, i,  1 )) 
275              IF  Code  <   & h80  Then  
276                 reVal  =  reVal  &   Chr (Code) 
277              Else  
278                 nCode  =  AscB(MidB(iStr, i + 1 1 )) 
279                 reVal  =  reVal  &   Chr ( CLng (Code)  *   & h100  +   CInt (nCode)) 
280                 i  =  i  +   1  
281              End   IF  
282          Next
283         B2S  =  reVal 
284      End Function
285
286      Private   Sub  AddError(ByVal Name, ByVal Message)
287         ErrorItem  =  ErrorItem  &  Separator  &  Name
288         ErrorMessage  =  ErrorMessage  &  Separator  &  ErrorNo  &   " : "   &  Message
289         ErrorNo  =  ErrorNo  +   1
290      End Sub
291
292      Public   Function  IsValidPost()
293          Dim  Url1 : Url1  =   Cstr (Request.ServerVariables( " HTTP_REFERER " ))
294          Dim  Url2 : Url2  =   Cstr (Request.ServerVariables( " SERVER_NAME " ))
295         IsValidPost  =  ( Mid (Url1,  8 Len (Url2))  =  Url2)
296      End Function
297
298      Public   Property   Let  Mode(ByVal Val)
299         ErrorMode  =   CInt (Val)
300      End Property
301
302      Public   Property   Let  Form(ByVal Val)
303          IF   IsNumeric (Val)  Then
304             FormIndex  =  Val
305          Else
306             FormName  =  Val
307          End   IF
308      End Property
309
310      Public   Property   Let  Path(ByVal Val)
311          IF  Test( " ^[A-Za-z]:///w+$ " , Val)  Then
312             FilePath  =  Val
313          Else
314             FilePath  =  Server.MapPath(Val)
315          End   IF
316      End Property
317
318      Public   Property   Let  Method(ByVal Val)
319         GetMethod  =  Val
320      End Property
321 End  Class
322 % >
323   < title > 表单验证类 Validator v1. 0 </ title >
324   < meta http - equiv = " Content-Type "  content = " text/html; charset=gb2312 " >
325   < style >
326  body,td{font:normal 12px Verdana;color:# 333333 }
327  input,textarea, select ,td{font:normal 12px Verdana;color:# 333333 ;border:1px solid # 999999 ;background:#ffffff}
328  table{border - collapse:collapse;}
329  td{padding:3px}
330  input{height: 20 ;}
331  textarea{width: 80 %;height:50px;overfmin:auto;}
332  form{display:inline}
333   </ style >
334   < script >
335   /*************************************************
336     Validator  for  ASP beta  2  客户端脚本
337     code by 我佛山人
338     wfsr@cunite.com
339     http: // www.cunite.com
340 *************************************************/
341   function  dispError(items, messages, mode, separator){
342     var iArray  =  items. split (separator);
343      for (var i = iArray.length - 1 ;i >= 0 ;i -- )
344         iArray[i]  =  getObj(iArray[i]);
345     messages  =  ( " 以下原因导致提交失败:/t/t/t/t "   +  separator  +  messages). split (separator);
346     switch(mode){
347          case   2  :
348              for (i = iArray.length - 1 ;i >= 0 ;i -- )
349                 iArray[i].style.color  =   " red " ;
350          case   1  :
351             alert(messages. join ( " /n " ));
352             iArray[ 0 ].focus();
353             break;
354          case   3  :
355              for (i = iArray.length - 1 ;i >= 0 ;i -- ){
356                 try{
357                     var span  =  document.createElement( " SPAN " );
358                     span.id  =   " __ErrorMessagePanel " ;
359                     span.style.color  =   " red " ;
360                     iArray[i].parentNode.appendChild(span);
361                     span.innerHTML  =  messages[i + 1 ]. replace ( // d + : / , " * " );
362                 }
363                 catch(e){alert(e.description);}
364             }
365             iArray[ 0 ].focus();
366             break;
367     }
368  }
369
370   function  getObj(name){
371     var objs  =  document.getElementsByName(name);
372     return objs[objs.length  - 1 ];
373  }
374 </ script >
375   < form name = " theForm "  id = " demo "  action = ""  method = " post "  onSubmit = " return true " >
376   < table align = " center " >
377      < tr >
378     < td > 真实姓名: </ td >< td >< input name = " Name "  dataType = " Chinese "  msg = " 真实姓名只允许中文 " ></ td >
379    </ tr >
380    < tr >
381     < td > 英文名: </ td >< td >< input name = " Nick "  dataType = " English "  require = " false "  msg = " 英文名只允许英文字母 " ></ td >
382    </ tr >
383      < tr >
384     < td > 主页: </ td >< td >< input name = " Homepage "  require = " false "  dataType = " Url "    msg = " 非法的Url " ></ td >
385    </ tr >
386    < tr >
387     < td > 密码: </ td >< td >< input name = " Password "  dataType = " Safe "    msg = " 密码不符合安全规则 "  type = " password " ></ td >
388    </ tr >
389    < tr >
390     < td > 重复: </ td >< td >< input name = " Repeat "  dataType = " Repeat "   to = " Password "  msg = " 两次输入的密码不一致 "  type = " password " ></ td >
391    </ tr >
392    < tr >
393     < td > 信箱: </ td >< td >< input name = " Email "  dataType = " Email "  msg = " 信箱格式不正确 " ></ td >
394    </ tr >
395      < tr >
396     < td > 信箱: </ td >< td >< input name = " Email1 "  dataType = " Repeat "   to = " Email "  msg = " 两次输入的信箱不一致 " ></ td >
397    </ tr >
398    < tr >
399     < td > QQ: </ td >< td >< input name = " QQ "  require = " false "  dataType = " QQ "  msg = " QQ号码不存在 " ></ td >
400    </ tr >
401      < tr >
402     < td > 身份证: </ td >< td >< input name = " Card "  dataType = " IdCard "  msg = " 身份证号码不正确 " ></ td >
403    </ tr >
404    < tr >
405     < td > 年龄: </ td >< td >< input name = " Year "  dataType = " Range "  msg = " 年龄必须在18~28之间 "  min = " 18 "  max = " 28 " ></ td >
406    </ tr >
407     < tr >
408     < td > 年龄1: </ td >< td >< input name = " Year1 "  require = " false "  dataType = " Compare "  msg = " 年龄必须在18以上 "  to1 = " 18 "  operator = " GreaterThanEqual " ></ td >
409    </ tr >
410     < tr >
411     < td > 电话: </ td >< td >< input name = " Phone "  require = " false "  dataType = " Phone "  msg = " 电话号码不正确 " ></ td >
412    </ tr >
413     < tr >
414     < td > 手机: </ td >< td >< input name = " Mobile "  require = " false "  dataType = " Mobile "  msg = " 手机号码不正确 " ></ td >
415    </ tr >
416       < tr >
417     < td > 生日: </ td >< td >< input name = " Birthday "  dataType = " Date "  format = " YMD "  msg = " 生日日期不存在 " ></ td >
418    </ tr >
419     < tr >
420     < td > 邮政编码: </ td >< td >< input name = " Zip "  dataType = " Custom "  regexp = " ^[1-9]/d{5}$ "  msg = " 邮政编码不存在 " ></ td >
421    </ tr >
422    < tr >
423     < td > 邮政编码: </ td >< td >< input name = " Zip1 "  dataType = " Zip "  msg = " 邮政编码不存在 " ></ td >
424    </ tr >
425    < tr >
426     < td > 操作系统: </ td >< td >< select  name = " OS "  dataType = " Require "   msg = " 未选择所用操作系统 "   >< option  value = "" > 选择您所用的操作系统 </ option >< option  value = " Win98 " > Win98 </ option >< option  value = " Win2k " > Win2k </ option >< option  value = " WinXP " > WinXP </ option ></ select ></ td >
427    </ tr >
428    < tr >
429     < td > 所在省份: </ td >< td > 广东 < input name = " Province "  value = " 1 "  type = " radio " > 陕西 < input name = " Province "  value = " 2 "  type = " radio " > 浙江 < input name = " Province "  value = " 3 "  type = " radio " > 江西 < input name = " Province "  value = " 4 "  type = " radio "  dataType = " Group "   msg = " 必须选定一个省份 " ></ td >
430    </ tr >
431    < tr >
432     < td > 爱好: </ td >< td > 运动 < input name = " Favorite "  value = " 1 "  type = " checkbox " > 上网 < input name = " Favorite "  value = " 2 "  type = " checkbox " > 听音乐 < input name = " Favorite "  value = " 3 "  type = " checkbox " > 看书 < input name = " Favorite "  value = " 4 "  type = " checkbox "  dataType = " Group "  min = " 2 "  max = " 3 "   msg = " 必须选择2~3种爱好 " ></ td >
433    </ tr >
434    < tr >
435     < td > 自我介绍: </ td >< td >< textarea name = " Description "  dataType = " Limit "  max = " 10 "   msg = " 自我介绍内容必须在10个字之内 " > 中文是一个字 </ textarea ></ td >
436    </ tr >
437    < tr >
438       < td > 自传: </ td >< td >< textarea name = " History "  dataType = " LimitB "  min = " 3 "  max = " 10 "   msg = " 自传内容必须在[3~10]个字节之内 " > 中文是两个字节t </ textarea ></ td >
439    </ tr >
440    < tr >
441     < td colspan = " 2 " >< input name = " Submit "  type = " submit "  value = " 确定提交 " ></ td >
442    </ tr >
443   </ table >
444 </ form >
445 < %
446      Dim  V :  Set  V  =   New  Validator
447     V.Mode  =   3
448     V.Method  =   " XMLHTTP"
449     V.Validate()
450      Set  V  =   Nothing
451 % >
452 </ body >
453 </ html >

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值