Challenge Admin Panel
Админская панель для управления Challenge Service - системой автоматической проверки заданий с помощью LLM.
🎯 Реализованная функциональность
✅ Dashboard (Главная страница)
- Основные метрики:
- Количество пользователей, заданий, цепочек
- Общее количество проверок
- Статус очереди с загруженностью
- Среднее время проверки
- Статистика проверок:
- Принятые/отклоненные/ожидающие
- Распределение по статусам
- Real-time обновление: автоматическое обновление данных каждые 10 секунд
✅ CRUD для Tasks (Заданий)
- Список заданий:
- Таблица с названием, автором, датой создания
- Индикатор наличия скрытых инструкций (🔒)
- Поиск по названию
- Действия: редактировать, удалить
- Создание/редактирование задания:
- Название (обязательное, до 255 символов)
- Описание в формате Markdown с вкладками "Редактор" и "Превью"
- Скрытые инструкции для LLM (🔒 только для преподавателей):
- Специальное поле с визуальным выделением
- Инструкции передаются LLM при проверке, но не видны студентам
- Примеры использования в подсказках
- Отображение метаданных (автор, даты создания/обновления)
- Валидация и обработка ошибок
✅ CRUD для Chains (Цепочек)
- Список цепочек:
- Таблица с названием, количеством заданий, датой создания
- Поиск по названию
- Действия: редактировать, удалить
- Создание/редактирование цепочки:
- Название цепочки (обязательное)
- Выбор заданий из существующих
- Управление порядком заданий (кнопки вверх/вниз)
- Добавление/удаление заданий в цепочку
- Поиск доступных заданий
✅ Users (Пользователи)
- Список пользователей:
- Таблица с nickname, ID, датой регистрации
- Поиск по nickname
- Кнопка просмотра статистики
- Детальная статистика пользователя (модальное окно):
- Общие метрики: выполнено, всего попыток, в процессе, требует доработки
- Прогресс по цепочкам с визуальными прогресс-барами
- Детали по заданиям со статусами
- Среднее время проверки
✅ Submissions (Попытки)
- Список попыток:
- Таблица с пользователем, заданием, статусом, попыткой
- Дата отправки и время проверки
- Фильтрация:
- Поиск по пользователю или заданию
- Фильтр по статусу (все/принято/доработка/проверяется/ожидает)
- Цветные бейджи статусов
- Детали попытки (модальное окно):
- Метаданные: пользователь, статус, даты
- Описание задания (Markdown)
- Решение пользователя
- Обратная связь от LLM
- Время проверки
🛠 Технологический стек
- React 18 + TypeScript
- React Router для навигации
- Redux Toolkit + RTK Query для state management и API
- Chakra UI v3 для UI компонентов
- react-markdown для отображения Markdown
- Keycloak для авторизации преподавателей
📁 Структура проекта
src/
├── __data__/
│ ├── api/
│ │ └── api.ts # RTK Query API endpoints
│ ├── kc.ts # Keycloak конфигурация
│ ├── store.ts # Redux store
│ └── urls.ts # URL константы
├── components/
│ ├── ui/
│ │ └── toaster.tsx # Toast уведомления
│ ├── ConfirmDialog.tsx # Диалог подтверждения
│ ├── EmptyState.tsx # Пустое состояние
│ ├── ErrorAlert.tsx # Отображение ошибок
│ ├── Layout.tsx # Общий layout с навигацией
│ ├── LoadingSpinner.tsx # Индикатор загрузки
│ ├── StatCard.tsx # Карточка метрики
│ └── StatusBadge.tsx # Бейдж статуса
├── pages/
│ ├── dashboard/
│ │ └── DashboardPage.tsx # Главная страница
│ ├── tasks/
│ │ ├── TasksListPage.tsx # Список заданий
│ │ └── TaskFormPage.tsx # Форма задания
│ ├── chains/
│ │ ├── ChainsListPage.tsx # Список цепочек
│ │ └── ChainFormPage.tsx # Форма цепочки
│ ├── users/
│ │ └── UsersPage.tsx # Список пользователей
│ └── submissions/
│ └── SubmissionsPage.tsx # Список попыток
├── types/
│ └── challenge.ts # TypeScript типы
├── app.tsx # Главный компонент
├── dashboard.tsx # Роутинг
├── index.tsx # Entry point
└── theme.tsx # Chakra UI theme
🔐 Авторизация
Приложение требует авторизации через Keycloak с ролью teacher в клиенте journal.
Конфигурация в bro.config.js:
KC_URL: 'https://auth.brojs.ru'
KC_REALM: 'itpark'
KC_CLIENT_ID: 'journal'
Все API запросы автоматически отправляют Bearer токен через RTK Query middleware.
🚀 Запуск проекта
# Установка зависимостей
npm install
# Запуск в режиме разработки (с стабами API)
npm start
# Сборка для production
npm run build:prod
Приложение будет доступно по адресу: http://localhost:8099
📡 Стабовый API сервер
Проект включает полнофункциональный стабовый API сервер для разработки и тестирования без реального бэкенда.
Тестовые данные:
stubs/api/data/tasks.json- 5 заданий с hiddenInstructionsstubs/api/data/chains.json- 3 цепочки заданийstubs/api/data/users.json- 8 пользователейstubs/api/data/submissions.json- 8 попыток с feedback от LLMstubs/api/data/stats.json- системная статистика
Возможности:
- ✅ Полный CRUD для заданий и цепочек
- ✅ In-memory хранилище (изменения сбрасываются при перезапуске)
- ✅ Автоматическое обновление статистики
- ✅ Генерация статистики пользователей на лету
- ✅ Поддержка всех endpoints из документации
Примечание: Все ответы возвращаются в формате { error: null, data: ... }
📡 API Endpoints
Все endpoints используют базовый URL из конфига (/api).
Tasks
GET /challenge/tasks- список заданийGET /challenge/task/:id- одно заданиеPOST /challenge/task- создать заданиеPUT /challenge/task/:id- обновить заданиеDELETE /challenge/task/:id- удалить задание
Chains
GET /challenge/chains- список цепочекGET /challenge/chain/:id- одна цепочкаPOST /challenge/chain- создать цепочкуPUT /challenge/chain/:id- обновить цепочкуDELETE /challenge/chain/:id- удалить цепочку
Users & Stats
GET /challenge/users- список пользователейGET /challenge/stats- общая статистика системыGET /challenge/user/:userId/stats- статистика пользователя
Submissions
GET /challenge/submissions- все попыткиGET /challenge/user/:userId/submissions- попытки пользователя
⚙️ Ключевые особенности реализации
RTK Query с кэшированием
Настроены tagTypes для автоматической инвалидации кэша:
Task- для заданийChain- для цепочекUser- для пользователейSubmission- для попытокStats- для статистики
Real-time обновления
Dashboard использует pollingInterval: 10000 для автоматического обновления статистики каждые 10 секунд.
hiddenInstructions (Скрытые инструкции)
Специальное поле только для преподавателей:
- Визуально выделено фиолетовым цветом
- Передаётся LLM при проверке решений
- Не видно студентам
- Позволяет тонко настроить проверку
UX оптимизации
- Loading состояния для всех запросов
- Toast уведомления для успеха/ошибок
- Confirm диалоги для опасных действий (удаление)
- Empty states для пустых списков
- Поиск и фильтрация на всех страницах
- Адаптивный дизайн
🔗 Навигация
Переход между проектами настроен через bro.config.js:
navigations: {
'challenge-admin-pl.main': '/challenge-admin-pl',
'link.challenge': '/challenge',
}
В Layout есть кнопка "Открыть проигрыватель" для перехода к студенческому интерфейсу.
📝 Документация
Подробная документация по API и архитектуре системы находится в папке docs/:
CHALLENGE_FRONTEND_GUIDE.md- руководство для фронтенд разработчиковTEACHER_GUIDE.md- руководство для преподавателейCHALLENGE_ANALYTICS_SUMMARY.md- аналитика и метрикиCHALLENGE_REACT_EXAMPLE.md- примеры React компонентов
✨ Дополнительно
- Все компоненты типизированы с TypeScript
- Markdown поддержка с превью и стилизацией
- Обработка ошибок API с понятными сообщениями
- Валидация форм
- Responsive design
Версия: 1.0.0
Дата: Ноябрь 2025
Статус: ✅ Production Ready