首先在Home/Controller下创建一个公共控制器PublicController P+ |5 s. \% J( |
- <?php
) @% j3 }1 f/ O: m - namespace Home\Controller;7 t( H5 l! }8 s: W9 h" c+ I
+ ^8 z+ |, E/ M E- use Think\Controller;
# W& R! {# D/ @' I9 O9 P - use Think\Verify;
* h9 X) D4 B6 `3 j - 0 e$ D7 s. l2 ?" k, Q: u- D
- class PublicController extends Controller
) U5 \+ I, A @! ?- U$ h9 E - {# u$ R& o v9 o5 h% ^7 n% l! S. m* |2 r3 K
- 1 Y: ~0 E2 \& L6 ^& T. R3 @
- /* 生成验证码 */
' u; p7 \- y. x k4 l: c3 T - public function verify()
# G2 ~5 M, Z1 B% ^5 t - {
3 ]$ {( U$ v8 a - $config = [- {# K0 f' L( }5 H% c" ^0 b
- 'fontSize' => 19, // 验证码字体大小+ D' [* s; S+ S" a/ t3 e; e- X- v
- 'length' => 4, // 验证码位数2 Q6 P; d. p# g1 g0 O' c c7 O$ u
- 'imageH' => 34
+ q3 H& v( A& Q1 ^1 D - ];
0 Q& w) c# N, A* g - $Verify = new Verify($config);; R8 j" y5 A0 d, J
- $Verify->entry();* [; J5 w/ X, s3 x# W5 Y
- }
. ^9 j) F# o$ Y+ E2 |& g - ' Z/ D& t! r3 m: F# F; `
- /* 验证码校验 */6 r3 W" O! d" y( Z2 r
- public function check_verify($code, $id = '')
, U# Q M; k, y' J) { - {
3 d/ e: _0 I" ~+ J* I$ I - $verify = new \Think\Verify();/ k3 E" f& w3 T% A9 N& }- u# r
- $res = $verify->check($code, $id);
& K1 a1 {: p7 U8 h z5 h5 \ J - $this->ajaxReturn($res, 'json');+ M* M0 t+ L2 K
- }6 e7 x2 Q( j8 b1 I$ `
- }
复制代码 - y, s8 U5 I/ h
y7 P; j6 c- n8 I0 w
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。5 v# t1 ^& K2 b+ z. ?" e# n/ `( V) L M
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
# j* A! a) H }; ]' X前台模板页建立index.html: j4 x7 t- T4 P
- <div class="">9 l4 k) Z6 ~& u0 d: T3 ^2 V
- <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
2 q- l( C" X" L# }5 ? - name="j_verify" type="text" class="form-control x164 in">: A5 ~" W4 W! a1 a
- <img id="verify_img" alt="点击更换" title="点击更换"
# Q, @4 W$ Q! z - src="{:U('public/verify',array())}" class="m">
$ p& |1 l% A- u0 d% p - </div>
复制代码
0 p# w9 @1 f4 q! {使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {
. S2 _ ]" D( F - var verifyURL = "public/verify";
5 J" @# h" o5 F N% Y1 e" ~ - var time = new Date().getTime();
. i) Y& Q$ R9 u1 c, E& ~ - $("#verify_img").attr({# @& _! M- }& j' ?- S6 q$ I1 r o
- "src" : verifyURL + "/" + time
% Z" h' [8 e5 R+ W' s9 O4 ^ - });
# r( U5 E8 T |0 I2 L# |( |. q - });
复制代码
* v+ A+ d6 w1 U) e) U% @9 a利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现: : K& f- d1 H+ y$ v' a9 t! V2 K
- $("#j_verify").keyup(function() {2 E+ h- A5 r* y0 Z0 v# x" v, F* s
- $.post("public/check_verify", {
6 J4 ]1 O* T: a. p( a5 s - code : $("#j_verify").val()" X9 E4 |6 z, Z" E+ W. h N- l
- }, function(data) {+ L% ?4 h9 N2 t0 C) ] o
- if (data == true) {
& C* ^( \/ i" q" F - //验证码输入正确" ~5 I9 o2 B: f; m9 c! b3 O" m
- } else {
; f- q) K! N1 {$ ~4 N, l - //验证码输入错误
9 B) ]. }6 Z1 H+ D7 Y7 d* B0 t - }9 N6 f/ @) @- w( E# S$ B# t& W- ^
- });% Z0 Y9 s, M0 d: E1 d
- });
复制代码
" ]( r# E- W) A9 @/ q$ y- x: t利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(
( r: L1 P" g+ V% @8 O; X - 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥
/ `2 R6 b2 {8 Z% s3 Y+ K3 o8 j - 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合( d" \* Y1 Y! {) R
- 'expire' => 1800, // 验证码过期时间(s)& h0 }: ?7 ?7 n" T# C
- 'useZh' => false, // 使用中文验证码
3 E$ `- _) \. y6 w+ G" q - 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串* i) T+ \' q2 @: Q
- 'useImgBg' => false, // 使用背景图片
, I. M8 r/ ]0 a# G - 'fontSize' => 25, // 验证码字体大小(px)1 _9 t. E: O" p: X& S
- 'useCurve' => false, // 是否画混淆曲线
7 |% R% a4 Y3 r- O3 M" a, @ - 'useNoise' => false, // 是否添加杂点 0 i* R+ u p8 F* T7 V
- 'imageH' => 0, // 验证码图片高度7 t. K/ E, K& I, G; }
- 'imageW' => 0, // 验证码图片宽度# A+ Y6 X& i2 s3 B6 I
- 'length' => 5, // 验证码位数
; ~8 G8 `% z6 G( O- I - 'fontttf' => '', // 验证码字体,不设置随机获取6 w) n8 S- h5 a. c1 F
- 'bg' => array(243, 251, 254), // 背景颜色
1 K9 ?7 g# D2 n - 'reset' => true, // 验证成功后是否重置 [3 W5 [- X: T4 Z9 q9 d
- );
复制代码
0 \- T9 R- X# m; j, }请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。 7 c* d8 A6 `+ L
|