|
首先在Home/Controller下创建一个公共控制器PublicController
6 @, e P6 l4 M( [! B5 M- <?php. p* _+ Q1 G7 S2 P1 R2 d
- namespace Home\Controller;
2 y# Z* O* c+ N, M4 X, T; j
T" D# Y9 `2 N. w# t) G& p! Z$ ?9 Y- use Think\Controller;
1 U3 d$ f% K2 w! f1 F - use Think\Verify;
" a4 R& x" Z4 P. B: T - ( b1 S6 o4 l& r3 h! {" x: Y
- class PublicController extends Controller# ]3 W- ~: I8 N! @. e" g- H6 ]6 U3 o
- {! P5 }, J- s3 G
4 m& F) t2 k# D! {. D5 |- /* 生成验证码 */
" d) h& R! u: O- V& g; ~, U, Z - public function verify()3 z! U7 x& ^5 d
- {" ~" U e+ l$ Y* U6 G3 b M
- $config = [
; k8 {/ d( @$ r' m) P - 'fontSize' => 19, // 验证码字体大小
# e8 f$ t2 I, P3 \+ d# _- N: h - 'length' => 4, // 验证码位数) `1 r" Q! O% @) E' ]8 j6 P
- 'imageH' => 346 @3 M) h; x* R. [$ a6 V j
- ];
) k# {8 d, J' d# h - $Verify = new Verify($config);; j1 m; Y2 b! o' Q
- $Verify->entry();
, |2 {, W3 W) n - }( Z7 e4 c* C {# C0 O! j
- 8 T: L9 {* B' v* ?0 z; ], Y: M
- /* 验证码校验 */4 `9 D: S: C. P0 y% G$ w8 O, y
- public function check_verify($code, $id = '')
- B" |7 v. a5 \' Q( z - {
7 l* P7 u7 }' S* v e D* D - $verify = new \Think\Verify();
( p! p( d) c" r$ E q: C; o5 h - $res = $verify->check($code, $id);7 i/ s& ~ l' Y' i
- $this->ajaxReturn($res, 'json');
( _% a/ |3 O- e% K2 k - }! K4 t6 r" C: t
- }
复制代码 & e2 j( k O0 S% |1 i/ u
3 T: k1 [( ?# ]! u3 W& Y# dverify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。5 q) u* N' T1 h# i
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。7 Y" b; K7 J9 N8 P8 a
前台模板页建立index.html
p$ V; _2 [" R' g- <div class="">
8 X" ], ~0 g" H, w* {% D - <label for="j_verify" class="t">验证码:</label> <input id="j_verify"' N& p: g$ i) G- k) a- u/ H
- name="j_verify" type="text" class="form-control x164 in">1 O& ?. F2 Y. `# r$ C. Z) }
- <img id="verify_img" alt="点击更换" title="点击更换"
/ w2 C5 o# F" p" N+ C/ d+ o7 @ - src="{:U('public/verify',array())}" class="m">$ D) N0 A# e K' n; n
- </div>
复制代码
6 T* V9 d6 h) t9 a$ I$ e使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {
" g; f* j8 w4 } - var verifyURL = "public/verify";
, P$ F9 B. ]& ]( c! i - var time = new Date().getTime();5 E4 Y8 b3 J+ j) s: ?) ~( }
- $("#verify_img").attr({
1 r/ O+ t3 @ `) t - "src" : verifyURL + "/" + time! L: @# |9 `$ [1 ]
- });; h# N& G5 b3 U4 i/ |4 Z5 b s
- });
复制代码
9 [' B' E1 p/ l1 ^! }! |& w利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
- D0 |2 a/ n {: R8 N: E, B% K- $("#j_verify").keyup(function() {
$ ^, ?; w, m$ K9 h- R - $.post("public/check_verify", {# x* b4 B3 j5 Q4 Q9 L5 ~
- code : $("#j_verify").val()5 }# F1 T; K& ^; \6 ^7 P
- }, function(data) {
% ?4 H% ^) a0 H; o. a - if (data == true) {, t' W# U/ o# T( }: L6 N/ n
- //验证码输入正确: T! h8 B K& ^! G+ o
- } else {- [" N0 x5 H9 r4 [
- //验证码输入错误
+ d4 n8 R+ z- b# C$ r& _2 R1 P) u - }* f* Z# x0 E4 T) r6 P7 c8 Y
- });7 ^ o# k8 R, S7 H' r
- });
复制代码
& J# v0 Q* D) c7 h利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(
4 W- l4 C: _; J# U0 ?7 {5 i - 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥
) ^4 _ Z% e2 D/ }9 W; D' C - 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合% b% C- E' Y& N6 E3 I# Y8 U2 j+ }! v
- 'expire' => 1800, // 验证码过期时间(s). S3 Q# G' h% S! V0 Z8 C- b T
- 'useZh' => false, // 使用中文验证码
4 q# g: e, C! ]+ G: h, N - 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串8 _1 F( k0 l& j. y
- 'useImgBg' => false, // 使用背景图片
7 m: b, x6 W9 `& w" x! Z& A - 'fontSize' => 25, // 验证码字体大小(px)
, b8 A" T1 k8 g. t" q6 {- h - 'useCurve' => false, // 是否画混淆曲线' [& c$ \( T* Y' ?% k4 ?7 S8 P& d4 X
- 'useNoise' => false, // 是否添加杂点 , K0 y8 }5 D" c
- 'imageH' => 0, // 验证码图片高度
1 ]1 S" i+ ^. k - 'imageW' => 0, // 验证码图片宽度5 |# O, [, ]' T. C3 s! }
- 'length' => 5, // 验证码位数6 e" B( n, g& T2 }9 f+ T- F
- 'fontttf' => '', // 验证码字体,不设置随机获取. m: o4 j2 @, p7 p. s
- 'bg' => array(243, 251, 254), // 背景颜色
8 @* \7 X8 ~( e4 U$ } - 'reset' => true, // 验证成功后是否重置
/ m) U! @) z: P1 x1 F - );
复制代码 4 T0 S c$ N* S- G5 r [: b
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。 7 a; a2 m& W2 k, B: G
|