|
首先在Home/Controller下创建一个公共控制器PublicController a4 X4 D% k( W* I
- <?php/ e" m; d% o) p7 s; \. e7 z
- namespace Home\Controller;7 ^: o. Y: v1 k; H8 T' C, g
- 5 l8 g" g) ~5 S( ]2 x+ b
- use Think\Controller;! Q; K7 ~( m/ D4 [1 p" [
- use Think\Verify;
) t" N5 _$ J2 M3 r! b; b, [ - ; P5 Z5 ^$ V; C# z) g* ~* w2 B" W1 P
- class PublicController extends Controller4 m Q x: `! V: {, r; @3 D
- {$ ?; E$ |; ^( [" O5 q, ^6 a
- 5 u: R* ^7 s7 K: M) l7 q$ \
- /* 生成验证码 */$ C' W* l7 Z+ |7 t! t
- public function verify()
* T c( U6 h9 @5 I# e, h5 y - {
! \- \; X; U- z9 I; X# Z( C - $config = [- { Z# \4 v, k! N- H( N
- 'fontSize' => 19, // 验证码字体大小" |9 [6 m) u k' I2 }
- 'length' => 4, // 验证码位数; ?& ]. a& U$ \( I) u5 I, v$ R/ @
- 'imageH' => 346 o M0 Y, y5 Y- Q. v
- ];
_& H) h5 _" _& s% y K - $Verify = new Verify($config);
- z5 X7 b l0 ?5 J9 { w - $Verify->entry();( T& _( G/ e, _- d" n, A
- }0 r% @4 q c! ?# \
- * x: v; c5 r- ~& W
- /* 验证码校验 */
# n- D' N8 y' V* x B, V - public function check_verify($code, $id = '') v0 ?$ ~0 [: _1 o* e" N! [& d
- {
]+ }7 q. p" w. {+ y0 x6 `" V - $verify = new \Think\Verify();
1 J3 m- U h4 k0 Q - $res = $verify->check($code, $id);3 U) f* j8 c8 N: [- J
- $this->ajaxReturn($res, 'json');
; l. [ z* a! y1 x2 c - }8 h: b7 n1 K, u+ N% W
- }
复制代码 9 X/ l" w" P3 X0 c
% C0 _# d6 o3 [ p; S) n
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。
, w4 U8 g( ]) s# o* I# Z Xcheck_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。- g% V# l) u# p# X G
前台模板页建立index.html. X0 l( [4 E" t5 z
- <div class="">
' P5 M! @/ W4 A1 ]# h - <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
. m9 v+ c7 v2 n - name="j_verify" type="text" class="form-control x164 in">
' t' y& u1 }5 W; @$ x, I - <img id="verify_img" alt="点击更换" title="点击更换"
, y) v" ^/ k& U+ X. k$ B - src="{:U('public/verify',array())}" class="m">
) ^8 \. i0 E& l+ p# @ - </div>
复制代码 , [9 m( F$ x$ f0 H% U+ Q6 R
使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {+ V& l8 c J; l' }$ v2 z, n
- var verifyURL = "public/verify";
0 {6 |1 e) x/ r1 z9 @ - var time = new Date().getTime();, S7 H8 [# r/ N
- $("#verify_img").attr({
) F; U7 q: Z6 w* O - "src" : verifyURL + "/" + time/ r/ E a" z+ o t0 ^
- });
& O8 i2 L3 K& S1 g - });
复制代码 ) n# W7 M. r/ c b
利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
/ v5 C1 K) w+ H- $("#j_verify").keyup(function() {
* F1 h0 ~' f \5 w4 g. d - $.post("public/check_verify", {/ {. K9 e$ O4 _2 i& b/ D
- code : $("#j_verify").val(): h% q s7 O( V o/ b8 S- c
- }, function(data) {" K$ |% I7 Y* O2 G' B
- if (data == true) {
: P" u3 I7 ^' w/ ? O - //验证码输入正确0 Q1 R* X1 W% E; _
- } else { w9 [! t' X4 @0 T* U8 I
- //验证码输入错误
, ]# a- A3 x# ^6 ~ - }# Z- G" @1 y% k4 y7 w
- });
. R0 h" A1 `! \7 X# Z1 G - });
复制代码 - F6 b) _3 B# o X; [* Y) T
利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(
- N* u# K+ x, v- V3 i' N - 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥
( L: A" r8 {' t* R: x - 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合) Z3 j+ e( ?9 Q; P9 q3 P
- 'expire' => 1800, // 验证码过期时间(s), X2 I" u+ T' N0 R- D
- 'useZh' => false, // 使用中文验证码 0 V; m7 O! g3 J( ]4 C0 Q
- 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串
9 L5 n1 s& L+ N: w" _/ V6 ]2 C' h9 W - 'useImgBg' => false, // 使用背景图片
9 Y% x D0 ^3 g ^2 J+ r - 'fontSize' => 25, // 验证码字体大小(px)" _; |4 @( C8 I+ e" O' g# F! |
- 'useCurve' => false, // 是否画混淆曲线9 Q: i* t& O. i9 |/ S a
- 'useNoise' => false, // 是否添加杂点
% Y7 ]3 s' r$ _( z: U' E( I6 E - 'imageH' => 0, // 验证码图片高度7 Z5 ^+ Z9 }- W O) U0 S
- 'imageW' => 0, // 验证码图片宽度5 W8 h* \" j# `, d/ X* i+ g
- 'length' => 5, // 验证码位数9 G$ q, I3 c5 w& V$ r; J! W
- 'fontttf' => '', // 验证码字体,不设置随机获取
4 o8 h3 \4 I: B" y1 U - 'bg' => array(243, 251, 254), // 背景颜色
3 t" F6 C3 I8 Y - 'reset' => true, // 验证成功后是否重置
% T0 x% h! m# N: } - );
复制代码
9 y: P) m! C. Y+ D& ?; g请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。
8 s! Z( Z( i1 Q3 f( M |