Обновлен план MVP
This commit is contained in:
@@ -40,10 +40,9 @@
|
|||||||
|
|
||||||
## 🛠️ Технологический стек
|
## 🛠️ Технологический стек
|
||||||
|
|
||||||
**Core Service:** Go (Gin) + PostgreSQL + JWT auth + gRPC
|
**Core Service:** Go (Gin) + PostgreSQL + JWT auth (REST)
|
||||||
**Document Service:** Python (FastAPI) + Redis + Document libraries
|
**Frontend:** Angular PWA (мобильный) + Material UI + генерация PDF (pdfmake/jsPDF)
|
||||||
**Frontend:** Angular PWA (мобильный) + Material UI
|
**Инфраструктура:** Docker + Docker Compose + HTTPS
|
||||||
**Инфраструктура:** Docker + gRPC + Redis + HTTPS
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -57,40 +56,34 @@
|
|||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
gantt
|
gantt
|
||||||
title MVP План разработки
|
title MVP План разработки (упрощённый)
|
||||||
dateFormat YYYY-MM-DD
|
dateFormat YYYY-MM-DD
|
||||||
section Фундамент
|
section Фундамент
|
||||||
Инфраструктура :fund, 2024-01-01, 7d
|
Инфраструктура :fund, 2024-01-01, 7d
|
||||||
Аутентификация :auth, after fund, 7d
|
Аутентификация :auth, after fund, 7d
|
||||||
gRPC настройка :grpc, after auth, 7d
|
|
||||||
|
|
||||||
section Document Service
|
|
||||||
Python сервис :python, after grpc, 7d
|
|
||||||
PDF генерация :pdf, after python, 7d
|
|
||||||
|
|
||||||
section Шаблоны + QR
|
section Шаблоны + QR
|
||||||
Шаблоны помещений :templates, after pdf, 7d
|
Шаблоны помещений :templates, after auth, 7d
|
||||||
QR генерация :qr, after templates, 7d
|
QR генерация (frontend PDF) :qr, after templates, 7d
|
||||||
|
|
||||||
section Angular PWA
|
section Angular PWA
|
||||||
Фронтенд :frontend, after qr, 7d
|
Фронтенд :frontend, after qr, 7d
|
||||||
QR сканер :scanner, after frontend, 7d
|
QR сканер :scanner, after frontend, 7d
|
||||||
|
|
||||||
section Операции
|
section Операции
|
||||||
Управление товарами :items, after scanner, 7d
|
Управление товарами :items, after scanner, 7d
|
||||||
Поиск и размещение :operations, after items, 7d
|
Поиск и размещение :operations, after items, 7d
|
||||||
|
|
||||||
section Тестирование
|
section Тестирование
|
||||||
Пилот :pilot, after operations, 7d
|
Пилот :pilot, after operations, 7d
|
||||||
```
|
```
|
||||||
|
|
||||||
### Детализация этапов:
|
### Детализация этапов:
|
||||||
1. **Фундамент** (2 недели) - инфраструктура, аутентификация, gRPC
|
1. Фундамент (2 недели) — инфраструктура, аутентификация, REST API
|
||||||
2. **Document Service** (2 недели) - Python сервис, PDF генерация
|
2. Шаблоны + QR (2 недели) — генерация мест и кодов, печать PDF на фронтенде
|
||||||
3. **Шаблоны + QR** (2 недели) - генерация мест и кодов
|
3. Angular PWA (2 недели) — фронтенд и сканирование
|
||||||
4. **Angular PWA** (2 недели) - фронтенд и сканирование
|
4. Базовые операции (2 недели) — управление товарами и размещение/поиск
|
||||||
5. **Базовые операции** (2 недели) - управление товарами
|
5. Тестирование (1 неделя) — пилот с реальными пользователями
|
||||||
6. **Тестирование** (1 неделя) - пилот с реальными пользователями
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -9,27 +9,21 @@ graph TB
|
|||||||
B[QR Scanner]
|
B[QR Scanner]
|
||||||
end
|
end
|
||||||
|
|
||||||
subgraph "Backend Services"
|
subgraph "Backend"
|
||||||
C[Go Core Service]
|
C[Go Core Service (REST)]
|
||||||
D[Python Document Service]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
subgraph "Infrastructure"
|
subgraph "Infrastructure"
|
||||||
E[PostgreSQL]
|
E[PostgreSQL]
|
||||||
F[Redis Cache]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
A <--> C
|
A <--> C
|
||||||
B --> A
|
B --> A
|
||||||
C <--> E
|
C <--> E
|
||||||
C <--> D
|
|
||||||
D <--> F
|
|
||||||
|
|
||||||
style A fill:#ff9999
|
style A fill:#ff9999
|
||||||
style C fill:#99ccff
|
style C fill:#99ccff
|
||||||
style D fill:#99ff99
|
|
||||||
style E fill:#ffcc99
|
style E fill:#ffcc99
|
||||||
style F fill:#cc99ff
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -37,36 +31,25 @@ graph TB
|
|||||||
## 🛠️ Технологический стек
|
## 🛠️ Технологический стек
|
||||||
|
|
||||||
### Backend (Go)
|
### Backend (Go)
|
||||||
- **Framework:** Gin (легкий и быстрый)
|
- Framework: Gin (легкий и быстрый)
|
||||||
- **Database:** PostgreSQL
|
- Database: PostgreSQL
|
||||||
- **Authentication:** JWT
|
- Authentication: JWT
|
||||||
- **Validation:** validator
|
- Validation: validator
|
||||||
- **Inter-service Communication:** gRPC + Protocol Buffers
|
- API: REST + OpenAPI (Swagger)
|
||||||
- **API Documentation:** Swagger/OpenAPI
|
|
||||||
|
|
||||||
### Frontend (Angular PWA)
|
### Frontend (Angular PWA)
|
||||||
- **Framework:** Angular 17+
|
- Framework: Angular 17+
|
||||||
- **Build Tool:** Angular CLI
|
- PWA: @angular/service-worker (только кэш статики)
|
||||||
- **PWA:** @angular/service-worker
|
- QR Scanner: @zxing/ngx-scanner
|
||||||
- **QR Scanner:** @zxing/ngx-scanner
|
- UI: Angular Material + Tailwind CSS
|
||||||
- **UI:** Angular Material + Tailwind CSS
|
- State Management: локальные сервисы (без NgRx на MVP)
|
||||||
- **State Management:** NgRx (для сложной логики)
|
|
||||||
|
|
||||||
### Document Service (Python)
|
|
||||||
- **Framework:** FastAPI (быстрый, автоматическая документация)
|
|
||||||
- **PDF Generation:** reportlab + weasyprint
|
|
||||||
- **Office Documents:** python-docx, openpyxl
|
|
||||||
- **Templates:** Jinja2
|
|
||||||
- **Caching:** Redis
|
|
||||||
- **Inter-service Communication:** gRPC
|
|
||||||
|
|
||||||
### Infrastructure
|
### Infrastructure
|
||||||
- **Containerization:** Docker
|
- Containerization: Docker
|
||||||
- **Orchestration:** Docker Compose
|
- Orchestration: Docker Compose
|
||||||
- **Inter-service Communication:** gRPC + Protocol Buffers
|
- Web server (опционально): Nginx для фронтенда
|
||||||
- **API Gateway:** Traefik (опционально)
|
- Security: HTTPS, CORS, JWT
|
||||||
- **Security:** HTTPS, CORS, JWT
|
- Monitoring: структурированное логирование (метрики Post‑MVP)
|
||||||
- **Monitoring:** Structured logging + Prometheus
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -197,7 +180,6 @@ CREATE TABLE item_placements (
|
|||||||
# Аутентификация
|
# Аутентификация
|
||||||
POST /api/auth/login
|
POST /api/auth/login
|
||||||
POST /api/auth/register
|
POST /api/auth/register
|
||||||
POST /api/auth/refresh
|
|
||||||
|
|
||||||
# Организации
|
# Организации
|
||||||
GET /api/organizations/:id
|
GET /api/organizations/:id
|
||||||
@@ -227,168 +209,12 @@ GET /api/templates
|
|||||||
POST /api/templates/:id/apply
|
POST /api/templates/:id/apply
|
||||||
```
|
```
|
||||||
|
|
||||||
### Document Service (Python) - REST API
|
|
||||||
```
|
|
||||||
# Документы
|
|
||||||
POST /api/documents/generate-pdf
|
|
||||||
POST /api/documents/generate-excel
|
|
||||||
GET /api/documents/:id/status
|
|
||||||
GET /api/documents/:id/download
|
|
||||||
|
|
||||||
# Шаблоны документов
|
|
||||||
GET /api/templates
|
|
||||||
POST /api/templates
|
|
||||||
PUT /api/templates/:id
|
|
||||||
DELETE /api/templates/:id
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔄 Межсервисная коммуникация
|
|
||||||
|
|
||||||
### gRPC Services
|
|
||||||
|
|
||||||
#### Core Service → Document Service
|
|
||||||
```protobuf
|
|
||||||
service DocumentService {
|
|
||||||
rpc GenerateQRCode(QRCodeRequest) returns (QRCodeResponse);
|
|
||||||
rpc GenerateReport(ReportRequest) returns (ReportResponse);
|
|
||||||
rpc GetDocumentStatus(StatusRequest) returns (StatusResponse);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Document Service → Core Service
|
|
||||||
```protobuf
|
|
||||||
service CoreService {
|
|
||||||
rpc GetLocationData(LocationRequest) returns (LocationResponse);
|
|
||||||
rpc GetItemData(ItemRequest) returns (ItemResponse);
|
|
||||||
rpc ValidateTemplate(TemplateRequest) returns (TemplateResponse);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### События (Event-Driven)
|
|
||||||
```protobuf
|
|
||||||
message DocumentEvent {
|
|
||||||
string event_type; // "qr_generated", "report_ready"
|
|
||||||
string document_id;
|
|
||||||
string organization_id;
|
|
||||||
google.protobuf.Timestamp timestamp;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔄 Диаграммы последовательности
|
|
||||||
|
|
||||||
### Генерация QR-кода
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
sequenceDiagram
|
|
||||||
participant F as Frontend
|
|
||||||
participant C as Core Service
|
|
||||||
participant D as Document Service
|
|
||||||
participant R as Redis
|
|
||||||
|
|
||||||
F->>C: POST /api/locations/:id/qr-code
|
|
||||||
C->>D: gRPC GenerateQRCode()
|
|
||||||
D->>D: Generate QR code
|
|
||||||
D->>R: Cache document
|
|
||||||
D->>C: Return document URL
|
|
||||||
C->>F: Return QR code data
|
|
||||||
```
|
|
||||||
|
|
||||||
### Размещение товара
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
sequenceDiagram
|
|
||||||
participant U as User
|
|
||||||
participant F as Frontend
|
|
||||||
participant C as Core Service
|
|
||||||
participant DB as Database
|
|
||||||
|
|
||||||
U->>F: Scan QR code
|
|
||||||
F->>F: Decode location ID
|
|
||||||
F->>C: GET /api/locations/:id
|
|
||||||
C->>DB: Query location
|
|
||||||
DB->>C: Return location data
|
|
||||||
C->>F: Return location info
|
|
||||||
F->>U: Show location details
|
|
||||||
|
|
||||||
U->>F: Select item & quantity
|
|
||||||
F->>C: POST /api/operations/place-item
|
|
||||||
C->>DB: Create placement
|
|
||||||
DB->>C: Confirm placement
|
|
||||||
C->>F: Return success
|
|
||||||
F->>U: Show confirmation
|
|
||||||
```
|
|
||||||
|
|
||||||
### Поиск товара
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
sequenceDiagram
|
|
||||||
participant U as User
|
|
||||||
participant F as Frontend
|
|
||||||
participant C as Core Service
|
|
||||||
participant R as Redis
|
|
||||||
participant DB as Database
|
|
||||||
|
|
||||||
U->>F: Search query
|
|
||||||
F->>C: GET /api/operations/search?q=query
|
|
||||||
C->>R: Check cache
|
|
||||||
alt Cache hit
|
|
||||||
R->>C: Return cached results
|
|
||||||
else Cache miss
|
|
||||||
C->>DB: Search items & locations
|
|
||||||
DB->>C: Return results
|
|
||||||
C->>R: Cache results
|
|
||||||
end
|
|
||||||
C->>F: Return search results
|
|
||||||
F->>U: Display results
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔐 Безопасность
|
|
||||||
|
|
||||||
### Аутентификация
|
|
||||||
- JWT токены с refresh механизмом
|
|
||||||
- Organization-scope на всех запросах
|
|
||||||
- Middleware для проверки прав доступа
|
|
||||||
|
|
||||||
### Валидация данных
|
|
||||||
- Входная валидация всех параметров
|
|
||||||
- SQL injection protection через prepared statements
|
|
||||||
- XSS protection в frontend
|
|
||||||
|
|
||||||
### HTTPS
|
|
||||||
- Обязательное использование HTTPS
|
|
||||||
- Secure cookies для JWT
|
|
||||||
- CORS настройки для PWA
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📱 PWA Особенности
|
|
||||||
|
|
||||||
### Service Worker
|
|
||||||
- Кэширование статических ресурсов
|
|
||||||
- Offline fallback для базовых функций
|
|
||||||
- Background sync для операций
|
|
||||||
|
|
||||||
### QR Scanner
|
|
||||||
- Использование WebRTC для доступа к камере
|
|
||||||
- Real-time распознавание QR-кодов
|
|
||||||
- Fallback на ручной ввод
|
|
||||||
|
|
||||||
### Установка
|
|
||||||
- Manifest для установки как нативное приложение
|
|
||||||
- Splash screen и иконки
|
|
||||||
- Автоматические обновления
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 Развертывание
|
## 🚀 Развертывание
|
||||||
|
|
||||||
### Docker Compose
|
### Docker Compose (MVP)
|
||||||
```yaml
|
```yaml
|
||||||
version: '3.8'
|
version: '3.8'
|
||||||
services:
|
services:
|
||||||
# Core Service (Go)
|
|
||||||
core-service:
|
core-service:
|
||||||
build: ./core-service
|
build: ./core-service
|
||||||
ports:
|
ports:
|
||||||
@@ -396,23 +222,9 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
- DB_HOST=postgres
|
- DB_HOST=postgres
|
||||||
- JWT_SECRET=your-secret
|
- JWT_SECRET=your-secret
|
||||||
- DOC_SERVICE_URL=http://doc-service:8000
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- postgres
|
- postgres
|
||||||
- redis
|
|
||||||
|
|
||||||
# Document Service (Python)
|
|
||||||
doc-service:
|
|
||||||
build: ./doc-service
|
|
||||||
ports:
|
|
||||||
- "8000:8000"
|
|
||||||
environment:
|
|
||||||
- REDIS_URL=redis://redis:6379
|
|
||||||
- CORE_SERVICE_URL=http://core-service:8080
|
|
||||||
depends_on:
|
|
||||||
- redis
|
|
||||||
|
|
||||||
# Frontend (Angular)
|
|
||||||
frontend:
|
frontend:
|
||||||
build: ./frontend
|
build: ./frontend
|
||||||
ports:
|
ports:
|
||||||
@@ -420,7 +232,6 @@ services:
|
|||||||
depends_on:
|
depends_on:
|
||||||
- core-service
|
- core-service
|
||||||
|
|
||||||
# Database
|
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:15
|
image: postgres:15
|
||||||
environment:
|
environment:
|
||||||
@@ -430,29 +241,8 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- postgres_data:/var/lib/postgresql/data
|
- postgres_data:/var/lib/postgresql/data
|
||||||
|
|
||||||
# Cache
|
|
||||||
redis:
|
|
||||||
image: redis:7-alpine
|
|
||||||
ports:
|
|
||||||
- "6379:6379"
|
|
||||||
volumes:
|
|
||||||
- redis_data:/data
|
|
||||||
|
|
||||||
# API Gateway (опционально)
|
|
||||||
traefik:
|
|
||||||
image: traefik:v2.10
|
|
||||||
command:
|
|
||||||
- --api.insecure=true
|
|
||||||
- --providers.docker=true
|
|
||||||
ports:
|
|
||||||
- "80:80"
|
|
||||||
- "8081:8080"
|
|
||||||
volumes:
|
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
postgres_data:
|
postgres_data:
|
||||||
redis_data:
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Структура проекта
|
### Структура проекта
|
||||||
|
|||||||
@@ -55,9 +55,8 @@ journey
|
|||||||
**Требования:**
|
**Требования:**
|
||||||
- Генерация уникальных QR-кодов для каждого места
|
- Генерация уникальных QR-кодов для каждого места
|
||||||
- Кодирование в QR: ID места, адрес, координаты
|
- Кодирование в QR: ID места, адрес, координаты
|
||||||
- Печать этикеток на обычном принтере (A4) через Document Service
|
- Печать этикеток на обычном принтере (A4) на фронтенде (pdfmake/jsPDF)
|
||||||
- Сетка этикеток на лист с предварительным просмотром
|
- Сетка этикеток на лист с предварительным просмотром
|
||||||
- Кэширование сгенерированных QR-кодов в Redis
|
|
||||||
|
|
||||||
#### 2.1.3 Виртуальная карта
|
#### 2.1.3 Виртуальная карта
|
||||||
**Требования:**
|
**Требования:**
|
||||||
@@ -76,14 +75,13 @@ journey
|
|||||||
- Распознавание QR-кодов в реальном времени
|
- Распознавание QR-кодов в реальном времени
|
||||||
- Автоматический переход к операции с местом
|
- Автоматический переход к операции с местом
|
||||||
- Обработка ошибок сканирования
|
- Обработка ошибок сканирования
|
||||||
- Offline поддержка через Service Worker
|
|
||||||
|
|
||||||
#### 2.2.2 Быстрые операции
|
#### 2.2.2 Быстрые операции
|
||||||
**Требования:**
|
**Требования:**
|
||||||
- Размещение товара: сканирование места → выбор товара → подтверждение
|
- Размещение товара: сканирование места → выбор товара → подтверждение
|
||||||
- Поиск товара: сканирование места → показ списка товаров
|
- Поиск товара: сканирование места → показ списка товаров
|
||||||
- Перемещение: сканирование места откуда → сканирование места куда → выбор товара
|
- Перемещение: сканирование места откуда → сканирование места куда → выбор товара
|
||||||
- State management через NgRx для сложных операций
|
- Управление состоянием через сервисы Angular (без NgRx в рамках MVP)
|
||||||
|
|
||||||
### 2.3 Справочники
|
### 2.3 Справочники
|
||||||
|
|
||||||
@@ -108,7 +106,7 @@ journey
|
|||||||
- Выбор места размещения
|
- Выбор места размещения
|
||||||
- Указание количества
|
- Указание количества
|
||||||
- Автоматическое обновление статуса места
|
- Автоматическое обновление статуса места
|
||||||
- Валидация через gRPC между сервисами
|
- Валидация в Core Service (REST API)
|
||||||
|
|
||||||
#### 2.4.2 Поиск товаров
|
#### 2.4.2 Поиск товаров
|
||||||
**Требования:**
|
**Требования:**
|
||||||
@@ -116,24 +114,11 @@ journey
|
|||||||
- Поиск по адресу места
|
- Поиск по адресу места
|
||||||
- Поиск по категории
|
- Поиск по категории
|
||||||
- Результат: список мест с товарами
|
- Результат: список мест с товарами
|
||||||
- Кэширование результатов поиска в Redis
|
- Оптимизация поиска за счёт индексов БД (без Redis в MVP)
|
||||||
|
|
||||||
### 2.5 Document Service
|
### 2.5 Генерация документов (MVP)
|
||||||
|
|
||||||
#### 2.5.1 Генерация документов
|
**Подход:** Без отдельного Document Service. Генерация PDF этикеток выполняется на фронтенде (pdfmake/jsPDF). Excel/Word и серверная генерация документов — Post‑MVP.
|
||||||
**Требования:**
|
|
||||||
- Генерация PDF этикеток с QR-кодами
|
|
||||||
- Создание Excel отчетов по товарам
|
|
||||||
- Экспорт данных в Word документы
|
|
||||||
- Шаблонизация через Jinja2
|
|
||||||
- Асинхронная обработка через Redis
|
|
||||||
|
|
||||||
#### 2.5.2 Кэширование
|
|
||||||
**Требования:**
|
|
||||||
- Кэширование сгенерированных документов
|
|
||||||
- TTL для документов: 24 часа
|
|
||||||
- Автоматическая очистка старых документов
|
|
||||||
- Статистика использования кэша
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -171,5 +156,5 @@ journey
|
|||||||
### 4.2 Упрощения для MVP
|
### 4.2 Упрощения для MVP
|
||||||
- Вместо графического редактора: готовые шаблоны
|
- Вместо графического редактора: готовые шаблоны
|
||||||
- Вместо умных подсказок: базовые правила размещения
|
- Вместо умных подсказок: базовые правила размещения
|
||||||
- Вместо сложного offline: кэш + простая синхронизация
|
- Без offline-функциональности: допускается только кэширование статических ресурсов PWA
|
||||||
- Вместо CV чеков: ручной ввод с автодополнением
|
- Вместо CV чеков: ручной ввод с автодополнением
|
||||||
|
|||||||
Reference in New Issue
Block a user