董俊俊 的个人动态
  • 董俊俊 回答了问题
    2个月前

    发现了Java中的一个bug; byte竟然不能 接收整型?

    Byte a = 1; 这样编译可以通过;
    而传值则不行,可能是因为jdk自动把整数包装成了Integer;
    ps - 喷子滚出

  • 董俊俊 回答了问题
    2个月前

    Laravel中 关于 compact ('user') 中使用'user'的疑问?

    1. 为什么 user 可以,而 $user 不可以?

    先看下 PHP 官方对于这个函数的解释。

    对每个参数,compact () 在当前的符号表中查找该变量名并将它添加到输出的数组中,变量名成为键名而变量的内容成为该键的值。

    意思就是,PHP 会根据传入的参数,去从当前的符号表,也就是 compact 所执行的作用域去寻找有没有相应名称的变量,所以 edit() 方法传入的是 $user,但是 $user 并不是 $user 这个变量的名称,user 才是,$ 是 PHP 对变量的一种标识吧,看下 PHP 对变量的解释。

    PHP 中的变量用一个美元符号后面跟变量名来表示。变量名是区分大小写的。

    所以 user 才是变量名,而不是 $user。所以你传入 $user,自然就找不到名为 $user 的变量。

    延伸:从某种意义上来说,$user 这种变量名是不存在的。PHP 有一个可变变量的概念,$$user 所表示的意义是,访问变量名称为 $user 内容的变量,也就是如果 $user 的内容是 job,那么 $$user 访问的变量就是 $job,如果 user 变量没有定义的话,程序就会报错了。

    2. 为什么 user 变量的类型是 object(App\Models\User),而不是 array

    因为 view() 函数的第二个参数就是你要传进视图的数据。这个参数是一个数组,也就是这个数组里的数据都是要传入视图的。如下对比代码所示:

    public function edit(User $user)
    {
        return view('users.edit', compact('user'));
    }

    等于

    public function edit(User $user)
    {
        return view('users.edit', [
            'user' => $user
        ]);
    }

    所以你在视图里访问 user 变量的时候,实际访问的就是这个数组里 user 键所对应的内容,也就是 edit 函数传进来的 user 参数,这个 user 参数就是框架自动注入进来的 User 模型的实例,所以这个变量的类型显然就是 object(App\Models\User)

  • 董俊俊 回答了问题
    3个月前

    Laravel 分页 appends (Request::except ('page')) 的疑问?

    是的,排除分页。 比如设这样,你有 10 页数据,你当前处在第 7 页,但是你数据筛选后只有 3 页,这个时候就要重置页数

  • 董俊俊 回答了问题
    3个月前

    Laravel 啥时候用 Query Builder 进行数据库查询,啥时候用 ORM 进行数据库查询,两者有什么区别?

    我一般就用 orm, 如果觉得执行效率低了,就改成 query builder, 如果觉得还低了,就直接上 sql.

    ORM 的就是基于 Query Builder 封装的,所以封装性能比原来肯定要低一些

  • 董俊俊 回答了问题
    3个月前

    搭建一个简单的React网站,如何在服务器快速创建后端数据库?

    我也是做前端的,前端时间做的个人网站 http://www.neroht.com 恰好是前后端分离 + 数据库来做的,React技术栈,可以和你分享一下经验。下边讲的主要是以我网站的后台管理系统为基础展开。

    对于你说的快速创建的简单后端框架和数据库,直接投入实用,我没有了解过,也没用过。其实前端倒还好说,就像平常一样正常开发就好。前端工程师的话,后端推荐node,真是非常方便,搭建环境启动服务很快,框架我用的是express,数据库MySQL可以直接装在服务器上(具体安装过程百度就可以找到)。

    要先将数据库安装成功,然后写后端服务,后端主要是前端和数据库的桥梁,前端通过接口与后端交互,后端连接数据库操作。用mysql这个npm包可以实现node.js服务与MySQL数据库的连接。

    关于后端

    编写后端项目,可以在前端项目内直接创建个server文件夹,用express写一个后端服务并连接上边步骤启动的MySQL服务,前端来访问这个后端服务。也可以独立于前端项目创建一个新的express项目来让前端访问。

    关于数据库

    在开发的时候可以先在自己的电脑上安装MySQL,或者如果在服务器上装了数据库也可以直连服务器的数据库(这种情况只适用于不正式的小规模的网站)。安装好了后,将MySQL服务启动(windows系统最好注册为Windows服务,并开机启动)。

    跨域问题

    开发环境

    假如前端的开发服务器是webpack-dev-server,那么开发环境下前端访问后端的请求是跨域的,需要在webpack-dev-server配置项中配置跨域转发

    生产环境

    部署到服务器上的时候,前端打包的文件实际上都是express服务的静态资源,可以直接用将express的静态资源文目录指向打包好的前端文件的文件夹(步骤在这)。这时候不存在前端的开发服务器,全部只有一个后端服务,是不存在跨域访问的。

    关于部署

    需要在服务器上装好node,MySQL,还有pm2(用来管理node进程)。将前端和后端代码打包好传到服务器,并用pm2启动后端服务。用你服务器的公网IP+后端服务的端口就可以访问了

    几个注意的点

    • 服务器防火墙注意放开相应端口,比如MySQL的端口(便于远程连接服务器上的数据库)、启动后端服务的端口
    • 如果不习惯ip加端口的访问方式,可以用nginx将对于ip下80端口的访问反向代理到你启动的node服务端口,这样就可以实现不加端口的访问,再配置个域名解析,就是可以直接域名访问了
    • 后端框架也可以用koa2,非常优秀的nodejs后端框架。数据库MongoDB也是可以的
  • 董俊俊 回答了问题
    3个月前

    HTTP缓存和HTML5离线储存有什么区别?

    不只是缓存网页,任意资源都可以缓存(甚至所谓的 API 接口,其实本质也是资源)。

    HTML5 离线存储的优势主要就这么两个:

    • 配置与 WebServer 解耦。一般来说,静态资源想做 HTTP 缓存是需要修改 WebServer 配置的,比如 Nginx 的配置中常见的:
    location ~* \.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$  {    
        expires 30d;
    }

    这种下,如果需要对缓存的配置,还需要重启 WebServer(确实有少数支持热更新配置,但你指望这个?),对于现在前后端分离的大环境而言很不友好。

    • 完全脱机。普通的 HTTP 缓存,其实还是有一次网络请求,利用了 Cache-ControlETagLast-ModifiedIf-Modified-SinceIf-None-Match 这几个标头,服务端返回 304 状态码来告知浏览器可以使用之前的资源,节省的是该资源本身传输的网络开销,但并没有真正省去网络请求本身。HTML5 离线存储则是一旦缓存成功,就完全脱机化了,直到 manifest 发生变化。

    当然了,也不是没有缺点,比如不支持增量更新、容错机制差等等。

    关于最后一个问题的答案是,HTML5 离线存储的优先级比 HTTP 缓存高,两者同时存在时以前者为优先。

  • 董俊俊 回答了问题
    3个月前

    Go 中如何快速将字符串数组转为结构体?

    不只是缓存网页,任意资源都可以缓存(甚至所谓的 API 接口,其实本质也是资源)。

    HTML5 离线存储的优势主要就这么两个:

    • 配置与 WebServer 解耦。一般来说,静态资源想做 HTTP 缓存是需要修改 WebServer 配置的,比如 Nginx 的配置中常见的:
    location ~* \.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$  {    
        expires 30d;
    }

    这种下,如果需要对缓存的配置,还需要重启 WebServer(确实有少数支持热更新配置,但你指望这个?),对于现在前后端分离的大环境而言很不友好。

    • 完全脱机。普通的 HTTP 缓存,其实还是有一次网络请求,利用了 Cache-ControlETagLast-ModifiedIf-Modified-SinceIf-None-Match 这几个标头,服务端返回 304 状态码来告知浏览器可以使用之前的资源,节省的是该资源本身传输的网络开销,但并没有真正省去网络请求本身。HTML5 离线存储则是一旦缓存成功,就完全脱机化了,直到 manifest 发生变化。

    当然了,也不是没有缺点,比如不支持增量更新、容错机制差等等。

    关于最后一个问题的答案是,HTML5 离线存储的优先级比 HTTP 缓存高,两者同时存在时以前者为优先。

  • 董俊俊 回答了问题
    3个月前

    技术人员的焦虑?

    如果到了那个时候,你还是只会 CURD 那被淘汰也很正常。

  • 董俊俊 回答了问题
    3个月前

    vue.js的上传图片和导入xml文件思路

    上传图片可以用base64在本地显示,其他的不清楚

  • 董俊俊 回答了问题
    3个月前

    vue中怎么设置select默认选中

    Select这个组件本身就是这个特点。想要把它的值默认为某个选项,就给与它绑定的变量赋予这个选项的值。

    不管是vue,还是angular,还是什么别的框架,大致的原理是不变的。

  • 董俊俊 回答了问题
    3个月前
  • 董俊俊 回答了问题
    3个月前

    ES6关于数组循环的问题

    代码没有错,输出也没有错啊,
    __ob__: Observer这些数据是vue这个框架对数据设置的监控器,一般都是不可枚举的。也就说不会影响你数据的使用

    如果你想代码简单点的话,可以用

    that.diviCot = [...that.diviCot, ...res.data.list]

    that.diviCot=[];//要输出的数组                
            for(var i in this.otherCat){
                    getDivinationCont(this.otherCat[i].id).then(function(res){ //从后台取数据 
                                if(res.code<10000){
                                    console.log(res.data.list)// 返回的数据
                                     that.diviCot = [...that.diviCot, ...res.data.list]  
                                };        
                            })
                        };
  • 董俊俊 回答了问题
    3个月前

    es6 yield

    yield语句是暂停执行的标记,每次调用next方法,执行到下一个yield之前。
    因而,yield 222并不是一定要求的格式。
    就像我们常常写的 return 222,函数返回值是222,而同样return;函数返回值是undefined。这是一样的道理。
    因为此处 yield后面并没有跟返回值,所以genObj.next()返回值是Object {value: undefined, done: false}

    遍历器对象的next方法的运行逻辑如下。

    (1)遇到yield语句,就暂停执行后面的操作,并将紧跟在yield后面的那个表达式的值,作为返回的对象的value属性值。

    (2)下一次调用next方法时,再继续往下执行,直到遇到下一个yield语句。

    (3)如果没有再遇到新的yield语句,就一直运行到函数结束,直到return语句为止,并将return语句后面的表达式的值,作为返回的对象的value属性值。

    (4)如果该函数没有return语句,则返回的对象的value属性值为undefined。

    阮一峰EMCAScript入门

  • 董俊俊 回答了问题
    3个月前

    es6如何快速的删除数组元素

    ES6 findIndex MDN :Array.prototype.findIndex()
    findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。

    arr.splice(arr.findIndex(item => item.id === 8), 1)

    推荐文章:【深度长文】JavaScript数组所有API全解密 | louis blog

  • 董俊俊 回答了问题
    3个月前

    javascript 将一位数组分割成每三个一组

    var data = ['法国','澳大利亚','智利','新西兰','西班牙','加拿大','阿根廷','美国','0','国产','波多黎各','英国','比利时','德国','意大利','意大利',];
    var result = [];
    for(var i=0,len=data.length;i<len;i+=3){
       result.push(data.slice(i,i+3));
    }
  • 董俊俊 回答了问题
    3个月前

    php为什么这样写还是会报错呢?

    你不会在try-catch块中捕获它,因为“undefined index” 是 E_NOTICE error, 不是 exception, 可以用set_error_handler():

        <?php
        function my_handle(){}
        set_error_handler("my_handle");
        echo $foo["bar"];
        ?>

    您可以在my_handle()函数中做任何您想做的事情,或者只是将其保留为空以使通知静音,尽管不建议这样做。普通处理程序应如下所示:

    function myErrorHandler($errno, $errstr, $errfile, $errline)


    如果只是想当这个key不存在 忽略 继续执行的话。直接

    foreach($res['data']['cards'] as $k=>$v){
                if isset($v['mblog']['page_info']){
                    echo $v['mblog']['page_info']['media_info']['text'].'<br />';
                }
    }
  • 董俊俊 回答了问题
    3个月前
  • 董俊俊 回答了问题
    3个月前

    Laravel 使用队列,加载依赖包 Composer 报错 ?

    你所有需要 composer 加载依赖包的地方都去虚拟机里面操作,因为虚拟机环境都有了,不需要配,在你的电脑环境下的话会报 pcntl 扩展包没有,你用的是教程的 homestead?
    第一步进入你之前安装的 homestead 目录打开虚拟机:

    vagrant up

    第二步进入虚拟机:

    vagrant ssh

    然后切到你的项目下,再加载 composer 依赖

  • 董俊俊 回答了问题
    3个月前

    请教一下什么是序列化为什么要序列化 + 什么是依赖注入?

    1. 什么是序列化?

    序列化 (Serialization) 将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

    简单说就是把运行过程中的变量按照一定的格式编码成字符串

    2. 为什么要序列化?

    根据定义就可以知道,序列化是转换成可以存储或者传输形式的过程。队列的时候需要序列化,就是因为这个变量需要脱离 PHP 的运行环境,比如添加到 redis 或其他队列驱动中,但是 redis 和 php 不是同一个东西,redis 无法直接读取 php 的变量,所以需要将 php 的变量序列化保存到 redis 中,等队列执行之后,php 会读取 redis 中保存的序列化之后的变量,然后根据序列化的规则,将其反序列化,重新生成序列化之前的变量。

    3. 什么是依赖注入?

    依赖注入就是,A 类需要调用 B 类,原来是通过 A 类内部直接调用 B 类 (new ClassB()) 的方式,改成依赖注入之后就是 A 类通过构造函数,传入 B 类 (__construct(ClassB $class_b)),A 类内部调用 $this->class_b 的方式调用 B 类。

    好处:
    松耦合,A 类不需要自己调用 B 类,如果需要更换 B 类,只需要通过构造函数传入其他类即可

  • 董俊俊 回答了问题
    3个月前

    使用队列:什么是消息队列

    1. 什么是序列化?

    序列化 (Serialization) 将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

    简单说就是把运行过程中的变量按照一定的格式编码成字符串

    2. 为什么要序列化?

    根据定义就可以知道,序列化是转换成可以存储或者传输形式的过程。队列的时候需要序列化,就是因为这个变量需要脱离 PHP 的运行环境,比如添加到 redis 或其他队列驱动中,但是 redis 和 php 不是同一个东西,redis 无法直接读取 php 的变量,所以需要将 php 的变量序列化保存到 redis 中,等队列执行之后,php 会读取 redis 中保存的序列化之后的变量,然后根据序列化的规则,将其反序列化,重新生成序列化之前的变量。

    3. 什么是依赖注入?

    依赖注入就是,A 类需要调用 B 类,原来是通过 A 类内部直接调用 B 类 (new ClassB()) 的方式,改成依赖注入之后就是 A 类通过构造函数,传入 B 类 (__construct(ClassB $class_b)),A 类内部调用 $this->class_b 的方式调用 B 类。

    好处:
    松耦合,A 类不需要自己调用 B 类,如果需要更换 B 类,只需要通过构造函数传入其他类即可

最近访客
  • 小花花
    小花花 4周前