Відзначимо: коли стандартна адмін-панель занадто жорстка, а кастомна розробка — занадто дорога, 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.







