Отметим: когда стандартная админ-панель слишком жесткая, а кастомная разработка — слишком дорогая, AdminJS (см. GitHub-репозиторий) предлагает золотую середину. Но в коробке он часто не покрывает сложные бизнес-правила: кастомные экшены, загрузку файлов, ролевой доступ. Мы разработали админ-панели на AdminJS для e-commerce, логистики и SaaS с 20+ проектами за плечами. Однажды для сети магазинов мы внедрили кастомный экшен массового изменения цен — обработка 5000 товаров за 30 секунд. В этой статье расскажем, как кастомизировать AdminJS, какие инструменты используем и где проходят границы возможностей.
Какие проблемы решает AdminJS?
AdminJS генерирует CRUD-интерфейс на основе моделей данных. Он подходит для быстрого запуска админки, но требует доработки под нестандартные сценарии. Вот основные сложности, которые мы решаем:
- Кастомные действия — массовая рассылка, генерация отчётов, интеграция с внешними API. Например, для логистического стартапа мы добавили экшен автоматического создания накладных, обрабатывающий 10 000 записей за минуту.
- Загрузка файлов — через
@adminjs/uploadс S3 или локальным хранилищем. Поддерживаем автогенерацию превью и миниатюр для изображений товаров. - Права доступа — разграничение по ролям и действиям (просмотр, редактирование, удаление). Настраиваем ролевую модель на основе
currentAdmin.roleс каскадными разрешениями. - Кастомные компоненты — замена стандартных полей на React-виджеты: datepicker, autocomplete, wysiwyg-редакторы. Для одного клиента мы разработали компонент выбора склада с геолокацией.
- Производительность — оптимизация запросов для таблиц с 100k+ записей: добавляем индексы, используем серверную фильтрацию, подключаем Elasticsearch для полнотекстового поиска.
Как кастомизировать AdminJS под бизнес-требования?
Стек: Node.js, TypeScript, React 18, AdminJS 7.x, TypeORM / Prisma. Деплой — Docker, Nginx, Vercel.
Рассмотрим пример: интернет-магазин с товарами, заказами и клиентами. Базовая настройка AdminJS с аутентификацией и кастомными правами:
Пример кода настройки AdminJS
import AdminJS from 'adminjs'; import AdminJSExpress from '@adminjs/express'; import { Database, Resource, getModelByName } from '@adminjs/typeorm'; AdminJS.registerAdapter({ Database, Resource }); const adminJs = new AdminJS({ resources: [ { resource: getModelByName('User'), options: { properties: { password: { isVisible: { list: false, edit: false, filter: false, show: false } }, createdAt: { isVisible: { edit: false } } }, actions: { delete: { isAccessible: ({ currentAdmin }) => currentAdmin?.role === 'superadmin' } } } }, { resource: getModelByName('Order'), options: { listProperties: ['id', 'customer', 'status', 'total', 'createdAt'], filterProperties: ['status', 'createdAt'], sort: { sortBy: 'createdAt', direction: 'desc' } } } ], dashboard: { component: AdminJS.bundle('./components/Dashboard') }, branding: { companyName: 'Мой Магазин', logo: '/admin-logo.svg' } }); const router = AdminJSExpress.buildAuthenticatedRouter(adminJs, { authenticate: async (email, password) => { const admin = await Admin.findOne({ email }); if (admin && await bcrypt.compare(password, admin.passwordHash)) { return admin; } return null; }, cookiePassword: process.env.COOKIE_SECRET }); Кастомный компонент для отображения статуса заказа цветом:
import { BasePropertyProps } from 'adminjs'; const OrderStatusCell: React.FC<BasePropertyProps> = ({ record }) => { const status = record.params.status; const colors = { pending: 'orange', completed: 'green', cancelled: 'red' }; return <span style={{ color: colors[status] }}>{status}</span>; }; export default OrderStatusCell; Загрузка изображений товаров в S3 через @adminjs/upload:
import uploadFeature from '@adminjs/upload'; import { s3Client } from './s3-client'; { resource: getModelByName('Product'), features: [ uploadFeature({ provider: { aws: { bucket: 'my-bucket', s3Client } }, properties: { file: 'imageFile', filePath: 'imageUrl', filename: 'imageName', mimeType: 'imageMimeType' }, uploadPath: (record, filename) => `products/${record.id()}/${filename}` }) ] } Почему AdminJS экономит до 60% времени и бюджета?
Написание админ-панели с нуля на React и Express занимает около 3–4 недель для типового CRUD. AdminJS сокращает этот срок до 1–2 недель, что в 2-3 раза быстрее. Для проектов с 10+ сущностями экономия времени достигает 60%, а следовательно и бюджета. При добавлении кастомных компонентов экономия сохраняется на уровне 30–40%.
Согласно официальной документации AdminJS, фреймворк поддерживает все популярные ORM и ускоряет разработку за счёт генерации интерфейса из моделей. Но важно понимать: коробочная версия даёт базовый функционал, а реальная экономия получается при правильной настройке и кастомизации.
| ORM | Скорость разработки | Сложность кастомизации |
|---|---|---|
| TypeORM | Высокая | Низкая |
| Prisma | Средняя | Средняя |
| Mongoose | Высокая | Низкая |
| Sequelize | Средняя | Средняя |
Что делать, если производительность AdminJS не устраивает?
Для таблиц с 100k+ записей стандартные механизмы могут тормозить. Мы применяем несколько подходов. Первый — серверная фильтрация: все фильтры выполняются на стороне БД, а не во фронтенде. Второй — индексация часто запрашиваемых полей. Третий — отказ от find с загрузкой всех связанных сущностей; используем QueryBuilder с select only. В крайнем случае подключаем Elasticsearch для полнотекстового поиска.
Пример оптимизации: в одном проекте таблица заказов (200k записей) открывалась 5 секунд. После добавления композитного индекса по (status, createdAt) и фильтрации по статусу время загрузки упало до 200 мс.
Как мы разрабатываем админ-панель?
| Этап | Время (дни) |
|---|---|
| Аналитика | 1 |
| Проектирование | 1-2 |
| Реализация | 5-10 |
| Тестирование | 2-3 |
| Деплой | 1 |
- Аналитика — изучаем структуру данных, бизнес-процессы, права доступа. Оцениваем объём за 1 день.
- Проектирование — определяем ресурсы, экшены, компоненты, схему прав.
- Реализация — настройка AdminJS, написание кастомных компонентов и экшенов, интеграция с внешними сервисами.
- Тестирование — проверка сценариев, нагрузочное тестирование (до 10 000 запросов).
- Деплой и документация — развёртывание на вашем сервере, описание инструкций для администраторов.
Что входит в результат работы
- Полностью готовая админ-панель на AdminJS с аутентификацией.
- Кастомные компоненты и экшены по вашему ТЗ.
- Интеграция с загрузкой файлов (S3, MinIO).
- Разграничение прав доступа (роли, действия).
- Исходный код, документация, инструкция по развёртыванию.
- Гарантия 6 месяцев на выявленные ошибки.
Для простых проектов AdminJS сокращает время разработки админки на 60% по сравнению с написанием с нуля. Свяжитесь с нами, чтобы обсудить ваш проект — получите консультацию и предварительную оценку за 1 день. Закажите разработку админ-панели на AdminJS.







