<?php /** *这是一个验证码的logic */ namespace Wechat\Logic; class ValidateCodeLogic extends CommonLogic { 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';//注意字体路径要写对,否则显示不了图片 } //生成随机码 public function createCode() { $_len = strlen($this->charset)-1; for ($i=0;$i<$this->codelen;$i++) { $this->code .= $this->charset[mt_rand(0,$_len)]; } // dump('1'.); } //生成背景 public 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); } //生成文字 public 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]); //dump( 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])); } } //生成线条、雪花 public 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); } } //输出 public 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); } }
然后我们要在控制器里引用这个
public function createcode(){ $ValidateCodeLogic = D('ValidateCode','Logic'); $ValidateCodeLogic -> doimg(); $code = $ValidateCodeLogic -> getCode(); session('code',$code); }
这样我们可以得到这个随机码 并且把它存在一个session里
最后 我们要让这个验证码显示到页面上
<img title="点击刷新" src="{:U('Book/createcode')}" align="absbottom"></img>
当然 我们可以加上一个js 让我们可以点击这个验证码时可以切换它 于是变成了这样
<img title="点击刷新" src="{:U('Book/createcode')}" align="absbottom" onclick="this.src='{:U('Book/createcode')}'+Math.random();"></img>