|
首先在Home/Controller下创建一个公共控制器PublicController
( J( n% |8 h% o# [+ c9 I; F, w6 d% v1 _- <?php
- q) t" J1 y5 i9 C$ z' O# A# E - namespace Home\Controller;
0 [# h0 l" z3 J3 w5 U5 m3 m% q
3 X9 U: `6 z6 A7 r3 ^5 g5 \- use Think\Controller;' X E @/ Q$ R, r9 ?8 r$ H2 X
- use Think\Verify;) [* p2 g+ I8 |' p& j, P) Y
- $ w- p/ ^+ @1 m
- class PublicController extends Controller
, u8 Y! y, A- V2 Z) H: [ - {4 b# _2 |& {& q
$ G5 F. n M! g% b6 V( H( V- /* 生成验证码 */
. f* h! s. R8 ? - public function verify()& Q+ `, B( u2 a' r% }
- {+ z. N' w4 A" s' E' V
- $config = [
/ @* r% g2 L! e" `# K' Y$ s - 'fontSize' => 19, // 验证码字体大小6 M: ~* |8 R: j3 }2 d# f
- 'length' => 4, // 验证码位数
9 t/ c$ e" ^' O' O - 'imageH' => 34
0 a4 _) f8 G2 q - ];
0 t/ _1 z/ F+ P! B - $Verify = new Verify($config);1 R6 p. {2 Z' T$ J; w* H
- $Verify->entry();- Q" j4 ?- V0 c/ {. ^- Q9 M/ ^; j
- }: _4 X; J( B6 {; b1 l0 p( u: d) W+ L
/ e4 A! F& N- Q/ A: }4 s- /* 验证码校验 */
/ I0 `9 X0 P; w0 c8 B& s7 k: w9 ] - public function check_verify($code, $id = '')
* L, t6 ^2 D0 s6 u! B - {; @& y* ^/ @. o( l. B
- $verify = new \Think\Verify();+ {1 o3 m. R$ F
- $res = $verify->check($code, $id);
* }% d Z2 z) d- c - $this->ajaxReturn($res, 'json');
$ V+ ?. k$ A3 d+ d7 k - }
3 M a( o9 t# x - }
复制代码 ' R/ f' b. |) r! o
+ X5 A8 t5 o9 X9 f3 h+ gverify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。0 @! _: Y0 t: ~' l
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
, f1 y5 D# U1 ^: J# L* m* Y3 \前台模板页建立index.html
) f8 {3 W& Q* D* `7 F- <div class="">
1 n3 j. O( b% @9 z - <label for="j_verify" class="t">验证码:</label> <input id="j_verify"0 G; Z6 c: v4 h; A5 T" N9 `
- name="j_verify" type="text" class="form-control x164 in">
$ @) a3 y& s8 @( E" j$ ] - <img id="verify_img" alt="点击更换" title="点击更换"- |& |7 Q. Y O+ a% j
- src="{:U('public/verify',array())}" class="m">' U! N- V6 W1 k O. S( ^5 p. |, J
- </div>
复制代码
/ J- E% D& L; k9 R2 m. [使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {
" I; Q. m3 w( g - var verifyURL = "public/verify";
6 f6 @& R* l2 ^' q$ o0 R; u - var time = new Date().getTime();# B3 o B, D. ~, Q- e1 I. b* j
- $("#verify_img").attr({
2 ~ f, O# {1 U6 L - "src" : verifyURL + "/" + time
$ F0 T6 p! Y0 D0 z - });
1 v) f( F3 P* O# R2 k# E* X - });
复制代码 ' n9 I( r" N( b5 W1 h
利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
$ [, l4 A& i, S5 ]- $("#j_verify").keyup(function() {
4 o, d$ x d g- J' ^8 y5 W, F - $.post("public/check_verify", {
7 x7 i% i7 S' X* Z# O' n/ y) A1 z) N - code : $("#j_verify").val()
% O! |5 B9 Y# ?$ G1 s* B% X - }, function(data) {3 _( Z' E, E# A" y; m5 N2 _
- if (data == true) {+ |: ^7 H* @9 y
- //验证码输入正确2 {9 I8 F: e" t$ L
- } else {) z: ?. M+ ~; j( p' R8 t
- //验证码输入错误9 j2 _* n7 `. {
- }" ]# u: o+ [* O* U7 |& {' X
- });
2 c0 Q3 Y4 y! n( [ [/ I5 Y - });
复制代码
5 u& e/ Q4 Z' j3 E& q利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(
3 b9 k" _2 _5 i5 D; V0 p - 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥" `- W! M6 H+ p
- 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合) B! G. L F, E/ N
- 'expire' => 1800, // 验证码过期时间(s)
: ?4 {4 h8 G: z, n) \" i% a - 'useZh' => false, // 使用中文验证码
4 ?- H; }6 x& F" t- k - 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串
9 Y, c' f! H" W; V - 'useImgBg' => false, // 使用背景图片
7 I: e8 ?0 @1 N+ w7 } p: `( s$ d - 'fontSize' => 25, // 验证码字体大小(px)4 D0 }: h) J, l8 c7 k' ~
- 'useCurve' => false, // 是否画混淆曲线
: g" Y" v* b0 A; O+ t0 A. ?' @ - 'useNoise' => false, // 是否添加杂点 + q- W" E# a5 K
- 'imageH' => 0, // 验证码图片高度
9 A/ D. H* M7 s5 v [ O - 'imageW' => 0, // 验证码图片宽度
" m* `" h3 S. x) ^: l5 L$ G0 _ - 'length' => 5, // 验证码位数, @; ?- z# Z$ w1 A+ \* Z
- 'fontttf' => '', // 验证码字体,不设置随机获取- l! @; t: c" x6 R, F8 G' Z6 J
- 'bg' => array(243, 251, 254), // 背景颜色
6 e+ ]3 j4 E. H8 Q4 l - 'reset' => true, // 验证成功后是否重置
4 `% P) W2 f1 u9 s6 X4 c - );
复制代码 . [" G4 `; A; r& j* `
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。 " G2 }( [. _5 D( V% a9 Y
|