Shop Platform
Полнофункциональный интернет-магазин с RESTful API на Fastify и современным React фронтендом.
✨ Возможности
- 🛍️ Каталог товаров с фильтрацией и поиском
- 🛒 Корзина покупок
- 📱 Адаптивный дизайн
- 🔍 Поиск товаров
- 📂 Категории товаров
- 📄 Детальные страницы товаров
- 🎨 Современный и красивый UI
🚀 Технологии
Backend
- Fastify - быстрый веб-фреймворк для Node.js
- PostgreSQL - реляционная база данных
- Swagger/OpenAPI - документация API
- DAO Pattern - паттерн доступа к данным
- Keycloak - интеграция с системой аутентификации (опционально)
- YAML Config - конфигурация через YAML файл
Frontend
- React 18 - современная UI библиотека
- Vite - быстрый сборщик и dev-сервер
- React Router - клиентский роутинг
- Axios - HTTP клиент для API запросов
📋 Требования
- Node.js >= 18.0.0
- PostgreSQL >= 12.0
- npm или yarn
🛠️ Установка
Backend
-
Клонируйте репозиторий или используйте существующий проект
-
Установите зависимости:
npm install
Frontend
- Перейдите в папку клиента:
cd client
npm install
-
Настройте базу данных:
- Создайте базу данных PostgreSQL
- Выполните SQL скрипты в порядке:
psql -U postgres -d shop_platform -f sql/schema.sql psql -U postgres -d shop_platform -f sql/indexes.sql psql -U postgres -d shop_platform -f sql/triggers.sql psql -U postgres -d shop_platform -f sql/seed_data.sql
-
Настройте конфигурацию:
- Отредактируйте
config.yamlили установите переменные окружения - Формат переменных:
${VAR_NAME:default_value}
- Отредактируйте
⚙️ Конфигурация
Конфигурация загружается из файла config.yaml с поддержкой переменных окружения.
Формат конфигурации:
keycloak:
host: ${KEYCLOAK_HOST:158.160.87.50}
port: ${KEYCLOAK_PORT:10090}
realm: ${KEYCLOAK_REALM:sso}
# ...
postgres:
host: ${POSTGRES_HOST:158.160.87.50}
port: ${POSTGRES_PORT:11432}
# ...
web:
http_port: ${WEB_HTTP_PORT:80}
https_port: ${WEB_HTTPS_PORT:443}
# ...
Переменные окружения:
Вы можете переопределить значения через переменные окружения:
export POSTGRES_HOST=localhost
export POSTGRES_PORT=5432
export KEYCLOAK_HOST=keycloak.example.com
🏃 Запуск
Backend
Режим разработки
npm run dev
Продакшн режим
npm start
Сервер будет доступен по адресу из конфигурации (по умолчанию http://0.0.0.0:80)
Frontend
Режим разработки
cd client
npm run dev
Фронтенд будет доступен по адресу http://localhost:3000
Сборка для продакшена
cd client
npm run build
Собранные файлы будут в папке client/dist/
📚 API Документация
После запуска сервера Swagger документация доступна по адресу:
- Swagger UI: http://localhost:80/docs (или указанный порт)
- Swagger JSON: http://localhost:80/docs/json
📁 Структура проекта
shop-platform/
├── client/ # React фронтенд
│ ├── src/
│ │ ├── api/ # API клиенты
│ │ ├── components/ # React компоненты
│ │ ├── pages/ # Страницы приложения
│ │ └── App.jsx # Главный компонент
│ ├── package.json
│ └── vite.config.js
├── conf/
│ └── config.yml # Конфигурационный файл
├── src/
│ ├── dao/ # Data Access Objects
│ ├── routes/ # Маршруты API
│ ├── plugins/ # Fastify плагины
│ └── utils/ # Утилиты
├── sql/ # SQL скрипты
├── tests/ # Тесты
├── app.js # Главный файл приложения
└── package.json
├── package.json
└── README.md
🔌 API Endpoints
Аутентификация (Auth)
POST /auth/register- Регистрация по email и паролюPOST /auth/login- Вход по email и паролюPOST /auth/telegram- Вход/регистрация по Telegram IDGET /auth/me- Получить текущего пользователя (требует аутентификации)POST /auth/change-password- Изменить пароль (требует аутентификации)
Товары (Products)
GET /products- Получить список товаровGET /products/:id- Получить товар по IDPOST /products- Создать товарPUT /products/:id- Обновить товарDELETE /products/:id- Удалить товар
Категории (Categories)
GET /categories- Получить список категорийGET /categories/tree- Получить дерево категорийGET /categories/:id- Получить категорию по ID
🔐 Аутентификация
Система поддерживает два способа аутентификации:
1. По email и паролю
# Регистрация
curl -X POST http://localhost:80/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"password": "password123",
"first_name": "Иван",
"last_name": "Иванов"
}'
# Вход
curl -X POST http://localhost:80/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"password": "password123"
}'
2. По Telegram ID
curl -X POST http://localhost:80/auth/telegram \
-H "Content-Type: application/json" \
-d '{
"telegram_id": 123456789,
"first_name": "Иван",
"last_name": "Иванов",
"phone": "+79001234567"
}'
Использование токена
После успешной аутентификации вы получите JWT токен. Используйте его в заголовке:
curl http://localhost:80/auth/me \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
🔑 Keycloak интеграция
Система поддерживает интеграцию с Keycloak для аутентификации. Настройки находятся в config.yaml:
keycloak:
host: ${KEYCLOAK_HOST:158.160.87.50}
port: ${KEYCLOAK_PORT:10090}
realm: ${KEYCLOAK_REALM:sso}
ssl: ${KEYCLOAK_TLS:false}
client_id: ${KEYCLOAK_CLIENT_ID:sso}
client_secret: ${KEYCLOAK_CLIENT_SECRET:...}
🔒 TLS/SSL
Для включения HTTPS настройте в config.yaml:
web:
tsl: true
https_port: 443
tsl:
path: ./tsl
key: key.pem
cert: cert.pem
Сертификаты должны находиться в указанной директории.
📝 Переменные окружения
Все настройки можно переопределить через переменные окружения. Формат в config.yaml: ${VAR_NAME:default_value}
Основные переменные:
POSTGRES_HOST,POSTGRES_PORT,POSTGRES_USER,POSTGRES_PASSWORD,POSTGRES_DBKEYCLOAK_HOST,KEYCLOAK_PORT,KEYCLOAK_REALM,KEYCLOAK_CLIENT_ID,KEYCLOAK_CLIENT_SECRETWEB_HTTP_PORT,WEB_HTTPS_PORT,WEB_HOST,WEB_TSLJWT_SECRET,JWT_EXPIRES_INSYNC_TOKEN
🧪 Разработка
Добавление нового DAO
- Создайте файл в
src/dao/:
import { BaseDAO } from './BaseDAO.js';
export class NewDAO extends BaseDAO {
constructor() {
super('table_name');
}
// Кастомные методы
}
Добавление новых роутов
- Создайте файл в
src/routes/:
export async function newRoutes(fastify, options) {
fastify.get('/new', async (request, reply) => {
return { success: true };
});
}
- Зарегистрируйте в
src/server.js:
import { newRoutes } from './routes/new.routes.js';
await fastify.register(newRoutes);
📄 Лицензия
ISC
👥 Авторы
Проект создан для интернет-магазина.