modules/ с серверной и клиентской частью.
Принцип работы
При запуске проекта (pnpm dev) система:
- Запускает скрипт
pnpm modules:generate— сканирует папкуmodules/и генерирует файлы импортов - Собирает из каждого модуля: настройки, роутеры, схемы БД и хуки
- Регистрирует всё в едином реестре (
moduleRegistry) - Модули можно включать/выключать через админ-панель без перезапуска
Структура модуля
Создание модуля
Сгенерируйте импорты и запустите
Регистрировать модуль вручную не нужно — скрипт
pnpm modules:generate сканирует папку modules/ и автоматически собирает _register.generated.ts (импорты и вызовы moduleRegistry.register()), _schema.generated.ts и _client-register.generated.ts. Файл modules/register.ts лишь реэкспортирует сгенерированный реестр.Модуль появится в админ-панели в разделе «Модули».
Серверная часть
Схема БД
Создайте файлschema.ts и подключите его в index.ts:
modules/daily-rewards/schema.ts
modules/daily-rewards/index.ts
После добавления схемы выполните
pnpm db:push для создания таблиц.tRPC-роутер
Создайтеrouter.ts — API-методы модуля:
modules/daily-rewards/router.ts
index.ts:
trpc.modules.dailyRewards.claim.mutate().
Хуки
Модули могут реагировать на системные события:| Хук | Когда срабатывает |
|---|---|
onUserCreate | Регистрация нового пользователя |
onUserLogin | Вход пользователя |
onUserUpdate | Обновление профиля |
onPaymentComplete | Успешный платёж |
onBalanceTopUp | Пополнение баланса |
onServerStatusChange | Изменение статуса сервера |
onPrivilegePurchase | Покупка привилегии |
onBanCreate | Бан пользователя |
onReferralActivated | Активация реферала |
onPlaytimeUpdate | Обновление времени игры |
onReferralRewardPaid | Выплата реферальной награды |
Клиентская часть
Структура
package.json
modules/daily-rewards/client/package.json
register.ts — регистрация в слотах
modules/daily-rewards/client/register.ts
index.ts
modules/daily-rewards/client/index.ts
Слоты (точки расширения)
Слоты — это места в интерфейсе, куда модули могут вставлять свои компоненты.Профиль пользователя
| Слот | Описание |
|---|---|
profile.tabs | Новая вкладка в профиле |
profile.overview.cards | Карточки на вкладке «Обзор» |
profile.overview.sections | Секции на вкладке «Обзор» |
profile.header.actions | Кнопки в шапке профиля |
Админ-панель
| Слот | Описание |
|---|---|
admin.dashboard.widgets | Виджеты на дашборде |
admin.dashboard.cards | Карточки на дашборде |
admin.sidebar.items | Пункты меню в сайдбаре |
admin.module.pages | Страница модуля в админ-панели |
Лейаут
| Слот | Описание |
|---|---|
header.left | Элементы слева в шапке сайта |
header.right | Элементы справа в шапке сайта |
header.nav | Ссылки в шапке сайта |
footer.sections | Секции в подвале |
footer.links | Ссылки в подвале |
footer.bottom | Нижняя строка подвала |
Прочее
| Слот | Описание |
|---|---|
pages | Публичные страницы модуля (зарегистрированный path монтируется под /m) |
server.card.footer | Подвал карточки сервера |
news.card.footer | Подвал карточки новости |
auth.register.fields | Поля на форме регистрации |
auth.login.fields | Поля на форме входа |
Настройки модуля
Настройки описываются в полеsettings и автоматически отображаются в админ-панели.
Типы полей
| Тип | Описание |
|---|---|
string | Текстовое поле |
number | Числовое поле |
boolean | Переключатель |
select | Выпадающий список |
multiselect | Множественный выбор |
color | Выбор цвета |
url | Поле для URL |
json | JSON-редактор |
reward | Настройка награды (фикс/процент) |
duration | Настройка длительности |
Условная видимость
Поля можно показывать/скрывать в зависимости от значений других полей:Чтение настроек в коде
Эталонный модуль
Для примера смотрите модуль referrals (modules/referrals/). В нём реализовано всё: схема БД, tRPC-роутер, клиентские компоненты, настройки и хуки.