|
首先在Home/Controller下创建一个公共控制器PublicController
# s/ L* ?8 u" }% t' D! X! i; a8 ~- <?php7 X4 a. C+ m3 b+ j+ `2 O
- namespace Home\Controller;
9 T( N+ O) S7 S
7 {3 N0 P( N1 e% o0 H8 U w- use Think\Controller;
- T$ A. a# a/ I$ n - use Think\Verify;3 V- _; x# F' ~
- 2 ]( O+ W, {8 Y0 l# ^
- class PublicController extends Controller
9 y1 t6 S2 ^8 k# k: c4 Y" |5 G - {9 p6 Q/ v/ C8 r1 w* y6 l
- " w- S& k+ s' e2 q3 n, j
- /* 生成验证码 */
' H7 [9 m r' D t; d/ n2 K - public function verify()# C# F( a9 c. b/ m+ E: U
- {
# G& A) t) S/ B) f0 H6 v# _& r, r - $config = [
# W8 l* i1 U8 @, b$ E* y" N - 'fontSize' => 19, // 验证码字体大小/ j$ C; Z8 V- v
- 'length' => 4, // 验证码位数
2 ?: z. C$ N' Z0 P" _# {% t( z - 'imageH' => 345 Z) Y. C+ V" l2 Q9 v
- ];8 e V- J: c. H. N. P
- $Verify = new Verify($config);. v: Z8 p) i6 f- M1 {1 u
- $Verify->entry();
& f1 c9 U8 B2 S( A1 g* K - }
_5 N. g; O* v& [( j
$ U, s+ V# c# @, v: M, L0 i. m' Y- /* 验证码校验 */, y2 Q) G) e3 l4 w
- public function check_verify($code, $id = '')
( c( H) ]5 g! M3 Z" i- [ - {) p3 {; |# J- H( [7 \8 _0 _
- $verify = new \Think\Verify();( `# W* i3 u/ `0 v/ l9 \3 z) e e
- $res = $verify->check($code, $id);# M3 G) J/ \6 o# k, M
- $this->ajaxReturn($res, 'json');3 k, R( `/ M/ b; o8 Y
- }
. i# K; ]2 d0 }: u ^ - }
复制代码 - U2 x- i- i& K& @1 O
5 X z2 d# ^/ D, p6 H9 d$ d- R, G$ tverify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。 n) G; C+ Z, I/ F F/ Q
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
+ ]4 e9 t2 A( F, V9 ]前台模板页建立index.html! r5 R) k, I0 ~/ l: @, @
- <div class="">
s& i# H. l3 B% ]* t" N - <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
0 [9 Z) T) X. p' Q) z0 ^ - name="j_verify" type="text" class="form-control x164 in">5 ]: \( S+ V. G3 Y
- <img id="verify_img" alt="点击更换" title="点击更换", P0 [% I) K7 i9 d
- src="{:U('public/verify',array())}" class="m">
9 _8 o, A T7 l( p* z5 X6 {* W - </div>
复制代码 2 a3 f3 A9 o6 g- z
使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {
2 H1 F: h" R) D! B - var verifyURL = "public/verify";& A/ d( M# S8 U/ V1 [5 `8 j
- var time = new Date().getTime();0 o% P' d8 |& w* Z9 V
- $("#verify_img").attr({7 u6 R$ S( a" l) T
- "src" : verifyURL + "/" + time
X% T9 @9 N$ _) Y8 @2 r6 Y. n - });
7 Z) a1 A6 `* q - });
复制代码 7 I4 j: i) }! e5 K! ]
利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现: 6 k# H1 \- U+ @6 p0 ^ b" O
- $("#j_verify").keyup(function() {: J. q; V& @: S
- $.post("public/check_verify", {
3 E7 j( x7 `) B7 b/ A - code : $("#j_verify").val()
- b, R: V `$ d( _0 p - }, function(data) {" U7 w6 W5 A5 c! _
- if (data == true) {: W- `* d, W- x* y2 A- u( d6 c6 T
- //验证码输入正确; Z+ _1 B. e8 d. V- D9 R- }
- } else {
6 b4 S2 C* S* } - //验证码输入错误
9 X& Y. b5 f- k# _; X - }# V3 l# s1 k+ H. V& f5 L
- });1 J5 w3 J6 h7 o& L' w
- });
复制代码
I6 `4 Q; `' g+ z6 j6 T1 U. Y利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(
5 J5 G' T+ X" ?, T% t - 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥7 v6 ?6 ^4 L% j5 X, D
- 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合1 D- g+ L9 {% U D
- 'expire' => 1800, // 验证码过期时间(s)4 `: G7 d+ z9 K6 X+ `" ?6 ?9 W2 G
- 'useZh' => false, // 使用中文验证码
, I; a7 _6 ]% s' J; Y1 x - 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串
# n8 P- X6 }7 \! I' ?, d+ g - 'useImgBg' => false, // 使用背景图片
9 ^7 r1 j% N' R9 ?9 i - 'fontSize' => 25, // 验证码字体大小(px)
4 }" f+ b4 J" n: O1 L! y( K - 'useCurve' => false, // 是否画混淆曲线
0 Y' S) Y7 k) f! D - 'useNoise' => false, // 是否添加杂点 ) S& f3 j# j0 ~+ {" A
- 'imageH' => 0, // 验证码图片高度
, M0 A2 ~- N+ L+ h5 _2 f* [ X) } - 'imageW' => 0, // 验证码图片宽度
7 q5 j$ G0 u7 f2 K - 'length' => 5, // 验证码位数
9 [ J1 u1 j& L: D7 E: E - 'fontttf' => '', // 验证码字体,不设置随机获取
) X" I2 s) | E" D \ - 'bg' => array(243, 251, 254), // 背景颜色: k {* n" c! P- b, f ^6 t: b
- 'reset' => true, // 验证成功后是否重置
/ i( M/ c3 o- n/ R/ t5 Y - );
复制代码
, f! G- D# P7 v* t, W: c! z请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。
/ K4 f! n* ^+ Z6 D |