首页
登录
搜索
登录
搜索
emer
累计撰写
197
篇文章
累计收到
496
条评论
首页
栏目
首页
登录
自定义幻灯片
最新文章
2019-9-16
使用JavaScript在复制时添加版权信息
第一条使用两种方法对文章进行粘贴追加信息~~~ 方法一: ①监听copy事件,然后将隐藏盒子中的信息添加到其中; ②结合window.selection()方法; ③浏览器兼容情况是主流浏览器IE8以上; ④线上demo http://jsfiddle.net/jp6nhmxf/ ; ⑤使用:复制一段文本再粘贴就会出现 pagelink中的内容 。 主要JS code function addLink() { //Get the selected text and append the extra info var selection = window.getSelection(), pagelink = '\n\n Read more at: ' + document.location.href, copytext = selection + pagelink, newdiv = document.createElement('div'); //hide the newly created container newdiv.style.position = 'absolute'; newdiv.style.left = '-99999px'; //insert the container, fill it with the extended text, and define the new selection document.body.appendChild(newdiv); newdiv.innerHTML = copytext; selection.selectAllChildren(newdiv); window.setTimeout(function () { document.body.removeChild(newdiv); }, 100); } document.addEventListener('copy', addLink); 方法二: ①监听copy事件,然后修改剪贴板中的内容,也就是clipboard使用; ②结合window.clipboardData.setData()方法; ③浏览器兼容情况是IE4以上(换言之只针对于IE); ④线上demo http://jsfiddle.net/m56af0je/ (IE模式下起效); 主要JS code function addLink(event) { event.preventDefault(); var pagelink = '\n\n Read more at: ' + document.location.href, copytext = window.getSelection() + pagelink; if (window.clipboardData) { window.clipboardData.setData('Text', copytext); } } document.addEventListener('copy', addLink); ⑤另外疑问点来了,使用clipboard能在其他浏览器(比如谷歌/火狐/safari)中工作吗? 主要JS code function addLink(event) { event.preventDefault(); var pagelink = '\n\n Read more at: ' + document.location.href, copytext = window.getSelection() + pagelink; (event.clipboardData || window.clipboardData).setData('Text', copytext); } document.addEventListener('copy', addLink); 区别在 window.clipboarddata <--> event.clipboardData 亲测在兼容模式、极速模式、谷歌、火狐、IE等浏览器中均测有效! 第二条使用的方法跟第一条类似~~~ 主要JS code /** * @description 添加版权 */ const addCopyright = () => { const genCopy = () => { return [ '', '', '作者:张宇童', '链接 [文章复制添加版权](http://www.zyt8.cn/?post=132) ', '来源:张宇童 - 温馨技术博客', '著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。', ] } $('.content-reset').on('copy', function (event) { if (!window.getSelection) { return } let copyString = window.getSelection().toString() if (copyString.length < 128) { return } if ('object' === typeof event.originalEvent.clipboardData) { event.originalEvent.clipboardData.setData('text/html', copyString + genCopy().join('')) event.originalEvent.clipboardData.setData('text/plain', copyString + genCopy().join('\n')) event.preventDefault() return } $('body').append(`${copyString}${genCopy().join('')}`) window.getSelection().selectAllChildren($('#pipeFixCopy')[0]) setTimeout(function() { $('#pipeFixCopy').remove() }, 200) }) } 找一个空白地方复制粘贴测试,~~本人只在极速模式下测通过,其他未测~~ 敬请留意~~
2019年-9月-16日
205 阅读
3 评论
未分类
2019-9-12
Lua模块的安装
以下以Linux 系统为例进行讲解 1、创建一个目录 mkdir /lua 2、使用wget下载资源 3、编译二进制文件,设置安装目录 4、导入环境变量 5、下载,并解压 6、重新编译nginx
2019年-9月-12日
177 阅读
2 评论
未分类
2019-9-11
关于使用openssl生成key与csr和crt
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 19.0px Menlo; color: #000000} span.s1 {font-variant-ligatures: no-common-ligatures} 第一步 生成key文件 openssl genrsa -idea -out zhang.key 1024 第二步:生成csr文件 p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 19.0px Menlo; color: #000000} span.s1 {font-variant-ligatures: no-common-ligatures} p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 19.0px Menlo; color: #000000} span.s1 {font-variant-ligatures: no-common-ligatures} openssl req -new -key zhang.key -out zhang.csr 第三步:生成crt文件 第四步:配置location 第五步:重载配置文件
2019年-9月-11日
57 阅读
0 评论
未分类
2019-9-6
Echarts引入Mapbox添加柱状数据报表
2019年-9月-6日
70 阅读
0 评论
未分类
2019-6-1
简单理解php的socket编程
php的socket编程算是比较难以理解的东西吧,不过,我们只要理解socket几个函数之间的关系,以及它们所扮演的角色,那么理解起来应该不是很难了,在笔者看来,socket编程,其实就是建立一个网络服务的客户端和服务端,这和mysql的客户端和服务端是一样的,你只要理解mysql的客户端和服务端是怎么一回事,你就应该能够理解下面我要讲的东西吧。 关于socket编程所涉及到的网络协议,什么TCP啊,UDP啊,什么socket三次握手等等,这些网络协议网上有很详细的解释,这里不讲,只截个socket建立套接的过程图让你瞧瞧: 这个图是我辛辛苦苦从别人那里盗截过来的,你一定要好好看啊,同时,在这里我也向那个被我盗截图的笔者表示感谢,本人对自己盗取你的图案表示歉意,还望你大人大量不要计较啊。本人实在太懒了,懒得画图,(其实是对自己的画图技术表示不自信,呵呵)。 socket是怎么建立连接的呢?上面已经提到过了,它建立连接的过程是与mysql的客户端和服务端的连接本质是一样的。而它与mysql不同的是,mysql的服务端和客户端都已经为我们编辑好了,我们只要应用就行了。但是,关键时刻来啦,socket它什么东西都没有提供给我们,唯一提供给我们的就是:几十个socket函数。 这言外之意就是说,socket编程就是要我们自己创建服务端和客户端,也就是说,``socket编程``——就是要我们自己建立一个类似于mysql的服务端和客户端的应用。 说到这里,我想问一句,你说这socket让人头疼不?它既不建立个服务端,也不建立个客户端给我们应用,非要让我们自己去应用socket的函数,创建一个属于我们自己的网络协议套接应用,这是不是很让你头疼呢?头疼也没办法,要是你需要自己的应用,你还是不得不跟socket打交道。呵呵,这只是题外话,不多说,下面进入正题。 在你没有被socket编程搞蒙之前,我还是让你看看socket的几个关键函数,先给你解释一下它们各自的作用。不然,要是对socket编程一点基础都没有的人看到了,我怕你看了之后,就果断跳过这篇文章,从此对socket产生恐惧症了。呵呵,又多说了。 socket的关键函数1: socket_create($net参数1,$stream参数2,$protocol参数3) 作用:创建一个socket套接字,说白了,就是一个网络数据流。 返回值:一个套接字,或者是false,参数错误发出E_WARNING警告 php的在线手册那里说得更清楚: socket_create创建并返回一个套接字,也称作一个通讯节点。一个典型的网络连接由 2 个套接字构成,一个运行在客户端,另一个运行在服务器端。 上面一句话是从php在线手册那里复制过来的。看到没有,这里说得意思是不是和我上面反反复复提到的客户端与服务端一模一样?呵呵。 参数1是:网络协议, 网络协议有哪些?它的选择项就下面这三个: AF_INET: IPv4 网络协议。TCP 和 UDP 都可使用此协议。一般都用这个,你懂的。 AF_INET6: IPv6 网络协议。TCP 和 UDP 都可使用此协议。 AF_UNIX: 本地通讯协议。具有高性能和低成本的 IPC(进程间通讯)。 参数2:套接字流,选项有: SOCK_STREAM SOCK_DGRAM SOCK_SEQPACKET SOCK_RAW SOCK_RDM。 这里只对前两个进行解释: SOCK_STREAM TCP 协议套接字。 SOCK_DGRAM UDP协议套接字。 欲了解更多请链接这里:http://php.net/manual/zh/function.socket-create.php 参数3:protocol协议,选项有: SOL_TCP: TCP 协议。 SOL_UDP: UDP协议。 从这里可以看出,其实socket_create函数的第二个参数和第三个参数是相关联的。 比如,假如你第一个参数应用IPv4协议:AF_INET,然后,第二个参数应用的是TCP套接字:SOCK_STREAM, 那么第三个参数必须要用SOL_TCP,这个应该不难理解。 TCP 协议套接字嘛,当然只能用TCP协议了,是不是?如果你应用UDP套接字,那么第三个参数该怎么选择我就不说了,呵呵,你懂的。 关键函数2: socket_connect($socket参数1,$ip参数2,$port参数3) 作用:连接一个套接字,返回值为true或者false 参数1:socket_create的函数返回值 参数2:ip地址 参数3:端口号 关键函数3: socket_bind($socket参数1,$ip参数2,$port参数3) 作用:绑定一个套接字,返回值为true或者false 参数1:socket_create的函数返回值 参数2:ip地址 参数3:端口号 关键函数4: socket_listen($socket参数1,$backlog 参数2) 作用:监听一个套接字,返回值为true或者false 参数1:socket_create的函数返回值 参数2:最大监听套接字个数 关键函数5: socket_accept($socket) 作用:接收套接字的资源信息,成功返回套接字的信息资源,失败为false 参数:socket_create的函数返回值 关键函数6: socket_read($socket参数1,$length参数2) 作用:读取套接字的资源信息, 返回值:成功把套接字的资源转化为字符串信息,失败为false 参数1:socket_create或者socket_accept的函数返回值 参数2:读取的字符串的长度 关键函数7: socket_write($socket参数1,$msg参数2,$strlen参数3) 作用:把数据写入套接字中 返回值:成功返回字符串的字节长度,失败为false 参数1:socket_create或者socket_accept的函数返回值 参数2:字符串 参数3:字符串的长度 关键函数8: socket_close($socket) 作用:关闭套接字 返回值:成功返回true,失败为false 参数:socket_create或者socket_accept的函数返回值 这八个函数是socket的核心函数,下面列举两个个比较重要的函数 socket_last_error($socket),参数为socket_create的返回值,作用是获取套接字的最后一条错误码号,返回值套接字code socket_strerror($code),参数为socket_last_error函数的返回值,获取code的字符串信息,返回值也就是套接字的错误信息 这两个函数在socket编程中还是很重要的,在写socket编程的时候,我觉得你还是得利用起来,特别是新手,可以当做调试用 下面就是代码了,注意注意,请认真看我的注释,注释很重要,注释很重要,注释很重要,重要的事情要大喊三遍,呵呵。 服务端脚本,D:\vhost\test\socket\server_socket.php <?php //创建服务端的socket套接流,net协议为IPv4,protocol协议为TCP $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); /绑定接收的套接流主机和端口,与客户端相对应/ if(socket_bind($socket,'127.0.0.1',8888) == false){ echo 'server bind fail:'.socket_strerror(socket_last_error()); /这里的127.0.0.1是在本地主机测试,你如果有多台电脑,可以写IP地址/ } //监听套接流 if(socket_listen($socket,4)==false){ echo 'server listen fail:'.socket_strerror(socket_last_error()); } //让服务器无限获取客户端传过来的信息 do{ /接收客户端传过来的信息/ $accept_resource = socket_accept($socket); /socket_accept的作用就是接受socket_bind()所绑定的主机发过来的套接流/ if($accept_resource !== false){ /读取客户端传过来的资源,并转化为字符串/ $string = socket_read($accept_resource,1024); /socket_read的作用就是读出socket_accept()的资源并把它转化为字符串/ echo 'server receive is :'.$string.PHP_EOL;//PHP_EOL为php的换行预定义常量 if($string != false){ $return_client = 'server receive is : '.$string.PHP_EOL; /向socket_accept的套接流写入信息,也就是回馈信息给socket_bind()所绑定的主机客户端/ socket_write($accept_resource,$return_client,strlen($return_client)); /socket_write的作用是向socket_create的套接流写入信息,或者向socket_accept的套接流写入信息/ }else{ echo 'socket_read is fail'; } /socket_close的作用是关闭socket_create()或者socket_accept()所建立的套接流/ socket_close($accept_resource); } }while(true); socket_close($socket); 小提示:请注意上面的socket_bind,socket_listen,socket_accept三个函数的执行顺序不可更改,也就是说 必须先执行socket_bind,再执行socket_listen,最后才执行socket_accept 客户端脚本,D:\vhost\test\socket\client_socket.php <?php //创建一个socket套接流 $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); /****设置socket连接选项,这两个步骤你可以省略*/ //接收套接流的最大超时时间1秒,后面是微秒单位超时时间,设置为零,表示不管它 socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 0)); //发送套接流的最大超时时间为6秒 socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 6, "usec" => 0)); /****设置socket连接选项,这两个步骤你可以省略*/ //连接服务端的套接流,这一步就是使客户端与服务器端的套接流建立联系 if(socket_connect($socket,'127.0.0.1',8888) == false){ echo 'connect fail massege:'.socket_strerror(socket_last_error()); }else{ $message = 'l love you 我爱你 socket'; //转为GBK编码,处理乱码问题,这要看你的编码情况而定,每个人的编码都不同 $message = mb_convert_encoding($message,'GBK','UTF-8'); //向服务端写入字符串信息 if(socket_write($socket,$message,strlen($message)) == false){ echo 'fail to write'.socket_strerror(socket_last_error()); }else{ echo 'client write success'.PHP_EOL; //读取服务端返回来的套接流信息 while($callback = socket_read($socket,1024)){ echo 'server return message is:'.PHP_EOL.$callback; } } } socket_close($socket);//工作完毕,关闭套接流
2019年-6月-1日
70 阅读
0 评论
未分类
2019-5-31
golang启动一个简单的http服务
package main import ( "fmt" "log" "net/http" ) // w表示response对象,返回给客户端的内容都在对象里处理 // r表示客户端请求对象,包含了请求头,请求参数等等 func index(w http.ResponseWriter, r *http.Request) { // 往w里写入内容,就会在浏览器里输出 fmt.Fprintf(w, "Hello golang http!") } func main() { // 设置路由,如果访问/,则调用index方法 http.HandleFunc("/", index) // 启动web服务,监听9090端口 err := http.ListenAndServe(":9090", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } }
2019年-5月-31日
77 阅读
0 评论
未分类
2019-5-30
go语言发送Get请求
// 第一行代码不解释了 pakcage main // 引入所需的包 import( "fmt" "net/http" "net/http/httputil" ) // 入口函数 func main () { // 创建一个HTTP请求 request,err := http.NewRequest(http.MethodGet,"http://www.baidu.com",nil); if err != nil { panic(err); } // 可以写入一些头部信息 request.Header.Add(); // 加入头部信息 resp,err := http.DefaultClient.Do(request); if err != nil { panic(err); } // 发送请求 s,err := http.DumpResponse(resp,true); if err != nil { panic(err); } // 打印输入结果 fmt.Println(string(s)); }
2019年-5月-30日
71 阅读
0 评论
未分类
2019-5-30
go语言的字符串缓存
最近在学习go语言。看到了一些不错的案列; package main import( "fmt" "bytes" ) func main () { var a string = "一个字符串"; var b string = "两个字符串"; // 申明一个字节缓冲 var stringBuilder bytes.Buffer; // 将字符串放入缓冲区 stringBuilder.WriteString(a); stringBuilder.WriteString(b); // 将缓冲区字符串取出 fmt.Println(stirngBuilder.string()); }
2019年-5月-30日
65 阅读
0 评论
未分类
2019-5-30
PHPExcel 样式调整手册
// 引用phpexcel类 $this->load->library('PHPExcel'); // 创建对象 $objPHPExcel = new PHPExcel(); // 显示错误信息 error_reporting(E_ALL); // Set properties $objPHPExcel->getProperties()->setCreator("1245049149@qq.com") ->setLastModifiedBy("1245049149@qq.com") ->setTitle("Office 2007 XLSX Test Document") ->setSubject("Office 2007 XLSX Test Document") ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") ->setKeywords("office 2007 openxml php") ->setCategory("Test result file"); // 字体和样式 $objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setSize(12); //字体大小 $objPHPExcel->getActiveSheet()->getStyle('A2:D2')->getFont()->setBold(false); //第二行是否加粗 $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true); //第一行是否加粗 $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize(16); //第一行字体大小 $objPHPExcel->getActiveSheet()->getStyle('A2')->getFont()->setSize(14); //第二行字体大小 $objPHPExcel->getActiveSheet()->getStyle('A6')->getFont()->setSize(14); //第六行字体大小 $objPHPExcel->getActiveSheet()->getStyle('A11')->getFont()->setSize(14); //第十一行字体大小 // 设置垂直居中 $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle('A2:D2')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); // 设置水平居中 $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle('A3:G5')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle('A7:G10')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle('A12:B15')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //设置左对齐 $objPHPExcel->getActiveSheet()->getStyle('A2')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT); $objPHPExcel->getActiveSheet()->getStyle('A6')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT); $objPHPExcel->getActiveSheet()->getStyle('A11')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT); // 设置行高度 $objPHPExcel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(20); //设置默认行高 $objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(30); //第一行行高 //设置单元格宽度 $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20); $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(20); $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(20); $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(20); $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(20); $objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(20); $objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(20); // 合并 $objPHPExcel->getActiveSheet()->mergeCells('A1:G1'); $objPHPExcel->getActiveSheet()->mergeCells('A2:G2'); $objPHPExcel->getActiveSheet()->mergeCells('A6:G6'); $objPHPExcel->getActiveSheet()->mergeCells('A11:B11'); // 设置内容 $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A1', '利润核算统计') ->setCellValue('A2', '【用户充值】') ->setCellValue('A3', '费率') ->setCellValue('B3', '笔数 ') ->setCellValue('C3', '充值进账') ->setCellValue('D3', '手续费') ->setCellValue('E3', '利润') ->setCellValue('A4', '1.0%') ->setCellValue('B4', $pay_log_list['aa']) ->setCellValue('C4', $pay_log_list['bb']) ->setCellValue('D4', $pay_log_list['cc']) ->setCellValue('E4', $pay_log_list['dd']) ->setCellValue('A5', '合计') ->setCellValue('B5', $pay_log_list['ee']) ->setCellValue('C5', $pay_log_list['ff']) ->setCellValue('D5', $pay_log_list['gg']) ->setCellValue('E5', $pay_log_list['hh']) ->setCellValue('A6', '【用户提现】') ->setCellValue('A7', '类别') ->setCellValue('B7', '笔数') ->setCellValue('C7', '申请提现') ->setCellValue('D7', '手续费') ->setCellValue('E7', '快钱提现') ->setCellValue('F7', '手续费') ->setCellValue('G7', '利润') ->setCellValue('A8', '收取手续费') ->setCellValue('B8', $withdraw_list['ii']) ->setCellValue('C8', $withdraw_list['kk']) ->setCellValue('D8', $withdraw_list['ll']) ->setCellValue('E8', $withdraw_list['mm']) ->setCellValue('F8', $withdraw_list['nn']) ->setCellValue('G8', $withdraw_list['oo']) ->setCellValue('A9', '未收取手续费') ->setCellValue('B9', $withdraw_list['pp']) ->setCellValue('C9', $withdraw_list['qq']) ->setCellValue('D9', $withdraw_list['rr']) ->setCellValue('E9', $withdraw_list['ss']) ->setCellValue('F9', $withdraw_list['tt']) ->setCellValue('G9', $withdraw_list['ww']) ->setCellValue('A10', '合计') ->setCellValue('B10', $withdraw_list['uu']) ->setCellValue('C10', $withdraw_list['vv']) ->setCellValue('D10', $withdraw_list['xx']) ->setCellValue('E10', $withdraw_list['yy']) ->setCellValue('F10', $withdraw_list['zz']) ->setCellValue('G10', $withdraw_list['aaa']) ->setCellValue('A11', '【利润汇总】') ->setCellValue('A12', '充值手续费收') ->setCellValue('B12', $all_summary['bbb']) ->setCellValue('A13', '提现手续费支') ->setCellValue('B13', $all_summary['ccc']) ->setCellValue('A14', '快钱提现手续费支') ->setCellValue('B14', $all_summary['ddd']) ->setCellValue('A15', '利润') ->setCellValue('B15', $all_summary['eee']); // Rename sheet $objPHPExcel->getActiveSheet()->setTitle('利润核算表'); // Set active sheet index to the first sheet, so Excel opens this as the first sheet $objPHPExcel->setActiveSheetIndex(0); // 设置输出 $tableName = '利润核算表【'.$st.'--'.$et.'】'; header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="' .$tableName. '.xls"'); header('Cache-Control: max-age=0'); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output'); exit;
2019年-5月-30日
58 阅读
0 评论
未分类
2019-5-26
[整理]golang文件复制操作
package main import( "fmt" "os" "io" ) func main () { var a string; var b string; fmt.Println("请输入源文件名:"); fmt.Scanf("%s",&a); fmt.Println("请输入目标文件名:"); fmt.Scanf("%s",&b); fp1,err := os.Open(a); if err != nil { fmt.Println("打开源文件失败"); } fp2,err1 := os.Create(b); if err1 != nil { fmt.Println("创建目标文件失败"); } var c = make([]byte,10); // var d []byte; for { n,err := fp1.Read(c); if err == io.EOF { fmt.Println("恭喜,复制完成"); break; } fp2.Write(c[:n]); } }
2019年-5月-26日
66 阅读
0 评论
未分类
11
12
13
14
15