月度归档:2020年10月

mysql:Windows修改MySQL数据库密码(修改或忘记密码)

今天练习远程访问数据库时,为了方便访问,就想着把数据库密码改为统一的,以后我们也会经常遇到MySQL需要修改密码的情况,比如密码太简单、忘记密码等等。在这里我就借鉴其他人的方法总结几种修改MySQL密码的方法。

我就以实际操作修改root密码为例,操作系统为windows
这里我们需要注意的是,修改MySQL是需要MySQL中的root权限,一般用户是无法更改的,除非请求管理员。

修改密码的三种简单方法

第一种​用SET PASSWORD命令

1.打开cmd进入MySQL的bin目录;(如我的路径是F:\MySQL\mysql-5.7.24-winx64\bin)

2.通过输入命令 mysql -u root -p 指定root用户登录MySQL,输入后回车会提示输入密码,输入我们原来的密码然后回车。

3.修改MySQL的root用户密码,格式:mysql> set password for 用户名@localhost = password(‘新密码’);
例如(上面例子将用户root的密码更改为root):mysql> set password for root@localhost = password(‘root’);

4.退出mysql重新登录,输入新密码root登录就可以了;
在这里插入图片描述

第二种 用mysqladmin修改密码

1.打开cmd进入MySQL的bin目录;(如我的路径是F:\MySQL\mysql-5.7.24-winx64\bin)

2.修改MySQL的root用户密码格式:mysqladmin -u用户名 -p旧密码; password 新密码
例如(第一种方法中我将密码改成了root,这里再改回123):
mysqladmin -uroot -proot password 123(这里一定要注意-uroot和 -proot是整体,不要写成-u root -p root,我亲自验证过他们直接加-u和root间可以加空格,但是会有警告出现,所以就不要加空格了)

重新登录,输入新密码123就ok了;
在这里插入图片描述

第三种用UPDATE直接编辑user表

首先声明,这种方法我测试了半个小时也没有成功,但是网上查询很多人都成功了,感兴趣的话可以尝试一下。下面是步骤
首先还是通过cmd 登录MySQL
连接权限数据库: use mysql;
改密码:update user set password=password(“123”) where user=“root”;(别忘了最后加分号) 。
刷新权限(必须步骤):flush privileges;

忘记root密码情况

1.关闭正在运行的MySQL服务。打开cmd进入MySQL的bin目录;

2.输入mysqld –skip-grant-tables 回车。(–skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。)

3.再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),输入mysql回车,如果成功,将出现MySQL提示符 >。
连接权限数据库: use mysql; 。
4.改密码:update user set password=password(“root”) where user=“root”;(别忘了最后加分号) 。
刷新权限(必须步骤):flush privileges; 。
退出 quit;
重启mysql服务,使用用户名root和刚才设置的新密码root登录就ok了;

在这里插入图片描述
对mysql钻研了几个小时,发现输入命令还是比较简单的,只要记住一些语句就可以在DOS窗口随意操作我们的数据库了。

原文:https://blog.csdn.net/m0_37482190/article/details/86635339

js获取当前域名、Url、相对路径和参数

用 Javascript 可以单独获取当前域名、Url、相对路径和参数,所谓单独获取,即域名不包括网页文件的路径和参数、参数不包括域名和网页文件路径,下面分别介绍。

一、js获取当前域名有2种方法

1、方法一

var domain = document.domain;

2、方法二

var domain = window.location.host;

3、注意问题

由于获取到的当前域名不包括 http://,所以把获取到的域名赋给 a 标签的 href 时,别忘了加上 http://,否则单击链接时导航会出错。

二、获取当前Url的4种方法

var url = window.location.href;

var url = self.location.href;

var url = document.URL;

var url = document.location;

浏览器地址栏显示的是什么,获取到的 url 就是什么。

三、获取当前相对路径的方法

首先获取 Url,然后把 Url 通过 // 截成两部分,再从后一部分中截取相对路径。如果截取到的相对路径中有参数,则把参数去掉。

function GetUrlRelativePath()
  {
    var url = document.location.toString();
    var arrUrl = url.split("//");

var start = arrUrl[1].indexOf("/");
    var relUrl = arrUrl[1].substring(start);//stop省略,截取从start开始到结尾的所有字符

 if(relUrl.indexOf("?") != -1){
      relUrl = relUrl.split("?")[0];
    }
    return relUrl;
  }

调用方法:GetUrlRelativePath();

举例:假如当前 Url 是 http// www. liangshunet. com/pub/item.aspx?t=osw7,则截取到的相对路径为:/pub/item.aspx。

四、获取当前Url参数的方法

1、获取Url参数部分

function GetUrlPara()
  {
    var url = document.location.toString();
    var arrUrl = url.split("?");

var para = arrUrl[1];
    return para;
  }

调用方法:GetUrlPara()

举例:假如当前 Url 是 http// www. liangshunet. com/pub/item.aspx?t=osw7,则截取到的参数部分为:t=osw7。

2、获取Url中指定参数的值

在 C#、PHP、JSP 中,都有直接获取 Url 中指定参数的方法,但 Javascript 却没有这样的现在方法,得自己写一个。在 Web 的开发过程中,获取 Url 中的参数是十分常用的操作,所以很有必要把它封装成一个可直接调用的方法。下面先介绍具体的实现过程,再分享代码。

1) 直接获取 Url 中指定参数的实现过程

首先通过 document.location 获得当前访问网页的网址,其次用 split 方法通过“?”把网址分为两部分。如果网址中有参数(arrObj.length > 1);再用 split 方法通过 “&”把每个参数分开;接着用 for 循环检查参数中是否有与要找的参数相同参数,如果有,则返回参数的值;如果没有,继续循环直到找完所有参数。如果网址中没有参数和没有找到参数,都返回空。

2)实现代码如下:

//paraName 寻找参数的名称
  function GetUrlParam(paraName) {
    var url = document.location.toString();
    var arrObj = url.split("?");

if (arrObj.length > 1) {
      var arrPara = arrObj[1].split("&");
      var arr;
for (var i = 0; i < arrPara.length; i++) {
        arr = arrPara[i].split("=");
 if (arr != null && arr[0] == paraName) {
          return arr[1];
        }
      }
      return "";
    }
    else {
      return "";
    }
  }

调用方法:GetUrlParam(“id”);

举例说明:

假如当网页的网址有这样的参数 test.htm?id=896&s=q&p=5,则调用 GetUrlParam(“p”),返回 5。

Linux 文件和文件夹权限操作

三、Linux 文件权限

首先来查看一下当前目录下的文件内容吧

ls -l    查看当前目录下的文件列表
ls -l xxx.xxx (xxx.xxx是文件名) 查看指定的文件

我们可以看到文件的权限,-rw-rw-r–  ,一共有10位数。其中: 最前面那个 – 代表的是类型(详细如下面贴图所示)中间那三个 rw- 代表的是所有者(user)然后那三个 rw- 代表的是组群(group)最后那三个 r– 代表的是其他人(other)然后我再解释一下后面那9位数:表示文件可以被读(read)表示文件可以被写(write)表示文件可以被执行(如果它是程序的话)

– 表示相应的权限还没有被授予

文件和文件夹操作权限:

权限简写对普通文件的作用对文件夹的作用
读取r查看文件内容列出文件夹中的文件(ls)
写入w修改文件内容在文件夹中删除、添加或重命名文件(夹)
执行x文件可以作为程序执行cd 到文件夹

图解:

需要注意的一点是,一个目录同时具有读权限和执行权限才可以打开并查看内部文件,而一个目录要有写权限才允许在其中创建其它文件,这是因为目录文件实际保存着该目录里面的文件的列表等信息。

补充:

特殊权限SUID、SGID、Sticky
在 linux 系统中还有三种与用户身份无关的三个文件权限属性。即SUID、SGID和Sticky。
SUID(Set User ID, 4):
该属性只对有执行权限的文件有效,对目录无效。执行具有SUID权限的程序时,引发的进程的所有者是程序文件的所有者,而不是启动程序的用户(除非二者是同一个人)。比如,如果一个程序的所有者是root且具有SUID属性,一个普通用户执行此程序时,如同root执行此程序一样。(请注意该属性对Shell脚本程序无效)该属性为一些特殊程序(如lpr)的启动带来了方便。但有时也带来了安全隐患:比如一个具有SUID属性的程序如果在执行时运行了一个shell,那么用户可以籍此得到系统的最高权限。SUID可用s表示,如:
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 47032 Feb 16  2014 /usr/bin/passwd
SGID(Set Group ID, 4):
对于可执行文件,SGID与SUID类似,引发的进程的所有组是程序文件所属的组。对于目录,SGID属性会使目录中新建文件的所属组与该目录相同。SGID也可以用 s 表示,如:
$ ls -l /var
drwxrw s r-x  2 root staff    4096 Apr 10  2014 local
drwxrwxr-x 15 root syslog   4096 Apr  4 19:57 log
Sticky, 1:
仅对目录有效。带sticky属性的目录下的文件或目录可以被其拥有者删除或改名。常利用sticky属性创建这样的目录:组用户可以在此目录中创建新文件、修改文件内容,但只有文件所有者才能对自己的文件进行删除或改名。如系统中的/tmp文件夹。在属性字符串中,通常用 t 表示。
$ ls -l /
drwxrwxrw t    8 root root  4096 Apr  4 23:57 tmp

修改文件和文件夹对应用户的操作权限

如果你有一个自己的文件不想被其他用户读、写、执行,那么就需要对文件的权限做修改,这里有两种方式:

方式一:二进制数字表示

每个文件的三组权限:
u 代表所有者(user
g 代表所有者所在的组群(group
o 代表其他人,但不是u和g (other
a 代表全部的人,也就是包括u,g和o
根据上图,其中:rwx也可以用数字来代替
r ————4
w ———–2
x ————1
– ————0

当大家都明白了上面的东西之后,那么我们常见的以下的一些权限就很容易都明白了:
  -rw——- (600) 只有所有者才有读和写的权限
  -rw-r–r– (644) 只有所有者才有读和写的权限,组群和其他人只有读的权限
  -rwx—— (700) 只有所有者才有读,写,执行的权限
  -rwxr-xr-x (755) 只有所有者才有读,写,执行的权限,组群和其他人只有读和执行的权限
  -rwx–x–x (711) 只有所有者才有读,写,执行的权限,组群和其他人只有执行的权限
  -rw-rw-rw- (666) 每个人都有读写的权限
  -rwxrwxrwx (777) 每个人都有读写和执行的权限

上实际操作查看了test的权限,是所有者拥有读、写、执行的权限:

然后向文件里添加了些内容,更改了下权限(700:-rwx——),并尝试在shiyanlou(所有者)下读取文件,可以读取。

更换到其他用户Peter,如下图再尝试读取,显示是权限不够,无法读取。

方式二:加减赋值操作u 代表所有者(user)
g 代表所有者所在的组群(group)
o 代表其他人,但不是u和g (other)

a 代表全部的人,也就是包括u,g和o

+ 和 – 分别表示增加和去掉相应的权限。+号一般不显示(初学练手时我还是会加上)
在终端输入:
chmod o+w xxx.xxx
chmod o w xxx.xxx         表示给其他人授予xxx.xxx这个文件的权限

chmod go-rw xxx.xxx      表示删除xxx.xxx中组群和其他人的读和写的权限
chmod ug-r xxx.xxx

修改文件或文件夹的拥有者/所属的组

使用命令chown改变目录或文件的所有权(所有者/组)

注释:这里说的断断续续的,将在学习下一个内容(用户/组 增删改查)之后补充

文件与目录不仅可以改变权限,其所有权及所属用户组也能修改,和设置权限类似,用户可以通过图形界面来设置,或执行chown命令来修改。
我们先执行ls -l看看目录情况:

可以看到test文件的所属用户组为root所有者为root
执行下面命令,把上图中test文件的所有权转移到用户peter:
# chown peter test

改变所属组,将test文件从root组中转移到组Peter中,可使用下面命令:
# chown :peter test

将所属的用户和组一起更改
将文件夹或文件test的拥有者修改成shiyanlou,所属的组修改成shiyanlou,如下图:

原文:https://blog.csdn.net/zbj18314469395/article/details/79884857

PHP SESSION不能跨页面传递的问题解决

PHP中,session不能传递到下一个页面去,一般有两种情况:

我们先写个php文件:<?=phpinfo()?>, 传到服务器去看看服务器的参数配置。

转到session部分,看到session.use_trans_sid参数被设为了零。

这 个参数指定了是否启用透明SID支持,即session是否随着URL传递。我个人的理解是,一旦这个参数被设为0,那么每个URL都会启一个 session。这样后面页面就无法追踪得到前面一个页面的session,也就是我们所说的无法传递。两个页面在服务器端生成了两个session文 件,且无关联。(不知道这样理解对不对?请高手指教。)

所以一个办法是在配置文件php.ini里把session.use_trans_sid的值改成1。

当然我们知道,不是谁都有权限去改php的配置的,那么还有什么间接的解决办法呢?

下面就用两个实例来说明吧:

文件1 test1.php

<?php
//表明是使用用户ID为标识的session
session_id(SID);
//启动session
session_start();
//将session的name赋值为Havi
SESSION[′name′]=”Havi”;//输出session,并设置超链接到第二页test2.phpecho“<ahref=\”test2.php\”>”.SESSION[′name′]=”Havi”;//输出session,并设置超链接到第二页test2.phpecho“<ahref=\”test2.php\”>”._SESSION['name'].”</a>”;
?>

文件2: test2.php

<?php
表明是使用用户ID为标识的session
session_id(SID);
//启动session
session_start();
//输出test1.php中传递的session。
echo “This is “.$_SESSION['name'];
?>

每个页面都要写开启session哦。。不然还是不能正常工作

所以,重点是在session_start();前加上session_id(SID);,这样页面转换时,服务器使用的是用户保存在服务器session文件夹里的session,解决了传递的问题。

不过有同鞋会反映说,这样一来,多个用户的session写在一个SID里了,那Session的价值就发挥不出来了。所以还有一招来解决此问题,不用加session_id(SID);前提是你对服务器的php.ini有配置的权限:

output_buffering改成ON,道理就不表了。

第二个可能的原因是对服务器保存session的文件夹没有读取的权限,还是回到phpinfo.php中,查看session保存的地址:

session.save_path: var/tmp

所以就是检查下var/tmp文件夹是否可写。

写一个文件:test3.php来测试一下:

<?
echo var_dump(is_writeable(ini_get(“session.save_path”)));
?>

我添加了 echo var_dump(ini_get(“session.save_path”));
发现存储目录并非/tmp,在服务器上查看,发现用户组是apache,使用命令
chown :nginx 目录名,session就可以传递了

如果返回bool(false),证明文件夹写权限被限制了,那就换个文件夹咯,在你编写的网页里加入:

//设置当前目录下session子文件夹为session保存路径。
$sessSavePath = dirname(__FILE__).’/session/’;

//如果新路径可读可写(可通过FTP上变更文件夹属性为777实现),则让该路径生效。
if(is_writeable(sessSavePath) && is_readable(sessSavePath) && is_readable(sessSavePath))
{session_save_path($sessSavePath);}

原文:https://www.cnblogs.com/dmhp/p/5089378.html

linux下ls -l命令(即ll命令)查看文件的显示结果分析

在linux下使用“ls -l”或者“ls -al”或者“ll”命令查看文件及目录详情时,shell中会显示出好几列的信息。平时也没怎么注意过,今天忽然心血来潮想了解一下,于是整理了这篇博客,以供参考:

首先给出一张典型的显示结果:
这里写图片描述
下面对其中的每一列进行详细的分析:

一、文件类型

这里写图片描述
表示该文件的类型:

  • “-”表示普通文件;
  • “d”表示目录;
  • “l”表示链接文件;
  • “p”表示管理文件;
  • “b”表示块设备文件;
  • “c”表示字符设备文件;
  • “s”表示套接字文件;

二、文件属性

这里写图片描述
以back_init文件为例,其属性可分为三段:[rwx][rwx][r-x],其中:

第一段表示文件创建者/所有者对该文件所具有的权限,第二段表示创建者/所有者所在的组的其他用户所具有的权限,第三段表示其他组的其他用户所具有的权限。

  • r(Read,读取权限):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。
  • w(Write,写入权限):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。
  • x(eXecute,执行权限):对文件而言,具有执行文件的权限;对目录来说,该用户具有进入目录的权限。

另外,这里还有2个很特殊的属性,平时不怎么常见,这里也顺带解释一下:

  • s或S(SUID,Set UID):可执行的文件搭配这个权限,便能得到特权,任意存取该文件的所有者能使用的全部系统资源。请注意具备SUID权限的文件,黑客经常利用这种权限,以SUID配上root帐号拥有者,无声无息地在系统中开扇后门,供日后进出使用。
  • t或T(Sticky):/tmp和 /var/tmp目录供所有用户暂时存取文件,亦即每位用户皆拥有完整的权限进入该目录,去浏览、删除和移动文件。

综合起来可得,对于back_init文件,其创建者/所有者具有可读可写可执行的权限,其创建者/所有者所在的组的其他用户具有可读可写可执行的权限,其他组的其他用户则具有可读可执行但不可写的权限。

三、目录/链接个数

这里写图片描述

对于目录文件,表示它的第一级子目录的个数。注意此处看到的值要减2才等于该目录下的子目录的实际个数。

  • 比如这里的include目录下,其实是没有子目录的,所以应该是0,但是它这里却显示2,这是因为要加上.目录和..目录。在linux下,.目录表示当前目录,..目录表示上一级目录。
  • 这也可以解释上图中第一行的.目录下的3和第二行..目录下的26。因为当前目录下有一个include目录,所以加上.目录和..目录这2个目录就等于3,所以第一行会显示3。而上一级目录共有24个目录,加上上一级目录的.目录和..目录这2个目录,所以这里的第二行显示的是26。

对于其他文件,表示指向它的链接文件的个数。

四、所有者及组

这里写图片描述
表示该文件的所有者/创建者(owner)及其所在的组(group)。

五、文件大小

这里写图片描述

如果是文件,则表示该文件的大小,单位为字节。
如果是目录,则表示该目录符所占的大小,并不表示该目录下所有文件的大小。

六、修改日期

这里写图片描述
该文件最后修改的日期时间。

七、文件名称

这里写图片描述
文件名,无需多说。

八、字体颜色

这里写图片描述
在大多数的linux shell窗口中,还能用颜色来区分不同文件的属性:

  • 灰白色表示普通文件;
  • 亮绿色表示可执行文件;
  • 亮红色表示压缩文件;
  • 灰蓝色表示目录;
  • 亮蓝色表示链接文件;
  • 亮黄色表示设备文件;

当然,这里需要使用系统缺省的配色方案。如果你自定义了shell的配色方案,则有可能与上面的定义不一致。

最后还要说明一点的是,可以看到上述的图片中,back_init文件的后面还带了一个星号(*),这也是linux系统下用于标记可执行文件的另外一种方式。也就是说,凡是文件名后面带了一个星号(*)的,都是在说明这是一个可执行文件。

原文:https://blog.csdn.net/LEON1741/article/details/82386520

CSS设置鼠标为小手手型

css中鼠标放上去变成手型怎么设置:其实就是一个属性的问题,

css的cursor属性 

cursor:pointer;

default:标准箭头 //这是默认的样式

pointer:手形光标  

wait :等待光标  

text:I形光标  

vertical-text :水平I形光标  

no-drop:不可拖动光标  

not-allowed:无效光标  

help:帮助光标  

all-scroll:三角方向标  

move  :移动标  

crosshair:十字标

有的地方手型用hand,在这里隆重的说明,不要用hand,有些浏览器不支持。

PHP+Javascript实现拖动滑块完成拼图验证码

下载源码 or 查看演示

github地址:https://github.com/binwind8/tncode

重要的文件:

1、tncode.js

/*! tncode 1.2 author:weiyingbin email:277612909@qq.com
//@ object webiste: http://www.39gs.com/archive/259.html
//@ https://github.com/binwind8/tncode
*/
if(!document.getElementByClassName){
    function hasClass(elem, cls) {
      cls = cls || '';
      if (cls.replace(/\s/g, '').length == 0) return false; //当cls没有参数时,返回false
      var ret = new RegExp(' ' + cls + ' ').test(' ' + elem.className + ' ');
      return ret;
    }
    document.getElementByClassName = function(className,index){
        var nodes=document.getElementsByTagName("*");//获取页面里所有元素,因为他会匹配全页面元素,所以性能上有缺陷,但是可以约束他的搜索范围;
        var arr=[];//用来保存符合的className;
        for(var i=0;i<nodes.length;i++){
            if(hasClass(nodes[i],className)) arr.push(nodes[i]);
        }
        if(!index)index=0;
        return index==-1?arr:arr[index];
    };
    function addClass( elements,cName ){
       if( !hasClass( elements,cName ) ){
          elements.className += " " + cName;
       };
    }
    function removeClass( elements,cName ){
       if( hasClass( elements,cName ) ){
          elements.className = elements.className.replace( new RegExp( "(\\s|^)" + cName + "(\\s|$)" )," " ); // replace方法是替换
       };
    }
}

function appendHTML(o,html) {
    var divTemp = document.createElement("div"), nodes = null
        , fragment = document.createDocumentFragment();
    divTemp.innerHTML = html;
    nodes = divTemp.childNodes;
    for (var i=0, length=nodes.length; i<length; i+=1) {
       fragment.appendChild(nodes[i].cloneNode(true));
    }
    o.appendChild(fragment);
    nodes = null;
    fragment = null;
};



var _ajax = function() {};
_ajax.prototype = {
    request: function(method, url, callback, postVars) {
        var xhr = this.createXhrObject()();
        xhr.onreadystatechange = function() {
            if (xhr.readyState !== 4) return;
            (xhr.status === 200) ?
                callback.success(xhr.responseText, xhr.responseXML) :
                callback.failure(xhr,status);
        };
        if (method !== "POST"&&postVars) {
            url += "?" + this.JSONStringify(postVars);
            postVars = null;
        }
        xhr.open(method, url, true);
        xhr.send(postVars);
    },
    createXhrObject: function() {
        var methods = [
            function() { return new XMLHttpRequest(); },
            function() { return new ActiveXObject("Msxml2.XMLHTTP"); },
            function() { return new ActiveXObject("Microsoft.XMLHTTP"); }
        ],
        i = 0,
        len = methods.length,obj;
        for (; i < len; i++) {
            try {
                methods[i];
            } catch(e) {
                continue;
            }
            this.createXhrObject = methods[i];
            return methods[i];
        }
        throw new Error("ajax created failure");
    },
    JSONStringify: function(obj) {
        return JSON.stringify(obj).replace(/"|{|}/g, "")
                    .replace(/b:b/g, "=")
                    .replace(/b,b/g, "&");
    }
};


var tncode = {
    _obj:null,
    _tncode:null,
    _img:null,
    _img_loaded:false,
    _is_draw_bg:false,
    _is_moving:false,
    _block_start_x:0,
    _block_start_y:0,
    _doing:false,
    _mark_w:50,
    _mark_h:50,
    _mark_offset:0,
    _img_w:240,
    _img_h:150,
    _result:false,
    _err_c:0,
    _onsuccess:null,
    _bind:function(elm,evType,fn){
        //event.preventDefault();
        if (elm.addEventListener) {
            elm.addEventListener(evType, fn);//DOM2.0
            return true;
        }else if (elm.attachEvent) {
            var r = elm.attachEvent(evType, fn);//IE5+
            return r;
        }
    },
    _block_start_move:function(e){
        if(tncode._doing||!tncode._img_loaded){
            return;
        }
        e.preventDefault();
        var theEvent = window.event || e;
        if(theEvent.touches){
            theEvent = theEvent.touches[0];
        }

        console.log("_block_start_move");

        var obj = document.getElementByClassName('slide_block_text');
        obj.style.display="none";
        tncode._draw_bg();
        tncode._block_start_x = theEvent.clientX;
        tncode._block_start_y = theEvent.clientY;
        tncode._doing = true;
        tncode._is_moving = true;
    },
    _block_on_move:function(e){
        if(!tncode._doing)return true;
        if(!tncode._is_moving)return true;
        e.preventDefault();
        var theEvent = window.event || e;
        if(theEvent.touches){
            theEvent = theEvent.touches[0];
        }
        tncode._is_moving = true;
        console.log("_block_on_move");
                //document.getElementById('msg').innerHTML = "move:"+theEvent.clientX+";"+theEvent.clientY;
        var offset = theEvent.clientX - tncode._block_start_x;
        if(offset<0){
            offset = 0;
        }
        var max_off = tncode._img_w - tncode._mark_w;
        if(offset>max_off){
            offset = max_off;
        }
        var obj = document.getElementByClassName('slide_block');

        obj.style.cssText = "transform: translate("+offset+"px, 0px)";
        tncode._mark_offset = offset/max_off*(tncode._img_w-tncode._mark_w);
        tncode._draw_bg();
        tncode._draw_mark();
    },
    _block_on_end:function(e){
        if(!tncode._doing)return true;
        e.preventDefault();
        var theEvent = window.event || e;
        if(theEvent.touches){
            theEvent = theEvent.touches[0];
        }
        console.log("_block_on_end");
        tncode._is_moving = false;
        tncode._send_result();
    },
    _send_result:function(){
        var haddle = {success:tncode._send_result_success,failure:tncode._send_result_failure};
        tncode._result = false;
        var re = new _ajax();
        re.request('get',tncode._currentUrl().replace('houtai/assets/js', 'config/libs')+'tn_check.php?tn_r='+tncode._mark_offset,haddle);
    },
    _send_result_success:function(responseText,responseXML){
        tncode._doing = false;
        if(responseText=='ok'){
            tncode._showmsg('验证成功',1);
            tncode._result = true;
            document.getElementByClassName('hgroup').style.display="block";
            //setTimeout(tncode.hide,2500);
            setTimeout(function(){
                tncode.hide();
                tncode._tncode.style.backgroundColor = "#52d192";
                tncode._tncode.style.border = "1px solid #52d192";
                tncode._tncode.innerHTML = '验证成功';
            },2500);
            if(tncode._onsuccess){
                tncode._onsuccess();
            }
        }else{
            var obj = document.getElementById('tncode_div');
            addClass( obj,'dd');
            setTimeout(function(){
                removeClass( obj,'dd');
            },200);
            tncode._result = false;
            tncode._showmsg('验证失败');
            tncode._err_c++;
            if(tncode._err_c>5){
                tncode.refresh();
            }
        }
    },
    _send_result_failure:function(xhr,status){

    },
    _draw_fullbg:function(){
        var canvas_bg = document.getElementByClassName('tncode_canvas_bg');
        var ctx_bg = canvas_bg.getContext('2d');
        ctx_bg.drawImage(tncode._img, 0, tncode._img_h*2, tncode._img_w, tncode._img_h, 0, 0, tncode._img_w, tncode._img_h);
    },
    _draw_bg:function(){
        if(tncode._is_draw_bg){
            return;
        }
        tncode._is_draw_bg = true;
        var canvas_bg = document.getElementByClassName('tncode_canvas_bg');
        var ctx_bg = canvas_bg.getContext('2d');
        ctx_bg.drawImage(tncode._img, 0, 0, tncode._img_w, tncode._img_h, 0, 0, tncode._img_w, tncode._img_h);
    },
    _draw_mark:function(){
        var canvas_mark = document.getElementByClassName('tncode_canvas_mark');
        var ctx_mark = canvas_mark.getContext('2d');
        //清理画布
        ctx_mark.clearRect(0,0,canvas_mark.width,canvas_mark.height);
        ctx_mark.drawImage(tncode._img, 0, tncode._img_h, tncode._mark_w,tncode._img_h,tncode._mark_offset,0,tncode._mark_w, tncode._img_h);
        var imageData = ctx_mark.getImageData(0, 0, tncode._img_w, tncode._img_h);
          // 获取画布的像素信息
          // 是一个一维数组,包含以 RGBA 顺序的数据,数据使用  0 至 255(包含)的整数表示
          // 如:图片由两个像素构成,一个像素是白色,一个像素是黑色,那么 data 为
          // [255,255,255,255,0,0,0,255]
          // 这个一维数组可以看成是两个像素中RBGA通道的数组的集合即:
          // [R,G,B,A].concat([R,G,B,A])
        var data = imageData.data;
        //alert(data.length/4);
        var x = tncode._img_h,y=tncode._img_w;
        for(var j = 0; j < x; j++) {
            var ii = 1,k1=-1;
            for(var k=0;k<y&&k>=0&&k>k1;){
              // 得到 RGBA 通道的值
                var i = (j*y+k)*4;
                k+=ii;
                var r = data[i]
                  , g = data[i+1]
                  , b = data[i+2];
                // 我们从最下面那张颜色生成器中可以看到在图片的右上角区域,有一小块在
                // 肉眼的观察下基本都是白色的,所以我在这里把 RGB 值都在 245 以上的
                // 的定义为白色
                // 大家也可以自己定义的更精确,或者更宽泛一些
                if(r+g+b<200) data[i+3] = 0;
                else{
                    var arr_pix = [1,-5];
                    var arr_op = [250,0];
                    for (var i =1; i<arr_pix[0]-arr_pix[1]; i++) {
                        var iiii = arr_pix[0]-1*i;
                        var op = parseInt(arr_op[0]-(arr_op[0]-arr_op[1])/(arr_pix[0]-arr_pix[1])*i);
                        var iii = (j*y+k+iiii*ii)*4;
                        data[iii+3] = op;
                    }
                    if(ii==-1){
                        break;
                    }
                    k1 = k;
                    k = y-1;
                    ii = -1;
                };
            }
        }
        ctx_mark.putImageData(imageData, 0, 0);
    },
    _reset:function(){
        tncode._mark_offset = 0;
        tncode._draw_bg();
        tncode._draw_mark();
        var obj = document.getElementByClassName('slide_block');
        obj.style.cssText = "transform: translate(0px, 0px)";
    },
    show:function(){
        var obj = document.getElementByClassName('hgroup');
        if(obj){
            obj.style.display="none";
        }
        tncode.refresh();
        tncode._tncode = this;
        document.getElementById('tncode_div_bg').style.display="block";
        document.getElementById('tncode_div').style.display="block";
    },
    hide:function(){
        document.getElementById('tncode_div_bg').style.display="none";
        document.getElementById('tncode_div').style.display="none";
    },
    _showmsg:function(msg,status){
        if(!status){
            status = 0;
            var obj = document.getElementByClassName('tncode_msg_error');
        }else{
            var obj = document.getElementByClassName('tncode_msg_ok');
        }
        obj.innerHTML = msg;
        var setOpacity = function (ele, opacity) {
            if (ele.style.opacity != undefined) {
                ///兼容FF和GG和新版本IE
                ele.style.opacity = opacity / 100;

            } else {
                ///兼容老版本ie
                ele.style.filter = "alpha(opacity=" + opacity + ")";
            }
        };
        function fadeout(ele, opacity, speed) {
            if (ele) {
                var v = ele.style.filter.replace("alpha(opacity=", "").replace(")", "") || ele.style.opacity || 100;
                v < 1 && (v = v * 100);
                var count = speed / 1000;
                var avg = (100 - opacity) / count;
                var timer = null;
                timer = setInterval(function() {
                    if (v - avg > opacity) {
                        v -= avg;
                        setOpacity(ele, v);
                    } else {
                        setOpacity(ele, 0);
                        if(status==0){
                            tncode._reset();
                        }
                        clearInterval(timer);
                    }
                }, 100);
            }
        }
        function fadein(ele, opacity, speed) {
            if (ele) {
                var v = ele.style.filter.replace("alpha(opacity=", "").replace(")", "") || ele.style.opacity;
                v < 1 && (v = v * 100);
                var count = speed / 1000;
                var avg = count < 2 ? (opacity / count) : (opacity / count - 1);
                var timer = null;
                timer = setInterval(function() {
                    if (v < opacity) {
                        v += avg;
                        setOpacity(ele, v);
                    } else {
                        clearInterval(timer);
                        setTimeout(function() {fadeout(obj, 0, 6000);},1000);
                    }
                }, 100);
            }
        }

        fadein(obj, 80, 4000);
    },
    _html:function(){
        var d = document.getElementById('tncode_div_bg');
        if(d)return;
        var html = '<div class="tncode_div_bg" id="tncode_div_bg"></div><div class="tncode_div" id="tncode_div"><div class="loading">加载中</div><canvas class="tncode_canvas_bg"></canvas><canvas class="tncode_canvas_mark"></canvas><div class="hgroup"></div><div class="tncode_msg_error"></div><div class="tncode_msg_ok"></div><div class="slide"><div class="slide_block"></div><div class="slide_block_text">拖动左边滑块完成上方拼图</div></div><div class="tools"><div class="tncode_close"></div><div class="tncode_refresh"></div><div class="tncode_tips"></div></div></div>';
        var bo = document.getElementsByTagName('body');
        appendHTML(bo[0],html);
    },
    _currentUrl:function(){
        var list = document.getElementsByTagName('script');
        for (var i in list) {
            var  d=list[i];
            if(d.src.indexOf('tn_code')!==-1){//js文件名一定要带这个字符
                var arr = d.src.split('tn_code');
                return arr[0];
            }
        }
    },
    refresh:function(){
        var isSupportWebp = !![].map && document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0;
        var _this = this;
        tncode._err_c = 0;
        tncode._is_draw_bg = false;
        tncode._result = false;
        tncode._img_loaded = false;
        var obj = document.getElementByClassName('tncode_canvas_bg');
        obj.style.display="none";
        obj = document.getElementByClassName('tncode_canvas_mark');
        obj.style.display="none";
        tncode._img = new Image();
        var img_url = tncode._currentUrl().replace('houtai/assets/js', 'config/libs')+"tncode.php?t="+Math.random();
        if(!isSupportWebp){//浏览器不支持webp
            img_url+="&nowebp=1";
        }
        tncode._img.src = img_url;
        tncode._img.onload = function(){
            tncode._draw_fullbg();
            var canvas_mark = document.getElementByClassName('tncode_canvas_mark');
            var ctx_mark = canvas_mark.getContext('2d');
            //清理画布
            ctx_mark.clearRect(0,0,canvas_mark.width,canvas_mark.height);
            tncode._img_loaded = true;
            obj = document.getElementByClassName('tncode_canvas_bg');
            obj.style.display="";
            obj = document.getElementByClassName('tncode_canvas_mark');
            obj.style.display="";
        };
        //alert("Hong Kong ForHarvest Technology and Culture Development Co. Limited".length);
        obj = document.getElementByClassName('slide_block');
        obj.style.cssText = "transform: translate(0px, 0px)";
        obj = document.getElementByClassName('slide_block_text');
        obj.style.display="block";
    },
    init:function(){
        var _this = this;
        if(!tncode._img){
            tncode._html();
            var obj = document.getElementByClassName('slide_block');

            tncode._bind(obj,'mousedown',_this._block_start_move);
            tncode._bind(document,'mousemove',_this._block_on_move);
            tncode._bind(document,'mouseup',_this._block_on_end);

            tncode._bind(obj,'touchstart',_this._block_start_move);
            tncode._bind(document,'touchmove',_this._block_on_move);
            tncode._bind(document,'touchend',_this._block_on_end);

            var obj = document.getElementByClassName('tncode_close');
            tncode._bind(obj,'touchstart',_this.hide);
            tncode._bind(obj,'click',_this.hide);
            var obj = document.getElementByClassName('tncode_refresh');

            tncode._bind(obj,'touchstart',_this.refresh);
            tncode._bind(obj,'click',_this.refresh);


            var objs = document.getElementByClassName('tncode',-1);
            for (var i in objs) {
                var o = objs[i];
                o.innerHTML = '点击按钮进行验证';
                tncode._bind(o,'touchstart',_this.show);
                tncode._bind(o,'click',_this.show);
            }
        }
    },
    result:function(){
        return tncode._result;
    },
    onsuccess:function(fn){
        tncode._onsuccess = fn;
    }
};
var $TN = tncode;
var _old_onload = window.onload;
window.onload = function(){
    if(typeof _old_onload == 'function'){
        _old_onload();
    }
    tncode.init();
};

2、TnCode.class.php

<?php
/*! tncode 1.2 author:weiyingbin email:277612909@qq.com
//@ object webiste: http://www.39gs.com/archive/259.html
//@ https://github.com/binwind8/tncode
*/
class TnCode
{
    var $im = null;
    var $im_fullbg = null;
    var $im_bg = null;
    var $im_slide = null;
    var $bg_width = 240;
    var $bg_height = 150;
    var $mark_width = 50;
    var $mark_height = 50;
    var $bg_num = 6;
    var $_x = 0;
    var $_y = 0;
    //容错象素 越大体验越好,越小破解难道越高
    var $_fault = 3;
    function __construct(){
        //ini_set('display_errors','On');
        //
        error_reporting(0);
        if(!isset($_SESSION)){
            session_start();
        }
    }
    function make(){
        $this->_init();
        $this->_createSlide();
        $this->_createBg();
        $this->_merge();
        $this->_imgout();
        $this->_destroy();
    }

    function check($offset=''){
        if(!$_SESSION['tncode_r']){
            return false;
        }
        if(!$offset){
            $offset = $_REQUEST['tn_r'];
        }
        $ret = abs($_SESSION['tncode_r']-$offset)<=$this->_fault;
        if($ret){
            unset($_SESSION['tncode_r']);
        }else{
            $_SESSION['tncode_err']++;
            if($_SESSION['tncode_err']>10){//错误10次必须刷新
                unset($_SESSION['tncode_r']);
            }
        }
        return $ret;
    }

    private function _init(){
        $bg = mt_rand(1,$this->bg_num);
        $file_bg = dirname(__FILE__).'/tn_img/bg/'.$bg.'.png';
        $this->im_fullbg = imagecreatefrompng($file_bg);
        $this->im_bg = imagecreatetruecolor($this->bg_width, $this->bg_height);
        imagecopy($this->im_bg,$this->im_fullbg,0,0,0,0,$this->bg_width, $this->bg_height);
        $this->im_slide = imagecreatetruecolor($this->mark_width, $this->bg_height);
        $_SESSION['tncode_r'] = $this->_x = mt_rand(50,$this->bg_width-$this->mark_width-1);
        $_SESSION['tncode_err'] = 0;
        $this->_y = mt_rand(0,$this->bg_height-$this->mark_height-1);
    }

    private function _destroy(){
        imagedestroy($this->im);
        imagedestroy($this->im_fullbg);
        imagedestroy($this->im_bg);
        imagedestroy($this->im_slide);
    }
    private function _imgout(){
        if(!$_GET['nowebp']&&function_exists('imagewebp')){//优先webp格式,超高压缩率
            $type = 'webp';
            $quality = 40;//图片质量 0-100
        }else{
            $type = 'png';
            $quality = 7;//图片质量 0-9
        }
        header('Content-Type: image/'.$type);
        $func = "image".$type;
        $func($this->im,null,$quality);
    }
    private function _merge(){
        $this->im = imagecreatetruecolor($this->bg_width, $this->bg_height*3);
        imagecopy($this->im, $this->im_bg,0, 0 , 0, 0, $this->bg_width, $this->bg_height);
        imagecopy($this->im, $this->im_slide,0, $this->bg_height , 0, 0, $this->mark_width, $this->bg_height);
        imagecopy($this->im, $this->im_fullbg,0, $this->bg_height*2 , 0, 0, $this->bg_width, $this->bg_height);
        imagecolortransparent($this->im,0);//16777215
    }

    private function _createBg(){
        $file_mark = dirname(__FILE__).'/tn_img/tn_mark.png';
        $im = imagecreatefrompng($file_mark);
        header('Content-Type: image/png');
        //imagealphablending( $im, true);
        imagecolortransparent($im,0);//16777215
        //imagepng($im);exit;
        imagecopy($this->im_bg, $im, $this->_x, $this->_y  , 0  , 0 , $this->mark_width, $this->mark_height);
        imagedestroy($im);
    }

    private function _createSlide(){
        $file_mark = dirname(__FILE__).'/tn_img/tn_mark2.png';
        $img_mark = imagecreatefrompng($file_mark);
        imagecopy($this->im_slide, $this->im_fullbg,0, $this->_y , $this->_x, $this->_y, $this->mark_width, $this->mark_height);
        imagecopy($this->im_slide, $img_mark,0, $this->_y , 0, 0, $this->mark_width, $this->mark_height);
        imagecolortransparent($this->im_slide,0);//16777215
        //header('Content-Type: image/png');
        //imagepng($this->im_slide);exit;
        imagedestroy($img_mark);
    }

}
?>

3、tn_style.css

/*按钮*/
.clear{clear: both;}
.tncode{
    border: 1px solid #ccc;
    background-color: white;
    border-radius: 4px;
    width: 100%;
    height: 44px;
    cursor: pointer;
    opacity: 1;
    line-height: 44px;
}
/*浮层*/
.tncode_div_bg{
    width: 100%;height: 100%;position: absolute;
    top:0;
    left:0;
    z-index:1000;
    background-color: rgba(0,0,0,0.5);
    opacity:0.3;
    filter: alpha(opacity=30); background-color:#000;
    *zoom:1;
    display: none;
}
.tncode_div{
    display: none;
    background-color: white;
    z-index: 1000000;
    width: 260px;height: 260px;
    position: absolute;
    left: 50%;top:50%;
    margin-top: -130px;
    margin-left: -130px;
    border: 1px solid #d1d1d1;
    border-radius: 2px;
    overflow: hidden;
    filter: progid:DXImageTransform.Microsoft.Shadow(color='#969696',Direction=135, Strength=5);/*for ie6,7,8*/
    /*background-color: #ccc;*/
    -moz-box-shadow:2px 2px 5px #969696;/*firefox*/
    -webkit-box-shadow:2px 2px 5px #969696;/*webkit*/
    box-shadow:2px 2px 5px #969696;/*opera或ie9*/
}
.tncode_div .tncode_canvas_bg{
    z-index: 0;
}
.tncode_div .tncode_canvas_mark{
    z-index: 10000;
}
.tncode_div canvas{
    position: absolute;
    left: 10px;
    top: 10px;
}
.tncode_div .loading{
    padding-top: 60px;
    position: absolute;
    left: 10px;
    top: 10px;
    background-color: #ccc;
    width: 240px;
    height: 150px;
    text-align: center;
    box-sizing:border-box;
}
.dd{
    -webkit-transform: rotate(-45deg);
    -moz-transform: rotate(-45deg);
    -ms-transform: rotate(-45deg);
    -o-transform: rotate(-45deg);
    transform: rotate(-45deg);
    -webkit-animation: ddf 0.1s ease-in 0s infinite;
    -o-animation: ddf 0.1s ease-in 0s infinite;
    animation: ddf 0.1s ease-in 0s infinite;
}
@-webkit-keyframes ddf {
    0% {-webkit-transform: translate(-8px, 3px);}
    20% {-webkit-transform: translate(-3px, 1.5px);}
    50% {-webkit-transform: translate(0px, 0px) ;}
    70% {-webkit-transform: translate(5px, -1.5px) ;}
    100% {-webkit-transform: translate(0px, 0px);}
}
@-o-keyframes ddf {
    0% {-o-transform: translate(-8px, 3px);}
    20% {-o-transform: translate(-3px, 1.5px);}
    50% {-o-transform: translate(0px, 0px) ;}
    70% {-o-transform: translate(5px, -1.5px) ;}
    100% {-o-transform: translate(0px, 0px);}
}
@-moz-keyframes ddf {
    0% {-moz-transform: translate(-8px, 3px);}
    20% {-moz-transform: translate(-3px, 1.5px);}
    50% {-moz-transform: translate(0px, 0px) ;}
    70% {-moz-transform: translate(5px, -1.5px) ;}
    100% {-moz-transform: translate(0px, 0px);}
}
@keyframes ddf {
    0% {transform: translate(-8px, 3px);}
    20% {transform: translate(-3px, 1.5px);}
    50% {transform: translate(0px, 0px) ;}
    70% {transform: translate(5px, -1.5px) ;}
    100% {transform: translate(0px, 0px);}
}
.hgroup{
    z-index: 20000;
    content: "";
    position: absolute;
    left: -800px;
    top: 70px;
    width: 250px;
    height: 15px;
    background-color: rgba(255,255,255,.5);
    -webkit-transform: rotate(-45deg);
    -moz-transform: rotate(-45deg);
    -ms-transform: rotate(-45deg);
    -o-transform: rotate(-45deg);
    transform: rotate(-45deg);
    -webkit-animation: searchLights 3s ease-in 0s infinite;
    -o-animation: searchLights 3s ease-in 0s infinite;
    animation: searchLights 3s ease-in 0s infinite;
}


@-webkit-keyframes searchLights {
    0% {
        left: -800px;
        top: 70px;
    }

    to {
        left: 350px;
        top: 70px
    }
}

@-o-keyframes searchLights {
    0% {
        left: -800px;
        top: 70px;
    }

    to {
        left: 350px;
        top: 70px
    }
}

@-moz-keyframes searchLights {
    0% {
        left: -800px;
        top: 70px;
    }

    to {
        left: 350px;
        top: 70px
    }
}

@keyframes searchLights {
    0% {
        left: -800px;
        top: 70px;
    }

    to {
        left: 350px;
        top: 70px
    }
}




/*拉条*/
.slide,.slide_block,.tools .tncode_close,.tools .tncode_refresh{
    background-repeat: no-repeat;
    background-image: url('../img/tn_icon.png');
}
.tncode_msg_ok{
    background-color: #24C628;
}
.tncode_msg_error{
    background-color: #DE5145;
}
.tncode_msg_ok,.tncode_msg_error{
    position: absolute;
    top:136px;
    left: 10px;
    width: 240px;  /* 同tncode_canvas_bg */
    height: 24px;
    color: #fff;
    margin: 0;
    padding: 2px 10px;
    overflow: visible;
    background-position: 0px 0px;
    font-size: 14px;
    opacity:0;
    filter: alpha(opacity=0.5);
    z-index: 10000;
    text-align: center;
}
.slide{
    position: absolute;
    top:160px;
    width: 93.52%;
    height: 0px;
    background-color: white;
    background-size: 100%;
    margin: 5.39% 3.24%;
    padding: 0px 0px 13.67%;
    overflow: visible;
    background-position: 0px 0px;
}

.tools{
    position: absolute;
    top:210px;
    width: 93.52%;
    height: 0px;
    background-color: white;
    background-size: 100%;
    margin: 5.39% 3.24%;
    padding: 5px 0px 13.67%;
    overflow: visible;
    background-position: 0px 0px;
    border-top: 1px solid #EEEEEE;
}

.slide_block{
background-position: 0px 12.9794%;
width: 65px;
height: 65px;
    position: absolute;
    left: 0px;
    top: 0px;
margin: -4.62% 0 0 -2.31%;
cursor: pointer;
}
.slide_block_text{
background-position: 0px 12.9794%;
height: 65px;
    position: absolute;
    left: 65px;
    top: 20px;
margin: -4.62% 0 0 -2.31%;
cursor: pointer;
font-size: 14px;
    color: rgb(136, 148, 157);
}

.tncode_canvas_bg,.tncode_canvas_mark{
   /* width: 240px;*/
}

.tools .tncode_close{
    background-position: 0 50%;
    height: 30px;
    width: 30px;
    float: left;
    margin-right: 10px;
    cursor: pointer;
}
.tools .tncode_refresh{
    background-position: 0 94%;
    height: 30px;
    width: 30px;
    float: left;
    cursor: pointer;
}
.tools .tncode_tips{
    float: right;
}
.tools .tncode_tips a{
    text-decoration: none;
    font-size: 10px;
    color: rgb(136, 148, 157);
}

原文:https://www.helloweba.net/php/551.html