要解决点赞计数器在其他客户端上不更新的问题,可以使用以下方法:
-
使用Redis作为数据存储:将点赞计数器存储在Redis中,而不是在数据库中。这样可以更快地读取和更新计数器,并且所有客户端都可以实时获取更新的计数器值。
-
使用Soket.io实时通信:使用Soket.io库在客户端和服务器之间建立实时通信。当一个客户端点赞时,通过Soket.io将点赞事件发送给服务器,服务器再广播给其他客户端。这样每个客户端都能即时收到点赞事件,并更新计数器。
下面是一个简单的示例代码,展示了如何在Laravel + Vue + Redis + Soket.io + Node环境中实现上述解决方法:
在Laravel中:
- 安装Redis和Soket.io相关依赖:
composer require predis/predis
npm install --save laravel-echo socket.io-client
- 在.env文件中配置Redis连接信息:
BROADCAST_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
- 在config/database.php文件中配置Redis连接:
'redis' => [
'client' => 'predis',
'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
],
],
- 创建一个点赞计数器的模型和迁移:
php artisan make:model Like -m
// migration文件
public function up()
{
Schema::create('likes', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('post_id');
$table->unsignedBigInteger('count')->default(0);
$table->timestamps();
$table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
});
}
- 更新点赞计数器的路由和控制器方法:
// 路由文件
Route::post('posts/{post}/like', 'LikeController@like');
// 控制器方法
public function like(Post $post)
{
$like = $post->like;
$like->count += 1;
$like->save();
// 广播点赞事件给其他客户端
broadcast(new LikeEvent($like))->toOthers();
return response()->json(['count' => $like->count]);
}
- 创建一个点赞事件类:
php artisan make:event LikeEvent
// LikeEvent类
class LikeEvent implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $like;
public function __construct(Like $like)
{
$this->like = $like;
}
public function broadcastOn()
{
return new Channel('like.' . $this->like->post_id);
}
}
在Vue中:
- 安装laravel-echo和socket.io-client:
npm install --save laravel-echo socket.io-client
- 在resources/js/bootstrap.js文件中配置Echo:
import Echo from 'laravel-echo';
window.io = require('socket.io-client');
const echo = new Echo({
broadcaster: 'socket.io',
host: window.location.hostname + ':6001',
});
export default echo;
- 在Vue组件中使用Echo监听点赞事件:
import echo from '../bootstrap';
export default {
data() {
return {
likeCount: 0,
};
},
methods: {
likePost() {
axios.post('/posts/' + this.postId + '/like')
.then(response => {
this.likeCount = response.data.count;
});
},
},
mounted() {
echo.channel('like.' + this.postId)
.listen('.LikeEvent', (e) => {
this.likeCount = e.like.count;
});
},
};
在Node中:
- 安装socket.io和lar