zoukankan      html  css  js  c++  java
  • CI框架中,扩展验证码类。

    使用CI框架的朋友,应该都知道CI框架的的验证码辅助函数,不太好用。它需要写入到数据库中,然后再进行比对。

    大家在实际项目中,好像不会这样去使用,因为会对数据库造成一定的压力。

    所以,我们还是利用session来临时存储验证码,比较的稳妥。

    下面附上验证码类的代码。这个类是放在libraries这个库文件夹下。

    <?php
    
    /**
     * 验证码类
     */
    
    class Code{
        //资源
        private $img;
        //画布宽度
        public $width = 150;
        //画布高度
        public $height = 45;
        //背景颜色
        public $bgColor = "#ffffff";
        //验证码
        public $code;
        //验证码的随机种子
        public $codeStr = "123456789abcdefghijklmnpqrstuvwsyz";
        //验证码长度
        public $codeLen = 4;
        //验证码字体
        public $font = "";//具体环境具体需要更改路径
        //验证码字体大小
        public $fontSize = 22;
        //验证码字体颜色
        public $fontColor = "";
    
        /**
         * 构造函数
         */
        public function __construct($arr = array()) {
    
            $width = '';
            $height = '';
            $codeLen = '';
            $fontSize = '';
            $bgColor = '';
            $fontColor = '';
    
            if(!empty($arr)){
               extract($arr); 
            } 
            $this->font = BASEPATH . "fonts/font.ttf";       
            if (!is_file($this->font)) {
                error("验证码字体文件不存在");
            }
            $this->width = empty($width) ? $this->width : $width;
            $this->height = empty($height) ? $this->height : $height;
            $this->bgColor = empty($bgColor) ? $this->bgColor : $bgColor;
            $this->codeLen = empty($codeLen) ? $this->codeLen : $codeLen;
            $this->fontSize = empty($fontSize) ? $this->fontSize : $fontSize;
            $this->fontColor = empty($fontColor) ? $this->fontColor : $fontColor;
            $this->create();//生成验证码
        }
    
        /**
         * 生成验证码
         */
        private function createCode() {
            $code = '';
            for ($i = 0; $i < $this->codeLen; $i++) {
                $code .= $this->codeStr [mt_rand(0, strlen($this->codeStr) - 1)];
            }
            $this->code = strtoupper($code);
            if(!isset($_SESSION)){
                session_start();
            }
            $_SESSION ['code'] = $this->code;
        }
    
        /**
         * 返回验证码
         */
        public function getCode() {
            return $this->code;
        }
    
        /**
         * 建画布
         */
        public function create() {
            if (!$this->checkGD())
                return false;
            $w = $this->width;
            $h = $this->height;
            $bgColor = $this->bgColor;
            $img = imagecreatetruecolor($w, $h);
            $bgColor = imagecolorallocate($img, hexdec(substr($bgColor, 1, 2)), hexdec(substr($bgColor, 3, 2)), hexdec(substr($bgColor, 5, 2)));
            imagefill($img, 0, 0, $bgColor);
            $this->img = $img;
            $this->createLine();
            $this->createFont();
            $this->createPix();
            $this->createRec();
        }
        /**
        *  画线
        */
        private function createLine(){
            $w = $this->width;
            $h = $this->height;
            $line_height = $h/10;
            $line_color = "#D0D0D0";
            $color = imagecolorallocate($this->img, hexdec(substr($line_color, 1, 2)), hexdec(substr($line_color, 3, 2)), hexdec(substr($line_color, 5, 2)));
            for($i=0;$i<10;$i++){
                $step =$line_height*$i+2;
                imageline($this->img, 0, $step, $w,$step, $color);
            }
            $line_width = $w/10;
            for($i=0;$i<10;$i++){
                $step =$line_width*$i+2;
                imageline($this->img, $step-2, 0, $step+2,$h, $color);
            }
        }
        /**
         * 画矩形边框
         */
        private function createRec() {
            imagerectangle($this->img, 0, 0, $this->width - 1, $this->height - 1, $this->fontColor);
        }
    
        /**
         * 写入验证码文字
         */
        private function createFont() {
            $this->createCode();
            $color = $this->fontColor;
            if (!empty($color)) {
                $fontColor = imagecolorallocate($this->img, hexdec(substr($color, 1, 2)), hexdec(substr($color, 3, 2)), hexdec(substr($color, 5, 2)));
            }
            $x = ($this->width - 10) / $this->codeLen;
            for ($i = 0; $i < $this->codeLen; $i++) {
                if (empty($color)) {
                    $fontColor = imagecolorallocate($this->img, mt_rand(50, 155), mt_rand(50, 155), mt_rand(50, 155));
                }
                imagettftext($this->img, $this->fontSize, mt_rand(- 30, 30), $x * $i + mt_rand(6, 10), mt_rand($this->height / 1.3, $this->height - 5), $fontColor, $this->font, $this->code [$i]);
            }
            $this->fontColor = $fontColor;
        }
    
        /**
         * 画线
         */
        private function createPix() {
            $pix_color = $this->fontColor;
            for ($i = 0; $i < 50; $i++) {
                imagesetpixel($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), $pix_color);
            }
    
            for ($i = 0; $i < 2; $i++) {
                imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $pix_color);
            }
            //画圆弧
            for ($i = 0; $i < 1; $i++) {
                // 设置画线宽度
               // imagesetthickness($this->img, mt_rand(1, 3));
                imagearc($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height)
                        , mt_rand(0, 160), mt_rand(0, 200), $pix_color);
            }
            imagesetthickness($this->img, 1);
        }
    
        /**
         * 显示验证码
         */
        public function show() {
            header("Content-type:image/png");
            imagepng($this->img);
            imagedestroy($this->img);
            exit;
        }
    
        /**
         * 验证GD库是不否打开imagepng函数是否可用
         */
        private function checkGD() {
            return extension_loaded('gd') && function_exists("imagepng");
        }
    }
    

      然后再控制器中调用就可以了。

    最后,提醒大家记得开启在自动加载文件中session哦。

  • 相关阅读:
    linux性能监控 -CPU、Memory、IO、Network等指标的讲解
    Linux中ctrl+z 、ctrl+c、 ctrl+d区别
    linux下程序启动后后台运行实现
    最近纠结致死的一个java报错java.net.SocketException: Connection reset 终于得到解决
    【Unity笔记】将角色的碰撞体朝向鼠标点击方向——角色朝向鼠标
    【Unity笔记】碰撞器(Collision)与触发器(Trigger)的区别
    【Unity笔记】鼠标射线由指定层接收
    【Unity笔记】Awake()和Start()的区别
    【Unity笔记】第三人称相机跟随
    【Unity笔记】经典的鼠标点击射线检测碰撞
  • 原文地址:https://www.cnblogs.com/yxhblogs/p/6538541.html
Copyright © 2011-2022 走看看