14 KiB
Executable File
14 KiB
Executable File
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)
Основные
- Dashboard — 4 KPI-карточки, 8 графиков (recharts), лента активности, авто-обновление
- Catalog — дерево локаций → категории → подкатегории → товары, CRUD, clone, экспорт
- Users — таблица + детальная страница, batch ban/unban, заметки, поиск, статус-вкладки
- Wallets — 4 вкладки (All/Owner/Transactions/Seeds), запись платежей, экспорт seed-фраз
- Purchases — таблица с batch approve/cancel, фильтры по статусу/дате, модаль деталей
- Audit Log — журнал действий, фильтры по действию/дате/поиску, копирование записей
- Categories — CRUD с просмотром товаров, подсчёт подкатегорий и продуктов
- Locations — CRUD (страна/город/район)
- Settings — редактирование параметров, экспорт/импорт данных (super_admin)
- Locales — inline-редактор EN/ES/DE переводов
- Danger Zone — Seed / Clear с reauth (super_admin)
ИИ-ассистент и Лиды
-
AI Chatbot (
#/chatbot) — полная конфигурация ИИ-бота:- Включение/выключение бота
- Спящий режим — при включении
/startпоказывает ИИ-чат вместо каталога - Системный промпт и приветственное сообщение
- Температура, max tokens, глубина истории
- База знаний — словарный лексикон (товары, цены, FAQ)
- Провайдер: OpenAI / DeepSeek / OpenRouter / Ollama / Custom
- API endpoint и ключ (маскированный при отображении)
-
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 | "" |
Поток чата
- TG-бот отправляет
POST /api/chatс{sessionId, message, telegramId} - Сервер находит/создаёт ChatSession
- Загружает конфигурацию бота (из кэша/БД)
- Формирует системный промпт:
system_prompt + knowledge_base + customer_profile + catalog_context - Если
sleep_mode— добавляет информацию о режиме пополнения - Отправляет в LLM (через z-ai-web-dev-sdk)
- Сохраняет сообщения в ChatSession
- Извлекает данные лида (имя, телефон, email, telegram) из текста
- Генерирует/обновляет AI-профиль клиента (intent, interests, sentiment, readiness)
- Автоматически создаёт/обновляет запись Lead
- Возвращает
{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 пользователей (alice–jack)
- 10 товаров, 25–30 покупок
- 10 криптокошельков, 2 комиссионных платежа, 12 audit записей
Общие компоненты
Pagination— числовая пагинация с многоточиямиErrorBoundary— обработка ошибок рендерингаExportButton— экспорт CSV + JSONSortableHeader— сортируемые заголовки таблицuseDebounce— хук debounce (300ms)useMobile— хук определения мобильного устройстваuseKeyboardShortcuts— хук горячих клавиш (1–9)
Навигация
Хеш-роутинг (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 — закреплённые заголовки таблиц