原文来自:https://jellybool.com/post/setup-pages-views-count-on-your-blog
由于最近都在搭建自己的博客,像一些基本的功能如文章的发表,编辑等功能在之前就实现好了,今天主要是说说自己在实现浏览次数的统计上的解决方法。
在Laravel中,利用Eloquent的One-To-Many的关系,实现一篇文章有多条浏览记录,具体思路如下:
用户访问文章页面-->取得ip地址和文章id,存入数据库 再次访问时根据ip和文章id判断是否新增记录
利用weboAp/VisitorPackage可以轻松实现,具体步骤如下:
1.在composer.json中添加weboAp/VisitorPackage:
{
"require": {
"weboap/visitor": "dev-master"
}
}
然后执行:
composer update
将Service添加到config/app.php
中:
'Weboap\Visitor\VisitorServiceProvider'
之后再执行下面两个命令:
php artisan vendor:publish
php artisan migrate
到http://dev.maxmind.com/geoip/geoip2/geolite2/下载geoip包(GeoLite2-City.mmdb),将它解压之后放到以下目录
storage/geo/
当然/geo
是需要自己创建的目录。
上面的步骤之后你将会得到一个表visitor_registry
,这里我们首先为visitor_registry
添加一个字段article_id
用于One-To-Many的关系。
php artisan make:migration add_article_id_to_visitor_registry --table='visitor_registry'
在生成的migration大概是这样写:
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()
声明了VisitorRegistry
对Article
的关系,于是在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