介绍
介绍
福哥今天带着大家完成TFUMS系统的忘记密码功能的第一步——验证用户信息。因为用户数据表里userName和userEmail都是唯一的,它们都可以作为忘记密码的验证手段。而userEmail是需要登录后进行绑定邮箱才会产生的,也就是说它不一定是存在的。
综上所述,福哥决定userName和userEmail都要验证,只要其中一个验证通过了就可以了。由于userName是一定存在的,所有福哥优先验证userName。
还有一个问题,邮箱的特点是包含一个“@”字符的,为了避免有人拿邮箱作为用户名注册的冲突问题,福哥还要在注册地方限制用户名不能包含“@”字符才行。
手机号码注册是一个很主流的设计,福哥今后会添加绑定手机号码的功能,手机号码也会成为忘记密码的验证手段,所以用户名也不能是一个手机号码。
注册接口控制器
福哥在注册接口控制器里增加了对用户名的格式的判断逻辑。
if(preg_match("/[\`\!\@\#\$\%\^\&\*\(\)\-\_\+\=\|\\\{\}\[\]\:\;\"\'\<\>\,\.\?\/]/", $userName)){ return $this->tfphp->getResponse()->responseJSON_CM(200, 1001001, "用户名不能包含特殊符号"); } if(preg_match("/^1\d{10}$/", $userName)){ return $this->tfphp->getResponse()->responseJSON_CM(200, 1001001, "用户名不能是手机号码"); }
注册视图模板
福哥在注册视图模板里也增加了对用户名的格式的判断逻辑。
[ {type:"empty", name:"user", msg:"请填写用户名"}, {type:"min", value:2, name:"user", msg:"用户名最少2个字"}, {type:"max", value:20, name:"user", msg:"用户名最多20个字"}, {type:"mre", value:/[\`\!\@\#\$\%\^\&\*\(\)\-\_\+\=\|\\\{\}\[\]\:\;\"\'\<\>\,\.\?\/]/, name:"user", msg:"用户名不能包含符号"}, {type:"mre", value:/^1\d{10}$/, name:"user", msg:"用户名不能是手机号码"}, {type:"empty", name:"pass", msg:"请填写密码"}, {type:"min", value:6, name:"pass", msg:"密码最少6个字"}, {type:"empty", name:"confirmPass", msg:"请填写确认密码"}, {type:"empty", name:"vsn", msg:"请填写验证码"}, ]
模型user
forgot
public function forgot(string $user):?string { $myAES = new TFAES($this->tfphp); if(strpos("@", $user) !== false){ $userInfo = $this->getByTable("userByEmail", array($user)); } else{ $userInfo = $this->getByTable("userByName", array($user)); } if($userInfo != null){ $userInfoData = serialize(array('userID'=>$userInfo['userID'],'userName'=>$userInfo['userName'],'userEmail'=>$userInfo['userEmail'])); $userInfoDataEncrypted = $myAES->encrypt($userInfoData, TFConfig::get("projectAESPK", "system"). date("YmdH0000"), ""); return $userInfoDataEncrypted; } return null; }
验证用户信息接口
user_process
protected function user_process(){ $req = $this->tfphp->getRequest(); $post = $req->post; $user = new user($this->tfphp); $userName = $post->get("user"); try{ // request test if($userName == ""){ return $this->tfphp->getResponse()->responseJSON_CM(200, 1001081, "错误请求"); } // forgot user $ret = $user->forgot($userName); if($ret != null){ return $this->tfphp->getResponse()->responseJSON_CM(200, 0, "OK", array('sn'=>$ret)); } else{ return $this->tfphp->getResponse()->responseJSON_CM(200, 1001082, "找不到匹配的用户"); } } catch(\TypeError $e){ return $this->tfphp->getResponse()->responseJSON_CM(200, 1001081, "错误请求"); } // output return $this->tfphp->getResponse()->responseJSON_CM(200, 1001081, "错误请求"); }
验证用户信息模板
HTML代码
<!-- forgot form begin --> <div class="row login-form"> <div class="col-sm-12"> <h3 class="text-center">忘记密码</h3> <p>请输入正确的用户名或者邮箱地址</p> <form action="forgotWay.htm"> <div class="form-group"> <label>用户名/邮箱地址</label> <input class="form-control" type="text" name="user" /> </div> <div class="form-group"> <button class="btn btn-primary btn-sm form-control">下一步</button> </div> </form> </div> </div> <!-- forgot form end -->
JS代码
$('form').form({ url: "api/member/forgot", method: "post", validations: [ {type:"empty", name:"user", msg:"请填写用户名或者邮箱地址"}, ], onSuccess: function (d) { if(d.errcode == 0){ document.location = '<% $TFReq->server->BASE_URI %>forgotWay.htm?sn='+d.sn; } else{ $('form').tips({ text:d.errmsg }); } }, onError: function (d) { $('form').tips({ text:"服务器响应错误" }); }, onValidationError: function (form, name, msg) { $('form').tips({ text:msg }); $('form').find('[name="'+ name +'"]').focus(); } });
讲解
模型user
forgot
这里判断了如果用户名包含“@”就当作邮箱地址处理,否则就当作用户名处理。
验证用户信息接口
user_process
标准的表单处理程序,使用模型user的forgot方法验证用户信息。
验证用户信息模板
HTML
表单只有一个用户名的输入框,可以输入用户名或者邮箱地址。
JS
标准的表单JS驱动程序,处理成功的话会从返回数据里面拿到sn串缀到forgotWay.htm后面跳转过去。
效果
总结
福哥今天带着童鞋们完成了忘记密码功能的第一步——验证用户信息表单的功能。这里面引出了注册用户名的格式限制的问题,为了避免冲突,我们又在用户注册的地方限制了用户名不能包含“@”字符,也不能是一个手机号码。
像这样的返工是不可避免的,在快速生产的现如今,不会有太多时间让我们仔细去推敲的。所以,大家要坦然看待返工的问题,真正的互联网公司的研发团队每天不返工才是不正常的。为什么?可以去问问产品经理去,哈哈哈~~
下一课,我们继续开发忘记密码功能,记得来看哦~~