Imitating the effect of 12306 railway customer service center login verification code


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>铁路客服服务中心</title>
    <link rel="icon" type="image/x-icon" href="http://www.12306.cn/mormhweb/images/favicon.ico">
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        .clk-img{
            position: absolute;
            width: 24px !important;
            height: 24px !important;
            z-index: 999;
        }
        #caption-div{
            position: relative;
            margin: 9px auto;
            width: 450px;
            border:3px solid #E3E1DE;
            text-align: center;
        }
        .caption-img{
            display: inline-block;
            cursor: pointer;
            margin: 3px;
            padding: 0;
            -webkit-user-select: none;
        }
        .caption-img img{ 
            height: 100px;
            width: 100px;
        }
        .all{
            font-weight: bold;
            color: red;
        }
        .caption-name{
            font-family: 'LiSu';
            font-size: 20px;
        }
        #remark{
            width: 440px;
            margin: 8px;
            border-top: 2px solid #E3E1DE;
        }
        #refresh{
            background: white;
            cursor: pointer;
            margin-top: 10px;
        }
        button{
            margin: 10px;
            width: 50px;
            height: 30px;
        }
    </style>
</head>
<body>
    <div id="caption-div">
        <h1>仿12306铁路网站验证码效果</h1>
        <?php
            $conn = mysql_connect('127.0.0.1','root','') or die('Error!');
            mysql_select_db('test',$conn);
            mysql_query('set names utf8');
            $sql1 = "select count(0) count from `captcha`";
            $resource1 = mysql_query($sql1);
            $row1 = mysql_fetch_assoc($resource1);
            for ($i=0; $i < 8; $i++) { 
                $rand_array = range(1,$row1['count']);
                $rand = $rand_array[array_rand($rand_array)];
                $sql2 = 'SELECT 
                        * 
                    FROM 
                        `captcha` 
                    WHERE
                        `id` = '.$rand.'
                    LIMIT 1';
                $resource2 = mysql_query($sql2);
                $row = mysql_fetch_assoc($resource2);
                $captcha_arr[] = $row;
                $captcha_name_arr[] = $row['name'];
            }
            $caption_name = $captcha_name_arr[array_rand($captcha_name_arr)];//产生验证码的值
            echo "<script>localStorage.removeItem('captcha_no');var captcha_no;</script>";//清除本地存储的数据
            if(is_array($captcha_arr)){
                foreach ($captcha_arr as $key => $value) {
                    if($caption_name == $value['name']){
                        echo "<script>
                            captcha_no = localStorage.getItem('captcha_no');
                            captcha_no = captcha_no ? captcha_no : '';
                            captcha_no += ".$key.";
                            localStorage.setItem('captcha_no',captcha_no);
                          </script>";//存储到本地
                    }
                    echo '<div class="caption-img"><img src="'.$value['url'].'" alt="'.$value['name'].'" data-no="'.$key.'" /></div>';
                }
            }
        ?>
        <div id="remark">
            请点击上图中<span class="all">所有的</span><span class="caption-name"><?php echo $caption_name;?></span>
            <img id="refresh" src="refresh.jpg" height="21" width="21" alt="刷新" />
        </div>
        <button id="submit">提交</button><span id="tip"></span>
    </div>
 
    
</body>
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script>    
    //为数组原型链增加一个判断2个数组的是否相等的方法
    //第一个参数为待比较的数组,第二个参数为是否采用严格模式,true表示采用严格模式,即元素数值和格式均需相等,false只需元素数值相等即可
    Array.prototype.equals = function (array,is_strict = false) {
        if (!array) return false;
        if (this.length != array.length) return false;
        for (var i = 0, l = this.length; i < l; i++) {
            if (this[i] instanceof Array && array[i] instanceof Array) {
                if (!this[i].equals(array[i])) return false;       
            }  
            if(is_strict){
                if (this[i] !== array[i]) return false;
            }else{
                if (this[i] != array[i]) return false;
            }    
        }       
        return true;
    }
 
    //例子
    // var a = [1];
    // var b = ["1"];
    // console.log(a.equals(b)) //true
    // console.log(a.equals(b,true))  //false
 
    $(function(){
        var captcha = {
            /*
             * 初始化页面
             */
            onInit: function() {
                // 页面数据初始化
                var clicked_no;
                this.captchaPictureBindClick();
                this.refreshBindClick();
                this.submitBindClick();
            },
 
            /**
             * 验证码图片绑定点击事件
             */
            captchaPictureBindClick: function(){
                localStorage.removeItem('clicked_no');
                $('.caption-img>img').click(function(e){
                    var x = e.clientX - $('#caption-div').offset().left - 12;
                    var y = e.clientY - $('#caption-div').offset().top - 12;
                    var data_no = $(this).data('no');
                    $(this).parent().prepend('<img class="clk-img" src="clk-img.jpg" alt="" style="top:'+ y +'px;left:'+ x +'px;"/>');//添加小图标
                    if(!$(this).hasClass('clicked')){ //未点击
                        clicked_no = localStorage.getItem('clicked_no') || '';
                        clicked_no += data_no;//拼接选中图片的索引值
                        localStorage.setItem('clicked_no',clicked_no);//写入图标编号
                        $(this).addClass('clicked'); //已点击状态,再次点击无效
                    }
                    
                    $('.clk-img').off().click(function(e){//点击图标消失
                        localStorage.setItem('clicked_no',localStorage.getItem('clicked_no').replace($(this).siblings('img').data('no'), ''));//删掉对应的图片索引值
                        var siblings_length = $(this).siblings('.clk-img').length;
                        if(!siblings_length){
                            $(this).siblings('img').removeClass('clicked');//恢复可点击有效状态
                        }
                        $(this).remove();//该图标删除
 
                    })
                });
            },
 
            /**
             * 刷新按钮绑定点击事件
             */
            refreshBindClick: function(){
                $('#refresh').click(function(){
                    location.reload();
                })
            },
 
            /**
             * 提交按钮绑定点击事件
             */
            submitBindClick: function(){
                $('#submit').click(function(){
                    captcha_no_arr = captcha_no.split('');//对默认的索引字符串拆分成数组
                    clicked_no_arr = localStorage.getItem('clicked_no').split('');//对选中的图片索引字符串拆分成数组
                    clicked_no_arr.sort();//对数组进行升序排序
                    if(captcha_no_arr.equals(clicked_no_arr)){//比较两个数组是否一样
                        $('#tip').html('恭喜!验证通过……');
                        setTimeout(function(){
                            location.href = 'http://www.12306.cn';
                        }, 1500);
                    }else{
                        $('#tip').html('请点击正确的验证码');
                    }
                })
            }
        }
 
        captcha.onInit();
    })
</script>
</html>

DROP TABLE IF EXISTS `captcha`;
CREATE TABLE `captcha` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `url` varchar(100) CHARACTER SET utf8 NOT NULL,
  `name` varchar(100) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1;
 
 
-- ----------------------------
-- Records of captcha
-- ----------------------------
INSERT INTO `captcha` VALUES ('1', '1.jpg', '猕猴桃');
INSERT INTO `captcha` VALUES ('2', '2.jpg', '草莓');
INSERT INTO `captcha` VALUES ('3', '3.jpg', '芒果');
INSERT INTO `captcha` VALUES ('4', '4.jpg', '苹果');
INSERT INTO `captcha` VALUES ('5', '5.jpg', '橙子');
INSERT INTO `captcha` VALUES ('6', '6.jpg', '车厘子');
INSERT INTO `captcha` VALUES ('7', '7.jpg', '杨桃');
INSERT INTO `captcha` VALUES ('8', '8.jpg', '水蜜桃');
INSERT INTO `captcha` VALUES ('9', '9.jpg', '菠萝');
INSERT INTO `captcha` VALUES ('10', '10.jpg', '红毛丹');
INSERT INTO `captcha` VALUES ('11', '11.jpg', '石榴');
INSERT INTO `captcha` VALUES ('12', '12.jpg', '提子');
INSERT INTO `captcha` VALUES ('13', '13.jpg', '西瓜');

Effect screenshot:

 

Guess you like

Origin blog.csdn.net/zhangge3663/article/details/108485655