BIG_UPDATE deleted vps, added s3 infrastructure.
This commit is contained in:
244
NEW_FEATURES.md
Normal file
244
NEW_FEATURES.md
Normal file
@@ -0,0 +1,244 @@
|
||||
# Новые функции: Сессии, QR-авторизация и улучшенные тикеты
|
||||
|
||||
## 📋 Что было сделано
|
||||
|
||||
### ✅ Backend
|
||||
|
||||
1. **Система управления сессиями**
|
||||
- Новая таблица `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` - завершить все остальные сессии
|
||||
|
||||
2. **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` - отклонить вход (требует авторизации)
|
||||
|
||||
3. **Улучшенная система тикетов**
|
||||
- Новые поля в таблице `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
|
||||
|
||||
1. **Страница управления сессиями**
|
||||
- Путь: `/dashboard/settings/sessions`
|
||||
- Компонент: `frontend/src/pages/dashboard/settings/sessions.tsx`
|
||||
- Функции:
|
||||
- Список всех активных сессий с карточками
|
||||
- Текущая сессия выделена зелёным
|
||||
- Информация: устройство, браузер, IP, геолокация, последняя активность
|
||||
- Кнопка "Завершить сессию" на каждой карточке
|
||||
- Кнопка "Завершить все остальные сессии"
|
||||
- Раздел истории входов (последние 20 попыток)
|
||||
- Советы по безопасности
|
||||
|
||||
2. **Компонент QR-авторизации**
|
||||
- Путь: `frontend/src/components/QRLogin.tsx`
|
||||
- Функции:
|
||||
- Генерация и отображение QR-кода
|
||||
- Таймер обратного отсчёта (60 секунд)
|
||||
- Автообновление истёкшего QR
|
||||
- Polling статуса каждые 2 секунды
|
||||
- Автоматический вход при подтверждении
|
||||
- Инструкции для пользователя
|
||||
- TODO: Интегрировать на страницу `/login` как альтернативу паролю
|
||||
|
||||
3. **Новая страница списка тикетов**
|
||||
- Путь: `/dashboard/tickets-new`
|
||||
- Компонент: `frontend/src/pages/dashboard/tickets/index.tsx`
|
||||
- Функции:
|
||||
- Современный card-дизайн
|
||||
- Фильтры по статусу, категории, приоритету
|
||||
- Цветные бейджи статусов
|
||||
- Индикаторы приоритета
|
||||
- Иконки категорий
|
||||
- Счётчик ответов
|
||||
- Относительное время обновления
|
||||
- Кнопка создания нового тикета
|
||||
|
||||
4. **Страница просмотра тикета**
|
||||
- Путь: `/dashboard/tickets-new/:id`
|
||||
- Компонент: `frontend/src/pages/dashboard/tickets/detail.tsx`
|
||||
- Функции:
|
||||
- Полная информация о тикете
|
||||
- История ответов в хронологическом порядке
|
||||
- Внутренние комментарии (жёлтый фон, только операторы)
|
||||
- Форма добавления нового ответа
|
||||
- Кнопка закрытия тикета
|
||||
- Бейджи статуса и приоритета
|
||||
- Аватары пользователей
|
||||
|
||||
5. **Страница создания тикета**
|
||||
- Путь: `/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
|
||||
|
||||
### Осталось сделать:
|
||||
|
||||
1. **Интеграция QR-компонента на страницу входа** ⏳
|
||||
- Добавить переключатель "Пароль / QR-код" на `/login`
|
||||
- Импортировать компонент `QRLogin`
|
||||
|
||||
2. **Добавить ссылку на сессии в меню настроек** ⏳
|
||||
- В сайдбаре дашборда добавить пункт "Сессии" в разделе настроек
|
||||
|
||||
3. **Тестирование** ⏳
|
||||
- Проверить создание/просмотр/ответ на тикеты
|
||||
- Проверить фильтры тикетов
|
||||
- Проверить управление сессиями
|
||||
- Протестировать QR-авторизацию (требуется мобильное приложение)
|
||||
|
||||
4. **Дополнительные улучшения (опционально)**:
|
||||
- WebSocket для real-time обновлений тикетов
|
||||
- Загрузка файлов в тикеты (multer настроен, нужен UI)
|
||||
- Интеграция API геолокации (сейчас заглушка "Россия, Москва")
|
||||
- Email-уведомления о новых ответах
|
||||
- Push-уведомления для мобильных устройств
|
||||
|
||||
## 🚀 Деплой
|
||||
|
||||
### Backend:
|
||||
```bash
|
||||
cd backend
|
||||
npm run build
|
||||
# Перезапустить PM2 или сервер
|
||||
pm2 reload ecosystem.config.js
|
||||
```
|
||||
|
||||
### Frontend:
|
||||
```bash
|
||||
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` - Сгенерировать QR
|
||||
- `GET /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-авторизации требуется мобильное приложение, которое:
|
||||
1. Умеет сканировать QR-коды
|
||||
2. Может отправить POST запрос на `/api/qr-auth/confirm` с кодом
|
||||
3. Передаёт авторизационный токен пользователя
|
||||
|
||||
Формат QR-кода: `ospabhost://qr-login?code={уникальный_код}`
|
||||
|
||||
---
|
||||
|
||||
**Дата создания**: 9 ноября 2025
|
||||
**Статус**: Backend ✅ | Frontend ✅ | Тестирование ⏳
|
||||
Reference in New Issue
Block a user