|
首先在Home/Controller下创建一个公共控制器PublicController ) C! h# Q6 r, [' S2 @4 F' {8 O
- <?php
/ a4 ^& H' H& W) @ - namespace Home\Controller;
4 U1 t% Z( m0 O' H0 s# w - 5 `- Q$ k$ S4 I
- use Think\Controller;
; h- O/ I/ \* s' d$ e, A - use Think\Verify;
9 h# |7 n+ v. h
8 T/ V* }$ L8 E- class PublicController extends Controller
, i& G' R \0 w3 p7 N - {
6 ]. Y& \% K/ |7 Q0 ~+ O' \ - K3 G6 M+ c; @* q2 f
- /* 生成验证码 */
8 D; D. } X. q/ I" ~8 x% _( G4 l - public function verify()
: p: s1 @1 ], j( \$ @* X- {1 H - {" z2 I2 @7 [2 k. K
- $config = [
, p) ? t q& _1 k - 'fontSize' => 19, // 验证码字体大小
2 H- u; J+ @$ a+ F - 'length' => 4, // 验证码位数
7 r+ L5 M) { ?3 p - 'imageH' => 34
! V$ ?" q0 ^. @ - ];1 G; B0 _) I, }6 J7 X& }
- $Verify = new Verify($config);, d& L2 B+ C s
- $Verify->entry();3 ]( Y* y3 Q7 j" n D
- }# d6 d. ~2 e, _5 |& c) D
; c+ {# k0 F8 n' d8 I- /* 验证码校验 */
* [3 k! v/ ^" }* e# C+ W - public function check_verify($code, $id = '')
3 m- m& y3 L' i - {& `& d! I. K+ a$ ?1 O6 \* O
- $verify = new \Think\Verify();+ c9 N' n2 P6 |5 U* R
- $res = $verify->check($code, $id);0 S W: R! @( g
- $this->ajaxReturn($res, 'json');& ]. _ O8 U1 Q. k5 s
- }5 t' z& ^+ m& L; @. B& R0 c6 X
- }
复制代码
/ p7 E5 l# M9 o- c5 G. m) [1 m( {! ]8 B
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。9 K. h0 U& g, n# r( l5 P
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。8 X0 j6 q# F$ {& R. [
前台模板页建立index.html
0 L& g8 E. R! A3 d- <div class="">
' g; u. b2 L1 {$ @4 G! y0 ~ - <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
2 l' h4 h4 V" ?8 b' Q) O! \ - name="j_verify" type="text" class="form-control x164 in">
9 D8 E% @. U+ D8 V - <img id="verify_img" alt="点击更换" title="点击更换"2 e3 e- J1 [2 d! l& a
- src="{:U('public/verify',array())}" class="m">
; B a. I! I. o' `7 f - </div>
复制代码
' {' a) F7 U3 x使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {+ @: f% K* t+ K* j7 j
- var verifyURL = "public/verify";
( ?) y9 S0 y0 B6 ?6 H+ J - var time = new Date().getTime();
3 F- t: q& v, t: c ] - $("#verify_img").attr({7 a+ Y* u3 R8 D% i4 T$ y4 V/ Z0 N
- "src" : verifyURL + "/" + time
5 z* R2 D* P; z. h$ S - });; ~8 O5 Q/ z3 B! p z: {
- });
复制代码 " y" P2 ]0 Q8 B9 p4 I7 b9 u5 b0 `
利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
( j$ j$ G+ d5 `# h0 s6 `( M- $("#j_verify").keyup(function() {
# ~: J. o, z4 h8 ^ - $.post("public/check_verify", { O( R) A8 [, X1 w4 x; A
- code : $("#j_verify").val()& l; b3 o9 f @7 _: E. n) s
- }, function(data) {
, A" L9 g, e5 a - if (data == true) {
1 l- g% Y o; d+ p' L - //验证码输入正确
' m1 }% ^, _2 F! K' i! h - } else {
4 x) o( Y4 E r7 @) Y - //验证码输入错误
- I, q2 l* q# y" ~ - }
1 W/ B F1 W* z8 \) p$ S - });4 e5 @+ p9 W) Z3 k- M
- });
复制代码 : Q) t3 ~1 n# q9 T! Q
利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(
* Q5 J; G* |3 `2 h3 z - 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥, l# t2 d5 |' K0 Q( b0 q* p" V) V
- 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合3 [) a( q6 l% V# M
- 'expire' => 1800, // 验证码过期时间(s)
* [: S9 `9 ]) U6 d9 ~6 j& `2 ~* Y - 'useZh' => false, // 使用中文验证码
7 ?, y8 |8 h8 { - 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串6 H3 [* V! g R( ]7 J2 n
- 'useImgBg' => false, // 使用背景图片
+ U) n* H! U) H - 'fontSize' => 25, // 验证码字体大小(px)
7 Z2 T6 b5 \/ Z: G: y m0 ^3 B - 'useCurve' => false, // 是否画混淆曲线
6 D2 }; l+ a- k$ o/ x - 'useNoise' => false, // 是否添加杂点 8 O1 L: F8 j& M' @+ `- ?
- 'imageH' => 0, // 验证码图片高度
) y) N$ M2 S" }2 Z6 @1 n - 'imageW' => 0, // 验证码图片宽度
) W9 f# E; f5 m L8 [& U- k1 z# o3 v - 'length' => 5, // 验证码位数
7 M5 E) b) | H v0 t* p - 'fontttf' => '', // 验证码字体,不设置随机获取
* z- H9 \0 q6 k2 @0 k - 'bg' => array(243, 251, 254), // 背景颜色
8 ^" N0 J* A4 f" K - 'reset' => true, // 验证成功后是否重置 f3 y& v! H P* G4 ~0 W, i
- );
复制代码 2 h4 `5 R" U1 O$ C
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。
5 W6 u1 n+ o) j7 L( T6 [) v |