|
首先在Home/Controller下创建一个公共控制器PublicController
1 r+ N' Z) m. E; i$ y- <?php. T& E8 E/ q2 y( a a6 u% j
- namespace Home\Controller;# p& r; o1 J! t1 _% s/ p% P2 q
- 4 c B$ e5 p( Q
- use Think\Controller;
, e, q5 x$ u* C - use Think\Verify;
& M/ J' Q1 _3 ]' z: w3 I1 B) ?2 L - , g9 |2 l7 L% L w8 m
- class PublicController extends Controller5 H! m2 A- n5 ?, A+ t
- {
: W, G9 _# K* g4 T/ L
! r: Q( V- c+ i: E! a, [: J- /* 生成验证码 */8 k: C2 u" F9 `, I3 x2 k
- public function verify(); b' W( a; j, L* R, j- ~% S
- {* G, y% w2 A" M! Z
- $config = [6 o, q9 x8 t" \- H" c7 z6 M6 K
- 'fontSize' => 19, // 验证码字体大小$ W0 x' W0 u# S2 M4 J+ k# y* i
- 'length' => 4, // 验证码位数7 ~4 r+ F5 H9 O6 T( I1 S% P
- 'imageH' => 34
+ L7 f6 {" d/ n2 \" X - ];
* p! ~# L) l5 v' Y% Y, g - $Verify = new Verify($config);
: X! c% y2 E* P) [$ z1 ~+ V) I - $Verify->entry();2 t2 v' i( k5 j+ Y
- }
5 M: K- h. Z6 s2 g
4 F" Q% P/ k1 G9 J. e- /* 验证码校验 */
; L c2 F9 Z4 q4 ~" Z) Q* `+ U8 H - public function check_verify($code, $id = '')
; [& R9 q* u2 j: \$ y* l - {! U f7 }9 x* T3 M1 s' M, |
- $verify = new \Think\Verify();
$ W3 z: `# s+ S - $res = $verify->check($code, $id);) g( t' j* V3 N; {
- $this->ajaxReturn($res, 'json');7 X. v7 m" C% _* n g4 S' j
- }0 \% ^6 c" _* Z2 k3 W4 R, m' ?
- }
复制代码 $ N( m2 _2 w7 d
) f; i, V; _4 T3 b& `* H) Rverify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。
/ C7 O. I# b1 w$ l) ?1 ?9 K! pcheck_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
) Z) l6 ~* m( s前台模板页建立index.html
& J0 C- U/ T# W* E- <div class="">8 m0 F: l3 Q" ]% g; c7 N1 h
- <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
7 E( j8 I( } \) @( k! s: C1 { - name="j_verify" type="text" class="form-control x164 in">
* J5 n- K. q+ N( l" w9 O w9 G - <img id="verify_img" alt="点击更换" title="点击更换"
- ]4 R0 {- Y% ^; {) t - src="{:U('public/verify',array())}" class="m">" H) v1 d) |# r7 o7 p
- </div>
复制代码 ' ]6 U G( R( \ l K! Q
使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {
; v$ `' B7 ~; h5 w* V7 H - var verifyURL = "public/verify";7 R+ E4 y9 w& L$ Q: Q2 |* ]. U
- var time = new Date().getTime();7 v9 t, z5 d7 @6 j' G
- $("#verify_img").attr({9 T4 H% C# j2 @$ H& u' A
- "src" : verifyURL + "/" + time
% Y/ @3 _; I. {1 h! t% d - });
) q5 S F7 N8 L8 i- f# B8 b - });
复制代码
: H5 N! g/ d* N0 O0 \& G利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现: ) x2 `9 d N3 d# ?9 G+ c
- $("#j_verify").keyup(function() {; c, D) D b1 o
- $.post("public/check_verify", {4 F$ R& V& W% v
- code : $("#j_verify").val()9 f# Z1 @& s! ~! G
- }, function(data) {2 Q) I$ H: U8 d" t
- if (data == true) {7 o, ]9 y& \) Z% [' i, K8 d
- //验证码输入正确
8 K3 z8 L. ^! Q- u" K2 M - } else {% x" J$ y4 }! L
- //验证码输入错误6 E) ~! A! t- ?8 ^
- }
* {' \7 {9 o K2 r8 x) V - });2 q" u3 u3 d U" B" w% W4 ?8 u
- });
复制代码
Q( U i9 a1 N' P利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(
/ m! s6 X7 i7 h! l5 W - 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥
8 a, _( M9 l5 k* z0 t - 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合
+ m3 p% ~7 \& S/ t# C( U3 F - 'expire' => 1800, // 验证码过期时间(s)
E% b. Q& s$ Q: @) j - 'useZh' => false, // 使用中文验证码
1 t; b E/ g7 }/ x8 [. l# {& \ - 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串
1 N; s% Y# W% J! q - 'useImgBg' => false, // 使用背景图片
$ j7 e4 k. y3 z- D; h) Q) p$ ` - 'fontSize' => 25, // 验证码字体大小(px)/ p9 K/ E3 Y) t
- 'useCurve' => false, // 是否画混淆曲线
) ]. s+ A$ ?, z8 H- Q - 'useNoise' => false, // 是否添加杂点 ) L9 D/ p6 P7 p; q
- 'imageH' => 0, // 验证码图片高度
s+ Y/ K1 }5 P* l1 J4 \3 I - 'imageW' => 0, // 验证码图片宽度 G6 d& N( p4 O9 M/ _
- 'length' => 5, // 验证码位数- f" K: }/ H( ` ^8 f1 u. i4 ?( N
- 'fontttf' => '', // 验证码字体,不设置随机获取) v+ O8 i# j& u4 c
- 'bg' => array(243, 251, 254), // 背景颜色. V. I4 D5 l1 e7 d
- 'reset' => true, // 验证成功后是否重置
% X# q+ U9 B2 v* o/ l - );
复制代码
" @6 J- g* }- l# Y# i. b- W" \请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。 9 [. S( k8 D, R: {% y D' W
|