# 验证码插件制作演示
## 涉及技术点
* 控制器
* 模板
* 第三方类库
* URL调用
<div class="simditor-body" contenteditable="true"><p>开发插件请开启你的网站调试. 如果你不开启则不会显示你的更改内容,你需要手动清理论坛缓存! </p><p><strong style="color: rgb(34, 34, 34);">开启方式: 管理员后台 - 全局设置 - 调试相关 - 开启DEBUG模式 打上勾 保存配置!</strong><br></p><p>按照惯例 来到插件后台 新建插件</p><p><b>后台 - 插件 - 点击制作插件按钮 - 弹出对话框</b></p><p><b>插件名 : 你所制作的插件名称</b></p><p><b>英文名 : <u>你的插件英文名</u>, 必须保持英文, 可以使用下划线以及一些支持路劲的符号</b></p><p><b>插件FA图标 : <a href="http://fontawesome.io/icons/">http://fontawesome.io/icons/</a> 从此处选择一个图标名称输入!</b></p><p><b>如果你的插件不需要配置表单参数 , 就不需要勾选</b></p><p><b>如果你的插件不需要安装函数 (也就是 插件可以在安装的时候执行PHP命令 )</b></p><p><b>此处默认两处不勾选,因为 此文插件无需用到</b></p><p><b>填写完毕 执行即可</b></p><p><img alt="QQ截图20160515190838.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/dc7a871059568931d3ae1d4f65717b75.jpg"><br></p><p><img alt="QQ截图20160515191432.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/bab6954a59e65fe9777efec44f4f8142.jpg"><br></p><p><b>插件新建成功, 会告诉你插件的绝对路劲</b></p><p><b>返回上一页 回到插件页面</b></p><p><b><img alt="QQ截图20160515191547.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/f9242c93837d1c017f79eaa2744f4284.jpg"><br></b></p><p><b>找到你的插件 , 开启你的插件, 默认是 禁用的!</b></p><p><b><img alt="QQ截图20160515191551.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/c17653c2b82b3d69c5724003facfac12.jpg"></b><br></p><hr><p>新建插件到一段落了</p><hr><h1>开始制作插件</h1><hr><p>本文是开发 验证码, 所以作者本人就从网上找现成的验证码程序了!</p><hr><p>寻找中...</p><hr><p><img alt="201308061003582.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/3a7ca0782fbc2780dff741add5c82535.jpg"><br></p><p>找到了这款 . </p><p>看一下这款验证码的代码 : </p><pre data-lang="php">//验证码类
class ValidateCode {
private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';//随机因子
private $code;//验证码
private $codelen = 4;//验证码长度
private $width = 130;//宽度
private $height = 50;//高度
private $img;//图形资源句柄
private $font;//指定的字体
private $fontsize = 20;//指定字体大小
private $fontcolor;//指定字体颜色
//构造方法初始化
public function __construct() {
$this->font = dirname(__FILE__).'/font/elephant.ttf';//注意字体路径要写对,否则显示不了图片
}
//生成随机码
private function createCode() {
$_len = strlen($this->charset)-1;
for ($i=0;$i<$this->codelen;$i++) {
$this->code .= $this->charset[mt_rand(0,$_len)];
}
}
//生成背景
private function createBg() {
$this->img = imagecreatetruecolor($this->width, $this->height);
$color = imagecolorallocate($this->img, mt_rand(157,255), mt_rand(157,255), mt_rand(157,255));
imagefilledrectangle($this->img,0,$this->height,$this->width,0,$color);
}
//生成文字
private function createFont() {
$_x = $this->width / $this->codelen;
for ($i=0;$i<$this->codelen;$i++) {
$this->fontcolor = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));
imagettftext($this->img,$this->fontsize,mt_rand(-30,30),$_x*$i+mt_rand(1,5),$this->height / 1.4,$this->fontcolor,$this->font,$this->code[$i]);
}
}
//生成线条、雪花
private function createLine() {
//线条
for ($i=0;$i<6;$i++) {
$color = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));
imageline($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$color);
}
//雪花
for ($i=0;$i<100;$i++) {
$color = imagecolorallocate($this->img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
imagestring($this->img,mt_rand(1,5),mt_rand(0,$this->width),mt_rand(0,$this->height),'*',$color);
}
}
//输出
private function outPut() {
header('Content-type:image/png');
imagepng($this->img);
imagedestroy($this->img);
}
//对外生成
public function doimg() {
$this->createBg();
$this->createCode();
$this->createLine();
$this->createFont();
$this->outPut();
}
//获取验证码
public function getCode() {
return strtolower($this->code);
}
}<br></pre><p>类方法中都注释了中文</p><p>代码里有两点需要关注, </p><p>1. $charset 随机因子 , 就是验证码会出现的字符</p><p>2. $this->font 验证码字体</p><p>看看验证码程序压缩包里的文件</p><p><img alt="QQ截图20160515192229.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/d6375a65ae57fdf44404bcdb6be0fb56.jpg"><br></p><p>font 就是字体</p><p>而captcha.php 就是演示验证码使用的代码</p><p>而sessionValidate.php 就是上面贴的代码类库</p><p>好了 我们来到我们新建的插件目录 .</p><p>论坛根目录\Plugin\hy_codes<br></p><p>hy_codes 是我们刚才新建的插件 (英文名 就是 目录名)</p><hr><p>我们将<b>sessionValidate.php</b>和<b>font</b>目录复制到插件目录</p><p><img alt="QQ截图20160515192528.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/1a64b3363fee817675fb830d3fe2b6dd.jpg"><br></p><p><br></p><h1>正题来了</h1><hr><p>我们如何在登录与注册页面插入这个验证码图片呢?</p><p>首先我们来到 登录与注册的模板</p><p>/View 目录 是论坛的模板目录</p><p>/View/hy_user 是论坛默认的用户模板目录</p><p>/View/hy_user/user_login.html 登录页面模板 </p><p>打开这个文件.</p><p><img alt="QQ截图20160515193637.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/9b24f6be986f4f7618269aa770d183b3.jpg"><br></p><p>我们是想把验证码插入 密码下面,</p><p>那么我们复制这个hook名</p><p>t_user_login_2 我们在插件目录新建文件 t_user_login_2.hook </p><p><img alt="QQ截图20160515193851.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/e13b01835c948fae070c0f802052d22e.jpg"><br></p><p>在该文件写入 11111111 保存后 看看网站登录页面如何 !</p><p><img alt="QQ截图20160515194235.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/f3f10d494c4c413da8790908974dfdac.jpg"><br></p><p>登录页面显示了我们插件文件内的内容</p><p>那么我们就需要在这里显示我们的验证码了</p><p>但我们的验证码程序是PHP脚本, 而我们的插入点是 是HTML 用不了的说. 咋办咧? </p><p>那我们在能执行PHP的地方插入我们的验证码类库 从而HTML去加载这个PHP 链接显示验证码</p><p>打开文件 /Action/User.php 拉倒文件底部</p><p><img alt="QQ截图20160515194433.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/f61ee33b88613e83ae53738bab3fd143.jpg"><br></p><p>a_user_fun, 按照上面的一样 插件目录新建一个 a_user_fun.hook<br></p><h1>开始输出我们的验证码</h1><hr><p><span style="color: rgb(51, 51, 51); font-size: 16px;"> </span><span style="color: rgb(51, 51, 51); font-size: 16px;">a_user_fun.hook写入内容</span><br></p><pre data-lang="php">public function show_codes(){
//加载 验证码类库
include PLUGIN_PATH . 'hy_codes/sessionValidate.php';
//new 验证码类
$codes = new ValidateCode();
//输出验证码<br> $codes->doimg();
//获取本次验证码的值
$codes->getCode();
} <br></pre><p>可见我们定义了一个函数 show_codes() 他是属于user控制器</p><p>所以他的链接就成了 </p><p>xxx.com/user/show_codes</p><p>我们访问我们的函数</p><p><img alt="QQ截图20160515195144.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/2d1c5bd4cf344b6d6970b64299b2259b.jpg"><br></p><p>提示错误 意思是说 Action空间没有 验证码类</p><p>就是我们的New 出问题了</p><p>我们打开验证码类库</p><p><img alt="QQ截图20160515195317.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/bacb2244cd7ca869e55e92af97cf4dd8.jpg"><br></p><p>为类库增加一个命名空间组</p><p>namespace Plugin;</p><p>然后我们的<span style="color: rgb(51, 51, 51); font-size: 16px;"> </span><span style="color: rgb(51, 51, 51); font-size: 16px;">a_user_fun.hook 内容改为</span></p><pre data-lang="php">public function show_codes(){
include PLUGIN_PATH . 'hy_codes/sessionValidate.php';
$codes = new \Plugin\ValidateCode();
$codes->doimg();
$codes->getCode();
}<br></pre><p>$codes = new \Plugin\ValidateCode();<br></p><p>再次访问</p><p><a href="http://127.0.0.1/user/show_codes">http://127.0.0.1/user/show_codes</a><br></p><p><img alt="QQ截图20160515195503.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/da7bbbac1ae1bff6ac80bef0c26ed751.jpg"><br></p><p>可见验证码输出咯</p><p>然后我们的t_user_login_2.hook文件 就是刚才输入 111111111的地方 改为<br></p><pre data-lang="html"><img src="{#WWW}user{#EXP}show_codes"><br></pre><p>可见代码使用了img标签 显示了 我们的验证码图片地址</p><p>{#WWW} 则等于我们的网站链接 <a href="http://127.0.0.1/">http://127.0.0.1/</a> </p><p>{#EXP} 则是我们程序的分割符号 / , 因为有的用户吧 /改为了 - 之类的符号 我们不能直接 /user/show_codes 这样不正确滴!</p><p><br></p><hr><p>再看下登录页面</p><p><img alt="QQ截图20160515195810.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/0ec9e3ffc4b49489f4ab33e6367078bb.jpg"><br></p><p>显示了我们的验证码 ,我们再改下t_user_login_2.hook 内容 让验证码可以点击 刷新!</p><pre data-lang="html"><img src="{#WWW}user{#EXP}show_codes" onclick="this.src='{#WWW}user{#EXP}show_codes?time='+new Date()"><br></pre><p>可见内容</p><p>onclick="this.src='{#WWW}user{#EXP}show_codes?time='+new Date()"<br></p><p>点击后 img的src = 我们的验证码图片地址 后面加的参数 time + Date 是为了 防止浏览器使用该缓存图片! </p><p>这样 图片就可以点击刷新验证码了!</p><p><br></p><hr><p>突然发现没有验证码输入框呢 </p><p>这样就行鸟? 不行. 我们还要在 登陆提交的时候 检查用户输入的验证码是否正确呢!</p><p>再次打开我们的</p><p>a_user_fun.hook 我们需要将验证码的值储存到session<br></p><pre data-lang="php">public function show_codes(){
session_start();
include PLUGIN_PATH . 'hy_codes/sessionValidate.php';
$codes = new \Plugin\ValidateCode();
$codes->doimg();
$code = $codes->getCode();
$_SESSION['hy_codes'] = $code;
}<br></pre><p>可见我们增加了session_start 启动session储存</p><p>$_SESSION['hy_codes'] = $code; 将验证码值储存到session里<br></p><p><br></p><h1>提交验证</h1><hr><p>找到登录账号提交入口</p><p>/Action/User.php </p><p><img alt="QQ截图20160515201158.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/32f05570e7cc6c1ba0c81eb980723486.jpg"><br></p><p>IS_POST下就是提交登录</p><p>而上面的IS_GET 是访问登录模板</p><p>得到下面的插入点</p><p>a_user_login_3</p><p>和上面一样在插件目录新建 a_user_login_3.hook 输入内容</p><pre data-lang="php">session_start();
//判断是否已经设置该数组
if(!isset($_SESSION['hy_codes']))
return $this->message('请刷新验证码');
$hy_codes = $_SESSION['hy_codes'];
//获取用户提交过来的验证码值
$input_code = X("post.code");
//验证码开始判断咯
if($hy_codes != $input_code)
return $this->message('验证码错误!');
//验证成功后 关闭session
session_destroy();<br></pre><p>,这时候我们正式使用一下吧</p><p><img alt="QQ截图20160515202022.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/a29b93cc93e3685af36580734d43b55f.jpg"><br></p><p>输入错误验证码提交后 提示验证码错误</p><p>那我们输入正确的提交一下</p><p><img alt="QQ截图20160515202102.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/e4407087575c28b099a4f4017ba22858.jpg"></p><p><img alt="QQ截图20160515202118.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/1e0f19b11c40c1c63f4feaf39f4d9d36.jpg"><br></p><p>登录成功咯!</p><p>这样就做完咯</p><h1>突然发现注册账号没做</h1><hr><p>其实做了登录 , 而注册也是一样的过程啦 不讲了</p><p><br></p><p><br></p><p><b>附件已上传, 也包含了注册页面的验证码</b></p></div>
http://bbs.hyyyp.com/t/159.html 附件下载
- HYBBS
- 论坛公用函数
- 板块相关函数
- 板块版主判断
- 板块用户组权限
- 获取指定板块信息
- 插件相关函数
- 获取插件配置数据
- 获取插件安装状态
- 获取插件是否支持安装函数
- 判断插件是否存在
- 判断插件是否已开启
- 删除目录
- 下载远程文件
- 两时间相隔天数
- 时间间隔
- 随机字符
- 清空论坛缓存函数
- 测试时间过程耗时
- 文件数据缓存
- 获取网站后台参数配置
- 论坛常量宏
- 论坛变量
- 数据库字段介绍
- 论坛Model模型
- File文件模型
- 获取文件信息
- 判断文件所属者
- 获取文件原名称
- Fileinfo附件信息模型
- Forum板块分类模型
- 修改板块整数数据
- 获取某板块数据
- 获取所有板块数据
- 板块数据实例化
- Post评论模型
- 获取评论数据
- 删除某主题下所有评论
- 删除评论数据
- Thread主题帖子模型
- 获取文章数据
- 获取文章标题
- 删除文章主题
- 更新主题整数数据
- 获取主题列表
- 搜索主题
- 主题列表实例化
- 判断用户是否回复过该主题
- User用户系统模型
- 获取用户数据
- 用户名获取用户数据
- 邮箱名获取用户数据
- 判断是否存在该UID用户
- 判断是否存在该用户名
- 判断是否存在该邮箱名
- 添加用户数据
- UID转用户名
- 用户名转UID
- 更新用户整数数据
- 获取用户头像HTTP路劲
- 获取用户金币
- 获取用户积分
- 修改用户用户组
- 获取粉丝数量
- 获取关注数量
- 获取用户所在用户组ID
- Usergroup用户组模型
- 用户组ID获取用户组名
- 用户组数据排序
- Friend关注粉丝模型
- 获取两个用户之间的关系
- 设置解除关注状态
- 添加关注
- 删除关注
- 获取私信未读数量
- Chat 聊天系统
- send 发送消息
- sys_send 发送系统消息
- 论坛Action控制器
- 论坛数据缓存
- 插件开发
- 插件介绍
- 图形验证码插件制作
- 中文PHP API
