В этом уроке вы узнаете, как реализовать систему лайков и неприязней с помощью Vue js в приложении laravel 8. Этот туториал покажет вам, как создать простую систему лайков и дизлайков, которую пользователи смогут использовать для выражения своего мнения о вашем контенте.
Чтобы реализовать систему симпатий и антипатий с помощью Vue js в приложении laravel 8, мы выполняем следующие шаги.
На этом этапе вам необходимо установить последнюю версию приложения laravel. Откройте терминал или командную строку и выполните следующую команду:
composer create-project --prefer-dist laravel/laravel blog
После успешной установки приложения laravel 8 перейдите в корневой каталог проекта и откройте файл .env . Затем настройте учетные данные базы данных в файле .env следующим образом:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=here your database name here
DB_USERNAME=here database username here
DB_PASSWORD=here database password here
На этом шаге выполните следующие команды на терминале, чтобы авторизоваться в приложении laravel 8:
cd blog
composer require laravel/ui --dev
php artisan ui vue --auth
Этот пакет laravel laravel/ui предоставляет быстрый способ создать все маршруты, контроллеры и представления с аутентификацией.
На этом шаге вам нужно выполнить следующую команду на терминале, чтобы создать модель и фабрику:
php artisan make:model Post -fm
Эта команда создаст одно имя модели post.php , а также создаст один файл миграции для таблицы сообщений .
Теперь откройте файл миграции create_postss_table.php из базы данных > миграции и замените функцию up() следующим кодом:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePostsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('title');
$table->string('slug');
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('like')->default(0);
$table->unsignedBigInteger('dislike')->default(0);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('posts');
}
}
Затем перенесите таблицу с помощью следующей команды:
php artisan migrate
Затем перейдите к app/Post.php и обновите следующий код в вашей модели Post.php следующим образом:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
protected $fillable = [
'title', 'description'
];
public function getRouteKeyName()
{
return 'slug';
}
}
Затем перейдите к базе данных/фабрикам и откройте PostFactory.php . Затем обновите в нем следующий код следующим образом:
/** @var \Illuminate\Database\Eloquent\Factory $factory */
use App\Models\Post;
use Faker\Generator as Faker;
$factory->define(Post::class, function (Faker $faker) {
return [
'title' => $faker->sentence,
'slug' => \Str::slug($faker->sentence),
'user_id' => 1
];
});
а затем выполните следующую команду на терминале, чтобы сгенерировать поддельные данные с помощью подделки следующим образом:
php artisan tinker
//and then
factory(\App\Models\Post::class,20)->create()
exit
На этом этапе вам необходимо настроить Vue и установить зависимости Vue с помощью NPM. Поэтому выполните следующую команду в командной строке:
php artisan preset vue
Установите все зависимости Vue:
npm install
Следующий шаг, перейдите в папку маршрутов , откройте файл web.php и добавьте в свой файл следующие маршруты:
маршруты/web.php
use App\Http\Controllers\PostController;
Route::get('post', [PostController::class, 'index']);
Route::get('post/{slug?}', [PostController::class, 'show'])->name('post');
Route::post('like', [PostController::class, 'getlike']);
Route::post('like/{id}', [PostController::class, 'like']);
Route::post('dislike', [PostController::class, 'getDislike']);
Route::post('dislike/{id}', [PostController::class, 'dislike']);
Следующий шаг, откройте командную строку и выполните следующую команду на терминале, чтобы создать контроллер мастером:
php artisan make:controller PostController
После этого перейдите app\Http\Controllers и откройте файл PostController.php . Затем обновите следующий код в файле PostController.php :
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use Facades\App\Repository\Posts;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function index()
{
$posts = Post::latest()->get();
return view('posts',['posts' => $posts ]);
}
public function show(Post $slug)
{
return view('single-post',['post' => $slug ]);
}
public function getlike(Request $request)
{
$post = Post::find($request->post);
return response()->json([
'post'=>$post,
]);
}
public function like(Request $request)
{
$post = Post::find($request->post);
$value = $post->like;
$post->like = $value+1;
$post->save();
return response()->json([
'message'=>'Thanks',
]);
}
public function getDislike(Request $request)
{
$post = Post::find($request->post);
return response()->json([
'post'=>$post,
]);
}
public function dislike(Request $request)
{
$post = Post::find($request->post);
$value = $post->dislike;
$post->dislike = $value+1;
$post->save();
return response()->json([
'message'=>'Thanks',
]);
}
}
Следующим шагом перейдите в resources/assets/js/components папку и создайте файлы с именами LikeComponent.vue и DisLikeComponent.vue .
Теперь обновите следующий код в файле компонентов LikeComponent.vue :
<template>
<div class="container">
<p id="success"></p>
<a href="http://"><i @click.prevent="likePost" class="fa fa-thumbs-up" aria-hidden="true"></i>({{ totallike }})</a>
</div>
</template>
<script>
export default {
props:['post'],
data(){
return {
totallike:'',
}
},
methods:{
likePost(){
axios.post('/like/'+this.post,{post:this.post})
.then(response =>{
this.getlike()
$('#success').html(response.data.message)
})
.catch()
},
getlike(){
axios.post('/like',{post:this.post})
.then(response =>{
console.log(response.data.post.like)
this.totallike = response.data.post.like
})
}
},
mounted() {
this.getlike()
}
}
</script>
Затем обновите следующий код в файле DisLikeComponent.vue следующим образом:
<template>
<div class="container">
<p id="success"></p>
<a href="http://"><i @click.prevent="disLikePost" class="fa fa-thumbs-down" aria-hidden="true"></i>({{ totalDislike }})</a>
</div>
</template>
<script>
export default {
props:['post'],
data(){
return {
totalDislike:'',
}
},
methods:{
disLikePost(){
axios.post('/dislike/'+this.post,{post:this.post})
.then(response =>{
this.getDislike()
$('#success').html(response.data.message)
})
.catch()
},
getDislike(){
axios.post('/dislike',{post:this.post})
.then(response =>{
console.log(response.data.post.dislike)
this.totalDislike = response.data.post.dislike
})
}
},
mounted() {
this.getDislike()
}
}
</script>
Теперь откройте resources/assets/js/app.js и включите компоненты LikeComponent.vue и DisLikeComponent.vue следующим образом:
require('./bootstrap');
window.Vue = require('vue');
Vue.component('like-component', require('./components/LikeComponent.vue').default);
Vue.component('dis-like-component', require('./components/DisLikeComponent.vue'));
const app = new Vue({
el: '#app',
});
На этом этапе перейдите к ресурсам/представлениям и создайте одну папку с именем layouts . Внутри этой папки создайте один файл представления блейда с именем app.blade.php .
Затем перейдите к ресурсам/представлениям/макетам и откройте файл app.blade.php . Затем обновите следующий код в файле app.blade.php следующим образом:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>Laravel 8 Vue JS Like Dislike Example - Tutsmake.com</title>
<script src="{{ asset('js/app.js') }}" defer></script>
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
@stack('fontawesome')
</head>
<body>
<div id="app">
<main class="py-4">
@yield('content')
</main>
</div>
</body>
</html>
Затем перейдите к resources/views/ и создайте файл с одним именем posts.blade.php. Затем обновите следующий код в файле posts.blade.php следующим образом:
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">Post Lists</div>
<div class="card-body">
<ul>
@foreach ($posts as $item)
<a href="{{ route('post',$item->slug) }}"><li>{{ $item->title }}</li></a>
@endforeach
</ul>
</div>
</div>
</div>
</div>
</div>
@endsection
Опять же, перейдите к resources/views/ и создайте файл с одним именем single-post.blade.php. Затем обновите следующий код в файле single-post.blade.php следующим образом:
@extends('layouts.app')
@push('fontawesome')
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
@endpush
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">Post Detail</div>
<div class="card-body">
<ul>
<li>{{ $post->title }}</li>
<like-component :post="{{ $post->id }}"></like-component>
<dis-like-component :post="{{ $post->id }}"></dis-like-component>
</ul>
</div>
</div>
</div>
</div>
</div>
@endsection
Теперь выполните следующую команду на терминале, чтобы запустить сервер разработки:
npm run dev
or
npm run watch
С помощью этого пошагового руководства вы теперь можете реализовать систему симпатий и антипатий Vue js в приложении laravel 8.