|
首先在Home/Controller下创建一个公共控制器PublicController 1 z1 N: {6 y2 X+ c4 e1 u2 K- I
- <?php
1 ~5 l9 \3 c; u% E5 u, U - namespace Home\Controller;8 `) E2 G1 ]7 C+ H- f0 i- h
6 M8 H6 i( ~" v* @0 p% I6 ?) |- use Think\Controller;
. `% Y( x5 n- X) O* \ - use Think\Verify;
9 n9 z4 E0 B$ a - 5 Z2 S! @( K+ n* V% K! { z' Q
- class PublicController extends Controller) E' e& f4 w0 j+ i
- {# ~6 a. s5 Y" g* ?9 L! y
- 0 \7 y1 @3 W$ }4 x& b. d6 h' g5 n& s/ u
- /* 生成验证码 */
- x' X. @" B( y( [ ? - public function verify()
+ }( H4 o/ ~5 R* b - {8 S! Q; a# L5 k5 w
- $config = [
, u! S7 W9 b) u& z; I. q# ?* Y - 'fontSize' => 19, // 验证码字体大小' e$ i0 F, F, L, J1 [: [
- 'length' => 4, // 验证码位数( x& [( h9 v1 s ~8 x6 u
- 'imageH' => 343 `7 i/ j: J$ D8 ]- {
- ];
# X* i, i; r _: s4 y b2 v - $Verify = new Verify($config);+ X. F8 D" X1 k3 b. C( x
- $Verify->entry();
6 ~6 y' P C% H; }: W - }* w" i- O# |) m; V9 V' `4 V7 k
- . _1 E4 [' K* b5 d
- /* 验证码校验 */' f! u& @( I {! B; M
- public function check_verify($code, $id = '')
& [$ w; q$ H7 l2 r - {2 o+ c, E# T6 P# @
- $verify = new \Think\Verify();
* d* y$ t) D/ X M$ ~1 k7 ` - $res = $verify->check($code, $id);
% n% P3 q% f+ I, ^9 ? - $this->ajaxReturn($res, 'json');8 l7 i8 F! j1 f+ k
- }
: H o/ o5 {; ?% V+ } - }
复制代码
) A, s; X0 d! V) \% r& B$ ?( T6 Y$ Q7 _" h7 t0 E
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。6 k8 X. n' g4 t4 [
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
# Z8 I9 T9 k/ k2 I0 c5 z前台模板页建立index.html
4 X( k' X: P# n7 g+ P' ~ V1 ~# y- <div class="">
0 h$ B2 i* ]/ k6 `' O/ u! c - <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
% y/ @& R& _) d$ i5 j4 g - name="j_verify" type="text" class="form-control x164 in">
' F; O/ `+ g7 W6 _. i - <img id="verify_img" alt="点击更换" title="点击更换"
! O6 f* P5 X2 i; o- Z- Z/ {" ~( | - src="{:U('public/verify',array())}" class="m">) W5 \8 p4 u! S$ J" d
- </div>
复制代码 " T1 V7 n4 y7 u: V; {3 @! {
使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {
( x9 l$ V! Q' L- c f) l4 O; b - var verifyURL = "public/verify";. `+ r7 b' V$ b9 _- s* l
- var time = new Date().getTime();
# S1 O, j2 M5 g! ? - $("#verify_img").attr({2 p2 k' L$ g5 y: f* ?/ Q
- "src" : verifyURL + "/" + time! H3 z( m8 M; b! K
- });$ F- W. t1 m2 x2 F# e9 l" b
- });
复制代码 1 {% F5 `" z$ }! v3 {
利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现: , W' U& y( I$ ]) `9 C& O
- $("#j_verify").keyup(function() {7 B3 c/ y9 V# v# O
- $.post("public/check_verify", {. ?) h q7 h& |
- code : $("#j_verify").val()/ W0 u6 M% M9 m* b& O
- }, function(data) {
5 W1 b( T- h$ n8 [ - if (data == true) {
6 r. s0 u) ^% o' F8 g - //验证码输入正确
5 R6 R3 e/ c/ |' W4 \' W) V - } else {! ~4 F% j$ _, [! d# [& B" D6 u
- //验证码输入错误
% l; F3 D/ G* Z# W/ K) A, r2 [ - }5 s' E3 F* [% ~, k* m
- });' u# s0 T8 V; R5 ?7 Y; K. a9 @
- });
复制代码 $ C% L* ~" {3 z3 Z
利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(8 a8 V) E) O/ b: a$ W, i; B
- 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥
( u( u5 P5 `, `8 l4 U - 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合# I: ]+ z' @/ c, p7 W
- 'expire' => 1800, // 验证码过期时间(s)
8 f+ ~5 Z1 n3 \9 G, i - 'useZh' => false, // 使用中文验证码 3 N6 U* _4 z) S
- 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串
: c/ A1 ~+ v& L3 ?, O, u% I" n - 'useImgBg' => false, // 使用背景图片
0 S/ M/ h* c) i7 ` b - 'fontSize' => 25, // 验证码字体大小(px)
- r1 x2 E1 d8 @/ X4 X9 U - 'useCurve' => false, // 是否画混淆曲线' v) |+ j1 ?" X$ `& y
- 'useNoise' => false, // 是否添加杂点 ) E. Q) o! u, q2 r4 @
- 'imageH' => 0, // 验证码图片高度
* o* C2 I( M: t! p( w% Z' x9 m K - 'imageW' => 0, // 验证码图片宽度6 b4 b4 E2 g) K, [- {
- 'length' => 5, // 验证码位数
/ g o! M) b3 t - 'fontttf' => '', // 验证码字体,不设置随机获取
, T# j. T/ U) p N! [ - 'bg' => array(243, 251, 254), // 背景颜色
8 M' x0 Z/ C: T7 z: A/ ]5 s - 'reset' => true, // 验证成功后是否重置
9 \7 D1 i c4 |' | - );
复制代码 5 Q6 O. v6 Q% H4 d6 A
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。 # }- M5 J* S6 Q; V4 B( W
|