
Pada bagian sebelumnya kita mengatur struktur aplikasi, dalam artikel ini kita akan mengatur Strapi API dan menampilkan daftar restoran.
Catatan: Kode sumber untuk seluruh seri artikel tersedia di sini .
Kami membuat restoran
Pertama-tama, kita perlu menampilkan daftar restoran di aplikasi kita. Tentu saja, kami akan mengelola daftar ini melalui Strapi API, jadi mari kita konfigurasikan.
Content Type
Content Type, (model
). Strapi API user
. , restaurant
( ).
:

Restaurant
.
! , . Restaurant .
Content Manager
, , .
-
Add New Restaurant
-
name
, description
image
.

β . API . restaurant
, Strapi api/restaurant
. , CRUD API. find
: http://localhost:1337/restaurants.
URL, 403 . : Strapi API .
, :
: authenticated
http://localhost:1337/restaurants, .

GraphQL
API REST . , GraphQL 10 ?
.
GraphQL Strapi, /backend
:
yarn strapi install graphql
#
npm run strapi install graphql
, .

{
restaurants {
id # _id MongoDB
name
}
}

, :
- GraphQL @nuxt-apollo
/frontend
yarn add @nuxtjs/apollo graphql
#
npm install @nuxtjs/apollo graphql
apollo nuxt.config.js
:
...
modules: [ '@nuxtjs/apollo',
],
apollo: { clientConfigs: { default: { httpEndpoint: 'http://localhost:1337/graphql' } }
},
...
. Nuxt ? .
./pages/restaurants/index.vue
:
<template>
<div>
//
<form class="uk-search uk-search-large uk-align-center uk-margin">
<span uk-search-icon></span>
<input class="uk-search-input" v-model="query" type="search" placeholder="Search...">
</form>
//
<div class="uk-card uk-card-default uk-grid-collapse uk-child-width-1-2@m uk-margin" v-for="restaurant in filteredList" v-bind:key="restaurant" uk-grid>
<div class="uk-card-media-left uk-cover-container">
<img :src="'http://localhost:1337/' + restaurant.image.url" alt="" uk-cover>
<canvas width="600" height="400"></canvas>
</div>
<div>
<div class="uk-card-body">
<h3 class="uk-card-title">{{ restaurant.name }}</h3>
<p>{{ restaurant.description }}</p>
//
<router-link :to="{ name: 'restaurants-id', params: { id: restaurant.id }}" tag="a" class="uk-button uk-button-primary">See dishes
</router-link>
</div>
</div>
</div>
//
<div class="uk-container uk-container-center uk-text-center" v-if="filteredList.length == 0">
<img src="https://assets-ouch.icons8.com/preview/19/52de2377-696e-4194-8c63-0a81aef60b4f.png" height="800" width="800">
<p>No restaurants found</p>
</div>
</div>
</template>
<script>
import restaurantsQuery from '~/apollo/queries/restaurant/restaurants'
export default {
data() {
return {
restaurants: [],
query: ''
}
},
apollo: {
restaurants: {
prefetch: true,
query: restaurantsQuery
}
},
computed: {
filteredList() {
return this.restaurants.filter(restaurant => {
return restaurant.name.toLowerCase().includes(this.query.toLowerCase())
})
},
}
}
</script>
?
β . Vue.js .
, Vue.js:
v-for
: (restaurants
).v-if
: .v-model
: . .vue-router
: .
.
GraphQL
, restaurantsQuery
GraphQL apollo :
...
apollo: { restaurants: { prefetch: true, query: restaurantsQuery }
},
...
Strapi API.
/frontend/apollo/queries/restaurant/restaurants.gql
:
query Restaurants {
restaurants {
id
name
description
image {
url
}
}
}
! !
.