Схемы потоков данных системы "Симулятор регионов"
1. Общая архитектурная диаграмма
graph TB
%% Клиентская часть
Client[Клиент/Браузер]
%% Веб-сервер
Nginx[Nginx<br/>Reverse Proxy]
%% Основное приложение
Backend[Backend API<br/>Node.js/Express<br/>Port 3000]
%% Базы данных и сторонние сервисы
PostgreSQL[(PostgreSQL<br/>База данных<br/>Port 5432)]
Minio[(Minio<br/>Объектное хранилище<br/>Port 9000)]
%% Мониторинг и управление
PM2[PM2<br/>Process Manager]
TelegramBot[Telegram Bot<br/>Мониторинг]
%% Статические файлы
Static[Static Files<br/>/static/]
%% Связи
Client --> Nginx
Nginx --> Backend
Nginx --> Static
Backend --> PostgreSQL
Backend --> Minio
PM2 --> Backend
TelegramBot --> Backend
%% Стили
classDef clientStyle fill:#e1f5fe
classDef serverStyle fill:#f3e5f5
classDef dbStyle fill:#e8f5e8
classDef monitorStyle fill:#fff3e0
class Client clientStyle
class Nginx,Backend serverStyle
class PostgreSQL,Minio dbStyle
class PM2,TelegramBot monitorStyle
2. Схема API взаимодействия
graph LR
subgraph "Аутентификация"
A1[POST /api/auth/login]
A2[POST /api/auth/select-game]
end
subgraph "Управление игрой"
G1[POST /api/service/game/:id/start-game]
G2[POST /api/service/game/:id/end-round]
G3[GET /api/status]
end
subgraph "Работа с решениями"
S1[GET /api/solutions/draft]
S2[POST /api/solutions/draft]
S3[PUT /api/solutions/draft/current/:id]
S4[GET /api/solutions/select/:id]
S5[GET /api/solutions]
S6[POST /api/solutions/forecast]
S7[PUT /api/solutions/draft/editable]
S8[PUT /api/solutions/draft/:id/rename]
end
subgraph "Работа с кейсами"
C1[GET /api/cases]
C2[POST /api/cases]
end
Client --> A1
Client --> A2
Client --> G1
Client --> G2
Client --> G3
Client --> S1
Client --> S2
Client --> S3
Client --> S4
Client --> S5
Client --> S6
Client --> S7
Client --> S8
Client --> C1
Client --> C2
3. Поток данных игрового процесса
sequenceDiagram
participant Admin as Администратор
participant API as Backend API
participant DB as PostgreSQL
participant Engine as Calculation Engine
participant Team as Команда/Регион
%% Создание и запуск игры
Admin->>API: POST /api/service/game/:id/start-game
API->>DB: Создание начальных данных
API->>Engine: Инициализация параметров
Engine->>DB: Сохранение начальных расчетов
API-->>Admin: Игра запущена
%% Игровой раунд
loop Каждый раунд
Team->>API: GET /api/solutions/draft
API->>DB: Получение текущих решений
API-->>Team: Текущие решения
Team->>API: POST /api/solutions/draft
API->>DB: Сохранение черновика решения
API-->>Team: Решение сохранено
Team->>API: POST /api/solutions/forecast
API->>Engine: Прогноз результатов
Engine-->>API: Прогнозные данные
API-->>Team: Прогноз результатов
Team->>API: PUT /api/solutions/draft/current/:id
API->>DB: Установка текущего решения
API-->>Team: Решение принято
Admin->>API: POST /api/service/game/:id/end-round
API->>Engine: Расчет результатов раунда
Engine->>DB: Сохранение результатов
API->>DB: Подготовка следующего раунда
API-->>Admin: Раунд завершен
end
4. Схема базы данных (основные таблицы)
erDiagram
Users ||--o{ TeamUsers : "участвует"
Teams ||--o{ TeamUsers : "включает"
Teams ||--o{ GameRegions : "контролирует"
Games ||--o{ GameRegions : "содержит"
Games ||--|| Scenarios : "использует"
GameRegions ||--o{ Solutions : "принимает"
Solutions ||--|| SolutionsDraft : "основано на"
SolutionsDraft ||--o{ SolutionDraftParameters : "содержит"
GameRegions ||--o{ GameCaseAnswers : "отвечает"
GameCaseQuestions ||--o{ GameCaseAnswers : "получает ответы"
Games ||--o{ GameCaseQuestions : "содержит вопросы"
Scenarios ||--o{ Projects : "включает"
GameRegions ||--o{ GameRegionProjects : "реализует"
Projects ||--o{ GameRegionProjects : "может быть реализован"
Users {
string id PK
string email
string passwd
string role
datetime created_at
}
Teams {
string id PK
string name
datetime created_at
}
Games {
string id PK
string name
int currentStep
int maxSteps
string gameState
string scenarioId FK
datetime created_at
}
GameRegions {
string id PK
string idTeam FK
string idGame FK
string regionId FK
float gamePoints
datetime created_at
}
Solutions {
string id PK
int step
string dataId FK
string gameId FK
string regionId FK
datetime created_at
}
SolutionsDraft {
string id PK
string name
int step
json values
json results
boolean isCurrent
string teamUserId FK
string gameId FK
datetime created_at
}
5. Поток обработки решений команд
flowchart TD
Start([Команда создает решение]) --> Draft[Создание черновика]
Draft --> SaveDraft[Сохранение в SolutionsDraft]
SaveDraft --> Forecast{Нужен прогноз?}
Forecast -->|Да| CalcForecast[Вызов Engine для прогноза]
Forecast -->|Нет| Edit[Редактирование решения]
CalcForecast --> ShowForecast[Показ прогноза команде]
ShowForecast --> Edit
Edit --> SetCurrent{Принять решение?}
SetCurrent -->|Нет| Edit
SetCurrent -->|Да| MarkCurrent[Установить как текущее]
MarkCurrent --> WaitEndRound[Ожидание окончания раунда]
WaitEndRound --> EndRound[Администратор завершает раунд]
EndRound --> CalcResults[Engine: расчет результатов]
CalcResults --> SaveResults[Сохранение результатов в БД]
SaveResults --> PrepareNext[Подготовка следующего раунда]
PrepareNext --> NextRound([Следующий раунд])
%% Стили
classDef processStyle fill:#e3f2fd
classDef decisionStyle fill:#fff3e0
classDef engineStyle fill:#e8f5e8
classDef endStyle fill:#fce4ec
class Draft,SaveDraft,Edit,MarkCurrent,WaitEndRound processStyle
class Forecast,SetCurrent decisionStyle
class CalcForecast,CalcResults,SaveResults,PrepareNext engineStyle
class Start,NextRound endStyle
6. Архитектура движка расчетов
graph TB
subgraph "Входные данные"
SD[SolutionsDraft<br/>Решения команд]
SP[ScenarioParams<br/>Параметры сценария]
GP[GameParams<br/>Игровые параметры]
RP[RegionParams<br/>Региональные параметры]
end
subgraph "Calculation Engine"
CE[Основной движок расчетов]
subgraph "Отраслевые расчеты"
IND1[Промышленность]
IND2[Сельское хозяйство]
IND3[Строительство]
IND4[Торговля]
IND5[Транспорт]
IND6[Связь]
IND7[Образование]
IND8[Здравоохранение]
INDN[... другие отрасли]
end
subgraph "Агрегированные расчеты"
VRP[ВРП расчеты]
BUD[Бюджетные расчеты]
DEM[Демографические расчеты]
ECO[Экологические расчеты]
SOC[Социальные показатели]
end
subgraph "Индексы и рейтинги"
IDX[Расчет индексов]
RAT[Рейтинги регионов]
end
end
subgraph "Выходные данные"
GRC[GameRegionCalculatedParams<br/>Расчетные параметры]
RS[RegionStatistics<br/>Статистика региона]
RES[Results<br/>Результаты раунда]
end
%% Связи входных данных
SD --> CE
SP --> CE
GP --> CE
RP --> CE
%% Связи внутри движка
CE --> IND1
CE --> IND2
CE --> IND3
CE --> IND4
CE --> IND5
CE --> IND6
CE --> IND7
CE --> IND8
CE --> INDN
IND1 --> VRP
IND2 --> VRP
IND3 --> VRP
IND4 --> VRP
IND5 --> VRP
IND6 --> VRP
IND7 --> VRP
IND8 --> VRP
INDN --> VRP
VRP --> BUD
VRP --> DEM
VRP --> ECO
VRP --> SOC
BUD --> IDX
DEM --> IDX
ECO --> IDX
SOC --> IDX
IDX --> RAT
%% Связи выходных данных
VRP --> GRC
BUD --> GRC
DEM --> GRC
ECO --> GRC
SOC --> GRC
IDX --> GRC
RAT --> GRC
GRC --> RS
RS --> RES
7. Поток обработки кейсов
sequenceDiagram
participant Admin as Администратор
participant System as Система
participant DB as База данных
participant Team as Команда
%% Подготовка кейсов для раунда
Admin->>System: Запуск нового раунда
System->>DB: Получение шаблонов кейсов (ScenarioCases)
DB-->>System: Шаблоны кейсов для текущего шага
System->>DB: Случайный выбор вопросов (CaseQuestions)
System->>DB: Создание GameCaseQuestions для раунда
DB-->>System: Кейсы подготовлены
System-->>Admin: Раунд запущен
%% Команды отвечают на кейсы
Team->>System: GET /api/cases
System->>DB: Получение кейсов для команды/региона
DB-->>System: Список вопросов с вариантами ответов
System-->>Team: Кейсы для решения
Team->>System: POST /api/cases (ответы)
System->>DB: Сохранение ответов (GameCaseAnswers)
System->>DB: Проверка правильности ответов
DB-->>System: Результаты проверки
System->>DB: Начисление баллов команде
System-->>Team: Ответы сохранены
%% Завершение раунда
Admin->>System: Завершение раунда
System->>DB: Подсчет итоговых баллов за кейсы
DB-->>System: Итоговые результаты
System-->>Admin: Результаты по кейсам готовы
8. Схема мониторинга и алертов
graph TB
subgraph "Мониторируемые компоненты"
API[Backend API<br/>Port 3000]
DB[(PostgreSQL<br/>Port 5432)]
PM2_PROC[PM2 Processes]
SYS[System Resources<br/>CPU, Memory, Disk]
end
subgraph "Система мониторинга"
MONITOR[Monitor Script<br/>/opt/regionsim/monitor.sh]
CRON[Cron Job<br/>*/5 * * * *]
end
subgraph "Алерты и уведомления"
TELEGRAM[Telegram Bot]
ADMIN[Администраторы]
end
subgraph "Логирование"
PM2_LOGS[PM2 Logs<br/>~/.pm2/logs/]
NGINX_LOGS[Nginx Logs<br/>/var/log/nginx/]
PG_LOGS[PostgreSQL Logs<br/>/var/log/postgresql/]
SYS_LOGS[System Logs<br/>/var/log/syslog]
end
%% Связи мониторинга
CRON --> MONITOR
MONITOR --> API
MONITOR --> DB
MONITOR --> PM2_PROC
MONITOR --> SYS
%% Алерты
MONITOR -->|Проблемы обнаружены| TELEGRAM
TELEGRAM --> ADMIN
%% Логирование
API --> PM2_LOGS
API --> NGINX_LOGS
DB --> PG_LOGS
SYS --> SYS_LOGS
%% Условия алертов
API -.->|Недоступен| MONITOR
DB -.->|Недоступен| MONITOR
PM2_PROC -.->|Процессы остановлены| MONITOR
SYS -.->|Высокое использование ресурсов| MONITOR
9. Поток развертывания и обновления
flowchart TD
Start([Начало развертывания]) --> CheckReq{Проверка требований}
CheckReq -->|Требования не выполнены| InstallReq[Установка зависимостей]
CheckReq -->|OK| PrepareEnv[Подготовка окружения]
InstallReq --> PrepareEnv
PrepareEnv --> CloneRepo[Клонирование репозитория]
CloneRepo --> SetupEnv[Настройка .env файла]
SetupEnv --> StartInfra[Запуск инфраструктуры<br/>docker-compose up -d]
StartInfra --> InstallDeps[npm install]
InstallDeps --> PrismaGen[Генерация Prisma клиента]
PrismaGen --> Migrate[Выполнение миграций]
Migrate --> Seed[Заполнение начальными данными]
Seed --> Build[Сборка приложения]
Build --> StartPM2[Запуск через PM2]
StartPM2 --> ConfigNginx[Настройка Nginx]
ConfigNginx --> SetupMonitor[Настройка мониторинга]
SetupMonitor --> Success([Развертывание завершено])
%% Процесс обновления
Update([Обновление системы]) --> Backup[Создание резервной копии]
Backup --> GitPull[git pull origin main]
GitPull --> UpdateDeps[npm install]
UpdateDeps --> MigrateUpdate[Выполнение миграций]
MigrateUpdate --> BuildUpdate[npm run build]
BuildUpdate --> RestartPM2[pm2 restart all]
RestartPM2 --> TestUpdate{Тестирование}
TestUpdate -->|OK| UpdateSuccess([Обновление завершено])
TestUpdate -->|Ошибки| Rollback[Откат к резервной копии]
Rollback --> UpdateSuccess
%% Стили
classDef startStyle fill:#e8f5e8
classDef processStyle fill:#e3f2fd
classDef decisionStyle fill:#fff3e0
classDef errorStyle fill:#ffebee
class Start,Success,Update,UpdateSuccess startStyle
class PrepareEnv,CloneRepo,SetupEnv,StartInfra,InstallDeps,PrismaGen,Migrate,Seed,Build,StartPM2,ConfigNginx,SetupMonitor,Backup,GitPull,UpdateDeps,MigrateUpdate,BuildUpdate,RestartPM2 processStyle
class CheckReq,TestUpdate decisionStyle
class InstallReq,Rollback errorStyle
10. Диаграмма безопасности и аутентификации
sequenceDiagram
participant Client as Клиент
participant Nginx as Nginx
participant API as Backend API
participant Auth as AuthService
participant DB as PostgreSQL
participant JWT as JWT Token
%% Процесс аутентификации
Client->>Nginx: POST /api/auth/login
Nginx->>API: Проксирование запроса
API->>Auth: Проверка учетных данных
Auth->>DB: Запрос пользователя
DB-->>Auth: Данные пользователя
Auth->>Auth: Проверка пароля (hash)
Auth->>JWT: Генерация JWT токена
JWT-->>Auth: JWT токен
Auth-->>API: Токен и данные пользователя
API-->>Nginx: Ответ с токеном
Nginx-->>Client: Set-Cookie с JWT
%% Авторизованный запрос
Client->>Nginx: GET /api/status (с токеном)
Nginx->>API: Проксирование с заголовками
API->>Auth: Проверка JWT токена
Auth->>JWT: Валидация токена
JWT-->>Auth: Данные из токена
Auth-->>API: Пользователь авторизован
API->>DB: Выполнение запроса
DB-->>API: Результат
API-->>Nginx: Ответ
Nginx-->>Client: Данные
%% Неавторизованный доступ
Client->>Nginx: GET /api/solutions (без токена)
Nginx->>API: Проксирование
API->>Auth: Проверка токена
Auth-->>API: 401 Unauthorized
API-->>Nginx: Ошибка аутентификации
Nginx-->>Client: 401 Unauthorized
Эти диаграммы показывают основные потоки данных в системе "Симулятор регионов" и помогают понять взаимодействие между различными компонентами системы, процессы обработки данных и архитектурные решения.
No comments to display
No comments to display