现在我们就来介绍一下如何使用Thinkphp来写登录方法,登录成功后通过ajaxReturn返回json数据。
登录的访法:
// 登录检测 public function login() { if(IS_POST){ $ip = get_client_ip(); $time = time(); $username = I('uname'); $password = I('upass'); if(check_verify(I('verify_code'))){ $this->ajaxReturn(0,"验证码错误!",0); $result = array('status'=>0, 'info'=>'验证码错误!'); $this->ajaxReturn($result); } $Admin = M('Admin'); $authInfo = $Admin->field()->getByUsername($username); if(empty($authInfo)){ $result = array('status'=>0, 'info'=>'改用户不存在!'); $this->ajaxReturn($result); }else if($authInfo['password']!=password($password)){ $result = array('status'=>0, 'info'=>'密码错误!'); $this->ajaxReturn($result); }else if($authInfo['status']<0){ $result = array('status'=>0, 'info'=>'该帐号已被禁封,如有问题请联系管理员!'); $this->ajaxReturn($result); }else if($authInfo['status']==0){ $result = array('status'=>0, 'info'=>'该帐号未激活,如有问题请联系管理员!'); $this->ajaxReturn($result); } $_SESSION[C('USER_AUTH_KEY')] = $authInfo['id']; $admin = array(); $admin['id'] = $authInfo['id']; $admin['roleid'] = $authInfo['role_id']; $admin['username'] = $authInfo['username']; $admin['nickname'] = $authInfo['nickname']; if($authInfo['username']=='admin') { $admin['administrator'] = true; } session('liqingbo',$admin); //保存登录信息 $Admin = M('Admin'); $data = array(); $data['id'] = $authInfo['id']; $data['last_login_time'] = NOW_TIME; $data['login_count'] = array('exp','login_count+1'); $data['last_login_ip'] = get_client_ip(); $Admin->save($data); /*$loginData['user_id'] = $authInfo['id']; $loginData['login_time'] = NOW_TIME; $loginData['login_ip'] = get_client_ip(); M('LoginLog')->add($loginData);*/ $result = array('status'=>1, 'info'=>'正在登陆...', 'url'=>C('APP_PORTAL')); $this->ajaxReturn($result); } }
思路分析:首先通过IS_POST来判断是否是POST提交。
1、判断验证码是否正确
2、通过提交过来的用户名获取该用户名的信息
3、通过获取的用户信息和提交过来的密码加密后对比,如果匹配则密码正确,否则密码错误。
4、如果密码错误,且该用户没有被禁用或者有权限的情况下,将该用户信息通过SESSION方式保存到服务器上。
5、更新用户表上的对应用户信息,如登录次数、最后一次登录时间和IP地址。
6、如果是ajax登录,则通过ajax返回响应的json信息,如果是普通post提交,则返回响应的信息。
以上就是一个登录的基本流程思路了。大家也可以根据自己的需求加上自己想要的流程和功能,如有不明白的地方欢迎留言一起讨论。
下面附带登出,也就是退出的操作方法,大家也可以参考一下。
// 用户登出 public function logout() { if(isset($_SESSION[C('USER_AUTH_KEY')])) { unset($_SESSION[C('USER_AUTH_KEY')]); unset($_SESSION); session_destroy(); $this->success('登出成功!','/admin.php'); }else { $this->error('已经登出!'); } }
思路分析:直接注销登录时所保存的SESSION中的user_id,顺便通过session_destroy()来注销所有session信息。
form代码
<form id="form" action="__URL__/login/login" method="post"> <div class="loginInfo"> <ul> <li class="row1">登录账号:</li> <li class="row2"><input class="input" name="uname" id="uname" size="30" type="text" /></li> </ul> <ul> <li class="row1">登录密码:</li> <li class="row2"><input class="input" name="upass" id="upass" size="30" type="password" /></li> </ul> <ul> <li class="row1">验证码:</li> <li class="row2"><input class="input" id="verify_code" name="verify_code" type="text" style="width:100px;" /> <img src="/admin.php/login/verify" title="看不清?单击此处刷新" onclick="this.src+='?rand='+Math.random();" style="cursor: pointer; vertical-align: middle;"/></li> </ul> </div> </form>
加载js
<script type="text/javascript" src="__PUBLIC__/js/jquery-1.9.0.min.js"></script> <script type="text/javascript" src="__PUBLIC__/js/jquery.form.js"></script>
js
<script type="text/javascript"> //ajax提交 function loginSubmit(){ $("#op_type").val("1"); if($("#email").val()==''||$("#pwd").val()==''||$("#verify_code").val()==''){ popup.alert("填写完整方可登陆"); return false; } //commonAjaxSubmit('__APP__/login/login'); $("#form").ajaxSubmit({ url:'__APP__/login/login', type:"POST", success:function(data, st) { if(data.status==1){ popup.success(data.info); setTimeout(function(){ popup.close("asyncbox_success"); },2000); }else{ popup.error(data.info); setTimeout(function(){ popup.close("asyncbox_error"); },2000); } if(data.url&&data.url!=''){ top.window.location.href=data.url; } } }); } </script>