Willis

Willis 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织 www.xiebruce.top/ 编辑
编辑

php开发者

个人动态

Willis 回答了问题 · 2020-10-26

Yii2添加request的baseUrl后加载的资源url也会加上这个baseUrl导致加载的不对

好吧,经过大量的搜索、仔细的查看文档以及Q群问网友,最后还是我自己解决了,如下代码所示,在components里面添加一个assetManager(必须小写开头),在里面就可以重置baseUrl

'components' => [
    'assetManager' => [
        //after settting components.request.baseUrl='/admin', the assets url will automatically add "/admin" to its url
        //to avoid this, we can set the asset baseUrl in components.assetManager.baseUrl, set it to '/assets'
        'baseUrl' => '/assets',
    ],
    'request' => [
        'csrfParam' => '_csrf-backend',
        //All requests will add "/admin",e.g:
        //www.example.com/controller/action will change to
        //www.example.com/admin/controller/action
        'baseUrl' => '/admin',
    ],
    // other configs....
],

关注 1 回答 1

Willis 提出了问题 · 2020-10-24

Yii2添加request的baseUrl后加载的资源url也会加上这个baseUrl导致加载的不对

我的是Advanced版本,我frontend和backend是单独用不同域名的,由于怕权限管理里面跟前台的路由有相同的,所以就在后台的路径里添加个/admin

具体是在backend的main.phpcomponents里添加baseUrl => /admin添加,添加后,页面是可以访问的,就是url多了个admin,比如从backend.example.com/controller/action变成backend.example.com/admin/controller/action

'components' => [
    'request' => [
        'csrfParam' => '_csrf-backend',
        //All requests will add "/admin",e.g:
        //backend.example.com/controller/action will change to
        //backend.example.com/admin/controller/action
        'baseUrl' => '/admin',
    ],
],

但问题是,assets url也加了这个admin,导致无法加载
image.png

我试了改这个文件backend/assets/AppAsset.php里的$baseUrl,但是无论我怎么修改,它完全不起作用(没设置'baseUrl' => '/admin'的时候设置这个是有用的)

<?php

namespace backendassets;

use yiiwebAssetBundle;

/**
 * Main backend application asset bundle.
 */
class AppAsset extends AssetBundle {
    public $basePath = '@webroot';
    public $baseUrl = '@web';
    public $css = [
        'css/site.css',
    ];
    public $js = [
    
    ];
    public $depends = [
        'yiiwebYiiAsset',
        'yiibootstrapBootstrapAsset',
    ];
}

另外我发现在views页面中用registerJsFile()添加的js,就不会添加/admin,就能正常加载

$this->registerJsFile('plugins/ImageViewer/imageviewer.min.js', ['position' => View::POS_END, 'depends'=>JqueryAsset::class]);

image.png

所以想问一下大佬们,怎样设置能让assets不添加这个/admin?感觉这个文件backend/assets/AppAsset.php里应该可以设置才对呀。

关注 1 回答 1

Willis 赞了文章 · 2020-10-01

双击事件(dblclick)时,不触发单击事件(click)

事件绑定中,执行双击事件(dblclick)时能触发两次单击事件(click)。即一个标签元素(如button等),如果元素同时绑定了单击事件(click)和双击事件(dblclick),那么执行单击事件(click)时,不会触发双击事件(dblclick), 执行双击事件(dblclick)时却会触发两次单击事件(click)。

先看一下点击事件的执行顺序:

单击(click):mousedown,mouseout,click;
双击(dblclick):mousedown,mouseout,click , mousedown,mouseout,click,dblclick;

在单击的时候不会执行双击,但是双击的时候会执行两次单击再执行双击事件。
解决的思路:要想双击时不执行单击事件,就使用定时器清除掉两个单击事件,留下一个双击事件。

如下实现,使用setTimeout

<button onclick="single(event)" ondblclick="double(event)">按钮</button>

var time = 200;
var timeOut  = null;

function single (e) {
    clearTimeout(timeOut); // 清除第一个单击事件
    timeOut= setTimeout(function () {
        console.log('单击');
        // 单击事件的代码执行区域
        // ...
    }, time)
}
function double (e) {
    clearTimeout(timeOut); // 清除第二个单击事件
    console.log('双击')
    // 双击的代码执行区域
    // ...
}

然后现在,单击按钮打印“单击”,双击按钮打印“双击”。

关于 time=200,大家知道js的事件循环机制,点击事件会添加一个任务队列。time=0, 也会添加一个任务队列。那么time=0与time=200有什么区别呢?

因为第一次单击事件后,主线程没有任何任务,就会立马执行这个单击事件的任务。待第二次单击的时候,假设距离第一次单击事件是150ms, 如果你的定时器小于150ms, 那么第一次的任务队列就会执行完。
要想不执行第一次的任务队列,那么定时器时间间隔就必须大于两次单击的时间间隔了。这样才能清除第一次的单击事件,所以,这个200是酌情值,大于间隔就行。

第一次单击任务不执行了,是被定时器延时,然后第二次点击的时候给清除了。那么第二次点击事件呢?
在两次单击之后,会立马执行一个双击事件,双击事件的一开头就把这个第二次点击事件给清除了。至此两个单击时间全部被清除了,大功告成。

这就是双击事件的大概过程。

查看原文

赞 5 收藏 0 评论 3

Willis 发布了文章 · 2020-06-02

PHP分片上传文件到又拍云对象存储

本文参加又拍云原创技术征文活动

注册&实名认证

注册我就不说了,大家自行前往又拍云注册就行。

注册之后需要实名认证,否则无法使用,但由于我已经实名认证了(当时没截图),网上也很难找到截图,我找了一张很模糊的,不过还是能看清的

认证方式:支付宝芝麻信用有700分以上选支付宝芝麻信用认证,没有的话选人工(选人工应该要上传手持身份证的照片)
所属行业:我的是博客,所以我选的是门户网站→博客
网站/产品:就填你的网站名称(暂时没有就随便想一个)
网站地址:写你自己搭建的博客域名,没有的话用csdn,博客园,新浪博客之类的博客地址,再没有的话好像也可以不写
个人名称:写你的姓名(跟身份证要一样)
身份证号码:如实填写,否则无法通过实名认证

创建存储桶

登录后,点击页面右上角的控制台,然后选择云产品→云存储
Xnip2020-06-02_13-02-15.jpg

点击右上角创建一个服务(在这里叫服务,其它云一般叫“存储桶”,英文“bucket”)
-w1179

按下图填写,其中加速按你的需求,但如果选择全球加速,价格肯定比国内加速贵;操作员如果你之前没有就需要新建并授权,因为调用api需要一个账号密码,但这个账号密码并不是你注册又拍云的那个账号密码,而是要在这里新建一个,叫“操作员”

测试操作员账号及默认域名

又拍云的对象存储是支持直接使用ftp登录的,这里我使用filezilla登录(其它ftp工具也类似)。

打开filezilla,如下图所示,点击左上角的“Site Manager”图标(也可直接点击菜单FileSite Manager)进入以下界面,然后按下图填写参数

如果ftp能连接上,也能上传文件,说明操作员账号没啥问题,连不上可能是前面忘了授权,可以点击右上角用户名→账户管理
-w461

然后点击操作员→管理,查看是否已经给了这个操作员权限,如果没有给,则给它加上权限,然后再试,应该就没问题了
-w1199

另外,我们还可以在网页上上传文件
-w1174

创建一个服务后,又拍云默认会给我们一个测试域名,域名结构为”https://服务名.test.upcdn.net“,其实也可以在控制台中看到,点击上图中的“配置”→选择域名管理选项卡(实际上默认就是该选项卡)→滚动到最底下即可看见送的测试域名。

使用php分片上传文件

REST API文档,其中并行式断点续传和串行式断点续传,就是分片上传了
-w1016

不过又拍云有写好的php-sdk,就不用我们自己写这个,直接传参就行。

创建一个文件夹UploadToUpyun,在终端中进入该文件夹,使用composer安装sdk(没有composer命令请自行安装,都0202年了应该都有吧?)

composer require upyun/sdk

安装完成后,在UploadToUpyun文件夹中创建一个index.php,代码如下,注释已经写的非常清楚,填上你的参数即可正常运行,相信没有人不会

<?php
require 'vendor/autoload.php';

use Upyun\Config;
use Upyun\Upyun;

//你自己创建的服务的名称
$serviceName = 'YOUR_SERVICE_NAME';
//操作员账号
$operator = 'YOUR_OPERATOR_NAME';
//操作员密码
$password = 'YOUR_OPERATOR_PASSWORD';
//要上传到哪个目录下
$directory = '/UploadToUpyun/test/';
//要上传的文件的绝对路径(请换成你电脑上一个图片文件的路径)
$uploadFilePath = '/Users/bruce/Downloads/Ts8CYigv.png';
//上传文件名,为什么上传文件名要叫key而不叫filename呢?因为对象存储其实就是一个key value
//的存储结构,你可以认为它就是个redis,key就是redis键名,value就是这个key对应的内容。
$key = basename($uploadFilePath);
//又拍云默认域名在:云存储→选择一个服务并点配置→配置的第一项默认就是域名管理→滚动到最后就能看到默认域名
$defaultDomain = 'http://' . $serviceName . '.test.upcdn.net';

//在对象存储中,其实并没有实际意义上的"目录"(或者叫"文件夹"),整个文件夹和最后的key一起,组成的一个整体也是key
//举例:我要把文件存到"2020/06/02/test.jpg",那么这整个就是一个key,而内容当然就是test.jpg这张图片的二进制数据了。
if($directory){
    //真正使用时,$directory可能是用户传过来的,在不知道用户是否写了右斜杠的情况下,统一先去掉再添加一个
    $key = rtrim($directory, '/') . '/' . $key;
}

//使用又拍云php-sdk上传文件非常方便,很new一个config对象
$serviceConfig = new Config($serviceName, $operator, $password);
// 15728640 = 15M,如果文件大于15M,则使用并行分块上传
if(filesize($uploadFilePath) > 15728640){
    /* uploadType有两个值
       - BLOCK : 串行分块上传
       - BLOCK_PARALLEL : 并行分块上传
    */
    //然后可对new出的config对象的属性继续设置参数(有哪些参数可直接查看Config类: vendor/upyun/sdk/src/Upyun/Config.php)
    //设置uploadType=BLOCK_PARALLEL表示使用并行分片上传
    $serviceConfig->uploadType = 'BLOCK_PARALLEL';
}
$client = new Upyun($serviceConfig);
$fp = fopen($uploadFilePath, 'rb');
$retArr = $client->write($key, $fp);
// var_dump($retArr);exit;

/*
 * 返回的$retArr的值
 * array(6) {
      'x-upyun-content-length' =>
      string(5) "47028"
      'x-upyun-height' =>
      string(3) "473"
      'x-upyun-content-type' =>
      string(9) "image/png"
      'x-upyun-file-type' =>
      string(3) "PNG"
      'x-upyun-width' =>
      string(3) "839"
      'x-upyun-frames' =>
      string(1) "1"
    }
 */

//我们随便拿一个元素来判断是否上传成功
if(isset($retArr['x-upyun-content-length'])){
    //在实际使用中,$key可能是用户传过来的,在不知道$key是否以斜杠开头的情况下,统一先去掉再自己添加一个
    echo $defaultDomain . '/' . ltrim($key);
}else{
    echo 'Upload failed.';
}

好了,到这里就写完了,enjoy!

查看原文

赞 0 收藏 0 评论 0

Willis 回答了问题 · 2019-10-21

解决git add 多个文件,但想忽略某一个文件

先用以下命令添加所有

git add -u

再以下命令排除掉你不想添加进去的某几个文件,比如我这里要排除“static/js/dashboard.js”文件(这个路径可以用git status查看):

git reset -- static/js/dashboard.js

关注 6 回答 5

Willis 回答了问题 · 2019-09-08

php-cli能获取系统剪贴板中的图片吗?

一段时间过去了,也没人知道,我自己研究出来并且还写了个插件:php-get-image-from-clipboard,兼容macOS、Windows、Linux三大平台。

原理:

  • macOS是通过使用php调用pngpaste命令来生成的,需要安装pngpastebrew install pngpaste
  • Windows是通过使用php调用Powershell来生成的,Win10什么都不用动,Win7要升级Powershell到5.1;
  • Linix是通过使用php调试xclip来生成截图的,Ubuntu的话,使用apt install xclip来安装xclip

关注 3 回答 3

Willis 提出了问题 · 2019-06-21

用link标签无法实现http2的server push

服务器已经配置好:

server {
    # listen在原https配置文件基础上添加http2
    listen 443 ssl http2;
    # 添加一句http2_push_preload on表示开启server push功能
    http2_push_preload on;
    ……
}

并且用以下的方式(php)也成功了:

<?php
    header("link: </styles.css>; rel=preload; as=style", false);
    header("link: </script.js>; rel=preload; as=script", false);

但是据说还可以用link标签的方式来指定要推送的资源:

<link rel="preload" href="/styles.css" as="style">
<link rel="preload" href="/script.js" as="script">

但我一直没试成功这种方式,有人知道这是什么问题吗?

关注 2 回答 1

Willis 评论了文章 · 2019-04-26

七牛云图床上传工具-iUploader

软件介绍:
iUploader主要功能将图片上传至七牛云,返回 Markdown 格式的链接到剪贴板

功能介绍:

  1. 图片本地压缩
  2. 图片右键上传
  3. 图片复制上传
  4. 图片拖拽上传
  5. https加密上传

开发:
继承七牛云SDK,使用swift开发,App自签上传凭证,自动选择存储区域,通过https加密上传。


联系方式:

邮箱:iChochy@qq.com
网站:https://iuploader.ichochy.com

注: 处女作
Cloud

查看原文

Willis 评论了文章 · 2019-04-26

分享一个自己写的开源图床ImgURL

ImgURL是一款使用PHP + SQLite 3开发的图床程序,免费开源,支持图像裁剪、压缩、自动鉴黄识别等多种功能,部署简单,管理方便。

目前已经实现的功能

  • 支持拽拖上传、多图上传、Ctrl + V粘贴上传、URL上传
  • 支持图片裁剪,自动生成缩略图
  • 限制访客上传数量
  • 图片压缩/批量压缩
  • 图片鉴黄/批量鉴黄
  • API支持

DEMO

安装ImgURL

其它说明

查看原文

Willis 评论了文章 · 2019-04-26

我的最佳写作方式

最佳喜欢上了写作,喜欢自己写的东西能被别人阅读,赞赏,也希望我写的东西能更有价值,体验也更好。

今天我分享的是我的最佳写作方式。

我的最佳写作方式

工具汇总

markdown编辑器截图工具gif录制工具图床工具
TyporaQQ / wechatlicecapiPic

markdown编辑器 · Typora

完全免费的markdown编辑器,无与伦比的写作体验,让人爱不释手,具体的特性请移步官网:https://typora.io/

我最常用的快捷键是Command+/,可以切换源码模式和打字机模式。

typora

图传工具iPic

仅仅有好的编辑器还不够,还需要图床工具将你的图片自动上传到云端,最好是能够结合你使用的markdown编辑器一起使用,最好是截图后直接粘贴,然后上传。

那么iPic是首选,因为Typora内置了iPic的功能,如下图:

ipic

iPic支持很多种图传工具,我现在用的是腾讯COS,这个工具默认是免费的,但是默认只支持免费的新浪微博图传,如果你要使用其他图传就要收费了,年费50元。

iPic的作者是全职独立开发者Jason,已经写了很多类似的mac工具,都很优秀,官网:https://toolinbox.net/

截图工具

QQ和微信截图应该是大家都在用的,非常方便,截图后可以粘贴到任何地方,QQ还支持视频录制功能。

gif录制工具

这里我就要介绍强大的LICEcap了,用来做屏幕截图的,录制出来的gif很小,我的所有gif都是通过它来制作的。

详细请移步官网:https://www.cockos.com/licecap/

查看原文

认证与成就

  • 获得 2 次点赞
  • 获得 8 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 8 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2016-03-08
个人主页被 900 人浏览