Skip to content

Полнофункциональная CMS платформа для ведения блога с гексагональной архитектурой, современным фронтендом и удобной админ-панелью.

Notifications You must be signed in to change notification settings

turkprogrammer/go-cms-blog

Repository files navigation

CMS Blog - Современная платформа для ведения блога

Полнофункциональная CMS платформа для ведения блога с гексагональной архитектурой, современным фронтендом и удобной админ-панелью.

🚀 Особенности

  • Гексагональная архитектура - Чистая архитектура с разделением на Domain, Ports, Adapters
  • Современный фронтенд - React + TypeScript + Vite + Tailwind CSS
  • Стильный дизайн - Glassmorphism, градиенты, анимации, темная/светлая тема
  • Админ-панель - Полнофункциональное управление контентом
  • Статичные страницы - Управление информационными страницами
  • WYSIWYG редактор - Удобный редактор контента (Tiptap)
  • Загрузка файлов - Загрузка изображений для постов и страниц
  • Управление пользователями - Полный CRUD для пользователей
  • SQLite база данных - Легковесная и простая в использовании
  • RESTful API - Чистый и понятный API
  • JWT аутентификация - Безопасный вход в админку

📋 Технологии

Backend

  • Go 1.21+ - Основной язык
  • SQLite - База данных
  • httprouter - HTTP роутер
  • bcrypt - Хеширование паролей
  • slog - Структурированное логирование

Frontend

  • React 18 - UI библиотека
  • TypeScript - Типизация
  • Vite - Сборщик
  • Tailwind CSS - Стилизация
  • React Router - Маршрутизация
  • React Query - Управление состоянием
  • Framer Motion - Анимации
  • Axios - HTTP клиент

🏗️ Архитектура

Проект следует принципам гексагональной архитектуры (Ports & Adapters):

internal/
├── domain/          # Бизнес-логика (сущности)
│   ├── slug.go      # Общая функция транслитерации slug
│   ├── post.go      # Доменная сущность поста
│   ├── page.go      # Доменная сущность страницы
│   ├── category.go  # Доменная сущность категории
│   └── tag.go       # Доменная сущность тега
├── ports/           # Интерфейсы
│   ├── inbound/     # Use Cases (входящие порты)
│   └── outbound/    # Repositories (исходящие порты)
└── adapters/        # Реализации
    ├── inbound/     # HTTP handlers, Use Cases
    └── outbound/    # SQLite repositories

Принципы проектирования

  • KISS - Простота превыше всего
  • DRY - Нет дублирования кода (общая функция транслитерации для всех сущностей)
  • SOLID - Следование принципам SOLID
  • YAGNI - Только необходимый функционал
  • Слабая связанность - Независимые компоненты
  • Высокая связность - Логическое группирование

Генерация slug

Все сущности (Post, Page, Category, Tag) используют общую функцию transliterateToSlug() из пакета domain для генерации URL-friendly идентификаторов. Функция поддерживает:

  • Транслитерацию кириллицы в латиницу
  • Автоматическую очистку от HTML-тегов
  • Нормализацию специальных символов
  • Ограничение длины slug

📦 Установка и запуск

Требования

  • Go 1.21 или выше
  • Node.js 18+ и npm
  • SQLite (встроен в Go)

Быстрый запуск

Linux / Mac

Запустите оба сервиса (Backend + Frontend) одной командой:

chmod +x start-dev.sh
./start-dev.sh

Скрипт автоматически:

  • Проверит наличие Go и Node.js
  • Установит зависимости frontend (если нужно)
  • Запустит Backend в фоне
  • Запустит Frontend в фоне
  • Остановится по Ctrl+C

Windows PowerShell

Запустите оба сервиса (Backend + Frontend) одной командой:

powershell -ExecutionPolicy Bypass -File .\start-dev.ps1

Скрипт автоматически:

  • Проверит наличие Go и Node.js
  • Установит зависимости frontend (если нужно)
  • Запустит Backend в отдельном окне
  • Запустит Frontend в отдельном окне

Ручной запуск (любая ОС)

Или запустите вручную в двух отдельных терминалах:

Терминал 1 - Backend:

go run ./cmd/api

Терминал 2 - Frontend:

cd web/frontend
npm run dev

Подробная инструкция

  1. Клонируйте репозиторий:

    git clone <repository-url>
    cd cms-blog
  2. Установите зависимости Backend:

    go mod download
  3. Установите зависимости Frontend:

    cd web/frontend
    npm install
  4. Запустите Backend (в первом терминале):

    # Из корня проекта
    go run ./cmd/api

    Backend будет доступен на http://localhost:8080

  5. Запустите Frontend (во втором терминале):

    # Из директории web/frontend
    cd web/frontend
    npm run dev

    Frontend будет доступен на http://localhost:3000

Порты

  • Backend API: http://localhost:8080
  • Frontend: http://localhost:3000
  • Статические файлы (uploads): http://localhost:8080/uploads/

🔐 Аутентификация

Тестовые данные для входа в админку:

  • Email: admin@example.com
  • Password: admin123

При первом запуске автоматически создается администратор с этими данными.

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

cms-blog/
├── cmd/
│   └── api/              # Точка входа приложения
├── internal/
│   ├── domain/           # Доменные сущности
│   ├── ports/            # Интерфейсы (Ports)
│   │   ├── inbound/      # Use Cases
│   │   └── outbound/     # Repositories
│   └── adapters/         # Реализации (Adapters)
│       ├── inbound/      # HTTP handlers, Use Cases
│       └── outbound/     # SQLite repositories
├── migrations/            # SQL миграции
├── web/
│   ├── frontend/         # React фронтенд
│   └── static/           # Статические файлы
├── go.mod                 # Go зависимости
└── README.md             # Документация

🧪 Тестирование

Запуск тестов

# Все тесты
go test ./...

# С покрытием
go test -cover ./...

# Конкретный пакет
go test ./internal/domain/...

Тесты фронтенда

cd web/frontend
npm test

📚 API Endpoints

Публичные

  • GET /api/posts - Список постов
  • GET /api/posts/:id - Получить пост по ID или slug
  • GET /api/pages - Список страниц
  • GET /api/pages/:id - Получить страницу по ID или slug
  • GET /api/categories - Список категорий
  • GET /api/tags - Список тегов
  • GET /api/pages - Список страниц
  • GET /api/pages/:id - Получить страницу по ID или slug

Защищенные (требуют аутентификации)

  • POST /api/auth/login - Вход в систему
  • POST /api/posts - Создать пост
  • PUT /api/posts/:id - Обновить пост
  • DELETE /api/posts/:id - Удалить пост
  • POST /api/pages - Создать страницу
  • PUT /api/pages/:id - Обновить страницу
  • DELETE /api/pages/:id - Удалить страницу
  • POST /api/categories - Создать категорию
  • PUT /api/categories/:id - Обновить категорию
  • DELETE /api/categories/:id - Удалить категорию
  • POST /api/tags - Создать тег
  • PUT /api/tags/:id - Обновить тег
  • DELETE /api/tags/:id - Удалить тег
  • GET /api/users - Список пользователей
  • GET /api/users/:id - Получить пользователя по ID
  • POST /api/users - Создать пользователя
  • PUT /api/users/:id - Обновить пользователя
  • DELETE /api/users/:id - Удалить пользователя
  • POST /api/upload - Загрузить изображение (multipart/form-data)

🔧 Конфигурация

Переменные окружения

  • DB_PATH - Путь к файлу базы данных (по умолчанию: ./cms.db)
  • PORT - Порт сервера (по умолчанию: 8080)
  • UPLOAD_DIR - Директория для загрузки файлов (по умолчанию: ./uploads)

Пример:

export DB_PATH=./data/cms.db
export PORT=3000
go run ./cmd/api

📝 Миграции

Миграции выполняются автоматически при запуске приложения. SQL файлы находятся в директории migrations/.

🎨 Дизайн

Фронтенд использует современные тренды дизайна:

  • Glassmorphism - Эффект стеклянного дизайна
  • Gradient backgrounds - Градиентные фоны
  • Micro-interactions - Плавные анимации
  • Dark/Light mode - Поддержка темной и светлой темы
  • Responsive design - Адаптивный дизайн
  • Accessibility - Доступность (a11y)

🛡️ Безопасность

  • ✅ Хеширование паролей (bcrypt)
  • ✅ JWT токены для аутентификации
  • ✅ Валидация входных данных
  • ✅ Защита от SQL инъекций (prepared statements)
  • ✅ CORS настройки
  • ✅ Обработка ошибок без утечки информации

📊 Логирование

Используется структурированное логирование через slog:

logger.Info("Server started", "addr", srv.Addd)
logger.Error("Failed to connect", "error", err)

🚀 Производительность

  • Оптимизированные SQL запросы
  • Кэширование на фронтенде (React Query)
  • Минимальные зависимости
  • Эффективная работа с базой данных

📖 Документация

🤝 Вклад в проект

  1. Fork проекта
  2. Создайте ветку для фичи (git checkout -b feature/AmazingFeature)
  3. Commit изменения (git commit -m 'Add some AmazingFeature')
  4. Push в ветку (git push origin feature/AmazingFeature)
  5. Откройте Pull Request

📄 Лицензия

Этот проект создан для образовательных целей.

👨‍💻 Автор

Создано с использованием современных практик разработки и принципов чистой архитектуры.


Примечание: Проект следует принципам KISS, DRY, SOLID, YAGNI и современным трендам разработки.

About

Полнофункциональная CMS платформа для ведения блога с гексагональной архитектурой, современным фронтендом и удобной админ-панелью.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published