Sprache:

Suche

Vollständige Anleitung zur Implementierung der serverseitigen Suche mit Vue Good Table

  • Teilen:
Vollständige Anleitung zur Implementierung der serverseitigen Suche mit Vue Good Table

In diesem Tutorial werden wir die serverseitige Suchfunktionalität in  Vue Good table mit Laravel API auf dem Backend mit VueJS dem frontend.

Bitte beachten Sie, dass Sie zumindest einige grundlegende Kenntnisse von Laravel & VueJS haben müssen, um weiterzukommen.

Es gibt einen neuen Abschnitt in Vue Good Table's Dokumentation zum Einrichten der serverseitigen Suche mit Remote-Modus, was ich persönlich sehr hilfreich fand.

Was werden Sie tun?

Wir werden die Benutzerdatensätze aus der Datenbank holen und sie an Vue-Good-table weitergeben und eine serverseitige Suche durchführen.

Projekt einrichten

Folgen Sie den Schritten, um eine vollständige Anleitung zur Implementierung der serverseitigen Suche mit Laravel und Vue-Good-Table.

Erstellen Sie ein neues Laravel-Projekt

Gehen Sie zu Ihrem Projektordner, in meinem Fall zu ~/code und führen Sie den folgenden Befehl aus.

laravel new vue-good-table-search-example
 

Einrichten der Datenbank

Hier werden wir die grundlegenden Operationen wie die Einrichtung der DB und andere Konfigurationen durchführen.

Erstellen Sie eine neue Datenbank und weisen Sie Werte in .env. In unserem Fall ist es vuesearch

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=vuesearch
DB_USERNAME=root
DB_PASSWORD=root

Bevor wir nun unsere Standardmigrationen ausführen, erstellen wir einen einfachen Users Table Seeder.

php artisan make:seeder UsersTableSeeder

Und jetzt in UsersTableSeeder.php

/**
Run the database seeds.
*
@return void
*/
public function run() {
factory( User::class, 20 )->create();
}

Führen Sie nun die Migration mit unseren geimpften Daten durch.

php artisan migrate --seed
 

API-Endpunkt einrichten

 

Lesen Sie auch: Restful API in Laravel

In Ihrem routes/api.php

Route::get('users','UsersController@getRecords');

Als nächstes werden wir unseren Controller erstellen php artisan make:controller UsersController

Jetzt in unserem UsersController.php

/**
* @param Request $request
*
* @return \Illuminate\Http\JsonResponse
*/
public function getRecords( Request $request ) {

$search_query = $request->searchTerm;
$users = User::where( 'name', 'LIKE', '%' . $search_query . '%' )
->get()
->toArray();
if ( $search_query ) {
$users['searchTerm'] = $search_query ?: '';
} else {
$users['searchTerm'] = $search_query ? null : '';
}

return response()->json( [
'users' => $users
] );
}

Überprüfen wir die Antwort in Postman oder im Browser

Klicken Sie auf die URL http://www.vue-good-table-search-example.local/api/users und Sie werden die JSON-Antwortdaten sehen.

Da unsere API nun fertig ist und einwandfrei funktioniert, können wir uns nun der Frontend-Seite zuwenden.

Frontend-Routen einrichten

Jetzt in unserer routes/web.php

Route::get('/', function () {
return view('users');
});

Erstellen Sie nun eine Benutzervorlage, in unserem Fall haben wir einfach welcome.blade.php in users.blade.php umbenannt, mit kleinen Änderungen.

Jetzt innerhalb der Body-Tags von users.blade.php

<div id="app">
<div class="flex-center position-ref full-height">

<div class="content">
<vue-search
endpoint={{config('app.url')}}api/users
></vue-search>
</div>
</div>
</div>
<script src="{{ asset('js/app.js') }}"></script>
 

Wir werden unsere Vue-Komponente in einer Weile erstellen. Der Einfachheit halber habe ich den API-Endpunkt als Prop an unsere Komponente übergeben.

Sie können auch Ihren Anwendungsendpunkt in config/app.php definieren.

Vue-Komponente einrichten

Umbenennen ExampleComponent.vue zu VueSearchComponent.vue

Oh, Moment, wir haben vergessen, npm install auszuführen, um unsere Frontend-Abhängigkeiten zu installieren.

Führen Sie den Befehl aus und fügen Sie den Link in unserer Benutzer-Blade-Vorlage hinzu.

Install Vue-good-table

Wenn Sie Vue-good-table zum ersten Mal verwenden, gehen Sie zu deren dockmentation um mehr darüber zu erfahren.

Führen Sie nun npm install vue-good-table aus und importieren Sie später unsere VueSearchComponent.

Jetzt in unserem VueSearchComponent.vue

<template>
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">Users</div>

<div class="card-body">
<vue-good-table
mode="remote"
:columns="columns"
:rows="rows"
:globalSearch="true"
:search-options="{
enabled: true,
skipDiacritics: true,
}"
@on-search="onSearch"
styleClass="table table-hover table-bordered table-responsive">
<template slot="table-row" slot-scope="props">
<span v-if="props.column.field === 'S.No'">

{{ (users.per_page * (users.current_page - 1)) + (props.index + 1)
}}
</span>
<span v-else>
{{props.formattedRow[props.column.field]}}
</span>
</template>
</vue-good-table>
</div>
</div>
</div>
</div>
</div>
</template>

<script>
import Vue from 'vue';
import VueGoodTable from 'vue-good-table';
import 'vue-good-table/dist/vue-good-table.css'

Vue.use(VueGoodTable);
export default {
props: ['endpoint'],
data() {
return {
users: {
searchTerm: '',
total: 0,
per_page: 5,
from: 1,
to: 0,
current_page: 1
},
offset: 4,
columns: [
{
label: 'S.No',
field: 'S.No'
},
{
label: 'User Name',
field: 'name',
filterable: true
},
{
label: 'Email Address',
field: 'email',
filterable: true
},
{
label: 'Created At',
field: 'created_at',
filterable: true
},
],
rows: []
}
},
mounted() {
this.getRecords()
},
methods: {

getRecords() {
return axios.get(`${this.endpoint}?searchTerm=${this.users.searchTerm}`).then((response) => {
this.rows = response.data.users.data
this.users = response.data.users
})
},
updateParams(newProps) {
this.users = Object.assign({}, this.users, newProps);
},
onSearch: _.debounce(function (params) {
this.updateParams(params);
this.getRecords();
return false;
}, 500)
}
}
</script>

Führen Sie nun npm run dev aus, um unsere Assets zu erstellen, und wechseln Sie zu Ihrem Browser, um die serverseitige Suche in Aktion zu sehen.

Bonus-Abschnitt: Wie wäre es jetzt mit einer Paginierung?

Um die Paginierung einzurichten, müssen wir einige Änderungen an unserer API vornehmen. Zurück zu unserer UsersController.php

$search_query = $request->searchTerm;
$perPage = $request->per_page;
$users = User::where( 'name', 'LIKE', '%' . $search_query . '%' )
->paginate( $perPage )
->toArray();

Wir erstellen eine separate Paginator.vue-Komponente für unsere serverseitige Pagination und binden sie in unsere Hauptkomponente VueSearchComponent ein.

Erstellen Sie eine neue Paginator-Komponente und fügen Sie sie in unsere app.js ein

Vue.component('pagination', require('./components/Paginator'));

Jetzt in Paginator.vue

<template>
<ul class="pagination">
<li v-if="pagination.current_page > 1" class="page-item" >
<a href="javascript:void(0)" aria-label="Previous" v-on:click.prevent="changePage(pagination.current_page - 1)">
<span aria-hidden="true">«</span>
</a>
</li>
<li v-for="page in pagesNumber" :class="{'active': page == pagination.current_page}">
<a href="javascript:void(0)" v-on:click.prevent="changePage(page)">{{ page }}</a>
</li>
<li v-if="pagination.current_page < pagination.last_page">
<a href="javascript:void(0)" aria-label="Next" v-on:click.prevent="changePage(pagination.current_page + 1)">
<span aria-hidden="true">»</span>
</a>
</li>
</ul>
</template>
<script>
export default{
props: {
pagination: {
type: Object,
required: true
},
offset: {
type: Number,
default: 4
}
},
computed: {
pagesNumber() {
if (!this.pagination.to) {
return [];
}
let from = this.pagination.current_page - this.offset;
if (from < 1) {
from = 1;
}
let to = from + (this.offset * 2);
if (to >= this.pagination.last_page) {
to = this.pagination.last_page;
}
let pagesArray = [];
for (let page = from; page <= to; page++) {
pagesArray.push(page);
}
return pagesArray;
}
},
methods : {
changePage(page) {
this.pagination.current_page = page;
this.$emit('paginate');
}
}
}
</script>
<style>
.pagination > .active > a, .pagination > .active > a:focus{
border-color:#004590;
background-color:red;
}
.pagination {
list-style: none;
display: inline-flex
}
</style>

Jetzt werden wir leichte Änderungen an unserer VueSearchComponent für die Paginierung vornehmen.

<vue-pagination :pagination="users"
@paginate="getRecords()"
:offset="4">
</vue-pagination>

Für unseren Axios-Aufruf müssen wir nun die Attribute page und per_page an likeso übergeben,

getRecords() {
return axios.get(`${this.endpoint}?searchTerm=${this.users.searchTerm}&page=${this.users.current_page}&per_page=${this.users.per_page}`).then((response) => {
this.rows = response.data.users.data
this.users = response.data.users
})
},

Vergessen Sie auch nicht, die Paginator-Komponente in Ihre VueSearchComponent zu importieren.

import VuePagination from './Paginator';

 

und

components: {
VuePagination,
},

Führen Sie nun zum letzten Mal npm run dev aus und gehen Sie zurück zu Ihrem Browser, um die serverseitige Paginierung und Suche in Aktion zu sehen. Bumm!

Fazit

Wir haben erfolgreich die serverseitige Suche und Paginierung mit Vue-good-table und Laravel implementiert. Wenn Sie Fragen oder Rückmeldungen haben, hinterlassen Sie uns bitte einen Kommentar.

Für die komplette Einrichtung der Anwendung, können Sie sich die Vue Server Side Search Github

Tags:
Usama Muneer

Usama Muneer

A web enthusiastic, self-motivated & detail-oriented professional Full-Stack Web Developer from Karachi, Pakistan with experience in developing applications using JavaScript, WordPress & Laravel specifically. Loves to write on different web technologies with an equally useful skill to make some sense out of it.