|
首先在Home/Controller下创建一个公共控制器PublicController 4 d6 A @+ `% H
- <?php3 [6 G$ a& m0 a# g" M
- namespace Home\Controller;6 @" r2 }0 k% P
- * O' w3 D ]9 ~% B2 K) B
- use Think\Controller;
3 u# c" m2 \; N2 o5 a' p9 Y - use Think\Verify;
: A( z% E. S+ k* V4 d; J3 T8 W% X - 2 @% P) C. F7 _& s* T9 t7 n# K& \, Y
- class PublicController extends Controller
* b" R7 _& o8 n# Z - {
! E& O, `4 k4 t/ V! x1 b9 e" j - + M; y. J0 R; ?1 o( Z
- /* 生成验证码 */
+ \& T5 l8 K; } @+ } - public function verify()9 w9 P/ O$ d' K! S) K& L/ U
- {
. `+ j3 v- H+ V' Z7 R! Y - $config = [
/ \. B: W. n& G( q - 'fontSize' => 19, // 验证码字体大小
& c8 o! f: m# e9 p Y - 'length' => 4, // 验证码位数
" l% T! F3 R" ~) K0 |& D l9 |8 W - 'imageH' => 34' i1 b1 M$ _7 U7 `! W4 v" Q
- ]; _& L7 I) w. y9 b7 Q
- $Verify = new Verify($config);1 Q i+ h$ N5 x' u, E2 r
- $Verify->entry();# D8 t$ r, t9 ]* |, U
- }8 _. m% \! C( B ^
- # K" a0 L6 c# T P& A
- /* 验证码校验 */
. i5 A( c( ~* \: X2 d - public function check_verify($code, $id = '')
2 q9 i" ^5 l. x6 M0 S& a; A - {4 e& W$ ?1 h+ s. Y8 ~
- $verify = new \Think\Verify();/ Z' Q4 {% B" f, d: N9 e. I3 u' g+ i
- $res = $verify->check($code, $id);& c( S/ B( T$ ^# S1 j: m# ^; h: T$ X
- $this->ajaxReturn($res, 'json');, f; [7 E7 l+ d' `7 J8 e5 r! z
- }5 D0 ]7 J1 s7 X+ S4 N1 D, v
- }
复制代码 $ ^; t7 f) c6 V; Z; k, a9 y }' q( n' X
. B, d4 e [8 h1 ]2 l( e& \/ J: [verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。
- _: ~) C( K! {+ N4 `" v8 x9 g; fcheck_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。( c9 s- s: m. f7 R
前台模板页建立index.html
5 X: k9 u1 n, j! \- H7 Q- <div class="">
1 ]( t2 A0 `8 ? - <label for="j_verify" class="t">验证码:</label> <input id="j_verify"+ \. E8 ^! J+ C% _
- name="j_verify" type="text" class="form-control x164 in">2 u" U+ c" U6 G) O
- <img id="verify_img" alt="点击更换" title="点击更换"
5 T W+ B. W( L2 p - src="{:U('public/verify',array())}" class="m">
) j* c: r& e( Z - </div>
复制代码
1 V y% a3 ^( a% M! l- x* `使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {& D( |3 B% N- w1 R$ q& W4 N# q
- var verifyURL = "public/verify";
( _! Y4 J- U/ {+ b - var time = new Date().getTime();/ t' P9 W0 L' R8 B* X# Q
- $("#verify_img").attr({0 L8 t( ]8 |: u9 M% ^6 U
- "src" : verifyURL + "/" + time' _7 T7 b5 Q) ~7 D9 l
- });
5 T$ P, F% T9 R( x, x - });
复制代码
. S/ X0 r& V6 W3 B6 S利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现: 1 i* X7 A+ o1 }8 I5 l
- $("#j_verify").keyup(function() {
R+ p8 V% } z S2 w5 ? - $.post("public/check_verify", {
; u$ R5 r0 d$ R1 b - code : $("#j_verify").val()( t6 J, X, a, H& N6 o( C* [2 ~
- }, function(data) {
+ A& P9 ]9 R8 m - if (data == true) {
$ i/ C8 F* D0 Z5 r# U - //验证码输入正确' m- @6 r9 S! K/ M1 a' I6 [
- } else {
: I( f- G# ~, Z6 k5 r9 t; W( k - //验证码输入错误
. c5 p' y$ e4 S - }" f4 \8 P; C2 T7 E
- });
* A8 u" g, ~8 T! {, } - });
复制代码 * W) p4 E6 E. ~8 W0 H% M( d
利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(
+ \. h1 W! i" x, ?5 Y - 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥
8 R6 d6 u6 R! `1 h; F/ }$ z* j - 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合
5 T0 f L! G9 s - 'expire' => 1800, // 验证码过期时间(s) c8 Q* |* m) r9 b( t, J
- 'useZh' => false, // 使用中文验证码 ) x, s8 N5 g/ Y
- 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串
6 \& ]( }: @4 ~4 G3 j3 j - 'useImgBg' => false, // 使用背景图片 7 x" [, c E) p4 ]1 ~* k" O
- 'fontSize' => 25, // 验证码字体大小(px)8 ]* t: ~- F& T, ^8 ^
- 'useCurve' => false, // 是否画混淆曲线
. `/ N, z* }8 U9 S - 'useNoise' => false, // 是否添加杂点
4 o" K# o! H; U - 'imageH' => 0, // 验证码图片高度9 \, l- ? b) a: m- j* z7 O
- 'imageW' => 0, // 验证码图片宽度$ @0 j: p; J0 O/ H. `) a4 I
- 'length' => 5, // 验证码位数9 C: x9 r1 ]9 I' s2 Z
- 'fontttf' => '', // 验证码字体,不设置随机获取
) N4 |7 d6 M! b) N( @& Z+ U( c - 'bg' => array(243, 251, 254), // 背景颜色
8 N0 W. l& Y6 _4 X# L( F - 'reset' => true, // 验证成功后是否重置5 \ V# k- [; f1 r5 E
- );
复制代码 % _: c" y: a) s8 [2 u2 B
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。 5 G3 h" ?7 g1 f/ W' x9 h- d
|