11 KiB
11 KiB
Новые функции: Сессии, QR-авторизация и улучшенные тикеты
📋 Что было сделано
✅ Backend
-
Система управления сессиями
- Новая таблица
sessionдля хранения JWT refresh tokens - Отслеживание: IP, user-agent, устройство, браузер, геолокация
- Лимит: максимум 10 сессий на пользователя
- Автоматическое удаление старых сессий (30 дней)
- API endpoints:
GET /api/sessions- список всех активных сессийGET /api/sessions/history- история входовDELETE /api/sessions/:id- завершить конкретную сессиюDELETE /api/sessions/others/all- завершить все остальные сессии
- Новая таблица
-
QR-авторизация (как в Telegram Web)
- Новая таблица
qr_login_request - Генерация уникальных QR-кодов (crypto-based)
- Время жизни: 60 секунд
- Polling механизм для проверки статуса (каждые 2 сек)
- API endpoints:
POST /api/qr-auth/generate- создать QR-код (публичный)GET /api/qr-auth/status/:code- проверить статус (публичный, polling)POST /api/qr-auth/confirm- подтвердить вход с мобильного (требует авторизации)POST /api/qr-auth/reject- отклонить вход (требует авторизации)
- Новая таблица
-
Улучшенная система тикетов
- Новые поля в таблице
ticket:priority(low/normal/high/urgent)category(general/technical/billing/other)assignedTo(оператор, которому назначен тикет)closedAt(дата закрытия)
- Новые таблицы:
ticket_attachment- файлы к тикетамresponse_attachment- файлы к ответам
- Новое поле в
response:isInternal- внутренние комментарии для операторов
- Поддержка файлов: max 5 файлов по 10MB (jpeg/png/gif/pdf/doc/txt/zip)
- Статусы: open → in_progress → awaiting_reply → resolved → closed
- API endpoints:
GET /api/ticket/:id- получить один тикетPOST /api/ticket/status- изменить статус (только операторы)POST /api/ticket/assign- назначить оператора (только операторы)- Обновлены существующие endpoints для поддержки новых полей
- Новые поля в таблице
✅ Frontend
-
Страница управления сессиями
- Путь:
/dashboard/settings/sessions - Компонент:
frontend/src/pages/dashboard/settings/sessions.tsx - Функции:
- Список всех активных сессий с карточками
- Текущая сессия выделена зелёным
- Информация: устройство, браузер, IP, геолокация, последняя активность
- Кнопка "Завершить сессию" на каждой карточке
- Кнопка "Завершить все остальные сессии"
- Раздел истории входов (последние 20 попыток)
- Советы по безопасности
- Путь:
-
Компонент QR-авторизации
- Путь:
frontend/src/components/QRLogin.tsx - Функции:
- Генерация и отображение QR-кода
- Таймер обратного отсчёта (60 секунд)
- Автообновление истёкшего QR
- Polling статуса каждые 2 секунды
- Автоматический вход при подтверждении
- Инструкции для пользователя
- TODO: Интегрировать на страницу
/loginкак альтернативу паролю
- Путь:
-
Новая страница списка тикетов
- Путь:
/dashboard/tickets-new - Компонент:
frontend/src/pages/dashboard/tickets/index.tsx - Функции:
- Современный card-дизайн
- Фильтры по статусу, категории, приоритету
- Цветные бейджи статусов
- Индикаторы приоритета
- Иконки категорий
- Счётчик ответов
- Относительное время обновления
- Кнопка создания нового тикета
- Путь:
-
Страница просмотра тикета
- Путь:
/dashboard/tickets-new/:id - Компонент:
frontend/src/pages/dashboard/tickets/detail.tsx - Функции:
- Полная информация о тикете
- История ответов в хронологическом порядке
- Внутренние комментарии (жёлтый фон, только операторы)
- Форма добавления нового ответа
- Кнопка закрытия тикета
- Бейджи статуса и приоритета
- Аватары пользователей
- Путь:
-
Страница создания тикета
- Путь:
/dashboard/tickets/new - Компонент:
frontend/src/pages/dashboard/tickets/new.tsx - Функции:
- Форма с полями: тема, категория, приоритет, описание
- Валидация полей
- Советы по созданию тикетов
- Перенаправление на созданный тикет
- Путь:
📁 Структура файлов
Backend
backend/
├── src/
│ ├── index.ts (добавлены новые routes)
│ └── modules/
│ ├── session/
│ │ ├── session.controller.ts (NEW)
│ │ └── session.routes.ts (NEW)
│ ├── qr-auth/
│ │ ├── qr-auth.controller.ts (NEW)
│ │ └── qr-auth.routes.ts (NEW)
│ └── ticket/
│ ├── ticket.controller.ts (REWRITTEN)
│ └── ticket.routes.ts (UPDATED)
├── prisma/
│ ├── schema.prisma (обновлена)
│ ├── apply-migration.ts (NEW - скрипт применения миграции)
│ └── migrations_manual/
│ └── add_sessions_qr_tickets_features.sql (NEW)
└── uploads/
└── tickets/ (NEW)
Frontend
frontend/
├── src/
│ ├── components/
│ │ └── QRLogin.tsx (NEW)
│ └── pages/
│ └── dashboard/
│ ├── mainpage.tsx (добавлены routes)
│ ├── settings/
│ │ └── sessions.tsx (NEW)
│ └── tickets/
│ ├── index.tsx (NEW)
│ ├── detail.tsx (NEW)
│ └── new.tsx (NEW)
└── package.json (добавлен qrcode.react)
🔧 Технические детали
База данных
- Миграция применена: ✅
- Prisma client сгенерирован: ✅
- Новые таблицы:
session(10 столбцов)login_history(9 столбцов)qr_login_request(9 столбцов)ticket_attachment(7 столбцов)response_attachment(7 столбцов)
Зависимости
- Backend: Без новых зависимостей (используются встроенные)
- Frontend:
qrcode.react✅ установлен
Компиляция
- Backend: ✅ Собран без ошибок (
npm run build) - Frontend: ✅ Собран без ошибок (
npm run build)
📝 TODO
Осталось сделать:
-
Интеграция QR-компонента на страницу входа ⏳
- Добавить переключатель "Пароль / QR-код" на
/login - Импортировать компонент
QRLogin
- Добавить переключатель "Пароль / QR-код" на
-
Добавить ссылку на сессии в меню настроек ⏳
- В сайдбаре дашборда добавить пункт "Сессии" в разделе настроек
-
Тестирование ⏳
- Проверить создание/просмотр/ответ на тикеты
- Проверить фильтры тикетов
- Проверить управление сессиями
- Протестировать QR-авторизацию (требуется мобильное приложение)
-
Дополнительные улучшения (опционально):
- WebSocket для real-time обновлений тикетов
- Загрузка файлов в тикеты (multer настроен, нужен UI)
- Интеграция API геолокации (сейчас заглушка "Россия, Москва")
- Email-уведомления о новых ответах
- Push-уведомления для мобильных устройств
🚀 Деплой
Backend:
cd backend
npm run build
# Перезапустить PM2 или сервер
pm2 reload ecosystem.config.js
Frontend:
cd frontend
npm run build
# Скопировать dist/ на production сервер
🔗 API Endpoints
Сессии
GET /api/sessions- Список активных сессийGET /api/sessions/history?limit=20- История входовDELETE /api/sessions/:id- Завершить сессиюDELETE /api/sessions/others/all- Завершить все остальные
QR-авторизация
POST /api/qr-auth/generate- Сгенерировать QRGET /api/qr-auth/status/:code- Проверить статусPOST /api/qr-auth/confirm- Подтвердить входPOST /api/qr-auth/reject- Отклонить вход
Тикеты (новые/обновлённые)
GET /api/ticket/:id- Получить один тикетPOST /api/ticket/status- Изменить статусPOST /api/ticket/assign- Назначить оператора
📱 Мобильное приложение
Для полноценной работы QR-авторизации требуется мобильное приложение, которое:
- Умеет сканировать QR-коды
- Может отправить POST запрос на
/api/qr-auth/confirmс кодом - Передаёт авторизационный токен пользователя
Формат QR-кода: ospabhost://qr-login?code={уникальный_код}
Дата создания: 9 ноября 2025
Статус: Backend ✅ | Frontend ✅ | Тестирование ⏳