|
首先在Home/Controller下创建一个公共控制器PublicController - K0 s: p1 ^" l+ ^& Z& m
- <?php
& P4 }/ x- u, i8 J# h" o1 ~5 w1 H - namespace Home\Controller; Y+ y' q1 e9 L7 e* p" X4 Q
2 G! }! U# ^1 j2 S- a- use Think\Controller;
6 }8 X. P2 k6 {! f/ Z - use Think\Verify;5 b& O8 i, ^0 w& N# _6 Y
- 5 h4 S2 ^1 v9 K% J9 d/ H0 I' ?
- class PublicController extends Controller) j" m) L6 H# W9 {/ Z9 K5 c) q) B
- {/ S) K4 n6 n5 g% \. [6 ~1 a3 n
- ! y5 {5 u( q: T3 O# T
- /* 生成验证码 */
: a9 M; n6 U$ G1 E0 a - public function verify()3 W+ F7 l+ {0 s1 i) s
- {
! K2 X& @% K- M, A* O \1 w - $config = [$ s9 Y& z, p6 n# q( T% h: q% E( X
- 'fontSize' => 19, // 验证码字体大小8 [/ V6 Z9 M9 U8 s* Y( \+ O4 d
- 'length' => 4, // 验证码位数
& {7 k) W1 ?5 i5 T& V" L1 _* v - 'imageH' => 344 P& w! J( i$ ?8 w
- ];
- M: v; i% v+ w4 B: e - $Verify = new Verify($config);
! l- k: C* m7 U. B" |+ ? - $Verify->entry();% q, G* v& Y% z7 @' \$ U/ I
- }6 I: e4 ^) a |: t4 x, U
@* U9 Q; \! U" N- /* 验证码校验 */. A4 f9 ]% `8 l% ^" A s ~* s4 t" y
- public function check_verify($code, $id = '')
2 Z. E# r4 t* R/ `" l - {' E9 ^4 Z3 ]2 J$ T1 Y
- $verify = new \Think\Verify();7 E" F7 R' e! w/ P, _5 I
- $res = $verify->check($code, $id);6 F2 x7 K. W6 a
- $this->ajaxReturn($res, 'json');
. }7 { W* M3 _0 c - }
/ @/ @+ u6 a. p6 }/ d0 Y, ? - }
复制代码
9 ~7 \' A/ h) h( L# J9 p: H3 N. \+ y' F& E/ o0 D
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。
5 x8 O% L7 R! @1 Rcheck_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
9 u7 J6 u3 s# j/ E; f9 m前台模板页建立index.html6 F/ p' _# R2 y9 A2 z
- <div class="">" s% w y- v/ y9 N; x- b
- <label for="j_verify" class="t">验证码:</label> <input id="j_verify"# p' R, D' C2 F& \3 n1 T
- name="j_verify" type="text" class="form-control x164 in">8 B! R. f( D3 G; n
- <img id="verify_img" alt="点击更换" title="点击更换"' Z4 W) l7 v8 E
- src="{:U('public/verify',array())}" class="m">; D; O X1 x( h0 T) u
- </div>
复制代码
- V) X) R |5 ]: @$ d! ]使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {
0 F: I& x- B! S - var verifyURL = "public/verify";; P3 D% H: L: O! H
- var time = new Date().getTime(); x/ i8 X, G8 Z% p/ T4 j6 b
- $("#verify_img").attr({
7 r ^* ]0 y% r+ S+ g5 {0 t4 A+ y - "src" : verifyURL + "/" + time/ g9 i, l$ W* t: t' Z6 w. E; U
- });! F3 ~* f& n% O! h
- });
复制代码 / i+ {4 z0 b) @/ Q b2 d" r2 e
利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
2 R; d$ _) C) R' v1 v- $("#j_verify").keyup(function() { Y+ ]% k4 j; L2 w3 }7 N b4 f4 D
- $.post("public/check_verify", {3 A! {" w3 F: Q3 K
- code : $("#j_verify").val()
3 A T; `5 j3 L: |( e - }, function(data) {8 }1 Q i7 s9 U, o1 r7 @; j$ D
- if (data == true) {$ Z* A8 j" G3 `7 p1 T9 ~6 z
- //验证码输入正确
& p: W( [, o0 b - } else {
' T) y( |$ V* r* r8 F$ k( ~4 c - //验证码输入错误( {3 s& N- ?0 Z5 E6 I
- }
# B9 L; L2 I9 A" Y8 V7 W - });
' Z8 B3 H/ j" q. [1 ~; ] - });
复制代码
" V6 |/ T8 ^/ K% v( Q利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(
k, |% _9 Y& F. ?8 p6 x+ Q. ^* R1 s - 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥
7 P' [) U, ~( R& ~8 c3 w0 ` - 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合$ q5 S" O6 I' y
- 'expire' => 1800, // 验证码过期时间(s)
; r: c# n8 U3 @$ P# a* P% z# { - 'useZh' => false, // 使用中文验证码
/ N, E- }. v) A - 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串. u% K0 ^, m6 Z9 N6 j% d8 l
- 'useImgBg' => false, // 使用背景图片
& Z( S) H! F7 T5 D' `0 R% k! X - 'fontSize' => 25, // 验证码字体大小(px)
- F" g* o4 C: L4 k, y! z - 'useCurve' => false, // 是否画混淆曲线
/ y7 k1 _* l$ `, k: r! b - 'useNoise' => false, // 是否添加杂点
" c; T+ j- r! z! F: @8 | - 'imageH' => 0, // 验证码图片高度! p# X& E# q2 E# _ ~" \: ]* J* O
- 'imageW' => 0, // 验证码图片宽度
`# b5 _% J- | t Y4 n! W - 'length' => 5, // 验证码位数
. M M; e1 {2 a! G" i4 b6 s+ P - 'fontttf' => '', // 验证码字体,不设置随机获取) h; x' N# Y7 x* W# N0 Q, C: q$ \1 h
- 'bg' => array(243, 251, 254), // 背景颜色
! y* {' n6 L3 O% w - 'reset' => true, // 验证成功后是否重置
; d) @) H4 k( w2 J' G2 R - );
复制代码 ) o4 T2 H7 V7 R- S2 H [
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。
5 r. f3 ^4 g0 V; w+ \# J6 d6 Q |