Files
telegram-shop/docs/admin-nextjs-guide.md
2026-08-05 19:45:03 +00:00

14 KiB
Executable File
Raw Blame History

Next.js Админ-Панель — Руководство

Обзор

Новая админ-панель на Next.js 16 (App Router) + TypeScript + shadcn/ui + Prisma (SQLite) + Recharts. Полная замена EJS/SmartAdmin шаблонизатора.

Стек

Слой Технология
Фреймворк Next.js 16 (App Router, Turbopack)
Язык TypeScript 5
Стилизация Tailwind CSS 4 + shadcn/ui (New York)
БД Prisma ORM + SQLite
Графики Recharts
Состояние Zustand
ИИ/LLM z-ai-web-dev-sdk (chat, vision)
Тема next-themes (dark/light)
Уведомления Sonner (toast)
Иконки Lucide React

Авторизация

  • Пароль: значение ADMIN_SECRET из .env (по умолчанию changeme)
  • Если задан SUPER_ADMIN_SECRET (и ≠ ADMIN_SECRET) — вход с ним даёт роль super_admin
  • Если не задан — все админы = super_admin
  • Кука admin_token (httpOnly, sameSite=lax, 24ч, secure в production)
  • Rate-limit: 5 попыток / 15 мин с IP
  • HMAC-SHA256 подпись токена

Экраны (15)

Основные

  1. Dashboard — 4 KPI-карточки, 8 графиков (recharts), лента активности, авто-обновление
  2. Catalog — дерево локаций → категории → подкатегории → товары, CRUD, clone, экспорт
  3. Users — таблица + детальная страница, batch ban/unban, заметки, поиск, статус-вкладки
  4. Wallets — 4 вкладки (All/Owner/Transactions/Seeds), запись платежей, экспорт seed-фраз
  5. Purchases — таблица с batch approve/cancel, фильтры по статусу/дате, модаль деталей
  6. Audit Log — журнал действий, фильтры по действию/дате/поиску, копирование записей
  7. Categories — CRUD с просмотром товаров, подсчёт подкатегорий и продуктов
  8. Locations — CRUD (страна/город/район)
  9. Settings — редактирование параметров, экспорт/импорт данных (super_admin)
  10. Locales — inline-редактор EN/ES/DE переводов
  11. Danger Zone — Seed / Clear с reauth (super_admin)

ИИ-ассистент и Лиды

  1. AI Chatbot (#/chatbot) — полная конфигурация ИИ-бота:

    • Включение/выключение бота
    • Спящий режим — при включении /start показывает ИИ-чат вместо каталога
    • Системный промпт и приветственное сообщение
    • Температура, max tokens, глубина истории
    • База знаний — словарный лексикон (товары, цены, FAQ)
    • Провайдер: OpenAI / DeepSeek / OpenRouter / Ollama / Custom
    • API endpoint и ключ (маскированный при отображении)
  2. Leads (#/leads) — управление лидами и переписками:

    • Таблица лидов с поиском, фильтрами по статусу
    • AI-профиль клиента (intent, interests, sentiment, readiness)
    • Просмотр переписок в виде чат-пузырей
    • Вход оператора — переключение бота на ручной режим
    • Статусы: Новый / Контакт / Квалифицированный / Потерянный / Спам
    • Заметки и quick-статус

Спящий режим магазина

Когда спящий режим включён в настройках AI Chatbot:

  • Пользователь через /start получает ИИ-чат вместо каталога
  • Бот сообщает что магазин пополняется
  • Можно собрать контакты для уведомления при открытии
  • Все сессии сохраняются в таблице chat_sessions
  • Из переписок автоматически извлекаются лиды

API маршруты (48+)

Основные

Метод Маршрут Описание
POST /api/auth/login Вход, установка куки
GET /api/auth/session Проверка сессии
POST /api/auth/logout Выход
GET /api/stats/dashboard Статистика дашборда
GET/PUT /api/settings Настройки
GET /api/settings/export Полный экспорт БД (JSON)
POST /api/settings/import Импорт (в разработке)

Товары и каталог

Метод Маршрут Описание
GET /api/products/bulk Список товаров
POST /api/products/add Создание товара
GET/PUT/DELETE /api/products/[id] CRUD товара
POST /api/products/[id]/clone Дублирование товара
GET /api/catalog/tree Дерево каталога
GET/POST /api/categories/bulk Список/создание категорий
GET/PUT/DELETE /api/categories/[id] CRUD категории
GET/POST /api/subcategories/bulk Список/создание подкатегорий
GET/PUT/DELETE /api/subcategories/[id] CRUD подкатегории
GET/POST /api/locations/bulk Список/создание локаций
GET/PUT/DELETE /api/locations/[id] CRUD локации

Пользователи и кошельки

Метод Маршрут Описание
GET /api/users/bulk Список пользователей
GET/PUT /api/users/[id] Профиль пользователя
POST /api/users/[id]/adjust-balance Корректировка баланса
POST /api/users/batch-status Batch ban/unban
GET /api/wallets/bulk Список кошельков
GET /api/wallets/overview Обзор кошельков
GET /api/wallets/[userId] Кошельки пользователя
POST /api/wallets/record-payment Запись платежа
GET /api/wallets/seeds Seed-фразы (super_admin)
GET /api/wallets/export-seeds Экспорт seed-фраз CSV

Покупки и транзакции

Метод Маршрут Описание
GET /api/purchases/bulk Список покупок
GET/PUT /api/purchases/[id] Детали/статус покупки
POST /api/purchases/batch-status Batch approve/cancel
GET /api/transactions/bulk Список транзакций

Аудит и локали

Метод Маршрут Описание
GET /api/audit/bulk Журнал аудита
GET /api/locales Локализации (EN/ES/DE)
POST /api/seed/demo Генерация тестовых данных
POST /api/seed/clear Очистка БД

ИИ-чатбот и лиды

Метод Маршрут Описание
GET/PUT /api/admin/chatbot Настройки ИИ-бота
POST /api/chat Точка входа чата (для TG-бота)
GET /api/leads/bulk Список лидов
GET/PUT /api/leads/[id] Профиль лида
GET /api/leads/[id]/sessions Чат-сессии лида
POST /api/operator Подключение/отключение оператора

Модель данных (Prisma)

Всего 15 моделей:

Модель Описание
TgUser Пользователи Telegram
CryptoWallet Криптокошельки
Transaction Транзакции
Location Локации (страна/город/район)
Category Категории товаров
Subcategory Подкатегории
Product Товары
Purchase Покупки
CommissionPayment Комиссионные платежи
AuditLog Журнал аудита
UserState Состояния пользователей ( FSM )
ChatSession Чат-сессии с ИИ-ботом
Lead Лиды (авто-экстракция из чата)
SiteSetting Ключ-значение настройки

ChatSession

model ChatSession {
  id                Int       @id @default(autoincrement())
  sessionId         String    @unique
  telegramId        String?
  leadId            Int?
  messages          String    // JSON: [{role, content, timestamp}]
  customerProfile   String?   // AI-профиль клиента (JSON)
  isActive          Boolean   @default(true)
  operatorName      String?   // Подключённый оператор
  autoReplyDisabled Boolean   @default(false) // Ручной режим
  operatorConnectedAt DateTime?
  device / ip / country
  createdAt / updatedAt
}

Lead

model Lead {
  id              Int      @id @default(autoincrement())
  telegramId      String?  @unique
  name / phone / email / telegram
  status          String   @default("new")
  aiLeadScore     Float?   // 0-1 скор от ИИ
  customFields    String   // JSON
  chatSessions    ChatSession[]
}

Архитектура ИИ-бота

Конфигурация (SiteSetting)

Все настройки бота хранятся в таблице site_settings как ключ-значение. Кэшируются 5 минут.

Ключ Тип По умолчанию
chatbot_enabled bool true
chatbot_sleep_mode bool false
chatbot_sleep_message text "Магазин пополняется..."
chatbot_system_prompt text "Ты — AI-ассистент..."
chatbot_welcome_message text "Здравствуйте!..."
chatbot_temperature float 0.7
chatbot_max_tokens int 500
chatbot_max_history int 20
chatbot_knowledge_base text ""
chatbot_provider enum openai
chatbot_api_endpoint url https://api.openai.com/v1
chatbot_api_key string ""

Поток чата

  1. TG-бот отправляет POST /api/chat с {sessionId, message, telegramId}
  2. Сервер находит/создаёт ChatSession
  3. Загружает конфигурацию бота (из кэша/БД)
  4. Формирует системный промпт: system_prompt + knowledge_base + customer_profile + catalog_context
  5. Если sleep_mode — добавляет информацию о режиме пополнения
  6. Отправляет в LLM (через z-ai-web-dev-sdk)
  7. Сохраняет сообщения в ChatSession
  8. Извлекает данные лида (имя, телефон, email, telegram) из текста
  9. Генерирует/обновляет AI-профиль клиента (intent, interests, sentiment, readiness)
  10. Автоматически создаёт/обновляет запись Lead
  11. Возвращает {reply, sessionId, leadId?, profile?}

Профилирование клиента

Из каждой переписки ИИ автоматически генерирует профиль:

{
  "intent": "покупка|информация|поддержка|пробный период",
  "interests": ["VPN-коды", "аналитика"],
  "sentiment": "positive|neutral|negative",
  "budgetHint": "бюджетный|высокий",
  "readiness": "exploring|considering|ready",
  "summary": "Цель: покупка. Интересуется VPN."
}

Оператор

  • Оператор может подключиться к любой сессии (POST /api/operator)
  • При подключении: autoReplyDisabled=true, бот перестаёт отвечать
  • Оператор видит всю историю переписки
  • При отключении — бот снова отвечает

Docker (ARM)

docker build -t tg-admin .
docker run -p 3000:3000 -v ./db:/app/db \
  -e ADMIN_SECRET=your_secret \
  -e SUPER_ADMIN_SECRET=super_secret \
  -e CHATBOT_API_KEY=sk-xxx \
  tg-admin

Требования: минимум 512 МБ RAM, ARM64/ARMv7/x86_64.

Seed-данные

POST /api/seed/demo создаёт данные:

  • 3 локации, 5 категорий, 11 подкатегорий
  • 10 пользователей (alicejack)
  • 10 товаров, 2530 покупок
  • 10 криптокошельков, 2 комиссионных платежа, 12 audit записей

Общие компоненты

  • Pagination — числовая пагинация с многоточиями
  • ErrorBoundary — обработка ошибок рендеринга
  • ExportButton — экспорт CSV + JSON
  • SortableHeader — сортируемые заголовки таблиц
  • useDebounce — хук debounce (300ms)
  • useMobile — хук определения мобильного устройства
  • useKeyboardShortcuts — хук горячих клавиш (19)

Навигация

Хеш-роутинг (window.location.hash). Горячие клавиши: 1 Dashboard, 2 Catalog, 3 Users, 4 Wallets, 5 Purchases, 6 Audit, 7 Categories, 8 Locations, 9 Settings Ctrl+K — палитра команд

Визуальные эффекты

  • Matrix Rain — CSS-анимация падающих символов на странице логина (низкая непрозрачность)
  • Glass-card — стеклянный эффект карточек (backdrop-blur)
  • KPI shimmer — мерцание при наведении на KPI-карточки
  • Page-enter — fade-in анимация страниц
  • Gradient borders — градиентные рамки хедера/футера
  • Alternating rows — чередующиеся строки таблиц
  • Sticky table headers — закреплённые заголовки таблиц