就在这几天,TP5进行的RC3的大规模更新,虽然我们都狠狠地骂了一百遍,但是我的内心是无比的激动,TP终于走上了“上流社会”的模式:composer!
为什么说composer是上流社会呢?因为 自己去 Bing 一下,为什么不是百度呢?

废话不多说了,今天要为大家讲的是如果给TP5加上图片验证码。

首先我在GITHUB上面找了一个看似还可以的图片验证码 https://github.com/Gregwar/Captcha,然后我们把她安装到我们TP5框架中去

  1. composer require gregwar/captcha

然后,我再 application\common\helper 下面创建了一个 VerifyHelper.php 我们的验证码助手类(为什么我的目录这么自由,因为我是主流,O(∩_∩)O~)

然后我们根据这个图片验证码的说明为verifyHelper.php 填充了两个方法

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: 申法宽
  5. * Date: 16/4/25
  6. * Time: 13:19
  7. * Email: sfk@live.cn
  8. * File: VerifyHelper.php
  9. */
  10. namespace app\common\helper;
  11. use Gregwar\Captcha\CaptchaBuilder;
  12. class VerifyHelper
  13. {
  14. /**
  15. * 生成验证码
  16. */
  17. public static function verify()
  18. {
  19. $builder = new CaptchaBuilder();
  20. $builder->build()->output();
  21. session('verify_code', $builder->getPhrase());
  22. }
  23. /**
  24. * 检测验证码是否正确
  25. * @param $code
  26. * @return bool
  27. */
  28. public static function check($code)
  29. {
  30. return ($code == session('verify_code') && $code != '') ? true : false;
  31. }
  32. }

好了,大家需要的验证码类已经搞定了!额~~~ 抱歉,没有给大家演示前端效果呢

--------------------------------------------------------------------------------------------------------------
接下来我们在控制器中重建一个verify的方法( 注意,这里VerifyHelper的命名空间PHPstorm在上面已经给我use 过了,如果你要纯手工的去敲代码,那么你可不要弄错哦 )

  1. /**
  2. * 显示验证码图片
  3. */
  4. public function verify()
  5. {
  6. VerifyHelper::verify();
  7. }

我们在页面中添加如下代码(注意,我的src是经过路由的,你需要自己对应到刚刚verify方法的控制器,或者自己写路由吧)

  1. {extend name="base" /}
  2. {block name="title"}图片验证码{/block}
  3. {block name="main"}
  4. <div class="row">
  5. <div class="col-xs-12 col-sm-6 col-md-6 col-lg-6 center-block">
  6. <form class="form-horizontal" id="tg-register-form" data-toggle="validator" action="{:url('/do_register')}"
  7. method="post">
  8. <div class="form-group">
  9. <label for="inputVerify" class="col-xs-2 control-label">验证码</label>
  10. <div class="col-xs-10">
  11. <input class="form-control" id="inputVerify" name="verify" placeholder="验证码" type="text"
  12. data-error="验证码错误" required>
  13. <img class="verifyimg reloadverify" src="{:url('/verify')}" alt="">
  14. </div>
  15. <div class="col-xs-offset-2 col-xs-10 help-block with-errors"></div>
  16. </div>
  17. </form>
  18. </div>
  19. </div>
  20. {/block}

好啦,前端工作做完,那么现在展示效果的时候到了



怎么样,还不错吧,你想点击图片就更换验证码?好的下面贴出代码来

  1. <script>
  2. $(function(){
  3. // 刷新验证码
  4. var verifyimg = $(".verifyimg").attr("src");
  5. $(".reloadverify").click(function(){
  6. if( verifyimg.indexOf('?')>0){
  7. $(".verifyimg").attr("src", verifyimg+'&random='+Math.random());
  8. }else{
  9. $(".verifyimg").attr("src", verifyimg.replace(/\?.*$/,'')+'?'+Math.random());
  10. }
  11. });
  12. })
  13. </script>

额,貌似又忘了,那么我怎么去验证用户输入的验证码是否正确呢?还记得我们在填充VerifyHelper.php类的时候有一个check 方法吗?没错,就是这个方法用来检测用户输入的验证码和session中存在的验证码是否一致了!

好,现在我们就说说这个验证,我们在使用TP5的时候,会发现手册中有一个验证,没错这个东西在3.2时候我们还是纯纯的在model验证(我没说错吧?其实那时候我几乎不写验证的,呵呵是不是很不负责呢),那么现在我就教大家写一个验证器

假设我们刚刚在写验证码的时候的场景是用户注册,我们现在就写一个用户注册的验证器(ps:如果你看不懂我写的什么,那么就去看看手册吧)!

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: 申法宽
  5. * Date: 16/4/21
  6. * Time: 16:26
  7. * Email: sfk@live.cn
  8. * File: UserValidate.php
  9. */
  10. namespace app\common\validate;
  11. use app\common\helper\VerifyHelper;
  12. class UserValidate extends BaseValidate
  13. {
  14. // 验证规则
  15. protected $rule = [
  16. ['email', 'require|email', '邮箱必须|邮箱格式不正确'],
  17. ['password', 'require|min:6', '密码必须|密码长度至少6位'],
  18. ['verify', 'check_verify:thinkphp', '验证码错误']
  19. ];
  20. protected $scene = [
  21. 'register' => ['email', 'password','verify'],
  22. 'login' => ['email', 'password'],
  23. ];
  24. // 自定义规则
  25. public function check_verify($value)
  26. {
  27. return VerifyHelper::check($value) ? true : false;
  28. }
  29. }

上面代码中的check_verify就是我们要做的自定义验证:验证码验证(还是那就话,我这里phpstorm已经给我写好了命名空间了)

我们上面说了,我们假设的是用户注册场景,我们需要一个用户注册的方法(下面代码中succ 和 err 就是一个返回js的方法,你可不要说我的代码你不能用,就开始咒我啊)

  1. public function register()
  2. {
  3. if(IS_POST) {
  4. $data = input('post.');
  5. $result = $this->validate($data, 'UserValidate.register');
  6. if(is_array($result)) {
  7. return $this->err('注册失败', ['valid' => $result]);
  8. }
  9. // 判断验证码
  10. $user_model = new UserModel();
  11. if($user_model->register($data)){
  12. return $this->succ('注册成功', ['url' => url('/login')]);
  13. } else {
  14. return $this->err('注册失败, 邮箱已注册', ['valid' => ['email' => '该邮箱已经注册,请更换或登录']]);
  15. }
  16. }
  17. }

这里我就简单说一下吧, $this->validate($data, 'UserValidate.register'); 意思是告诉我们 加载了 UserValidate的注册场景!

其实到这里,我们的工作已经写完了

流程:
用户打开注册页面
显示页面的验证码

用户点击提交

提交到我们 注册方法

注册方法加载用户验证器

验证器验证 email password 和 verify 是否符合要求

然后进行数据的写入

Done !

是不是很懵,从 TP5开始 我们就要开始 自己组装我们的框架了,不管你需要什么,去 GITHUB上面找,composer 安装,然后开始肆意的放纵吧!

对了 这里有一个问题,在我写这篇分享的时候,Model.php 的 save 方法有一个bug,在上面 注册方法中我们可以看到,我在UserModel中又写了一个注册方法到model中

  1. /**
  2. * 注册
  3. * @param $data
  4. * @return int|string
  5. */
  6. public function register($data)
  7. {
  8. $user = self::db()->getByEmail($data['email']);
  9. if ($user) return false; //用户已经存在
  10. if ($this->allowField(['email', 'password'])->save($data)) {
  11. return $this->id;
  12. }
  13. }

代码中使用了 allowField方法过滤了 verify 字段,不然在我们save的时候tp就要去判断verify字段不存在报错了

那么 这个bug 在哪呢?(Model.php 约 223行)

  1. // 检测字段
  2. if (!empty($this->field)) {
  3. foreach ($data as $key => $val) {
  4. if (!in_array($key, $this->field)) {
  5. unset($data[$key]);
  6. }
  7. }
  8. }

我们需要改为$this->data,为什么?仔细研究一下save方法你就知道啦!

  1. // 检测字段
  2. if (!empty($this->field)) {
  3. foreach ($this->data as $key => $val) {
  4. if (!in_array($key, $this->field)) {
  5. unset($this->data[$key]);
  6. }
  7. }
  8. }
 

给ThinkPHP5增加验证码功能的更多相关文章

  1. cas sso单点登录系列5_cas单点登录增加验证码功能完整步骤

    转:http://blog.csdn.net/ae6623/article/details/8919718 本篇教程cas-server端下载地址:解压后,直接放到tomcat的webapp目录下就能 ...

  2. SSO单点登录系列5:cas单点登录增加验证码功能完整步骤

    本篇教程cas-server端下载地址:解压后,直接放到tomcat的webapp目录下就能用了,不过你需要登录的话,要修改数据源,C:\tomcat7\webapps\casServer\WEB-I ...

  3. JEECG--去掉(增加)登陆页面验证码功能 - CSDN博客

    JEECG--去掉(增加)登陆页面验证码功能 - CSDN博客https://blog.csdn.net/KooKing_L/article/details/79711379

  4. TODO:Laravel增加验证码

    TODO:Laravel增加验证码1. 先聊聊验证码是什么,有什么作用?验证码(CAPTCHA)是"Completely Automated Public Turing test to te ...

  5. dd——留言板再加验证码功能

    1.找到后台-核心-频道模型-自定义表单 2.然后点击增加新的自定义表单 diyid 这个,不管他,默认就好 自定义表单名称 这个的话,比如你要加个留言板还是投诉建议?写上去呗 数据表  这个不要碰, ...

  6. web系统登陆页面增加验证码

    传统登陆页面中包含两个输入项: • 用户名 • 密码有时为了防止机器人进行自动登陆操作,或者防止恶意用户进行用户信息扫描,需增加动态验证码功能.此时,登陆页面中包含了三个输入项: • 用户名 • 密码 ...

  7. 使用JS来实现验证码功能

    最近想为自己的Django博客添加验证码功能,本来想使用第三方库来实现的,不过考虑到添加第三方库对性能的影响,以及第三方库是否安全可靠的问题,还是用自己的代码来实现吧.反正用JS来实现验证码功能又不是 ...

  8. 纯JS实现图片验证码功能并兼容IE6-8

    最近要搞一个图片验证码功能,但是又不想自己写后台代码.于是自己准备搞一个纯前端的验证码功能,于是网上搜索了一下,找到一个插件gVerify.js,简单好用,实现完美.不过后面接到说要兼容IE8,想想也 ...

  9. 一步一步实现web程序信息管理系统之三----登陆业务逻辑实现(验证码功能+参数获取)

    本篇紧接着上一篇文章[一步一步实现web程序信息管理系统之二----后台框架实现跳转登陆页面] 验证码功能 一般验证码功能实现方式为,前端界面访问一个url请求,后端服务代码生成一个图片流返回至浏览器 ...

随机推荐

  1. 运维必备:Oracle自备份精简教程(linux及win)

    Oracle在linux环境下的自动备份 1.自动导出及历史文件删除脚本 su - oracle<<EOF cd /db_backup/databak mv orabak*.* /db_b ...

  2. asp.net html table to DataTable

    添加引用 http://htmlagilitypack.codeplex.com/downloads/get/437941 protected void Export(string content,s ...

  3. Inno Setup入门(二十二)——Inno Setup类参考(8)

    : Install Setup 2013-02-02 11:31 477人阅读 评论(0) 收藏 举报 列表框 列表框(ListBox)是Windows应用程序中重要的输入手段,其中包括多个选项用户可 ...

  4. 转:12C CDB and pdb with sql developer

    How to install the 12c DB and use the Pluggable DB with SQL DeveloperGoal To give a path to install ...

  5. st-Spanning Tree

    st-Spanning Tree time limit per test 4 seconds memory limit per test 256 megabytes input standard in ...

  6. OpenGL---------BMP文件格式

    计算机保存图象的方法通常有两种:一是“矢量图”,一是“像素图”.矢量图保存了图象中每一几何物体的位置.形状.大小等信息,在显示图象时,根据这些信息计算得到完整的图象.“像素图”是将完整的图象纵横分为若 ...

  7. CodeForces 429B Working out 动态规划

    Description Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to loo ...

  8. scrollview上面的图片不上下滑动

    self.automaticallyAdjustsScrollViewInsets= NO;

  9. UITableView的子控件高度不确定处理

    比如,tableView的tableFootView的控件数量是根据网络请求的数据而定的.那么tableView并不能准确的设置其contentSize.处理方法: 在tableFootView的类中 ...

  10. IE 和 FF 写不同的CSS

    .FireFox 下如何使连续长字段自动换行 众所周知IE中直接使用word-wrap:break-word 就可以了, FF中我们使用JS插入的技巧来解决 <style type=" ...