clear log
This commit is contained in:
43
docs/LOGIC_DESCRIPTION.md
Normal file
43
docs/LOGIC_DESCRIPTION.md
Normal file
@@ -0,0 +1,43 @@
|
||||
# Простое описание логики работы компонентов (для генерации Vue)
|
||||
|
||||
## Хедер (AppHeader)
|
||||
Хедер - верхняя панель. В нём заголовок "Игровой Пульт" слева, информация о пользователе (имя/роль, если авторизован), справа 4 кнопки: "Смена", "Шарик" (запуск игры), "Выключение пульта", "Выход".
|
||||
|
||||
- **Кнопка "Смена"**: Клик -> открывает модал ShiftModal. В модале форма: дата смены (обязательная), начальный баланс (число >0), примечания (опционально). Валидация: дата обязательна, баланс >0. Submit -> отправка 'open-shift' через WebSocket с данными (date, amount, notes, user). Закрытие модала, уведомление успеха/ошибки. Если нет прав - уведомление "Доступ ограничен".
|
||||
|
||||
- **Кнопка "Шарик" (запуск игры)**: Клик -> открывает модал GameSelectionModal. Модал имеет 3 шага: 1) Выбор категории (банки, мишени, беспроигрышные - кнопки с иконками и кол-вом доступных игр). 2) Выбор игры из списка (фильтр по категории, только активные, не тестовые; показ название, патроны, сложность, цена). 3) Выбор оплаты (наличные или карта). Submit -> отправка 'start' через WebSocket с line (порт), game (ID), gamerId (если есть), isBonus (если бонус), paymentType (cash/card), tel (телефон), patr (патроны). Закрытие модала. Если смена не открыта - перенаправление на модал смены. Если ESP отключен - ошибка. Если нет прав - уведомление.
|
||||
|
||||
- **Кнопка "Выключение пульта"**: Клик -> показ подтверждения (confirm dialog "Вы уверены?"). При подтверждении - отправка 'shutdown' через WebSocket. Уведомление "Пульт выключен". Если отмена - закрытие.
|
||||
|
||||
- **Кнопка "Выход"**: Клик -> logout (очистка auth state), редирект на login. Уведомление "Выход выполнен".
|
||||
|
||||
Общая логика: Проверка роли (оператор/техник/админ). Нет прав - уведомление. Responsive flex, Tailwind стили.
|
||||
|
||||
## Дашборд (Dashboard)
|
||||
Структура: Хедер, main div flex-1 с padding (top 5px, bottom 126px), сетка портов (6 GamePort), модалы, футер.
|
||||
|
||||
Логика: useSelector для gameState (ports, movingGame/Player, pause, espConnected). onClick на main div -> если movingGame/Player - dispatch movingCancelled. Обновление портов от WebSocket. Responsive: 3x2 grid desktop, 2 cols mobile. Уведомления при действиях (success/error/warning/info, e.g., "Игра запущена", "Порт занят").
|
||||
|
||||
## GamePort (Порт)
|
||||
Структура: Card relative h-full w-full, absolute (ружье иконка, таймер, кнопки), main div flex-col center, модалы (Confirmation, PlayerDelete, TechConfirm).
|
||||
|
||||
Логика: Computed статус (active = game >0, hasPlayer = gamerId !=null, paused = system pause, canManage/Drag/Close по роли: operator full, tech test games only). onClick карточки: if free -> check role/pause/smena/ESP -> open GameSelectionModal or start game; if active -> show info; if player -> start game. Drag: if canDrag -> set data-port/type, drop -> animation (createFlyingPortAnimation) + send 'move'/'moveGamer' (from/to line) через WebSocket, clear moving. Buttons: +1/-1 patr (send 'addp' delta), move (dispatch movingStarted), cancel/delete (set showConfirmation 'cancelGame'/'deleteGamer', send 'cancelGame'/'deleteGamer'). Timer: interval 1000 if active. Lock overlay if restricted (role check).
|
||||
|
||||
Модалы: Confirmation (type end/cancel/forceEnd, send 'endGame'/'cancelGame'/'forceEndGame'), PlayerDelete (send 'deleteGamer'), TechConfirm (for tech, send 'start' game=2).
|
||||
|
||||
## GameSelectionModal (Модал выбора игры)
|
||||
Структура: Dialog with steps (category/game/payment), v-if currentStep, back/close on Escape.
|
||||
|
||||
Логика: onOpen -> fetch /api/game-info (groups/games), reset state. Step 1: категории (банки/мишени/беспроигрышные, кнопки с иконками/кол-во активных игр), bonus if isBonus. Step 2: grid игр (фильтр по категории/active/not test, название, патроны, сложность, цена), click -> set game, step 'payment'. Step 3: cash/card buttons, send 'start' (line, game, gamerId, isBonus, paymentType, tel, patr). Fallback data if fetch error. Filter: group==category, isGameActive=="вкл", !test (game!=1,2).
|
||||
|
||||
## ShiftModal (Модал смены)
|
||||
Структура: Dialog with form (date input, amount number, notes textarea), buttons submit/cancel.
|
||||
|
||||
Логика: onOpen -> reset form. onSubmit -> validate (date required, amount >0), send 'open-shift' (date, amount, notes, user), show success/error, close. Error display under fields.
|
||||
|
||||
## BottomPanel (Футер)
|
||||
Структура: fixed bottom bg-slate-900 border-t, flex justify-between, left burger, center barker/pause/music, right indicators (WS/ESP dots, gamers count).
|
||||
|
||||
Логика: Indicators passive from store/hooks (isConnected, espConnected, smena, gamersCounter). Pause button: toggle isPaused, send 'pause'/'resume'. Burger: toggle menu context. Responsive: mobile gap-2 pl-4 pr-1, desktop absolute center, tooltips for status.
|
||||
|
||||
Общая логика приложения: Auth check role, WebSocket for commands (start, move, addp, endGame), receive updates (ports, status), reconnect. Redux/Pinia for state (ports array with game/gamer/patr/startTime, movingGame/Player, pause, espConnected). Notifications for actions. Responsive with Tailwind, touch drag fix.
|
||||
Reference in New Issue
Block a user