|
首先在Home/Controller下创建一个公共控制器PublicController
5 X5 O! q C* R6 F$ X6 U- <?php
# z1 C+ e8 J" }, y7 a - namespace Home\Controller;4 y" T" v& r" \8 V: c
- . ~5 y" ? Q: `* M8 m
- use Think\Controller;
* G' I* b, L& }- {- K% h7 j - use Think\Verify;5 L6 [: M( q: D6 Z
1 k c( w4 w! B6 l4 R- class PublicController extends Controller6 |, ^, Y; v( J F2 N P+ P
- {) e6 K) E# G3 I: B
- * Q0 l8 e, T, T, O# Q) @- C
- /* 生成验证码 */
( v* ^, E+ @8 O) k1 g - public function verify()( J/ w1 C( G* `3 I
- {
' _! F3 O7 T1 J3 w - $config = [
: L4 y1 T+ k" P( r& m4 y+ b3 N - 'fontSize' => 19, // 验证码字体大小, i7 b$ |# ~# W3 |% b3 Z( v" g
- 'length' => 4, // 验证码位数
2 n1 h X/ L& N - 'imageH' => 34; o; L F- r: H: {# q& h- t1 n: C
- ];: L* O: }5 [. n% k
- $Verify = new Verify($config);
3 ?# e t2 ~4 l* A - $Verify->entry();
. U8 d! C+ g4 l j3 I9 n, T - }
& k- X$ p7 i3 I" Y K- T Y
4 T5 a8 N' _% ~0 t4 {0 o& @! y6 d- /* 验证码校验 */2 D& x! Q& Q/ p
- public function check_verify($code, $id = '')6 m% r0 L6 i4 s# r5 p
- {
3 @ }; a* y1 ?2 g" x - $verify = new \Think\Verify();
( ] N: P3 X* p: ^7 w - $res = $verify->check($code, $id);- `$ z# O! t) a8 R
- $this->ajaxReturn($res, 'json');
# E$ s$ f- n8 u" s) X - }& u ^/ R5 \) q$ G- g* E' W! H1 t
- }
复制代码 - e ] p& F) ]; D4 D% z f, D
! M; R( i' n. kverify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。; t9 o$ {: m! T3 ?0 @
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
( A z9 x5 E+ `1 P3 b前台模板页建立index.html
: _% S3 `' \! `2 W- <div class="">
! N( R3 T$ F, \8 J3 C - <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
4 I1 A4 H9 e, U9 m& a - name="j_verify" type="text" class="form-control x164 in">
. n8 C. U8 T0 }/ M0 L - <img id="verify_img" alt="点击更换" title="点击更换"* c) A+ q( H; g8 L, a7 K
- src="{:U('public/verify',array())}" class="m">, T0 C/ r/ n9 U) r+ Y
- </div>
复制代码
( e% L. a- E3 j( {% }1 V使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {2 [. o1 D n, D
- var verifyURL = "public/verify";7 D& k- T1 p) a; Y+ T0 j+ R+ V! S
- var time = new Date().getTime();# O' q$ r! p2 n' D( z
- $("#verify_img").attr({) U' o6 V! K- [6 @0 {$ ^; F% E5 U; Z
- "src" : verifyURL + "/" + time: `( }% Z t* _9 q; X! t4 s
- });
8 d# T# a) P. c1 g* U - });
复制代码 7 F* E/ d% U. g, r+ _; M
利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现: 1 y4 x. g- c( A8 H
- $("#j_verify").keyup(function() {
2 Q5 {, x; \$ G+ O+ _9 J - $.post("public/check_verify", {5 f( |: U' E8 d
- code : $("#j_verify").val()6 j: W' _& s; v( J( K/ V
- }, function(data) {+ v2 ]- r! p% i- w
- if (data == true) {# c- O4 Z6 e7 b" h) n2 K
- //验证码输入正确8 E( Y! E1 ]* E/ A/ m
- } else {7 B" e+ {' X* O" {
- //验证码输入错误& ^5 X1 T! J6 ?8 N
- }% t8 z2 T# s# ?+ v( S/ z' f( e
- });
6 B$ F8 c+ N3 i0 U6 y - });
复制代码
" J/ r( Q0 l+ r" n5 j7 m利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(. s6 A+ T4 l+ b% C3 T
- 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥9 x* j+ A# n! }+ B+ [
- 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合! g- {5 _1 |/ B r/ `6 p: H
- 'expire' => 1800, // 验证码过期时间(s)* m7 W5 U& f2 q7 r
- 'useZh' => false, // 使用中文验证码
1 z+ K' l1 u! b - 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串
) l% X6 G9 k' O9 L - 'useImgBg' => false, // 使用背景图片 ) `2 w8 J r' F7 _ I; n$ @
- 'fontSize' => 25, // 验证码字体大小(px); b' u3 @" q0 y0 q$ J; z7 `
- 'useCurve' => false, // 是否画混淆曲线1 O5 ~. V4 X" u# k: `# s
- 'useNoise' => false, // 是否添加杂点 8 r) R, ?+ m s0 h
- 'imageH' => 0, // 验证码图片高度1 T( Y; }3 r2 |% a% C8 i) B' ^
- 'imageW' => 0, // 验证码图片宽度& U/ h: i2 S/ H" P+ E
- 'length' => 5, // 验证码位数
6 y- s/ [% Z, Y - 'fontttf' => '', // 验证码字体,不设置随机获取
% y0 N" x* F; q! S - 'bg' => array(243, 251, 254), // 背景颜色4 T* j# D8 |5 N% e
- 'reset' => true, // 验证成功后是否重置% h4 L. A' `* X# p; p
- );
复制代码 & W8 ?9 u8 P/ u3 u
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。 ( u: G- E9 \" T1 ]% E
|