建立良好体验度的Web注册系统 dodo

*项目名称:具有良好体验度的Web注册系统
*作者:草履虫
*联系:caolvchong@gmail.com
*时间:2007-6-29
*起因和版权说明:
  1.蓝色理想上有位会员发布了个类似的系统,提问说验证码不支持firefox的刷新,于是萌生念头做一个.本系统外观(按钮取色等)借鉴了该系统,但细节实现原理并不相同(该文地址:http://bbs.blueidea.com/thread-2761325-1-4.html).
  2.另外,自己做的这个注册系统中利用了网络上的无组件验证码(作者sipo)
  3.至于密码强度的算法借鉴了蓝色理想的一篇文章(http://www.blueidea.com/tech/web/2006/4324.asp),但该算法并不十分理想,如果有更好算法的朋友不妨交流一下

*特点和知识点:
  1.AJAX验证用户名和验证码,同时异步进行用户名注册(都属于AJAX的很基础部分)
  2.支持验证码刷新(包括firefox平台下)
  3.密码,邮箱,用户名等即时检测(利用javascript DOM)
  4.HTML通过W3C Strict验证,CSS也通过W3C CSS验证(其实这个有点多余,并不完全必要)

*开发平台:Windows2003 IIS6.0 Access数据库
*工具:DreamWeaver(写ASP),Aptana(写Javascript,HTML和CSS),Emeditor(写这篇文章),Access2003(数据库)
*测试平台:Firefox2.0,Opera9.21,IE6.0,IE7.0
*演示地址:http://finish.3322.org/reg/reg.htm(短期有效,在本机上,可能访问不顺畅)
*原文地址:http://cceer.xmu.edu.cn/blog/view.asp?id=52
*补充:
  如果你使用这个注册系统,请务必注意下列问题:
    本系统没有对密码进行加密,如果需要,可以搜索MD5加密
    本系统没有进行防注入设置,如果需要,可以搜索SQL防注入
  限于本人水平上的限制,错误和不足在所难免,如果你有问题或者建议,请联系我,感谢!

*这里是效果图

*这里是所有文件的打包下载(包括所有文件,图片,数据库等,解压后请在IIS下测试)
良好体验度的注册系统.rar

限于文章长度的限制,只帖出两个js文件和一个显示注册页面,至于后台处理页面以及css文件等,请在压缩包中查看
1.reg.htm(由于BLOG会过滤,分开三个部分写)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="gb2312">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312" />
<title>草履虫---简易AJAX注册页面</title>
  <link href="reg.css" type="text/css" rel="stylesheet" />
  <script src="detect.js" type="text/javascript"></script>
  <script src="ajax.js" type="text/javascript"></script>
</head>
<body onload="check_data();">

  1. <UL>  
  2. <LI id=title>草履虫---Web注册系统   
  3. <LI class=underline>  
  4.     <LABEL>注册用户名:   
  5.         <INPUT onblur=check_id(this.value); maxLength=16>  
  6.     </LABEL>  
  7.     <SPAN>支持汉字,单词,数字,敏感字符屏蔽</SPAN>  
  8.   
  9. <LI>  
  10.     <LABEL>注册密码:   
  11.         <INPUT onblur=check_password(); type=password value="">  
  12.     </LABEL>  
  13.     <SPAN>密码在6-16位之间,敏感字符屏蔽</SPAN>  
  14.   
  15. <LI class=underline>  
  16.     <LABEL>重复密码:   
  17.         <INPUT onblur=check_pw(); type=password maxLength=16 value="">  
  18.     </LABEL>  
  19.     <SPAN></SPAN>  
  20.   
  21. <LI class=underline>  
  22.     <LABEL>邮箱:   
  23.         <INPUT onblur=check_email(this.value)>  
  24.     </LABEL>  
  25.     <SPAN>email是联系重要手段</SPAN>  
  26.   
  27. <LI class=underline>验证码:   
  28.     <INPUT onblur=checkcode(this.value); maxLength=5>  
  29.     <LABEL>  
  30.         <IMG id=src onclick="this.src=this.src+'?'+Math.random();" height=18 alt=看不清楚?请点击刷新 src="getcode.asp">  
  31.         <SPAN>看不清楚?请点击验证码刷新</SPAN>  
  32.     </LABEL>  
  33.   
  34. <LI class=underline>  
  35.     相关协议:   
  36.         <LABEL onclick=accept_info();><INPUT type=radio name=info>接受</LABEL>  
  37.         <LABEL onclick=refuse_info();><INPUT type=radio name=info>不接受</LABEL>    
  38.         <INPUT class=button type=button value=阅读协议>  
  39.   
  40. <LI class=underline>  
  41.     <INPUT class="button setleft" onclick="sendinfo($('input')[0].value,$('input')[1].value,$('input')[3].value)" type=submit value=注册>  
  42.     <INPUT class=button onclick=reset_info() type=reset value=重置>  
  43.     <SPAN></SPAN>  
  44.   
  45. <LI class=copyright>作者:草履虫   
  46. <LI class=copyright>时间:2007-6-28   
  47. <LI class=copyright>联系:caolvchong@gmail.com   
  48. <LI class=copyright>Blog---Web2.0之路:<A href="http://cceer.xmu.edu.cn/blog/">http://cceer.xmu.edu.cn/blog/</A>  
  49. /LI></UL>  

</body>
</html>

2.detect.js
  1.     var flag=[0,0,0,0,0,0];   
  2.     var $=function(tagName){   
  3.         return document.getElementsByTagName(tagName);   
  4.     }   
  5. //----------接受协议   
  6.     function accept_info(){   
  7.         flag[0]=1;   
  8.         check_data();   
  9.     }   
  10. //----------拒绝协议   
  11.     function refuse_info(){   
  12.         flag[0]=0;   
  13.         check_data();   
  14.     }   
  15. //----------重置   
  16.     function reset_info(){   
  17.         var info=["支持汉字,单词,数字,敏感字符屏蔽","密码在6-16位之间,敏感字符屏蔽","","email是联系重要手段","看不清楚?请点击验证码刷新"]   
  18.         for(var i=0;i<$("span").length;i++){   
  19.             $("span")[i].innerHTML=info[i];   
  20.             flag[i]=0;   
  21.         }   
  22.         for(var i=0;i<$("input").length-3;i++){   
  23.             $("input")[i].value="";   
  24.         }   
  25.         check_data();   
  26.     }   
  27. //----------邮箱检测   
  28.     function check_email(email){   
  29.         var reEmail=/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;   
  30.         var b_email=reEmail.test(email);   
  31.         if(b_email){   
  32.             $("span")[3].innerHTML="<IMG src="yesok.gif"> 邮箱可用";   
  33.             flag[1]=1;   
  34.             check_data();   
  35.         }   
  36.         else{   
  37.             $("span")[3].innerHTML="<IMG src="yesno.gif"> 邮箱错误";   
  38.             flag[1]=0;   
  39.             check_data();   
  40.         }   
  41.     }   
  42. //----------密码检测   
  43.     function check_password(obj){   
  44.         var pwd=$("input")[1].value;   
  45.         var reChinese=/[\u0391-\uFFE5]+/;   
  46.         var b_chinese=reChinese.test(pwd);   
  47.         var reSpace=/\s+/;   
  48.         var b_space=reSpace.test(pwd);   
  49.         //-------长度测试   
  50.         if(pwd.length<6){   
  51.             $("span")[1].innerHTML="<IMG src="yesno.gif"> 密码长度不能小于6";   
  52.             flag[2]=0;   
  53.             check_data();   
  54.         }   
  55.         //-------合法性检测:不能包含汉字   
  56.         else if(b_chinese){   
  57.             $("span")[1].innerHTML="<IMG src="yesno.gif"> 密码不能包含中文";   
  58.             flag[2]=0;   
  59.             check_data();   
  60.         }   
  61.         //-------合法性检测:不能包含空格   
  62.         else if(b_space){   
  63.             $("span")[1].innerHTML="<IMG src="yesno.gif"> 密码不能包含空格";   
  64.             flag[2]=0;   
  65.             check_data();   
  66.         }   
  67.         //-------合法时显示密码强度   
  68.         else{   
  69.             //定义对应的消息提示   
  70.             var num=getResult(pwd);   
  71.             var msg=new Array("<IMG src="bad.gif"> 密码强度差","<IMG src="comm.gif"> 密码强度一般","<IMG src="good.gif"> 密码强度强壮");   
  72.             $("span")[1].innerHTML=msg[num];   
  73.             if($("input")[2].value!=""){   
  74.                 check_pw();   
  75.                 }   
  76.             return flag[2]=1;   
  77.             check_data();   
  78.             }   
  79.         }   
  80.         //定义检测函数,返回0/1/2分别代表差/一般/强   
  81.         function getResult(s){   
  82.             var ls =-1;   
  83.             if (s.match(/[a-z]/ig)){   
  84.                 ls++;   
  85.             }   
  86.             if (s.match(/[0-9]/ig)){   
  87.                 ls++;   
  88.             }   
  89.             if (s.match(/(.[^a-z0-9])/ig)){   
  90.                 ls++;   
  91.             }   
  92.             return ls;   
  93.         }   
  94.     //---------密码一致性检测     
  95.         function check_pw(){   
  96.             var pwd=$("input")[1].value.toString();   
  97.             var check_pwd=$("input")[2].value.toString();   
  98.             if(flag[2]==1){   
  99.                 if(pwd==check_pwd){   
  100.                     $("span")[2].innerHTML="<IMG src="yesok.gif"> 密码可以使用";   
  101.                     flag[3]=1;   
  102.                     check_data();   
  103.                 }   
  104.                 else{   
  105.                     $("span")[2].innerHTML="<IMG src="yesno.gif"> 两次密码不相同";   
  106.                     flag[3]=0;   
  107.                     check_data();   
  108.                 }   
  109.             }   
  110.         }   
  111.     //---------用户名合法性检测   
  112.         function check_id(id_name){//只能字母和数字,是否相同用AJAX判断   
  113.             var reId=/^[\w\u0391-\uFFE5]+$/;   
  114.             var b_id=reId.test(id_name);   
  115.             if(!b_id){   
  116.                 $("span")[0].innerHTML="<IMG src="yesno.gif"> ID命名非法";   
  117.                 flag[4]=0;   
  118.                 check_data();   
  119.             }   
  120.             else{//合法用户名用ajax的checkid()检测是否被注册过   
  121.                 checkid(id_name);   
  122.             }   
  123.         }   
  124.     //---------检查数据,使提交按钮是否生效   
  125.         function check_data(){   
  126.             if(flag[0]==1 && flag[1]==1 && flag[2]==1 && flag[3]==1 && flag[4]==1 && flag[5]==1){   
  127.                 $("input")[8].disabled=false;   
  128.             }   
  129.             else{   
  130.                 $("input")[8].disabled=true;   
  131.             }   
  132.         }   
  133.            
  134. //--------------------------------------------------------------------  
3.ajax.js
  1. function checkcode(regcode){       
  2.     var xmlhttp;   
  3.     try{   
  4.         xmlhttp=new XMLHttpRequest();   
  5.         }   
  6.     catch(e){   
  7.         xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");   
  8.         }   
  9.     xmlhttp.onreadystatechange=function(){   
  10.     if (xmlhttp.readyState==4){   
  11.         if (xmlhttp.status==200){   
  12.             var data=xmlhttp.responseText;   
  13.             code_result(data);   
  14.             }   
  15.         else{   
  16.             $("span")[4].innerHTML="验证码校验失败,请联系管理员";   
  17.             }   
  18.         }   
  19.     else{   
  20.         $("span")[4].innerHTML="正在进行验证码校验...";   
  21.         }   
  22.     }   
  23.     xmlhttp.open("post""check_code.asp"true);   
  24.     xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');   
  25.     xmlhttp.send("regcode="+escape(regcode));   
  26. }   
  27. function code_result(data){   
  28.     var resultbox=$("span")[4];   
  29.     if(data==1){   
  30.         resultbox.innerHTML='<IMG src="yesok.gif"> 验证码正确';   
  31.         flag[5]=1;   
  32.         check_data();   
  33.         }   
  34.     else{   
  35.         resultbox.innerHTML='<IMG src="yesno.gif"> 验证码错误';   
  36.         flag[5]=0;   
  37.         check_data();   
  38.         }   
  39. }   
  40.        
  41. //--------------------------------------------------------------------   
  42. function checkid(regid){       
  43.     var xmlhttp;   
  44.     try{   
  45.         xmlhttp=new XMLHttpRequest();   
  46.         }   
  47.     catch(e){   
  48.         xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");   
  49.         }   
  50.     xmlhttp.onreadystatechange=function(){   
  51.     if (xmlhttp.readyState==4){   
  52.         if (xmlhttp.status==200){   
  53.             var data=xmlhttp.responseText;   
  54.             id_result(data);   
  55.             }   
  56.         else{   
  57.             $("span")[0].innerHTML="用户名检测失败,请联系管理员";   
  58.             }   
  59.         }   
  60.     else{   
  61.         $("span")[0].innerHTML="正在进行用户名校验...";   
  62.         }   
  63.     }   
  64.     xmlhttp.open("post""check_id.asp"true);   
  65.     xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');   
  66.     xmlhttp.send("regid="+escape(regid));   
  67. }   
  68. function id_result(data){   
  69.     var resultbox=$("span")[0];   
  70.     if(data==1){   
  71.         resultbox.innerHTML='<IMG src="yesok.gif"> 用户名可用';   
  72.         flag[4]=1;   
  73.         check_data();   
  74.         }   
  75.     else{   
  76.         resultbox.innerHTML='<IMG src="yesno.gif"> 该用户名已经被注册';   
  77.         flag[4]=0;   
  78.         check_data();   
  79.     }   
  80. }   
  81.   
  82. //--------------------------------------------------------------------   
  83. function sendinfo(regname,pwd,email){   
  84.     var xmlhttp;   
  85.     try{   
  86.         xmlhttp=new XMLHttpRequest();   
  87.         }   
  88.     catch(e){   
  89.         xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");   
  90.         }   
  91.     xmlhttp.onreadystatechange=function(){   
  92.     if (xmlhttp.readyState==4){   
  93.         if (xmlhttp.status==200){   
  94.             var data=xmlhttp.responseText;   
  95.             reg_result(data);   
  96.             }   
  97.         else{   
  98.             $("span")[5].innerHTML="注册失败,请联系管理员";   
  99.             }   
  100.         }   
  101.     else{   
  102.         $("span")[5].innerHTML="正在进行用户名注册...";   
  103.         }   
  104.     }   
  105.     xmlhttp.open("post""reg.asp"true);   
  106.     xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');   
  107.     xmlhttp.send("regname="+escape(regname)+"&pwd="+escape(pwd)+"&email="+escape(email));   
  108. }   
  109. function reg_result(data){   
  110.     if(data==1){   
  111.         $("span")[5].innerHTML='<A href="http://cceer.xmu.edu.cn/blog/" target=_blank>'+$("input")[0].value+",您好.请点击这里登陆</A>";   
  112.         }   
  113.     else{   
  114.         $("span")[5].innerHTML="注册失败,请联系管理员";   
  115.     }   
  116.     }  
原文地址:https://www.cnblogs.com/zgqys1980/p/1100885.html