Write the Code. Change the World.

分类目录
3月 01

什么是 RESTful

RESTful 是一种软件设计风格,由 Roy Fielding 在他的 论文 中提出,全称为 Representational State Transfer,直译为表现层状态转移,或许可以解释为用 URL 定位资源,用 HTTP 动词描述操作,不用太纠结于定义,接下来我们会详细讨论。

RESTful 风格的接口,目前来看,实现的最好的就是 Github API,经常被效仿。接下来我们通过分析 Github API 来引出我们的 API 设计原则。
继续阅读

1月 01

Laravel 5.4默认使用utf8mb4字符编码,而不是之前的utf8编码。因此运行php artisan migrate 会出现如下错误:

[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table users add unique users_email_unique(email))

[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

那么问题根源,以及怎么解决呢。
继续阅读

12月 28

场景

假如我们要使用七牛的 token

  1. 直接写死在代码调用的地方。 [x]可维护性低
  2. 写在 config/app.php 文件中。[x]无法区分环境进行配置

  3. 存储在 .env 文件中,使用 env() 方法直接读取。 [x]虽然解决了环境问题,但不推荐。

  4. 存储在 .envconfig/app.php 文件中,然后使用 config()函数来读取。 [x] 最佳方案

一种方法是最古老的方法,代码可维护性极低,一旦域名变更就只能全局替换。第二种方法无法区分环境,例如本地使用开发环境域名测试,线上才是正式的 CDN 域名。第三种方法虽然解决了环境变量的问题,并且也具备一定的灵活性,但是不够灵活,假如你的网站流量巨大,需要配置几个 CDN 域名,使其在加载静态资源时随机支配域名,这种做法就无法满足需求了。第四种方法既支持环境变量,又具备极高的灵活性,假如遇到同样的 CDN 多域名随机问题,你只需要写一个辅助方法,然后在 config/app.php 中调用即可,不需要动到任何一行业务逻辑代码。
继续阅读

12月 01

Laravel的auth功能非常好用。只需要按照模板写,几乎不写代码就可以完成注册,登录,忘记密码这一整套流程。但是,仅仅照搬,还是有些不足的。下边列出个人注意的一些知识点,以备以后会用到。

注册

前端表单页面 -> 路由 -> 控制器(RegisterController) + RegistersUsers。
继续阅读

12月 01

什么是

  1. 什么是 VirtualBox。
  2. 什么是 Vagrant。

  3. 什么是 Homestead。

VirtualBox

VirtualBox 是 Oracle 公司的开源虚拟机软件。VirtualBox号称是最强的免费虚拟机软件,它不仅功能齐全,而且性能也很优异!VirtualBox 支持大部分流行的系统,如:Mac, Windows, Linux 等。
继续阅读

11月 22

前言

使用 laravel 框架,总会使用到其模板引擎 blade。 该引擎的最大优点就是继承和切片。

一个网站通常首部(header),底部(footer)都是一样的。如果每个页面,都通过复制粘贴来实现共通性,就会很累赘。

相同代码的复用,在其他框架中也会有。而blade使用的是继承以及include。
继续阅读

11月 21

初入

  1. Contracts(契约),也就是接口。定义一些方法,所以实现此接口的类都要实现契约里边的方法。
  2. ServiceContainer (契约的具体实现) ,实现 Contracts。具体实现逻辑写在这里。

  3. ServiceProvider (服务提供者) ,绑定事务到服务容器。

  4. App (服务容器), 在服务提供者中,可以通过 $this->appApp:: 得到。 App::其实就是门面。

  5. Facades(门面), 简化服务提供者的调用方式,用静态的方式调用具体实现里的方法。

具体

通过依赖注入,反射,实现了服务的功能。契约定义好服务所需要的接口,当然也可以不需要这个。当类似抽象功能多的时候,还是实现的好。然后,定义契约的实现。在服务提供者中,将服务绑定到容器。最后,在 config\app.php 中的providers,加入服务提供者。如果想使用门面,创建一个门面,然后在门面中重写getFacadeAccessor。最后,也是要在 config\app.php中的aliases加入门面。
继续阅读

11月 11

场景

数据存储在mysql数据库中。在一个离散的一段时间内(开始时间到结束时间),求出每隔一个小时,用户消费的金币。

这时,就需要将这一段时间以小时来分割了,然后groupby。

该怎么做呢。

实现

时间通常是 datetimetimestamp 。通过 DATE_FORMAT,我们可以对时间进行分段。

比如:

%H 0-23小时
%S 00-59秒

所以可以这样:

select sum(coin), DATE_FORMAT(log_time, "%H") as h from gift_tb where log_time >= '2017-11-10 00:00:01' group by h

看起来是可以了。可是如果时间总长度大于1天呢。或是我需要30分钟来分割,10分钟来分割。这样显然是不行的。

好吧,路总是要人走的。

计算的根本还是时间,那不如将时间稍微处理下。

公式: floor( (记录时间 - 时间段的开始时间)/ (60 * 60) ) as h

于是就有了:

select sum(coin), floor((UNIX_TIMESTAMP(log_time) - 1510243200)/(60 * 60)) as h from gift_tb where log_time >= '2017-11-10 00:00:01' group by h

参考

http://www.w3school.com.cn/sql/func_date_format.asp

http://blog.csdn.net/zhuyu_deng/article/details/43409547