首页
高清壁纸
统计
留言
推荐
Json工具
Search
1
通过iframe嵌套时,被302重定向怎么办?
2,360 阅读
2
关于 MySQL Binlog 权限
1,106 阅读
3
Windows安装PECL
1,018 阅读
4
JS常用监听事件【监听键盘、触控、鼠标、多媒体、打印、剪贴板、表单等事件】
1,014 阅读
5
JS实现Web应用或网站发送浏览器Notification通知
778 阅读
抽奖系统
tony爱编程
收藏分享
经验总结
其它杂类
常用工具
登录
Search
标签搜索
抽奖系统
html+JS
抽奖HTA
js
MySQL
HTA版
源码
hta属性
ecshop
Meta
拖动
javascript
MySQL函数
git提交慢
提交卡
laravel-admin
FSO
redis
文件操作
mysql备份
Tony哥
累计撰写
55
篇文章
累计收到
11
条评论
首页
栏目
抽奖系统
tony爱编程
收藏分享
经验总结
其它杂类
常用工具
页面
高清壁纸
统计
留言
推荐
Json工具
搜索到
25
篇与
的结果
2023-10-13
php swoole的并发查询封装
说明:这是基于swoole_process封装的一个并发执行类,代码实现您可以做下参考! 个人在项目上用还是有挺好用的,使用时需要注意的是如果您使用的不是laravels框架,那么要注意以下两个地址根据您的框架做下调整:DB::disconnect(); 看您的框架使用哪个方法,意思是每创建一个进程需要断开重连一个mysql否则可能会造成报错,当然如果你的并发中不牵扯到sql查询可以注释掉这个Cache:: 缓存支持,由于通道支持处理的字符有限,我们通过缓存来实现数据的交换,根据您的框架支持或干脆使用redis实现数据交换即可,这里您可以自行改造。好了我们直接上代码: /** * 并发请求类 - 不支持并发将自动使用串行 * @return object {"getKey":"获取key",“getCount”:"获取并发数","add":"添加并发任务","run":"开始运行任务并返回结果","onError":"监听错误信息","onSuccess":"监听成功信息"} * @example $P = cdpProcess(); * $P->add( * function(){ * return 任务结果 * }, * "[可选]自定义id" //返回任务结果键名将为此值 * ); * $data = $P->run(); //开始任务 */ function cdpProcess() { return new class { private $uuid; private $installed = 0; private $worker = []; private $errCall = []; private $dataCall = []; private $index = 0; public function __construct() { if (function_exists("swoole_version")) { $this->installed = 1; } $this->uuid = uniqid(mt_rand(1, 100)); } public function getKey(): string { return $this->uuid; } public function getCount(): int { return count($this->worker); } /** * 添加执行方法进入队列 * @param callable $callback 任务逻辑回调 * @param int|string $index_name 可选任务自定义id否则 * @return $this */ public function Add(callable $callback, $index_name = null) { $key = $this->getKey()."_".$this->index; if ($this->installed) { $pro = new \swoole_process(function (\swoole_process $work) use ($callback, $index_name, $key) { try { DB::disconnect(); //始终使用新连接规避并发冲突 $d = $callback($index_name); Cache::put( $index = 'Process:' . $key, json_encode($d, 320), 5 ); $work->write('{"key":"' . $index . '","index_name":"' . $index_name . '"}'); } catch (\Exception $e) { $work->write(json_encode(['err' => $e->getMessage()])); } $work->exit(0); }, true); $this->worker[] = $pro; } else { $this->worker[] = new class($callback, $index_name) { private $callback; private $index_name; public function __construct(callable $callback, $index_name = null) { $this->callback = $callback; $this->index_name = $index_name; } public function start() { try { $d = ($this->callback)($this->index_name); } catch (\Exception $e) { $d = ['err' => $e->getMessage()]; } return [$d, $this->index_name]; } }; } $this->index++; return $this; } /** * 错误回调 * @param callable $errCallBack * @return $this */ public function onError(callable $errCallBack) { $this->errCall[] = $errCallBack; return $this; } /** * 完成数据回调 * @param callable $dataCallBack * @return $this */ public function onSuccess(callable $dataCallBack) { $this->dataCall[] = $dataCallBack; return $this; } /** * 启动并返回结果 * @return array */ public function run(): array { $data = $err = []; foreach ($this->worker as $i => $pro) { $s = $pro->start(); if (!$this->installed) { empty($s[1]) || $i = $s[1]; if (!empty($s[0]['err'])) $err[$i] = $s[0]['err']; else $data[$i] = $s[0]; } } if ($this->installed) { foreach ($this->worker as $i => $pro) { if (!empty($d = $pro->read())) { $d = json_decode($d, 1); empty($d["index_name"]) || $i = $d["index_name"]; if (!empty($d['err'])) $err[$i] = $d['err']; else { $data[$i] = json_decode(Cache::pull($d['key'], null), 1); } } unset($this->worker[$i]); } while (\swoole_process::wait()); } empty($err) && $this->ErrCallback($err); $this->DataCallback($data); return $data; } private function ErrCallback(array $err) { foreach ($this->errCall as $fun) { try { $fun($err); } catch (\Exception $e) { } } } private function DataCallback(array $data) { foreach ($this->dataCall as $fun) { try { $fun($data); } catch (\Exception $e) { } } } }; }
2023年10月13日
223 阅读
0 评论
0 点赞
2023-08-25
HTML 屏蔽F12及右键的通用方法
<h1>HTML 屏蔽F12及右键的通用方法</h1> <script type="text/javascript"> //禁用F12 window.onkeydown = window.onkeyup = window.onkeypress = function (event) { // 判断是否按下F12,F12键码为123 if (event.keyCode == 123) { event.preventDefault(); // 阻止默认事件行为 window.event.returnValue = false; } } //屏蔽右键菜单 document.oncontextmenu = function (event) { if (window.event) { event = window.event; } try { var the = event.srcElement; if (!((the.tagName == "INPUT" && the.type.toLowerCase() == "text") || the.tagName == "TEXTAREA")) { return false; } return true; } catch (e) { return false; } } </script>
2023年08月25日
272 阅读
0 评论
1 点赞
2023-05-08
laravel-admin 提交表单时遇到 “Call to a member function getAttribute() on null” 报错的解决
先看下报错内容:{ "message": "Call to a member function getAttribute() on null", "exception": "Error", "file": "D:\\WWW\\src\\vendor\\encore\\laravel-admin\\src\\Form.php", "line": 413, "trace": [ { "file": "D:\\WWW\\src\\vendor\\encore\\laravel-admin\\src\\Form.php", "line": 393, "function": "applayFieldDisplay", "class": "Encore\\Admin\\Form", "type": "->" }, { "file": "D:\\WWW\\src\\vendor\\encore\\laravel-admin\\src\\Form.php", "line": 352, "function": "ajaxResponse", "class": "Encore\\Admin\\Form", "type": "->" }, ... }这是一个快捷表单提交问题的报错问题,问题困扰了我好长时间,起初以为是我哪里我弄错类型了,反复尝试无果,最终顺着错误来源去撸了一遍,发现“src/vendor/encore/laravel-admin/src/Form.php”的 413行 $newValue = $this->model->fresh()->getAttribute($field->column());的fresh返回null 所以导致 “getAttribute” 报错,好了我们寻找下 fresh 看是做啥用的Reload a fresh model instance from the database.这么一看没问题,这是从数据库加载实例用的,那我就无解了,只能怀疑是 “$this->exists” 了,继续撸,于是我找到了这个方法,马上顿悟!报错是因为没有执行到 $this->exists = true; 导致实例为空,我看了下注释解决思路来了,原来表设计的时候我的id主键是非自增的,需要我在模型中明确为非自增解决:找到我的model,新增一行 public $incrementing=false; 搞定
2023年05月08日
518 阅读
0 评论
0 点赞
2023-04-14
laravel-admin中单独定义某页面模板 如“footer.blade.php”
关于laravel-admin仅仅修改个版权的事儿在网上搜了一圈,想只想改改版权,不想动别的,但是结果基本上都是官网提供的帮助文档的方法直接修改所有模板的路径copy模板,后面再升级了万一遇上个啥结构变化都要再改一遍属实有些坑啊,于是咱们就找到了laravel的视图的基本监听方法composer,结果解决了问题。好了直接上代码:还是老办法 打开/app/Admin/bootstrap.php,添加下面代码/** * 定制单页面模板 */ app('view')->composer('admin::*', function (Illuminate\View\View $view) { $views=[ 'admin::partials.footer'=>[ 'path' => resource_path('views/footer.blade.php') ] ]; if(!empty($views[$index=$view->getName()])){ $view->setPath($views[$index]['path']); } });搞个模板/resources/views/footer.blade.phpp<!-- Main Footer --> <footer class="main-footer"> <!-- To the right --> <div class="pull-right hidden-xs"> @if(config('admin.show_environment')) <strong>Env</strong> {!! config('app.env') !!} @endif @if(config('admin.show_version')) <strong>Version</strong> {!! \Encore\Admin\Admin::VERSION !!} @endif </div> <!-- Default to the left --> <strong>Powered by <a href="http://www.archn.cn" target="_blank">技术支持</a></strong> </footer> 大功告成 ::(茶杯)
2023年04月14日
191 阅读
0 评论
0 点赞
2023-02-24
laravel或lumen将日志上报至kafka
lumen或laravel 将日志上报至kafka大家都清楚 Lumen 算是一个精简版的 Laravel,针对速度优化了框架的加载方式,多余的功能需要自行开启。那么在精简版中日志的上报配置方面lumen也做了精简,本文中将分别介绍这两者日志上报的基本方法,咱们主要还是依赖hhxsv5/laravel-kafka-logger,下面是方法和步骤(Laravel 和 lumen的安装咱们就略过了)咱们先安装php的rdkafka扩展要求依赖要求php-rdkafka>=4.0.0安装方法git clone --depth 1 https://github.com/edenhill/librdkafka.git /tmp/librdkafka && cd /tmp/librdkafka && ./configure && make -j$(nproc) && make install && rm -rf /tmp/librdkafka pecl install rdkafka安装 laravel-kafka-logger在项目目录,根据您的项目版本运行如下脚本# Laravel 5.x composer require "hhxsv5/laravel-kafka-logger:~1.0.0" # Laravel 6.x & 7.x composer require "hhxsv5/laravel-kafka-logger:~2.0.0"lavael 上配置修改配置文件 config/logging.phpreturn [ 'channels' => [ //..., 'kafka' => Hhxsv5\LKL\KafkaLogger::getDefinition(['topic' => env('LOG_KAFKA_TOPIC', 'laravel-logs')]), ], ];lumen 上配置在app/Providers目录新增日志扩展类LogServiceProvider.php<?php namespace App\Providers; use Hhxsv5\LKL\KafkaLogHandler; use Illuminate\Support\ServiceProvider; use RdKafka\Conf; use Monolog\Logger; class LogServiceProvider extends ServiceProvider { /** * Configure logging on boot. * * @return void */ public function boot() { $this->createLogger([ 'driver' => 'custom', 'via' => static::class, 'name' => config('app.name'), 'topic' => env('LOG_KAFKA_TOPIC', 'php-logs'), 'fallback' => 'daily', 'flush_timeout_ms' => 5000, 'settings' => [ // see https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md 'metadata.broker.list' => env('LOG_KAFKA_BROKER_LIST', '127.0.0.1:9092'), 'queue.buffering.max.ms' => 3000, // < flush_timeout_ms, send messages ASAP 'socket.keepalive.enable' => true, 'log_level' => LOG_WARNING, ], // 'tap' => [App\Library\LogFormatter::class], //--格式化日志 ]); } /** * Register the log service. * * @return void */ public function register() { } private function createLogger($config){ if (!isset($config['fallback'])) { $config['fallback'] = 'daily'; } if (!isset($config['flush_timeout_ms'])) { $config['flush_timeout_ms'] = 60000; } if (!isset($config['level'])) { $config['level'] = Logger::DEBUG; } if (!isset($config['bubble'])) { $config['bubble'] = true; } $producerConf = new Conf(); foreach ($config['settings'] as $key => $value) { $producerConf->set($key, $value); } $producerConf->setLogCb(function ($kafka, $level, $facility, $message) use ($config) { app('log')->channel($config['fallback'])->info(sprintf('KafkaLogger %s: %s (level: %d)', $facility, $message, $level)); }); $producerConf->setErrorCb(function ($kafka, $err, $reason) use ($config) { app('log')->channel($config['fallback'])->error(sprintf('KafkaLogger error: %s (reason: %s)', rd_kafka_err2str($err), $reason)); }); $producerConf->setDrMsgCb(function ($kafka, $message) use ($config) { if ($message->err) { app('log')->channel($config['fallback'])->error(sprintf('KafkaLogger delivery fail: %s', $message->errstr())); } }); $handler = new KafkaLogHandler($config['name'], $producerConf, $config['topic'], null, $config['fallback'], $config['flush_timeout_ms'], $config['level'], $config['bubble']); $this->app['log']->setHandlers([$handler]); return $this->app['log']; } }注册类到bootstrap/app.php$app->register(\App\Providers\LogServiceProvider::class);最后步骤修改或新增.env配置文件如下内容LOG_CHANNEL=kafka # 注意:这一行lumen不要加的,否则白给 LOG_KAFKA_BROKER_LIST=kafka:9092 # 多个用英文逗号间隔 LOG_KAFKA_TOPIC=laravel-logs测试Log::info('测试日志', ['ok-uid-hhxsv5']);{dotted startColor="#ff6c6c" endColor="#1989fa"/}大功告成,祝顺利!
2023年02月24日
248 阅读
0 评论
0 点赞
2023-01-12
在JS中利用for...in循环遍历对象【踩坑】
for...in循环可以在js中遍历对象或者数组,比如当我们想要输出内容中的所有对象,就可以使用for...in循环//使用方法 for(键 in 对象) var obj={ name:'Zhang', score:60, result:'及格' } for(var ergodic in obj){ console.log(obj[ergodic]); }运行结果如果我们想隐藏(删除)部分内容,可以使用delete进行操作<!DOCTYPE HTML> <html> <head> <meta charset=utf-8" /> <title>CSDN Wellfancy</title> </head> <body> <div></div> <script> //使用方法 for(键 in 对象) var obj={ name:'Zhang', score:60, result:'及格' } delete obj.score;//隐藏obj中score的值 for(var ergodic in obj){ console.log(obj[ergodic]); } </script> </body> </html>运行结果:for in 的踩坑但实际上往往再引用了很多其它框架后,由于每个库写法的不确定性可能会用到一些影响对象特有属性的一些写法如:prototype、__proto__与constructor等,那么for in 去遍历时就出现了一些事情举例:某个js类中声明了一个:window.xyz={};window.xyz.__proto__.abcd=1123;那么您的所有对象中都会被新增了一个abcd,那么循环出来的结果将是Zhang 60 及格 1123我们来看下影响对象属性的一些属性定义首先,我们需要牢记两点:①__proto__和constructor属性是对象所独有的;② prototype属性是函数所独有的。但是由于JS中函数也是一种对象,所以函数也拥有__proto__和constructor属性,这点是致使我们产生困惑的很大原因之一。举个例子:function Foo() {...}; let f1 = new Foo();以上代码表示创建一个构造函数Foo(),并用new关键字实例化该构造函数得到一个实例化对象f1。这里稍微补充一下new操作符将函数作为构造器进行调用时的过程:函数被调用,然后新创建一个对象,并且成了函数的上下文(也就是此时函数内部的this是指向该新创建的对象,这意味着我们可以在构造器函数内部通过this参数初始化值),最后返回该新对象的引用 虽然是简简单单的两行代码,然而它们背后的关系却是错综复杂的,如下图所示: 上图有些复杂,如果不理解可以略过...详细了解...其实您知道"abcd"不是我们要的解决方案如下:<!DOCTYPE HTML> <html> <head> <meta charset=utf-8" /> <title>CSDN Wellfancy</title> </head> <body> <div></div> <script> //使用方法 for(键 in 对象) window.xyz={}; window.xyz.__proto__.abcd=1123; var obj={ name:'Zhang', score:60, result:'及格' } delete obj.score;//隐藏obj中score的值 for(var ergodic in obj){ if (obj.hasOwnProperty(ergodic)) { console.log(obj[ergodic]); } } </script> </body> </html>综上所属,建议我们采用for in遍历对象时都加入hasOwnProperty的判断,以免后续逻辑被未知框架声明所污染
2023年01月12日
365 阅读
0 评论
1 点赞
2023-01-12
你不知道的JavaScript事件总结(详细)
JavaScript操作css称为脚本化CSS,而JavaScript与HTML的交互是通过事件实现的。事件就是文档或浏览器窗口中发生的一些特定的交互瞬间,而事件流(又叫事件传播)描述的是从页面中接收事件的顺序。...
2023年01月12日
252 阅读
0 评论
0 点赞
2023-01-09
通过iframe嵌套时,被302重定向怎么办?
项目中发现,多系统通过iframe嵌套时,如果iframe的请求是重定向会导致父级页面重定向,怎么破?最终的设置(不包含allow-top-navigation即可){mtitle title="实现代码如下"/}1、在 PC 端你可以这样设置 iframe, 来防止父级页面被重定向, 产生重定向结果的链接会以 _blank 的形式打开<iframe src="page-b.html" sandbox="allow-forms allow-scripts allow-same-origin allow-popups"></iframe>2、在移动端你需要这样设置 iframe, 让产生重定向结果的链接失效, 来达到防止父级页面被重定向的目的<iframe src="page-b.html" sandbox="allow-forms allow-scripts allow-same-origin"></iframe>
2023年01月09日
2,360 阅读
0 评论
2 点赞
2022-09-15
关于 MySQL Binlog 权限
MySQL Binlog 权限Check binlog statusshow variables like 'log_bin'; show variables like 'binlog_format'; MySQL Binlog权限需要三个权限 SELECT, REPLICATION SLAVE, REPLICATION CLIENTGRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%' IDENTIFIED BY 'canal'; 缺乏SELECT权限时,报错为com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user 'canal'@'%' to database 'binlog' 缺乏REPLICATION SLAVE权限时,报错为java.io.IOException: Error When doing Register slave:ErrorPacket [errorNumber=1045, fieldCount=-1, message=Access denied for user 'canal'@'%' 缺乏REPLICATION CLIENT权限时,报错为com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied; you need (at least one of) the SUPER, REPLICATION CLIENT privilege(s) for this operationBinlog为什么需要这些权限:Select权限代表允许从表中查看数据Replication client权限代表允许执行show master status,show slave status,show binary logs命令Replication slave权限代表允许slave主机通过此用户连接master以便建立主从 复制关系
2022年09月15日
1,106 阅读
2 评论
1 点赞
2022-02-23
meta标签强制客户端浏览器为google内核+兼容+双核
meta代码:// 强制客户端浏览器为google内核 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> // 设置谷歌内核 <meta name="renderer" content="webkit">360浏览器的head头部有一行代码作为参考:<meta name=“renderer” content=“webkit|ie-comp|ie-stand”>说明:content的取值为webkit,ie-comp,ie-stand之一,区分大小写,分别代表用极速模式,兼容模式,IE模式打开;极速模式:使用谷歌内核;兼容模式:使用IE(Trident内核)。
2022年02月23日
130 阅读
0 评论
1 点赞
2022-02-11
JS的一些自定义函数(图片转base64、笛卡尔积、copy文本、文本框选中)
以下是以往用过的一些简单方法,供大家参考一下:/** * 文本框选中文字逻辑 * @param object textBox textarea 对象 * @param int|string start 选择开始索引或被选中文字的字符串 * @param int|null end */ function textareaSelect(textBox, start, end) { if (typeof textBox != 'object') { console.log('textareaSelect方法第一个参数应该为textarea对象'); return; } if (textBox instanceof jQuery) textBox = textBox[0]; if (!end) { let i = textBox.value.indexOf('' + start); end = i + ('' + start).length; start = i; } if (textBox.setSelectionRange) { textBox.setSelectionRange(start, end); } else if (textBox.createTextRange) { var rang = textBox.createTextRange(); rang.collapse(true); rang.moveStart('character', start); rang.moveEnd('character', end - start); rang.select(); } textBox.focus(); } /** * 转base64图片 * @param imgUrl 图片路径 * @param w 调整宽 仅填写一个参数为等比例缩放 * @param h 调整高 仅填写一个参数为等比例缩放 * @param callback 回调 错误返回false及错误码 */ function toBase64(imgUrl, callback, w, h) { if (!imgUrl) callback(false, '图片路径不存在或类型问题'); let image = new Image(); image.crossOrigin = ''; image.referrerPolicy = "no-referrer"; image.rel = "noreferrer"; image.src = imgUrl; image.onload = function () { if (!w && !h) { w = 0; h = 0; } else if (!(w && h)) if (w) h = image.height * (w / image.width); else w = image.width * (h / image.height); let c = document.createElement("canvas"); c.width = w ? w : image.width; c.height = h ? h : image.height; let ctx = c.getContext("2d"); ctx.drawImage(image, 0, 0, c.width, c.height); callback(canvas.toDataURL()); }; } /** * 笛卡尔积算法 * 传入数组集合,如cartesianProductOf(...[[1,2],[3,4]]) * @returns {T | (function(*=, *): Array)} */ function cartesianProductOf() { return Array.prototype.reduce.call(arguments, function (a, b) { let ret = []; a.forEach(function (a) { b.forEach(function (b) { ret.push(a.concat([b])); }); }); return ret; }, [[]]); } /** * copy文本内容 * @param value */ function copy(value) { let cpInput = document.createElement("input"); cpInput.setAttribute("id", "cp_input"); cpInput.setAttribute("type", "text"); cpInput.style.position = "absolute"; cpInput.style.top = "-500px"; cpInput.style.left = "-100px"; cpInput.value = value; document.body.appendChild(cpInput); document.getElementById("cp_input").select(); document.execCommand("copy"); document.getElementById('cp_input').remove(); }
2022年02月11日
180 阅读
0 评论
0 点赞
2022-02-11
php7.4对低版本的mysql内置函数的兼容支持
对一些低版本运行的php程序改造或许会有些用哦//--高版本的mysql支持 $dbhost = DB_HOST; $dbport = 3306; $dbuser = DB_USER; $dbpass = DB_PASSWD; $dbname = DB_NAME; if(!function_exists('mysql_connect')){ function mysql_connect($dbhost, $dbuser, $dbpass){ global $dbport; global $dbname; global $mysqli; $mysqli = mysqli_connect("$dbhost:$dbport", $dbuser, $dbpass, $dbname); return $mysqli; } function mysql_select_db($dbname){ global $mysqli; return mysqli_select_db($mysqli,$dbname); } function mysql_fetch_array($result){ return mysqli_fetch_array($result); } function mysql_fetch_assoc($result){ return mysqli_fetch_assoc($result); } function mysql_fetch_row($result){ return mysqli_fetch_row($result); } function mysql_query($query){ global $mysqli; return mysqli_query($mysqli,$query); } function mysql_escape_string($data){ global $mysqli; return mysqli_real_escape_string($mysqli, $data); } function mysql_real_escape_string($data){ return mysql_real_escape_string($data); } function mysql_close(){ global $mysqli; return mysqli_close($mysqli); } function mysql_num_rows($result){ return mysqli_num_rows($result); } function mysql_num_fields($result){ return mysqli_num_fields($result); } function mysql_insert_id(){ global $mysqli; return $mysqli->insert_id; } function mysql_error(){ global $mysqli; return mysqli_error($mysqli); } function mysql_errno(){ global $mysqli; return mysqli_errno($mysqli); } function mysql_affected_rows(){ global $mysqli; return mysqli_affected_rows($mysqli); } function mysql_get_server_info(){ global $mysqli; return mysqli_get_server_info($mysqli); } define('MYSQL_ASSOC',0); }
2022年02月11日
180 阅读
0 评论
0 点赞
2019-12-03
git 提交很慢或者卡住writing objects的解决方法
需要执行以下代码git config --global http.postBuffer 524288000再 进行提交,秒传
2019年12月03日
338 阅读
0 评论
0 点赞
2018-07-24
JS 下载文件方法,解决浏览器URL长度限制(href限制问题超过2M怎么办?)
下载方案,网上有很多方法 转换为a 加入下载标识的方法,可惜大一点的文件来说的话是不适用的,tony推荐以下方案有效规避 href src 长度限制问题,别的不多讲了,直接看码IMGS={//下载图片 download(imgData,name) { this.downloadFile(name?name:'test', imgData); }, //下载 downloadFile(fileName, content) { let aLink = document.createElement('a'); let blob = this.base64ToBlob(content); //new Blob([content]); let evt = document.createEvent("HTMLEvents"); evt.initEvent("click", true, true);//initEvent 不加后两个参数在FF下会报错 事件类型,是否冒泡,是否阻止浏览器的默认行为 aLink.download = fileName; aLink.href = URL.createObjectURL(blob); // aLink.dispatchEvent(evt); aLink.click() }, //base64转blob base64ToBlob(code) { let parts = code.split(';base64,'); let contentType = parts[0].split(':')[1]; let raw = window.atob(parts[1]); let rawLength = raw.length; let uInt8Array = new Uint8Array(rawLength); for (let i = 0; i < rawLength; ++i) { uInt8Array[i] = raw.charCodeAt(i); } return new Blob([uInt8Array], {type: contentType}); }, };以上方法重点在哪呢? base64ToBlob 没有错,以下是执行例子IMGS.download('data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==','下载');
2018年07月24日
407 阅读
0 评论
0 点赞
2018-06-26
IIS7.5使用web.config设置伪静态的二种方法
近几天公司里开发的项目有几个运行在IIS7.5上,由于全站采用的是伪静态,因此从网上找到两两种方法来实现。这两种方法各有优势:第一种比较灵活,只要把文件拷到根目录下,即可直接显示所有伪静态页面(适用于此伪静态规则的所有项目,如ThinkPHP),无需更改代码;第二种适合有子目录时的伪静态,比如一个网站下有多个子网站且都要使用伪静态,那么就考虑使用第二种方法了,第一种会报错误。两种方法,自己根据情况使用吧(当然,并不是适用所有项目,可以根据项目的伪静态规则自行调整)。以下是代码
2018年06月26日
238 阅读
0 评论
0 点赞
2017-09-07
mysql中是否有类似于eval的写法的,答案在这里
在我们写sql的时候,经常可能会遇到同一个问题:mysql是否具备eval的功能从而使我的变量动态加载到对应的sql语句中:<?php eval('echo "abc";'); ?> <sctipt> var s=eval("{'a':'123456'}"); </script> //---您的mysql也想玩eval?答案是肯定的,没有,但是不要灰心 有个一个很好用的方法来替代:PREPARE statement_name FROM sql_text /*定义*/ EXECUTE statement_name [USING variable [,variable...]] /*执行预处理语句*/ DEALLOCATE PREPARE statement_name /*删除定义*/ 例子:mysql> PREPARE prod FROM "INSERT INTO examlple VALUES(?,?)"; mysql> SET @p='1'; mysql> SET @q='2'; mysql> EXECUTE prod USING @p,@q; mysql> SET @name='3'; mysql> EXECUTE prod USING @p,@name; mysql> DEALLOCATE PREPARE prod; 使用 PREPARE 的几个注意点: A:PREPARE stmt_name FROM preparable_stmt;预定义一个语句,并将它赋给 stmt_name ,tmt_name 是不区分大小写的。 B: 即使 preparable_stmt 语句中的 ? 所代表的是一个字符串,你也不需要将 ? 用引号包含起来。 C: 如果新的 PREPARE 语句使用了一个已存在的 stmt_name ,那么原有的将被立即释放! 即使这个新的 PREPARE 语句因为错误而不能被正确执行。 D: PREPARE stmt_name 的作用域是当前客户端连接会话可见。 E: 要释放一个预定义语句的资源,可以使用 DEALLOCATE PREPARE 句法。 F: EXECUTE stmt_name 句法中,如果 stmt_name 不存在,将会引发一个错误。 G: 如果在终止客户端连接会话时,没有显式地调用 DEALLOCATE PREPARE 句法释放资源,服务器端会自己动释放它。 H: 在预定义语句中,CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE, 和大部分的 SHOW 句法被支持。 I: PREPARE 语句不可以用于存储过程,自定义函数!但从 MySQL 5.0.13 开始,它可以被用于存储过程,仍不支持在函数中使用!当然一个悲剧的坏消息最后告诉你:这个东西好用但是不要妄想给他封装到哪个函数里面这个虽然能解决问题不要想用到触发器里面,甚至造到存储过程中用触发器引用也是不被允许的看完上面两点请冷静一下洗洗睡吧 建议: 你可以 把他封装到存储过程中用动态语言调用 这个是可以玩得转的哦!
2017年09月07日
260 阅读
0 评论
0 点赞
2017-07-05
JSON排序方法 - 原生sort方法扩展
/* JSON排序方法 - 原生sort方法扩展 var obj = [ {b: '3', c: 'c'}, {b: '1', c: 'a'}, {b: '2', c: 'b'} ]; obj.sort(sortBy('b', false, parseInt)); console.log(obj); 按照b的数字大小排序 正序 obj.sort(sortBy('b', false, String)); console.log(obj); 按照b的字符串大小排序 正序 ---------------------------------------------- @function filed 要排序的键值 @param rev 正序或者倒叙 false正序 true倒叙 @param primer 排序比较格式化方法 parseInt String 或其它自定义的函数 */ var sortBy = function (filed, rev, primer) { rev = (rev) ? -1 : 1; return function (a, b) { a = a[filed]; b = b[filed]; if (primer && typeof (primer) != 'undefined') { a = primer(a); b = primer(b); }else{ if(!isNaN(a) && !isNaN(a)){ a = Number(a); b = Number(b); } } if (a < b) { return rev * -1; } if (a > b) { return rev * 1; } return 1; } };以下是排序案例://声明一个json数组 var obj = [ {b: '3', c: 'c'}, {b: '1', c: 'a'}, {b: '2', c: 'b'} ]; //自动识别排序,如果b是数字按照数字排序 obj.sort(sortBy('b', false)); console.log(obj); //按照b的整数排序 obj.sort(sortBy('b', false, parseInt)); console.log(obj); //按照b的字符串 obj.sort(sortBy('b', false, String)); console.log(obj);
2017年07月05日
173 阅读
0 评论
0 点赞
2016-11-15
JavaScript删除数组重复元素的5个高效算法-变内置方法
1.遍历数组法最简单的去重方法, 实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中;注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 方法,IE8以下不支持,需多写一些兼容低版本浏览器代码,源码如下:// 最简单数组去重法 function unique1(array){ var n = []; //一个新的临时数组 //遍历当前数组 for(var i = 0; i < array.length; i++){ //如果当前数组的第i已经保存进了临时数组,那么跳过, //否则把当前项push到临时数组里面 if (n.indexOf(array[i]) == -1) n.push(array[i]); } return n; }// 判断浏览器是否支持indexOf ,indexOf 为ecmaScript5新方法 IE8以下(包括IE8, IE8只支持部分ecma5)不支持 if (!Array.prototype.indexOf){ // 新增indexOf方法 Array.prototype.indexOf = function(item){ var result = -1, a_item = null; if (this.length == 0){ return result; } for(var i = 0, len = this.length; i < len; i++){ a_item = this[i]; if (a_item === item){ result = i; break; } } return result; } } 2.对象键值对法该方法执行的速度比其他任何方法都快, 就是占用的内存大一些;实现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入新数组。注意点: 判断是否为js对象键时,会自动对传入的键执行“toString()”,不同的键可能会被误认为一样;例如: a[1]、a["1"] 。解决上述问题还是得调用“indexOf”。// 速度最快, 占空间最多(空间换时间) function unique2(array){ var n = {}, r = [], len = array.length, val, type; for (var i = 0; i < array.length; i++) { val = array[i]; type = typeof val; if (!n[val]) { n[val] = [type]; r.push(val); } else if (n[val].indexOf(type) < 0) { n[val].push(type); r.push(val); } } return r; }3.数组下标判断法还是得调用“indexOf”性能跟方法1差不多,实现思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组。function unique3(array){ var n = [array[0]]; //结果数组 //从第二项开始遍历 for(var i = 1; i < array.length; i++) { //如果当前数组的第i项在当前数组中第一次出现的位置不是i, //那么表示第i项是重复的,忽略掉。否则存入结果数组 if (array.indexOf(array[i]) == i) n.push(array[i]); } return n; }4.排序后相邻去除法虽然原生数组的”sort”方法排序结果不怎么靠谱,但在不注重顺序的去重里该缺点毫无影响。实现思路:给传入数组排序,排序后相同值相邻,然后遍历时新数组只加入不与前一值重复的值。// 将相同的值相邻,然后遍历去除重复值 function unique4(array){ array.sort(); var re=[array[0]]; for(var i = 1; i < array.length; i++){ if( array[i] !== re[re.length-1]) { re.push(array[i]); } } return re; }5.优化遍历数组法源自外国博文,该方法的实现代码相当酷炫;实现思路:获取没重复的最右一值放入新数组。(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)// 思路:获取没重复的最右一值放入新数组 function unique5(array){ var r = []; for(var i = 0, l = array.length; i < l; i++) { for(var j = i + 1; j < l; j++) if (array[i] === array[j]) j = ++i; r.push(array[i]); } return r; }综上所述,那么我们为了节约命名空间就干脆做一个Array的内置方法嵌入进去好了,我这么写:/** * //--数组去除重复元素------ * @param array * @returns {Array} */ window.Array.prototype.unique = function (){ var r = []; for(var i = 0, l = this.length; i < l; i++) { for(var j = i + 1; j < l; j++) if (this[i] === this[j]) j = ++i; r.push(this[i]);} return r; }; //---使用 var arr=[1,2,2,1,3,4].unique(); alert(arr); //结果 2,1,3,4 如果想要更高效的方法,那么您关注这里的持续更新吧
2016年11月15日
120 阅读
0 评论
0 点赞
2016-02-19
jquery1.9删除的browser,live,die,sub,toggle的替换方法
jQuery 1.9变化有几点,最重要的是标题所提到的browser,live,die,sub,toggle这几个,如果你在使用过程中遇到高级版本不行,而低版本却可以的时候,那你就要了解一下是不是版本升级带来的影响了。之前也转载过一篇“jQuery1.9升级和删除的API指南”的文章,文里面介绍了很多方面,其实很多我都没用过,这上面的几个,我也是熟悉过browser,live,toggle而已。
2016年02月19日
182 阅读
0 评论
0 点赞
2015-06-24
ecshop支付宝接口返回“支付操作失败,请返回重试”
ecshop购买商品,成功支付后跳转到一个错误提示的页面:地址栏返回的代码为:“http://abc.com/respond.php?code=alipay&buyer_email=xxx2008%40126.com&buyer_id=2088302295952289&exterface=create_direct_pay_by_user&is_success=T¬ify_id=RqPnCoPT3K9%252Fvwbh3I7z31fy5VZ2nTUUsZUcr%252FxCgjYYbvl4p6p6QU8wwplNFGvP0ETC¬ify_time=2012-02-02+10%3A59%3A45¬ify_type=trade_status_sync&out_trade_no=20120202469454904&payment_type=1&seller_email=15510719013&seller_id=2088302019601851&subject=2012020246945&total_fee=1.50&trade_no=2012020242158728&trade_status=TRADE_SUCCESS&sign=f09711546fea83d1b6d3f844119d32d6&sign_type=MD5”,都是成功信息,支付宝后台查看,这笔款已经收到,但是浏览器却显示“支付操作失败,请返回重试”。检查支付宝接口文件,查到如下代码:if ($_GET['trade_status'] == 'WAIT_SELLER_SEND_GOODS') { /* 改变订单状态 */ order_paid($order_sn, 2); return true; } elseif ($_GET['trade_status'] == 'TRADE_FINISHED') { /* 改变订单状态 */ order_paid($order_sn); return true; } else { return false; } ...比对成功代码的返回值,发现和地址栏返回的不一致,应该为:TRADE_SUCCESS;TRADE_FINISHED修改为TRADE_SUCCESS 修改之后,就可以返回成功信息了;
2015年06月24日
172 阅读
0 评论
0 点赞
1
2