thinkphp驗證碼使用小案例
阿新 • • 發佈:2019-01-02
thinkphp3.2 的驗證碼使用是非常方便的,幾乎可以說把程式碼貼上進去就能直接使用
首先做一個生成驗證碼的方法
LogController.class.php中
// 產生驗證碼
public function makeVerify(){
$Verify = new \Think\Verify();
$Verify->useImgBg = true;
$Verify->secure = true;
$Verify->entry();
}
在模板中呼叫這個方法,如下
View/Log/index.html中
注意驗證碼的使用方法 __URL__/makeVerify<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登陸頁面</title> <script src="__COMMONRESOURCE__/js/jquery-3.2.1.min.js"></script> </head> <body> <table> <form action="__URL__/login" method="post"> <tr> <td>使用者名稱</td> <td><input type="text" name="admin"></td> <td></td> </tr> <tr> <td>密碼</td> <td><input type="password" name="password"></td> <td></td> </tr> <tr> <td>驗證碼</td> <td><input type="text" name="verify"></td> <td id="changeVerify"><img src="__URL__/makeVerify" alt=""></td> </tr> <tr> <td><button>提交</button></td> <td></td> <td></td> </tr> </form> </table> </body> </html>
直接生成驗證碼
如圖
此時驗證碼就直接顯示出來了,是不是很簡單呢.............
好了,今天就到這了...
.
.
.
.
.
等等......怎麼驗證呢?好吧,當然也很容易啦,tp給我們都整好了
自建一個函式,寫到自己的函式庫裡就能直接用
我的函式放在了Application/Common/Common/Function.php中
怎麼用呢?當然是在驗證的時候使用啦// 校驗驗證碼 function check_verify($code, $id = ''){ $verify = new \Think\Verify(); return $verify->check($code, $id); }
public function login(){
$admin = D('Admin');
$data = array('adname' => I('post.admin'),
'password'=>I('post.password'),
'verify' =>I('post.verify')
);
$re = check_verify($data['verify']);
if(!$re){
$this->error('驗證碼錯誤');
}
// 對使用者進行登入驗證
$adname = $data['adname'];
$password = $data['password'];
$adminArr = $admin->where(array('adname'=>$adname))->find();
$relpassword = passport_decrypt($adminArr['password'],C('PASSWORD_KEY'));
if($relpassword !== $password){
$this->error('密碼不正確');
exit;
}
//儲存登入資訊----關閉瀏覽器則消除cookie
cookie('adid',passport_encrypt($adminArr['adid'],C('PASSWORD_KEY')));
cookie('adname',passport_encrypt($adname,C('PASSWORD_KEY')));
header('location:'.U('Index/index'));
}
看到了嗎?在
$re = check_verify($data['verify']);
直接驗證,然後對$re進行判斷,驗證成功返回true,失敗返回false
這樣的話,驗證碼的生成,校驗都結束了,
還有一些小問題,當我點選驗證碼換一張是怎麼實現的呢,其實也也很簡單啦,驗證碼就是一張圖片,換下圖片路徑就可以了,用jquery事件,為了防止快取問題,需要在路徑後面拼接上隨機數,這樣也不會有快取問題了
--------------------------------------------------------------------------------------------------------------------------------------------------------
完整的前臺程式碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陸頁面</title>
<script src="__COMMONRESOURCE__/js/jquery-3.2.1.min.js"></script>
</head>
<body>
<table>
<form action="__URL__/login" method="post">
<tr>
<td>使用者名稱</td>
<td><input type="text" name="admin"></td>
<td></td>
</tr>
<tr>
<td>密碼</td>
<td><input type="password" name="password"></td>
<td></td>
</tr>
<tr>
<td>驗證碼</td>
<td><input type="text" name="verify"></td>
<td id="changeVerify"><img src="__URL__/makeVerify" alt=""></td>
</tr>
<tr>
<td><button>提交</button></td>
<td></td>
<td></td>
</tr>
</form>
</table>
<script>
$('#changeVerify').click(function(){
var num = Math.random();
$(this).find('img').attr('src','__URL__/makeVerify/s/'+num);
});
</script>
</body>
</html>
------------------------------------------------------
完整的後臺程式碼
<?php
namespace Admin\Controller;
use Think\Controller;
class LogController extends Controller {
public function index(){
$adid = cookie('adid');
$adname = cookie('adname');
if(isset($adid) && isset($adname)) header('location:'.U('Index/index'));
$this->display();
}
// 產生驗證碼
public function makeVerify(){
$Verify = new \Think\Verify();
$Verify->useImgBg = true;
$Verify->secure = true;
$Verify->entry();
}
public function login(){
$admin = D('Admin');
$data = array('adname' => I('post.admin'),
'password'=>I('post.password'),
'verify' =>I('post.verify')
);
$re = check_verify($data['verify']);
if(!$re){
$this->error('驗證碼錯誤');
}
// 對使用者進行登入驗證
$adname = $data['adname'];
$password = $data['password'];
$adminArr = $admin->where(array('adname'=>$adname))->find();
$relpassword = passport_decrypt($adminArr['password'],C('PASSWORD_KEY'));
if($relpassword !== $password){
$this->error('密碼不正確');
exit;
}
//儲存登入資訊----關閉瀏覽器則消除cookie
cookie('adid',passport_encrypt($adminArr['adid'],C('PASSWORD_KEY')));
cookie('adname',passport_encrypt($adname,C('PASSWORD_KEY')));
header('location:'.U('Index/index'));
}
public function logout(){
cookie('adid',null);
cookie('adname',null);
header('location:'.U('Log/login'));
}
}
注意:不要把自定義校驗驗證碼函式給漏掉了