就在这几天,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. nefu 72 N!

    Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in one line, ...

  2. Django: 之用户注册、缓存和静态网页

    Django 用户注册系统 Django 的源码中已经有登录,退出,重设密码等相关的视图函数,在下面这个app中 django.contrib.auth 可以点击对应的版本查看相关源代码:1.9  1 ...

  3. JAVA EE 运行环境配置(包含JAVA SE)

    JAVA EE 运行环境配置(包含JAVA SE) 1.下载并安装jre-7u7-windows-i586.exe (最新的JAVA运行环境) 2.下载并安装java_ee_sdk-6u4-jdk7- ...

  4. 批量删除实现js+springmvc

    前台的控件 <input type='checkbox' name='isSelect' value='"+data[i].id+"' ></input>& ...

  5. centos 6.5常见lib库安装

    在CentOS安装软件的时候,可能缺少一部分支持库,而报错.这里首先安装系统常用的支持库.那么在安装的时候就会减少很多的错误的出现. # yum install -y gcc gdb strace g ...

  6. Django CRM学员系统项目

    项目需求: 1.分讲师\学员\课程顾问角色,2.学员可以属于多个班级,学员成绩按课程分别统计3.每个班级至少包含一个或多个讲师4.一个学员要有状态转化的过程 ,比如未报名前,报名后,毕业老学员5.客户 ...

  7. 使用SQL Server Management Studio 创建作业备份数据库

    在项目中,经常需要备份数据库,如果能做到只需点个按钮(“开始备份数据库”按钮),然后什么都不管,数据库就自动备份好了,或者服务器上的数据库隔一段时间自动备份一次,那该多好啊. Sql server 的 ...

  8. String s = new String("aa") 创建了几个对象?

    1 最近几个同学面试的时候出现了这样一个问题 刚听到这个题目的时候的确是不知所措: 经过网上的查找和自己的理解来解释一下这个题目的答案 答案是: 为什么呢??? 1 实现我们都知道创建实例有两种方法 ...

  9. Gym 100917C Constant Ratio 数论+暴力

    题目: Description standard input/outputStatements Given an integer n, find out number of ways to repre ...

  10. [原]界面上有几个球队名字的列表,将鼠标放到球队名字上就变为红色背景,其他球队背景颜色为白色,点击一个球队的时候就将点击的球队变为fontSize=30字体(fontSize=‘’回到默认)。

    window.onload = function () {             var uls = document.getElementById('ui').getElementsByTagNa ...