首先在Home/Controller下创建一个公共控制器PublicController
5 \3 S: j% j5 r* y6 L- <?php
, |: G1 N; M6 |9 h, f( d4 G - namespace Home\Controller;
; U6 o/ F6 e* ~ - 8 [( t, d5 q* r, @
- use Think\Controller;. X; ]" r0 } G. [% p. Q" I
- use Think\Verify;
+ |' }. h, \% \; \ - 3 `* ]$ C6 d+ }5 V! d8 J, ]
- class PublicController extends Controller+ _; n$ }0 `* _8 R
- {. v/ k& ?5 F, t8 I1 W" b3 w
4 T& f H, _9 k- /* 生成验证码 */, B# K& G( h, X& P
- public function verify(): Y" k" ?! q/ r9 D; v* L+ H+ H
- {* r0 h2 O% o: x9 i3 x- t) S; [
- $config = [6 k. ?! G* C; k% ~6 r
- 'fontSize' => 19, // 验证码字体大小
9 q) H* E$ R7 ?9 S - 'length' => 4, // 验证码位数
. J B$ _/ S" L Q: Y7 c. i+ O, O5 X - 'imageH' => 34
+ q# q# f, Q0 c. W - ];* i* e4 L/ I# w; w5 S
- $Verify = new Verify($config);
) G0 U5 f: X; k - $Verify->entry();9 \& W/ n* Q* M1 ]$ F- r/ ?
- }
' a0 a( _" w+ V5 ^, C
! d' e0 f* H0 D5 P. q- /* 验证码校验 */8 q: I- ~7 v4 V# z7 m v
- public function check_verify($code, $id = '')
9 S2 n g+ b! U) n0 P5 U( x - {
. U3 n$ Z0 b* ]4 v- `2 ` - $verify = new \Think\Verify();
# q1 O& T1 i2 o" c W; ~ - $res = $verify->check($code, $id);6 L# P* ?! {9 }: T5 j" `
- $this->ajaxReturn($res, 'json');. o& F. t! X. U3 t+ o
- }
* d) L" m' {: D4 D5 R9 G# \5 M - }
复制代码 , R: X- b, Q) ^1 n& U
2 }, ^; D0 ]8 v" D
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。
3 S* N) F" N" }" ^6 Dcheck_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
& f- M! @! w4 x, [0 A前台模板页建立index.html
/ x0 W' i6 @5 @. X) y0 D, D" u3 w+ l- <div class=""># R& N, w0 D- j+ g5 X
- <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
" o4 O) o; k2 {! Y" s% a7 e - name="j_verify" type="text" class="form-control x164 in"># l; b' g$ Q- M O
- <img id="verify_img" alt="点击更换" title="点击更换"
8 ^, h2 b( I( e' M3 t - src="{:U('public/verify',array())}" class="m">. g+ p4 d7 n* U3 S& I, x( \
- </div>
复制代码 % ~1 y/ a8 `' n6 V) z
使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {
6 P0 {8 P$ [9 ~$ Y7 v - var verifyURL = "public/verify";
, s1 g0 a4 G$ p - var time = new Date().getTime();
' d J. V& l* u1 y - $("#verify_img").attr({3 `, B8 \0 t8 U' _, N
- "src" : verifyURL + "/" + time
2 ~" U$ p% Z0 f: s - });
( H2 O K& m% }9 q8 X& }, l - });
复制代码 - w7 U7 W& p$ u; j
利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
% i9 p3 B4 k* g5 @: t- $("#j_verify").keyup(function() {
$ ? I0 Q" R( U4 ~0 v - $.post("public/check_verify", {
1 |& t' K$ \3 \ - code : $("#j_verify").val()0 o. a+ L5 s& }7 i. Y/ z6 I
- }, function(data) {! V+ Z- h6 ], [
- if (data == true) {; a3 z( S0 m7 T: W. [
- //验证码输入正确
0 u2 Q* H8 O- c$ D. d& X - } else {7 H# ?2 D6 X0 o1 _/ ]
- //验证码输入错误, N, D9 N2 U3 k/ d* h# ^, u
- }5 J0 B! f3 v0 y2 c
- });9 B5 n1 |( N* v3 [3 l& A0 |* K$ R
- });
复制代码
+ D. j1 C( P/ Q5 k J利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(2 @$ a$ |+ b! J/ {) ^
- 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥, d, d2 P5 u8 u& O- E
- 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合
' C! t' ^% \# R+ R; c1 G( r - 'expire' => 1800, // 验证码过期时间(s)& l; o3 p! p& x4 K" ~& u6 D
- 'useZh' => false, // 使用中文验证码 # a% Y7 v" r: [% p; c. J
- 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串+ V; c/ J, W2 y( j- \1 v' Q
- 'useImgBg' => false, // 使用背景图片
. Y7 g* [9 Q: e; X- m - 'fontSize' => 25, // 验证码字体大小(px)8 f) O3 B0 N3 a& Z5 G
- 'useCurve' => false, // 是否画混淆曲线
, ]/ x2 R; r x# [2 |0 B) i. b - 'useNoise' => false, // 是否添加杂点 4 G/ c# z2 W1 \ n$ w4 k5 [
- 'imageH' => 0, // 验证码图片高度
2 V& ]' |, y) j - 'imageW' => 0, // 验证码图片宽度
8 k1 N0 o( S: |1 [/ W, P) {2 V - 'length' => 5, // 验证码位数
0 z+ t! @3 f. F8 u1 ]0 \" F - 'fontttf' => '', // 验证码字体,不设置随机获取
5 A7 Z6 x' f3 s$ W. \ - 'bg' => array(243, 251, 254), // 背景颜色3 n' S' Y- x! C$ i
- 'reset' => true, // 验证成功后是否重置) b I ^+ N& j, Z. Y% Q
- );
复制代码 0 d* p; t% e; Z% q0 q
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。 & t8 R/ i/ Q. z8 A8 j* ]; n
|