Розробка панелі адміністратора для LMS
Адміністративна панель LMS—це операційний центр платформи. Через неї управляють користувачами, курсами, потоками, платежами, конфігурацією та інфраструктурою. На відміну від кабінету викладача, admin-панель охоплює всю платформу цілком та вимагає тонкого управління правами доступу.
Ролі та права доступу
Багаторівнева ролева система (RBAC):
| Роль | Доступ |
|---|---|
| Super Admin | Повний доступ до всього |
| Platform Manager | Курси, користувачі, аналітика (без біллінгу) |
| Finance | Тільки транзакції, купони, refunds |
| Support | Перегляд користувачів, курсів; без змін |
| Course Moderator | Тільки призначені курси |
// Middleware перевірки прав
function requirePermission(permission: string) {
return (req: Request, res: Response, next: NextFunction) => {
const userPermissions = req.user.role.permissions;
if (!userPermissions.includes(permission) && !userPermissions.includes('*')) {
return res.status(403).json({ error: 'Forbidden' });
}
next();
};
}
// Маршрути з правами
router.get('/users', requirePermission('users.read'), usersController.list);
router.delete('/users/:id', requirePermission('users.delete'), usersController.delete);
router.get('/finance/transactions', requirePermission('finance.read'), financeController.list);
Управління користувачами
Список користувачів з фільтрами (роль, статус, дата реєстрації, курс) та пошуком. На 100K+ користувачів—cursor-based pagination, не offset.
Карточка користувача—повна історія: курси, транзакції, сесії, лог змін. Дії: змінити email/пароль, призначити роль, заблокувати, імперсонація (увійти від імені користувача).
Імперсонація—критично важлива функція для підтримки:
// Увійти від імені користувача
app.post('/admin/impersonate/:userId', requirePermission('users.impersonate'), async (req, res) => {
const targetUser = await db.users.findByPk(req.params.userId);
// Зберігаємо вихідного користувача в сесію
req.session.impersonatorId = req.user.id;
req.session.userId = targetUser.id;
// Логуємо дію
await auditLog.create({
action: 'impersonate',
actorId: req.user.id,
targetId: targetUser.id,
ip: req.ip,
});
res.redirect('/dashboard');
});
Управління курсами
- Список всіх курсів з фільтрами (статус, категорія, викладач)
- Швидка зміна статусу: чорновик → опубліковано → архів
- Статистика по курсу: записи, прогрес, виручка, retention
- Управління потоками (cohorts): створення, запис студентів пачкою
- Клонування курсу для нового потоку
Фінансовий розділ
interface TransactionListFilters {
dateFrom?: Date;
dateTo?: Date;
status?: 'succeeded' | 'pending' | 'failed' | 'refunded';
paymentMethod?: string;
userId?: string;
courseId?: string;
minAmount?: number;
}
Функції:
- Список транзакцій з експортом у CSV/Excel
- Повернення платежу (Stripe Refund API) з указанням причини
- Промокоди: створення, обмеження (курс, строк, кількість використань, % скидки)
- MRR/ARR графіки, LTV по когортах
Аналітика платформи
-- Дашборд метрик за період
SELECT
COUNT(DISTINCT e.student_id) FILTER (WHERE e.created_at >= $1) AS new_enrollments,
COUNT(DISTINCT e.student_id) FILTER (WHERE cp.last_activity_at >= NOW() - INTERVAL '7 days') AS dau_7d,
COUNT(DISTINCT c.id) FILTER (WHERE c.completed_at >= $1) AS completions,
SUM(t.amount) FILTER (WHERE t.created_at >= $1 AND t.status = 'succeeded') AS revenue
FROM enrollments e
LEFT JOIN course_progress cp ON cp.student_id = e.student_id
LEFT JOIN transactions t ON t.user_id = e.student_id;
Grafana або вбудовані компоненти графіків (Recharts/Chart.js): MAU, нові реєстрації, виручка, % завершення курсів.
Конфігурація платформи
Налаштування через admin-панель без деплоя:
- Email шаблони (Twig/Handlebars редактор з preview)
- Налаштування нотифікацій (які типи включені за замовчуванням)
- Налаштування платіжних систем (ключі Stripe/PayPal)
- SEO мета-теги для сторінок курсів
- Feature flags (включити/вимкнути функції для % користувачів)
Audit Log
Кожна дія адміністратора логується:
CREATE TABLE audit_log (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
actor_id UUID REFERENCES users(id),
action VARCHAR(200) NOT NULL, -- 'user.delete', 'course.publish'
entity_type VARCHAR(100),
entity_id UUID,
old_value JSONB,
new_value JSONB,
ip_address INET,
user_agent TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX ON audit_log (actor_id, created_at DESC);
CREATE INDEX ON audit_log (entity_type, entity_id);
UI фреймворк для admin-панелі
Три варіанти:
- React Admin—готовий фреймворк для CRUD-інтерфейсів. Швидкий старт, обмежена кастомізація.
- Tremor / shadcn/ui—бібліотека компонентів для custom admin.
- Refine—headless фреймворк, повний контроль над UI з готовою логікою CRUD.
Терміни
Базова admin-панель: користувачі, курси, транзакції, аналітика дашборд—2–3 тижні. Розширені функції: імперсонація, audit log, feature flags, email-редактор—ще 1–2 тижні.







