DevGang
Авторизоваться

Интеграция STRAPI на NUXT

Что такое STRAPI

Strapi — это безголовая CMS, а это означает, что вы можете создать свой собственный API и распространять его без каких-либо ограничений.

Бэкэнд с Strapi

Установка Strapi

Перед установкой CMS убедитесь, что у вас установлен Node.js v20.

npx create-strapi-app@latest my-project

Или с yarn:

yarn create strapi-app my-project --quickstart

С помощью этой команды вы выполните простой процесс ее установки. Это не могло быть проще. В остальном в этом примере мы используем SQLite (по умолчанию), но вы можете установить любую базу данных, какую захотите.

thomasbnt@thomasbnt:~/lab$ yarn create strapi-app my-project --quickstart
yarn create v1.22.19
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...

success Installed "create-strapi-app@4.19.0" with binaries:
      - create-strapi-app
Creating a quickstart project.
Creating a new Strapi application at /lab/my-project.
Creating files.
Dependencies installed successfully.
Initialized a git repository.

Your application was created at /lab/my-project.

Available commands in your project:

  yarn develop
  Start Strapi in watch mode. (Changes in Strapi project files will trigger a server restart)

  yarn start
  Start Strapi without watch mode.

  yarn build
  Build Strapi admin panel.

  yarn strapi
  Display all available commands.

You can start by doing:

  cd /lab/my-project
  yarn develop

Running your Strapi application.

> my-project@0.1.0 develop
> strapi develop

⠋ Building build context
⠙ Building build context[INFO] Including the following ENV variables as part of the JS bundle:
    - ADMIN_PATH
    - STRAPI_ADMIN_BACKEND_URL
    - STRAPI_TELEMETRY_DISABLED
✔ Building build context (100ms)
✔ Creating admin (10071ms)
⠸ Loading Strapi[2024-01-27 18:49:09.061] info: The Users & Permissions plugin automatically generated a jwt secret and stored it in .env under the name JWT_SECRET.
✔ Loading Strapi (2075ms)
✔ Generating types (320ms)

 Project information

┌────────────────────┬──────────────────────────────────────────────────┐
│ Time               │ Sat Jan 27 2024 18:49:10 GMT+0100 (Central Euro… │
│ Launched in        │ 2405 ms                                          │
│ Environment        │ development                                      │
│ Process PID        │ 19885                                            │
│ Version            │ 4.19.0 (node v20.2.0)                            │
│ Edition            │ Community                                        │
│ Database           │ sqlite                                           │
└────────────────────┴──────────────────────────────────────────────────┘

 Actions available

One more thing...
Create your first administrator 💻 by going to the administration panel at:

┌─────────────────────────────┐
│ http://localhost:1337/admin │
└─────────────────────────────┘

[2024-01-27 18:49:11.419] http: GET /admin (12 ms) 200
[2024-01-27 18:49:11.454] http: GET /admin/runtime~main.b145af60.js (6 ms) 200
[2024-01-27 18:49:11.463] http: GET /admin/main.5eaa19e8.js (2 ms) 200
[2024-01-27 18:49:11.827] http: GET /admin/project-type (2 ms) 200
[2024-01-27 18:49:11.846] http: GET /admin/6707.d7b87269.chunk.js (2 ms) 200
[2024-01-27 18:49:11.983] http: GET /admin/6538.27d4c381.chunk.js (3 ms) 200
[2024-01-27 18:49:11.984] http: GET /admin/9719.fe70b828.chunk.js (2 ms) 200
[2024-01-27 18:49:11.984] http: GET /admin/1025.2d854ef2.chunk.js (2 ms) 200
[2024-01-27 18:49:11.989] http: GET /admin/5019.0d8113a1.chunk.js (3 ms) 200
[2024-01-27 18:49:11.990] http: GET /admin/4944.c9cc5f7f.chunk.js (3 ms) 200
[2024-01-27 18:49:11.991] http: GET /admin/9170.6aa61d26.chunk.js (3 ms) 200
[2024-01-27 18:49:11.994] http: GET /admin/1727.8847f948.chunk.js (1 ms) 200
[2024-01-27 18:49:12.048] http: POST /admin/renew-token (9 ms) 400
[2024-01-27 18:49:12.051] http: GET /admin/init (16 ms) 200
[2024-01-27 18:49:12.054] http: GET /admin/users/me (18 ms) 401
[2024-01-27 18:49:12.144] http: GET /admin/3067.4f4141cb.chunk.js (1 ms) 200
[2024-01-27 18:49:12.149] http: GET /admin/telemetry-properties (2 ms) 401
[2024-01-27 18:49:12.354] http: GET /admin (2 ms) 200
[2024-01-27 18:49:12.588] http: GET /admin/project-type (1 ms) 200
[2024-01-27 18:49:12.686] http: GET /admin/init (2 ms) 200
[2024-01-27 18:49:12.811] http: GET /favicon.ico (0 ms) 200

У вас есть вся документация.

После установки всего и зависимостей сервер запускается автоматически, как вы можете видеть выше. Однако, если этого не было сделано, yarn develop.

Создайте свою учетную запись на панели управления

Когда вы впервые зайдете на http://localhost:1337, вам будет предложено создать учетную запись суперадминистратора.

Йоу! У вас есть доступ к Strapi! ✨🚀

Создание коллекции

В этом примере мы собираемся создать коллекцию для отображения последних обновлений от робота Discord, чтобы мы могли отображать ее где угодно, в данном случае на веб-сайте под Nuxt, а также с помощью команды Slash в Discord. платформа через робота!

Перейдите в Content-Type Builder → Collections Types → Create new collection type.

Мы дадим ему имя собственное «ChangelogMrRobotApp» (здесь «Мистер Робот» относится к имени робота). Затем создайте поля, нажав «Добавить новое поле». кнопка.

В моем случае я просто хочу отобразить:

  • Название
  • Версия
  • Дата выпуска
  • Содержание версии
  • Slug
  • И баннер, который не является обязательным
Осторожно:Дата создания и публикации УЖЕ учитывается в Strapi, поэтому нет необходимости добавлять это поле даты в свои Коллекции!

Затем заполняем все эти поля во вкладке «Контент-менеджер». Тогда мы сможем двигаться вперед!

Интеграция на интерфейсе с Nuxt

Я использую Nuxt для внешнего интерфейса, потому что сайт робота использует эту платформу. Но вы вольны распорядиться так, как считаете нужным. Это просто запрос на выборку и немного JavaScript.

Создание токена API

Прежде чем продолжить работу с кодом, мы собираемся создать токен API, Настройки → Токены API → Добавить новый токен API. Нам нужно просто ПОЛУЧИТЬ коллекцию, не имея никаких других разрешений. Это позволит нам получать информацию из API. Этот токен должен быть частным.

  • Тип токена «Только для чтения».
  • Срок действия токена как «Неограниченный».
  • И разрешения только на «find» и «findOne» в коллекции.

Получение данных с помощью API вызова

Теперь мы можем получить данные из коллекции из API Strapi. Поскольку контент находится в Markdown, нам необходимо выполнить дополнительный шаг — преобразовать текст Markdown в HTML. Для этого я использую пакет markdown-it.

Первая функция: получение данных из API

Просто используйте useFetch из Nuxt. Мы получаем наши данные и можем поместить их в ссылку.

const config = useRuntimeConfig();
let changelogs = ref([]);

await useFetch(`${config.public.backendStrapiUrl}changelogs-mr-robot-app?populate=*&sort[0]=version:desc`, {
  headers: {
    Authorization: `Bearer ${config.public.backendStrapiPublicAPIToken}`
  }
}).then((response) => {
  changelogs = response.data._value;
});

Здесь config.public.backendStrapiUrl содержит URL-адрес Strapi с API конечной точки для получения коллекции журналов изменений, заполненной (посмотрите, что такое заполнение) и отсортированной по версии на пути вниз.

А config.public.backendStrapiPublicAPIToken, как следует из названия, — это ваш токен!

Вы получаете массив со всем, что хотите. Волшебство!

Преобразование содержимого Markdown → HTML

С помощью markdown-it мы сможем творить еще больше чудес. Установите пакет и добавьте его в компонент/страницу.

import MarkdownIt from "markdown-it";
const md = new MarkdownIt();

changelogs.data.forEach((changelog) => {
  changelog.attributes.content = md.render(changelog.attributes.content);
});

function formatDate(date) {
  const options = { year: "numeric", month: "long", day: "numeric" };
  return new Date(date).toLocaleDateString("fr", options);

Я добавил функцию formatDate, которая просто устанавливает дату в правильный формат.

Результат на одной странице

А теперь... (барабанная дробь 🥁)... вам нужно интегрировать эту часть в свой HTML-тело!

<article v-for="l in changelogs.data" :key="l.id" v-show="changelogs">
  <NuxtLink :to="'#' + l.attributes.slug">
    <h3 class="changelog_title" v-if="l.attributes.title" :id="l.attributes.slug">{{ l.attributes.title }}</h3>
  </NuxtLink>
  <div class="changelog_infos">
    <div
      v-if="l.attributes.releasedAt">
      <Icon name="lucide:calendar" />
      Sorti le {{ formatDate(l.attributes.releasedAt) }}
    </div>
    —
    <div v-if="l.attributes.version">v.{{ l.attributes.version }}</div>
  </div>
  <div v-html="l.attributes.content" v-if="l.attributes.content"></div>
</article>

Используя немного CSS, мы визуализируем его стильно, и вот результат!

Если вам интересно, эта веб-страница доступна по адресу mrrobot.app/changelog. 🚀

Заключение

Я открыл для себя Strapi довольно давно. И я ничего с его помощью не создавал, пока у меня не появился проект, где я это предложил. Я полюбил это с тех пор. За простоту использования, документацию, управление API и, прежде всего, простоту интеграции с любой платформой.

Источник:

#JavaScript
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу