|
首先在Home/Controller下创建一个公共控制器PublicController
7 j( l5 L7 q4 \5 c- <?php2 s! {; [3 z% e5 p# ^
- namespace Home\Controller;( q0 n- g* X/ k, \! Z Z
4 [! j& }9 q5 ^3 H. {- use Think\Controller;$ r0 l! a$ w8 r; y: I) W
- use Think\Verify;' b$ T/ }5 K. g% p7 K( j
# q: y2 ]4 a, c$ Z' ^$ F. [- class PublicController extends Controller
4 A3 M& G, X5 g: p0 P - {( `. x; F9 ~+ m; r% n6 z
- 2 ^5 _3 A6 ^8 w6 D2 V3 U, ~
- /* 生成验证码 */0 P: J$ F+ X# ^3 _" _
- public function verify()/ n$ `* Q* H+ R
- {
& l, z' G2 E e - $config = [" e4 ^5 j+ S# y, a3 Q
- 'fontSize' => 19, // 验证码字体大小
, D8 V% n/ R& p+ x - 'length' => 4, // 验证码位数; O6 Y8 p5 L8 _/ N2 b0 H; N4 H- p
- 'imageH' => 34
. f" t! v$ ^$ \) P0 h - ];3 D5 B" z) [! u
- $Verify = new Verify($config);
9 I1 L! f5 p* G3 P - $Verify->entry();& k! }2 F2 p" G7 l* x( L. l
- }
/ t# W0 c# N+ ^( B/ K- s
) b* c$ _% U4 y" y6 ^$ |- /* 验证码校验 */
+ r% O( B8 R' r1 q - public function check_verify($code, $id = '')3 `7 B- D, C n, g5 N, x
- {% }" F1 D1 R% p$ h. [
- $verify = new \Think\Verify();- N4 a: J; C: H, \- z; y. }
- $res = $verify->check($code, $id);
j c2 c+ \- }- g" u - $this->ajaxReturn($res, 'json');. _/ ^. y n6 @# z9 y
- }
8 g+ R. ~# v8 `" E. [ - }
复制代码
6 y- z' a* z" Y! z" {6 v, B% Y! V/ _ C
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。4 n; I# |. D$ Q4 N* n$ K" @
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
. V/ E5 W- W, I) n2 C前台模板页建立index.html
2 n9 I& i* q) \& [$ x- <div class=""># n0 p3 y+ z" T* H
- <label for="j_verify" class="t">验证码:</label> <input id="j_verify"% A# |6 {1 y7 G; g) \6 i" `
- name="j_verify" type="text" class="form-control x164 in">: K/ u9 q/ K* O% C7 c
- <img id="verify_img" alt="点击更换" title="点击更换") E. S! n0 o- P& Y5 b2 s1 B4 T
- src="{:U('public/verify',array())}" class="m">
- U4 U* A0 s; ]7 H - </div>
复制代码
4 y" m3 N5 j7 l" s8 s j使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {" [; |, }8 H. V
- var verifyURL = "public/verify";8 W2 x2 d' E& a" A
- var time = new Date().getTime(); k/ w1 ]: D. @' O
- $("#verify_img").attr({
# b5 |" a/ Q6 a - "src" : verifyURL + "/" + time
/ G7 X G, Z" A) O - });
( X! N5 F" ?5 [8 W+ c t - });
复制代码 , n* a; ^, g+ Y* }' L& P
利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
3 ?7 a$ Q. D+ G) v A0 H5 P- $("#j_verify").keyup(function() {
8 H' [1 B8 _( I, |, q2 `7 t - $.post("public/check_verify", {; b! k1 i6 f* Q+ G2 r0 B
- code : $("#j_verify").val()4 L6 U5 t9 k' L# x" O
- }, function(data) {
6 P' x7 ~6 Z# F6 o$ J - if (data == true) {
+ K( l' d1 d3 A6 ~ - //验证码输入正确% |0 e M @$ S' K8 ]3 Q: x
- } else {5 p, m j8 p- D2 {- |) u& [" j' m
- //验证码输入错误0 @& H* o3 o0 l( H
- }2 f+ p3 t/ F+ i+ K
- });/ a2 @+ R$ o4 ]2 E
- });
复制代码 " d8 Q7 `. H# B( F- w
利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(
' H; v; ?& B: o" o - 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥+ V) M( M3 O) A# V: [( \
- 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合* e2 `! x/ K$ O/ f* Z6 S% K: F( s( l
- 'expire' => 1800, // 验证码过期时间(s)
2 _2 c# d0 Y( g; \! h - 'useZh' => false, // 使用中文验证码 7 x5 n, ^1 c. q3 x3 W; o
- 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串2 _, E# t: } N, |4 V: ^
- 'useImgBg' => false, // 使用背景图片
5 O; u: C0 q9 Q& Q - 'fontSize' => 25, // 验证码字体大小(px)$ \) L4 C5 u; Y* A `6 }3 i) C$ F
- 'useCurve' => false, // 是否画混淆曲线
, X8 y/ c, M" S2 l. |: [% I - 'useNoise' => false, // 是否添加杂点
% n' E+ h" Q" c3 b- Z - 'imageH' => 0, // 验证码图片高度
2 ~ u2 R" n1 A$ J2 R9 H. A - 'imageW' => 0, // 验证码图片宽度& Z0 p- { A! z/ p, ~5 A. |4 Y
- 'length' => 5, // 验证码位数
# z; f1 h, ]( U5 E4 Y; Y6 { - 'fontttf' => '', // 验证码字体,不设置随机获取
/ L( y4 L) ~. T* t - 'bg' => array(243, 251, 254), // 背景颜色' e W! Z4 h: a; b+ L f
- 'reset' => true, // 验证成功后是否重置
" y7 r6 W+ N( Y- L' {. U9 I - );
复制代码
1 j I8 Z" g/ f* n. G请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。 3 c! X. c( D' V$ r
|