Меня зовут Данил Щуцкий, я автор проекта 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 — возможно именно эта админ‑панель Вам понравится, делали для своих)
Комментарии (10)
MrSmitix
12.09.2023 17:15-1Я хоть и не являюсь разработчиком на php, и тем более не знаком с laravel. Но выглядит очень круто и удобно. Так держать!
Единственное что интересует, как у вас будет взаимодействие дашбордов с фильтрами? И можно ли их прикрутить к ним? Могу ошибаться, но исходя из примеров для их отрисовки нельзя передать параметры. Тот же диапазон дат например.
Cutcode Автор
12.09.2023 17:15Взгляните на Метрики https://moonshine.cutcode.dev/section/metrics-line_chart
shachneff
Много лет использую SleepingOwlAdmin. В чем отличие Вашего продукта от него?
В SleepingOwlAdmin мне всегда не хватало виджета, позволяющего в сущность добавить другие сущности. Например, сущность "Альманах", в режиме редактирования добавить в нее "ссылки" (одну или несколько) на сущности "Пост", причем, в визуальном режиме, формой выбора.
Такое решение подглядел в свое время в проекте Laravel BAP, но на SleepingOwlAdmin реализовать сам не смог.
odilovoybek
Там 500ка в демо (https://demo.sleepingowladmin.ru/admin/some_models). Надеюсь дело не в коде самой панельке (ну я имею ввиду 500ку не подтянут к себе).
shachneff
Видимо, временные были трудности. Сейчас открывается.
Cutcode Автор
К сожалению не знаком с SleepingOwlAdmin, но у нас есть NoInput (https://moonshine.cutcode.dev/section/fields-no_input) на случай когда нужно вывести то чего нет) А в целом все кастомизируется и скоро мы представим версию 2.0 где будет полная свобода для разработчика (ну почти)
Vadiok
Да, интересно было бы увидеть краткий список плюсов-минусов по сравнению со SleepingOwlAdmin, Laravel Orchid и Laravel Nova.
И 2 вопроса к автору.
Можно ли внутри редактирования сущности вывести привязанные изображения с возможностью добавления и удаления. Изображения - это связь BelongsToMany? Когда используется одиночная связь, вижу, что можно.
Если есть поле сортировки (order, rank) и т.п., насколько сложно реализовать перетаскивание сущностей в списке с изменением этого поля?
Cutcode Автор
Привет! Да сравнение обязательно сделаем
Можно использовать отношения да, либо поле Image/File в режиме mulptiple или поле MediaLibrary(Spatie) или Json поле или глянуть на эти поля и как просто они реализованы и сделать свое кастомное
https://github.com/lee-to/moonshine-tree-resource в этом пакете примере я полностью изменил список карточек и добавил им сортировку (потратил 20 минут) А вот еще пример https://github.com/lee-to/moonshine-kanban-board-resource
В целом подключайтесь к нам, то чего еще нет в муншайн мы добавим