Разработка панели администратора для 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 или встроенные chart компоненты (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 недели.







