246 lines
6.1 KiB
Markdown
246 lines
6.1 KiB
Markdown
# Архитектура MVP: ERP для мастеров
|
||
|
||
## 🏗️ Общая архитектура
|
||
|
||
```
|
||
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||
│ React PWA │ │ Go Backend │ │ PostgreSQL │
|
||
│ (Frontend) │◄──►│ (API) │◄──►│ (Database) │
|
||
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
||
│ │
|
||
│ │
|
||
▼ ▼
|
||
┌─────────────────┐ ┌─────────────────┐
|
||
│ QR Scanner │ │ PDF Generator │
|
||
│ (Camera) │ │ (Labels) │
|
||
└─────────────────┘ └─────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 🛠️ Технологический стек
|
||
|
||
### Backend (Go)
|
||
- **Framework:** Gin или Echo
|
||
- **Database:** PostgreSQL
|
||
- **Authentication:** JWT
|
||
- **Validation:** validator
|
||
- **PDF Generation:** wkhtmltopdf или gofpdf
|
||
|
||
### Frontend (React PWA)
|
||
- **Framework:** React 18
|
||
- **Build Tool:** Vite
|
||
- **PWA:** Workbox
|
||
- **QR Scanner:** react-qr-reader
|
||
- **UI:** Tailwind CSS или Material-UI
|
||
|
||
### Infrastructure
|
||
- **Containerization:** Docker
|
||
- **Deployment:** Docker Compose
|
||
- **Security:** HTTPS, CORS
|
||
- **Monitoring:** Structured logging
|
||
|
||
---
|
||
|
||
## 📊 Структура базы данных
|
||
|
||
### Основные таблицы
|
||
|
||
```sql
|
||
-- Организации
|
||
CREATE TABLE organizations (
|
||
id UUID PRIMARY KEY,
|
||
name VARCHAR(255) NOT NULL,
|
||
type VARCHAR(100),
|
||
settings JSONB,
|
||
created_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
|
||
-- Пользователи
|
||
CREATE TABLE users (
|
||
id UUID PRIMARY KEY,
|
||
organization_id UUID REFERENCES organizations(id),
|
||
email VARCHAR(255) UNIQUE NOT NULL,
|
||
role VARCHAR(50) DEFAULT 'user',
|
||
created_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
|
||
-- Места хранения
|
||
CREATE TABLE storage_locations (
|
||
id UUID PRIMARY KEY,
|
||
organization_id UUID REFERENCES organizations(id),
|
||
parent_id UUID REFERENCES storage_locations(id),
|
||
name VARCHAR(255) NOT NULL,
|
||
address VARCHAR(100) NOT NULL,
|
||
type VARCHAR(50) NOT NULL,
|
||
coordinates JSONB,
|
||
qr_code VARCHAR(255),
|
||
created_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
|
||
-- Товары
|
||
CREATE TABLE items (
|
||
id UUID PRIMARY KEY,
|
||
organization_id UUID REFERENCES organizations(id),
|
||
name VARCHAR(255) NOT NULL,
|
||
description TEXT,
|
||
category VARCHAR(100),
|
||
created_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
|
||
-- Размещение товаров
|
||
CREATE TABLE item_placements (
|
||
id UUID PRIMARY KEY,
|
||
organization_id UUID REFERENCES organizations(id),
|
||
item_id UUID REFERENCES items(id),
|
||
location_id UUID REFERENCES storage_locations(id),
|
||
quantity INTEGER DEFAULT 1,
|
||
created_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
## 🔌 API Endpoints
|
||
|
||
### Аутентификация
|
||
```
|
||
POST /api/auth/login
|
||
POST /api/auth/register
|
||
POST /api/auth/refresh
|
||
```
|
||
|
||
### Организации
|
||
```
|
||
GET /api/organizations/:id
|
||
PUT /api/organizations/:id
|
||
```
|
||
|
||
### Места хранения
|
||
```
|
||
GET /api/locations
|
||
POST /api/locations
|
||
GET /api/locations/:id
|
||
PUT /api/locations/:id
|
||
DELETE /api/locations/:id
|
||
POST /api/locations/:id/qr-code
|
||
```
|
||
|
||
### Товары
|
||
```
|
||
GET /api/items
|
||
POST /api/items
|
||
GET /api/items/:id
|
||
PUT /api/items/:id
|
||
DELETE /api/items/:id
|
||
```
|
||
|
||
### Операции
|
||
```
|
||
POST /api/operations/place-item
|
||
POST /api/operations/move-item
|
||
GET /api/operations/search
|
||
```
|
||
|
||
### Шаблоны
|
||
```
|
||
GET /api/templates
|
||
POST /api/templates/:id/apply
|
||
```
|
||
|
||
---
|
||
|
||
## 🔐 Безопасность
|
||
|
||
### Аутентификация
|
||
- 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
|
||
```yaml
|
||
version: '3.8'
|
||
services:
|
||
backend:
|
||
build: ./backend
|
||
ports:
|
||
- "8080:8080"
|
||
environment:
|
||
- DB_HOST=postgres
|
||
- JWT_SECRET=your-secret
|
||
depends_on:
|
||
- postgres
|
||
|
||
frontend:
|
||
build: ./frontend
|
||
ports:
|
||
- "3000:80"
|
||
depends_on:
|
||
- backend
|
||
|
||
postgres:
|
||
image: postgres:15
|
||
environment:
|
||
- POSTGRES_DB=erp_mvp
|
||
- POSTGRES_USER=erp_user
|
||
- POSTGRES_PASSWORD=erp_pass
|
||
volumes:
|
||
- postgres_data:/var/lib/postgresql/data
|
||
|
||
volumes:
|
||
postgres_data:
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 Мониторинг
|
||
|
||
### Логирование
|
||
- Structured JSON логи
|
||
- Уровни: DEBUG, INFO, WARN, ERROR
|
||
- Correlation ID для отслеживания запросов
|
||
|
||
### Метрики
|
||
- Время отклика API
|
||
- Количество ошибок
|
||
- Активные пользователи
|
||
- Операции в день
|
||
|
||
### Алерты
|
||
- Высокое время отклика (>500ms)
|
||
- Высокий процент ошибок (>5%)
|
||
- Недоступность сервиса
|