首先在Home/Controller下创建一个公共控制器PublicController
* _8 d9 K* A. W/ s1 U- <?php
2 t3 b+ Z: n( X8 |$ w$ |% N# j) f5 E - namespace Home\Controller;' n6 X4 B$ ] h e
) ~! m9 G/ L5 }- use Think\Controller;
4 Y& @4 W3 O, k' S5 K - use Think\Verify;
) _: |* `- m3 n9 G% C/ [6 I$ |# D
. |" y7 D3 [8 \- y; {' k# V- class PublicController extends Controller! x- T& B9 w8 V# r! X7 w7 `
- {. D7 @- T0 I! }0 `- h1 y
( L* F9 B7 k# N- /* 生成验证码 */
; ~( c# q9 w3 y: r @$ c( j - public function verify()$ s7 w- k, j% z/ f! W
- {! a- w$ b8 [6 l/ X7 i! ^
- $config = [' e; E( G3 F) i8 y8 [2 \2 c! a2 {
- 'fontSize' => 19, // 验证码字体大小 S( i Z% e* R+ Y
- 'length' => 4, // 验证码位数8 C9 ?& `* E8 o# l ?
- 'imageH' => 34
0 ~1 q7 V _5 V: g2 h - ];
: _" g4 }3 @+ a8 N1 r! f& Q5 `- y - $Verify = new Verify($config);
e+ P8 l9 n7 B! F* l - $Verify->entry();( l; j$ j [' d
- }
: }) z l+ Y" q2 ]5 O C" q
6 Z/ M& {* D" `2 Y6 d( l- /* 验证码校验 */+ _: ]0 G: O. j7 {6 G! X
- public function check_verify($code, $id = '')' ?! e8 u; [7 ^# p" w' h
- {
t/ H, @; q1 c9 C - $verify = new \Think\Verify();
4 V" `+ q$ f& I$ L - $res = $verify->check($code, $id);% U$ E% V$ g6 ?! n* p- l( s. M) v
- $this->ajaxReturn($res, 'json');
, t; a7 y( d) @' `- a7 q% h" { - }' p7 W0 V7 Y; ~* P3 A/ |7 M
- }
复制代码
3 V- p1 U. ~6 e& ]" g& F3 s; Q3 N+ T0 b
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。; @2 t0 I9 d% x2 s3 c6 L
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
\7 Y: ^2 o2 }6 B& j* W2 a7 h r5 m前台模板页建立index.html$ C$ r* q( C9 C" y- y0 g
- <div class="">
7 s( a3 B5 y0 L# v7 j - <label for="j_verify" class="t">验证码:</label> <input id="j_verify", o1 m2 D$ l S0 O% m
- name="j_verify" type="text" class="form-control x164 in">
2 q/ d! T \2 v7 u8 w/ O0 _ - <img id="verify_img" alt="点击更换" title="点击更换": }& x/ L( s! I z, P1 {: X' z
- src="{:U('public/verify',array())}" class="m">5 e4 `: P# \0 w
- </div>
复制代码
- y9 J& a4 c" L, C8 I. K使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {
6 \- n; C2 E1 v1 t0 ? - var verifyURL = "public/verify";
4 [5 z: F. e3 V3 w" n/ m - var time = new Date().getTime();
# r( N; R- W( N d$ e& g& i& H - $("#verify_img").attr({8 K. y* j5 K7 J) F/ m. V/ ]& G
- "src" : verifyURL + "/" + time- S. f) w# J% a6 Y; o
- });: G& G- l* k- q
- });
复制代码
) W7 J& `1 q) @# x, c0 \3 O利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现: $ d* T2 ^1 A* z/ F. c: n
- $("#j_verify").keyup(function() {
; x: O# C% X3 ]7 } - $.post("public/check_verify", {
- J' F1 F+ U; Z+ A- p2 J - code : $("#j_verify").val()
$ n6 v8 x! Z2 s/ R- K, [4 u - }, function(data) {4 l S7 t/ j7 r6 Z# C% S" R* `8 @
- if (data == true) {/ s0 i$ s j2 i6 R+ m0 D: ]4 v0 O- {
- //验证码输入正确 V9 i+ f3 X5 m
- } else {# A/ ?& m, V; m& T: i+ o
- //验证码输入错误( K# M8 ~" x2 o. t4 e
- }
2 y8 u' W, m8 p( e9 }4 e) U - });& X8 N: T# ?" |; ?" \
- });
复制代码 + @- v1 A# n/ N. @
利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(
) E" s+ Y$ j7 v1 T- g/ O; U2 ?0 v7 _ - 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥4 k v' E, w, a) d
- 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合
' W4 c$ G0 V. c9 v - 'expire' => 1800, // 验证码过期时间(s)
) F$ H! u0 A! B. P$ ?' \ - 'useZh' => false, // 使用中文验证码
, K7 Z) b( P2 B& E% M* }7 s - 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串! G1 ^+ m& w, D$ P {3 b
- 'useImgBg' => false, // 使用背景图片
4 s* |6 s+ ?5 {5 O4 ?5 E0 G - 'fontSize' => 25, // 验证码字体大小(px)
/ E0 w# A- s& J' x* u, _ - 'useCurve' => false, // 是否画混淆曲线( H& A; y2 e+ |, ?6 {
- 'useNoise' => false, // 是否添加杂点 : c$ Y) i/ {1 z2 s% z
- 'imageH' => 0, // 验证码图片高度' Y3 E8 u5 G R: j& N
- 'imageW' => 0, // 验证码图片宽度3 q7 a4 d$ o0 {! G
- 'length' => 5, // 验证码位数( g B) Z" h% T+ @
- 'fontttf' => '', // 验证码字体,不设置随机获取
& V. T$ x U: f, [; t& z0 h* F- ~ - 'bg' => array(243, 251, 254), // 背景颜色7 _6 D0 \. B0 w$ p
- 'reset' => true, // 验证成功后是否重置
9 f2 A/ |% K8 ` O - );
复制代码 , j5 @4 W2 _( Y- F
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。 8 k* d# A' d* B, T! O3 D1 h; z+ a
|