Меня зовут Данил Щуцкий, я автор проекта CutCode. В этой статье я хотел рассказать вам о MoonShine — панели для администрирования для ваших проектов на Laravel.

Над MoonShine я работаю с участниками комьюнити CutCode. Это open‑source проект, основная задача которого — сделать админ‑панель максимально простую (для начинающих разработчиков) и в тоже время функциональную и кастомизируемую (для опытных).

На мой взгляд, для новичков очень непросто освоить другие, уже набравшие популярность панели администрирования, и дать им инструмент с невысоким порогом вхождения по знаниям. В то же время для бывалых разработчиков архитектура MoonShine позволяет создавать очень функциональные вещи.

В качестве стека был выбран TAL (Tailwindcss, Alpine.js, Laravel), на мой взгляд и функционально и перспективно.

На момент написания статьи актуальная версия MoonShine 1.62. Для работы MoonShine необходимо:

  • php >= 8.0

  • laravel >= 9.0

Для комфортного применения MoonShine написана документация, а также снят подробный видеогайд.

Расскажу и покажу что из себя представляет MoonShine

После установки админ-панели Вас встретит страница авторизации:

Попадаем внутрь и пробежимся вкратце по функционалу.

Так выглядит раздел со стандартным CRUD:

Фильтры и декорации

Для различных случаев создано много возможностей для фильтрации данных.

Для любителей кастомизации - декорации, сервис Heroicons, UI компоненты, бейджи и куча других фишек.

На форму для удобства можно добавить вкладки и сгруппировать поля:

use MoonShine\Decorations\Block;
use MoonShine\Decorations\Tabs;
use MoonShine\Decorations\Tab;
use MoonShine\Fields\Text;

//...

public function fields(): array
{
   return [
       Block::make('Основное', [
           Tabs::make([
               Tab::make('Seo', [
                   Text::make('Seo title')
                       ->fieldContainer(false),
                   //...
               ]),
               Tab::make('Categories', [
                   //...
               ])
           ])
       ]),
   ];
}
//...

Сетка с колонками

use MoonShine\Decorations\Column;

//...
public function fields(): array
{
   return [
       Grid::make([
           Column::make([
               Block::make('Main information', [
                   // Fields here
               ])
           ])->columnSpan(6), // 6 из 12 - половина экрана

           Column::make([
               Block::make('Contact information', [
                   // Fields here
               ])
           ])->columnSpan(6), // 6 из 12 - половина экрана
       ])
   ];
}
//...

Создание дашбордов

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

Отобразить в виде прогресса достижения цели

namespace MoonShine\Resources;
use MoonShine\Metrics\ValueMetric;

class PostResource extends Resource
{
   //...

   public function metrics(): array
   {
       return [
           ValueMetric::make('Open tasks')
               ->value(Task::opened()->count())
               ->progress(200) // Конечная цель
       ];
   }
   //...
}

Нарисовать график

namespace MoonShine\Resources;
use MoonShine\Metrics\LineChartMetric;

class PostResource extends Resource
{
   //...

   public function metrics(): array
   {
       return [
           LineChartMetric::make('Orders')
               ->line([
                   'Profit' => Order::query()
                       ->selectRaw('SUM(price) as sum, DATE_FORMAT(created_at, "%d.%m.%Y") as date')
                       ->groupBy('date')
                       ->pluck('sum','date')
                       ->toArray(),
                   'Avg' => Order::query()
                       ->selectRaw('AVG(price) as avg, DATE_FORMAT(created_at, "%d.%m.%Y") as date')
                       ->groupBy('date')
                       ->pluck('avg','date')
                       ->toArray()
               ],[
                   'red', 'blue'
               ])
       ];
   }
   //...
}

Поиск по админ панели

Для организации глобального поиска в MoonShine можно воспользоваться пакетом Algolia search for MoonShine

Данный пакет использует поисковый движок Algolia, который учитывает контекст и тип запроса, возможные опечатки, синонимы и словоформы, ввод запроса на разных языках и многое другое.

И еще несколько особенностей MoonShine:

  • для работы с правами доступа используется Laravel policy

  • центр уведомлений в который можно настроить свои события

  • для упрощения процесса аутентификации Laravel Socialite

  • локализация

  • кастомные поля — для тех случаев, когда стандартные поля не справляются

Дополнения

Для быстрого добавления функционала разработчиками создано уже 15 пакетов, дополняющих возможности MoonShine.

Попробуйте MoonShine — возможно именно эта админ‑панель Вам понравится, делали для своих)

Документация

GitHub 

Чат в Telegram 

Tips & Tricks

Комментарии (10)


  1. shachneff
    12.09.2023 17:15

    Много лет использую SleepingOwlAdmin. В чем отличие Вашего продукта от него?
    В SleepingOwlAdmin мне всегда не хватало виджета, позволяющего в сущность добавить другие сущности. Например, сущность "Альманах", в режиме редактирования добавить в нее "ссылки" (одну или несколько) на сущности "Пост", причем, в визуальном режиме, формой выбора.
    Такое решение подглядел в свое время в проекте Laravel BAP, но на SleepingOwlAdmin реализовать сам не смог.


    1. odilovoybek
      12.09.2023 17:15

      Там 500ка в демо (https://demo.sleepingowladmin.ru/admin/some_models). Надеюсь дело не в коде самой панельке (ну я имею ввиду 500ку не подтянут к себе).


      1. shachneff
        12.09.2023 17:15

        Видимо, временные были трудности. Сейчас открывается.


    1. Cutcode Автор
      12.09.2023 17:15

      К сожалению не знаком с SleepingOwlAdmin, но у нас есть NoInput (https://moonshine.cutcode.dev/section/fields-no_input) на случай когда нужно вывести то чего нет) А в целом все кастомизируется и скоро мы представим версию 2.0 где будет полная свобода для разработчика (ну почти)


    1. Vadiok
      12.09.2023 17:15

      Да, интересно было бы увидеть краткий список плюсов-минусов по сравнению со SleepingOwlAdmin, Laravel Orchid и Laravel Nova.

      И 2 вопроса к автору.

      1. Можно ли внутри редактирования сущности вывести привязанные изображения с возможностью добавления и удаления. Изображения - это связь BelongsToMany? Когда используется одиночная связь, вижу, что можно.

      2. Если есть поле сортировки (order, rank) и т.п., насколько сложно реализовать перетаскивание сущностей в списке с изменением этого поля?


      1. Cutcode Автор
        12.09.2023 17:15

        Привет! Да сравнение обязательно сделаем

        1. Можно использовать отношения да, либо поле Image/File в режиме mulptiple или поле MediaLibrary(Spatie) или Json поле или глянуть на эти поля и как просто они реализованы и сделать свое кастомное

        2. https://github.com/lee-to/moonshine-tree-resource в этом пакете примере я полностью изменил список карточек и добавил им сортировку (потратил 20 минут) А вот еще пример https://github.com/lee-to/moonshine-kanban-board-resource

        В целом подключайтесь к нам, то чего еще нет в муншайн мы добавим


  1. MrSmitix
    12.09.2023 17:15
    -1

    Я хоть и не являюсь разработчиком на php, и тем более не знаком с laravel. Но выглядит очень круто и удобно. Так держать!

    Единственное что интересует, как у вас будет взаимодействие дашбордов с фильтрами? И можно ли их прикрутить к ним? Могу ошибаться, но исходя из примеров для их отрисовки нельзя передать параметры. Тот же диапазон дат например.


    1. Cutcode Автор
      12.09.2023 17:15

      Взгляните на Метрики https://moonshine.cutcode.dev/section/metrics-line_chart


  1. GlamCat
    12.09.2023 17:15

    А что насчёт сравнения с Filament?

    Может быть, есть какие-то конкретные киллер-


    1. Cutcode Автор
      12.09.2023 17:15

      Сравним с выходом муншайн 2.0