Создайте простую удаленную конфигурацию для ролевой игры

📎 исходный код этого руководства на GitHub

В предыдущей части мы успешно установили и запустили приложение Strapi. Пришло время создать API. Но сначала давайте внимательно посмотрим, что может предоставить нам такой игровой сервер:

  • Он может аутентифицировать пользователей.
  • Мы можем реализовать игровую логику.
  • Пользователи могут видеть таблицы лидеров.
  • Мы можем изменить некоторые элементы игры через сервер.
  • и множество других функций.

Контроллеры, службы и маршруты

Для создания API в Strapi вам необходимо понимать 3 основных концепции.

Службы. Службы служат глобальными методами, которые можно использовать везде в своем приложении. Их основная задача - сократить использование некоторых повторяемых функций за счет глобальной доступности.

Контроллеры. Контроллеры являются основной частью вашего API. Здесь находятся основные функции.

Маршруты. Маршруты привязаны к методам контроллера. На самом деле это URL-адреса, которые указывают на определенный метод, поэтому каждый раз, когда вы вызываете этот URL-адрес, метод запускается.

Знайте, что вы знакомы с этими тремя концепциями, мы готовы создать систему удаленной настройки для нашей игры.

Удаленная конфигурация

Создание модели

Допустим, у нас есть ролевая игра с разными героями, типами героев, зданиями, картами, предметами и т. Д. Каждый герой имеет свои собственные характеристики, такие как сила урона (если это рукопашный бой), дальность (если это тип дальности), здоровье, мана и многие другие параметры. Дизайнеры игр должны часто балансировать и настраивать эти вещи. Так что помещать их внутрь клиента - не лучшая идея. Лучшее решение - получить все эти данные с вашего сервера в самом начале игры и сохранить их для дальнейшего использования.

Самым первым шагом для создания такой функциональности является создание модели данных. Это должна быть одна-единственная модель, охватывающая все, что требует конфигурации в игре, например, героев, типы героев, предметы и т. Д. Итак, нам нужны эти поля:

  • Название (определяет, к какой части игры принадлежит данный объект)
  • Тип (сообщает нам тип этого объекта)
  • Данные (основные данные, которые мы хотим настроить позже)

Теперь, когда у нас есть модель, мы открываем административную панель Strapi:

здесь вы можете видеть, что Strapi уже создал коллекцию (или тип контента) под названием Users. Нам нужно что-то подобное для нашего Remote Config. Коллекция, в которой хранятся наши данные конфигурации.

откройте Content-Types Builder:

в разделе Типы коллекций серого столбца вы можете увидеть синий текст с надписью Создать новый тип коллекции. Нажмите здесь:

открывается окно. В отображаемом имени напишите Remote Config и нажмите Continue. Теперь вы можете увидеть это окно:

здесь вы должны создать те 3 поля, о которых мы говорили. Имя, Тип и Данные. В качестве имени вы можете выбрать Текст или UID. Я рекомендую вам выбрать UID, потому что это гарантирует, что содержимое этого поля уникально во всей коллекции. Поэтому я выбираю UID:

в поле "Имя" напишите имя (с маленькой буквы, потому что так лучше :))

и нажмите + Добавить другое поле. Для нашего поля Тип вы можете выбрать Текст:

в поле Имя введите тип и не снимайте флажок Краткий текст. Потому что тип каждого объекта не должен быть таким длинным. Затем нажмите + Добавить другое поле:

Теперь для наиболее важного поля, данных, мы выбираем JSON:

введите данные в нижнем регистре и нажмите Готово.

вы можете видеть, что ваша модель для новой коллекции Remote Config готова. Нажмите зеленую кнопку Сохранить и дождитесь перезапуска приложения:

через мгновение вы можете увидеть новую коллекцию, появившуюся над коллекцией Users:

хороший. Теперь давайте добавим к нему кучу данных. Нажмите Добавить новую удаленную конфигурацию:

здесь мы хотим добавить данные для героя ближнего боя по имени Дариус - сложный :)

для его типа я пишу hero, потому что это ключ для получения всех данных о героях всего одним вызовом API.

поле данных выглядит примерно так:

{
  "health": 200,
  "healthPerLevel": 2.5,
  "damage": 160,
  "damagePerLevel": 3.5
}

просто простой объект JSON. Теперь, когда мы закончили, я нажимаю кнопку Сохранить.

Я добавил сюда кучу героев:

вы можете добавлять подобные объекты других типов и помещать в них другие данные. И в этом сила полей JSON. Хотя это одна и та же коллекция, поля данных могут быть разными.

Как теперь получить все эти объекты в клиенте?

Есть два пути:

  • Конечные точки API, встроенные в Strapi
  • Пользовательские конечные точки API

Начнем с первого, более простого:

Допустим, мы хотим получить данные конфигурации для всех героев. Перейдите в Роли и разрешения под подключаемыми модулями:

Щелкните значок пера перед разделом Public:

внизу страницы вы можете увидеть Remote Config с набором опций под ним. Установите флажок найти.

С правой стороны появляется эта информация:

он сообщает вам, как получить доступ к методу remote-config.find. Помните конечную точку GET.

Нажмите Сохранить. Н откройте новую вкладку в браузере и введите следующее:

http://localhost:1337/remote-configs

вы можете видеть, что Strapi возвращает список всех элементов, присутствующих в коллекции Remote Config. Но нам не все они нужны. Мы хотим указать, какой тип данных мы хотим, потому что то, как мы обрабатываем их на стороне клиента, будет другим. поэтому, набрав это в браузере:

http://localhost:1337/remote-configs?type=hero

вы получаете только объекты типа герой. Вот и все! Он готов к использованию в игре. Но, как видите, эти массивы настолько огромны, и если мы сделаем так много этих героев, нашему клиенту может потребоваться время, чтобы их получить! и в конце концов, зачем мне отправлять объекты createdDate или created_by и всю эту бесполезную информацию? Мы определенно можем это изменить.

откройте основной каталог вашего проекта:

откройте папку api и затем remote-config:

здесь вам нужно вспомнить концепции, о которых я упоминал ранее. Вам нужно написать метод внутри контроллера (и, возможно, в сервисах. Только если вам нужно что-то делать повторно). И привязал маршрут к методу. Давайте сделаем все это очень быстро!

войдите в папку controllers и откройте remote-config.js с помощью редактора кода. Я использую vscode здесь:

мы должны поместить все наши методы в modules.exports. Итак, он будет открыт для Strapi. Теперь мы хотим, чтобы метод возвращал только желаемые поля каждого объекта-героя. Вот код:

Я определил метод getAllHeroes и получил все объекты типа hero, сохранил их в массиве под названием heroes, а затем извлек только 3 основных поля из их и добавили измененные объекты в новый массив. И, наконец, я вернул модифицированный массив . Есть, конечно, более эффективные способы сделать это, но я не фантастический программист на JS, поэтому мне нравится этот вариант :)

Теперь, когда у нас есть метод, мы устанавливаем к нему маршрут. Перейдите в папку config и откройте routes.json:

вы можете увидеть кучу объектов JSON, которые привязывают определенные методы к своим маршрутам. добавьте это в начало списка:

{
  "method": "GET",
  "path": "/remote-configs/heroes",
  "handler": "remote-config.getAllHeroes",
  "config": {
    "policies": []
  }
}

теперь сохраните файлы remote-config.js и routes.json. Ваш сервер будет перезагружен, чтобы применить изменения, и после этого вам нужно будет сделать то же самое, что вы сделали с методом find в Роли и разрешения. Вот быстрый снимок:

мы проверяем метод getallheroes, и теперь он доступен по простому URL:

http://localhost:1337/remote-configs/heroes

результат:

Вы можете отчетливо увидеть разницу между этим результатом и предыдущим!

Итак, теперь, когда у нас есть API и конечные точки, пора приступить к настройке нашего игрового клиента в следующей части!