在博客中實現瀏覽次數的統計

原文來自:https://jellybool.com/post/setup-pages-views-count-on-your-blogphp

因爲最近都在搭建本身的博客,像一些基本的功能如文章的發表,編輯等功能在以前就實現好了,今天主要是說說本身在實現瀏覽次數的統計上的解決方法。git

在Laravel中,利用Eloquent的One-To-Many的關係,實現一篇文章有多條瀏覽記錄,具體思路以下:github

用戶訪問文章頁面-->取得ip地址和文章id,存入數據庫 再次訪問時根據ip和文章id判斷是否新增記錄

利用weboAp/VisitorPackage能夠輕鬆實現,具體步驟以下:web

1.在composer.json中添加weboAp/VisitorPackage:

{
    "require": {
        "weboap/visitor": "dev-master"
    }
}

而後執行:數據庫

composer update

將Service添加到config/app.php中:

'Weboap\Visitor\VisitorServiceProvider'

以後再執行下面兩個命令:json

php artisan vendor:publish

php artisan migrate

http://dev.maxmind.com/geoip/geoip2/geolite2/下載geoip包(GeoLite2-City.mmdb),將它解壓以後放到如下目錄數組


storage/geo/

固然/geo是須要本身建立的目錄。app

上面的步驟以後你將會獲得一個表visitor_registry,這裏咱們首先爲visitor_registry添加一個字段article_id用於One-To-Many的關係。composer

php artisan make:migration add_article_id_to_visitor_registry --table='visitor_registry'

在生成的migration大概是這樣寫:ide


public function up() { Schema::table('visitor_registry', function (Blueprint $table) { $table->integer('article_id')->unsigned()->index(); $table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade'); }); }

建立VisitorRegistry模型:

php artisan make:model VisitorRegistry

VisitorRegistry.php中寫上一下代碼:

protected $table = 'visitor_registry';

protected $fillable = ['clicks'];
public function articles()
{
    return $this->belongsTo('App\Article');
}

上面咱們經過articles()聲明瞭VisitorRegistryArticle的關係,因而在Article中也聲明關係:

public function visitors()
   {
       return $this->hasMany('App\VisitorRegistry');
   }

關係修改完畢以後,因爲咱們爲visitor_registry表添加了article_id字段,因此咱們須要修改weboAp/VisitorPackage中Visitor.php文件的log()方法,由於這個就是執行插入數據的實際方法,咱們首先給它闖入一額文章的id:

public function log($article_id){}

而後對log()方法裏面修改第二個條件判斷:


if( $this->has( $ip ) && $this->hasArticle($article_id) ) { //ip already exist in db. $visitor = VisitorRegistry::where('ip','=',$ip)->where('article_id','=',$article_id)->first(); $visitor->update(['clicks'=>$visitor->clicks + 1]); return true; }

上面咱們本身添加了一個hasArticle($article_id,$ip),咱們能夠直接將這個方法寫在Visitor.php中:

public function hasArticle($id,$ip)
    {
        return count(VisitorRegistry::where('article_id','=',$id)->where('ip','=',$ip)->get()) > 0;
    }

最後咱們還要修改log()中的插入數據的數組數據$data:

$data = array(
                    'ip'        => $ip,
                    'country'   => $country,
                    'clicks'    => 1,
                    'article_id' => $article_id,
                    'updated_at'    => c::now(),
                    'created_at'    => c::now()
                    );

咱們就添加'article_id' => $article_id,到這裏,咱們的準備工做作好了,而後在ArticleController中的show($id)方法使用:

Visitor::log($id);

有了數據以後咱們能夠將它展現給用戶看,在展現文章的頁面寫上相似下面的內容:

<li><i class="fa fa-eye"></i>{{ count($article->visitors) }} 瀏覽</li>

打完收工,很開心。

Happy Hacking

相關文章
相關標籤/搜索