2025-12-07 13:34:02 +03:00
2025-12-07 13:34:02 +03:00
2025-12-07 13:34:02 +03:00
2025-12-07 13:34:02 +03:00
2025-12-07 13:34:02 +03:00
2025-12-07 13:34:02 +03:00
2025-12-07 13:34:02 +03:00
2025-12-07 13:34:02 +03:00
2025-12-07 13:34:02 +03:00
2025-12-07 13:34:02 +03:00
2025-12-07 13:34:02 +03:00
2025-12-07 13:34:02 +03:00
2025-12-07 13:34:02 +03:00
2025-12-07 13:34:02 +03:00
2025-12-07 13:34:02 +03:00
2025-12-07 13:34:02 +03:00
2025-12-07 13:34:02 +03:00

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

  1. Клонируйте репозиторий или используйте существующий проект

  2. Установите зависимости:

npm install

Frontend

  1. Перейдите в папку клиента:
cd client
npm install
  1. Настройте базу данных:

    • Создайте базу данных 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
      
  2. Настройте конфигурацию:

    • Отредактируйте 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 документация доступна по адресу:

📁 Структура проекта

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 ID
  • GET /auth/me - Получить текущего пользователя (требует аутентификации)
  • POST /auth/change-password - Изменить пароль (требует аутентификации)

Товары (Products)

  • GET /products - Получить список товаров
  • GET /products/:id - Получить товар по ID
  • POST /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_DB
  • KEYCLOAK_HOST, KEYCLOAK_PORT, KEYCLOAK_REALM, KEYCLOAK_CLIENT_ID, KEYCLOAK_CLIENT_SECRET
  • WEB_HTTP_PORT, WEB_HTTPS_PORT, WEB_HOST, WEB_TSL
  • JWT_SECRET, JWT_EXPIRES_IN
  • SYNC_TOKEN

🧪 Разработка

Добавление нового DAO

  1. Создайте файл в src/dao/:
import { BaseDAO } from './BaseDAO.js';

export class NewDAO extends BaseDAO {
  constructor() {
    super('table_name');
  }
  
  // Кастомные методы
}

Добавление новых роутов

  1. Создайте файл в src/routes/:
export async function newRoutes(fastify, options) {
  fastify.get('/new', async (request, reply) => {
    return { success: true };
  });
}
  1. Зарегистрируйте в src/server.js:
import { newRoutes } from './routes/new.routes.js';
await fastify.register(newRoutes);

📄 Лицензия

ISC

👥 Авторы

Проект создан для интернет-магазина.

S
Description
No description provided
Readme
435 KiB
0 Stars 1 Watchers 0 Forks
Languages
JavaScript 87.1%
CSS 11.4%
PLpgSQL 1.2%
Dockerfile 0.3%