Полнофункциональная CMS платформа для ведения блога с гексагональной архитектурой, современным фронтендом и удобной админ-панелью.
- Гексагональная архитектура - Чистая архитектура с разделением на Domain, Ports, Adapters
- Современный фронтенд - React + TypeScript + Vite + Tailwind CSS
- Стильный дизайн - Glassmorphism, градиенты, анимации, темная/светлая тема
- Админ-панель - Полнофункциональное управление контентом
- Статичные страницы - Управление информационными страницами
- WYSIWYG редактор - Удобный редактор контента (Tiptap)
- Загрузка файлов - Загрузка изображений для постов и страниц
- Управление пользователями - Полный CRUD для пользователей
- SQLite база данных - Легковесная и простая в использовании
- RESTful API - Чистый и понятный API
- JWT аутентификация - Безопасный вход в админку
- Go 1.21+ - Основной язык
- SQLite - База данных
- httprouter - HTTP роутер
- bcrypt - Хеширование паролей
- slog - Структурированное логирование
- 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 - Только необходимый функционал
- ✅ Слабая связанность - Независимые компоненты
- ✅ Высокая связность - Логическое группирование
Все сущности (Post, Page, Category, Tag) используют общую функцию transliterateToSlug() из пакета domain для генерации URL-friendly идентификаторов. Функция поддерживает:
- Транслитерацию кириллицы в латиницу
- Автоматическую очистку от HTML-тегов
- Нормализацию специальных символов
- Ограничение длины slug
- Go 1.21 или выше
- Node.js 18+ и npm
- SQLite (встроен в Go)
Запустите оба сервиса (Backend + Frontend) одной командой:
chmod +x start-dev.sh
./start-dev.shСкрипт автоматически:
- Проверит наличие Go и Node.js
- Установит зависимости frontend (если нужно)
- Запустит Backend в фоне
- Запустит Frontend в фоне
- Остановится по Ctrl+C
Запустите оба сервиса (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-
Клонируйте репозиторий:
git clone <repository-url> cd cms-blog
-
Установите зависимости Backend:
go mod download
-
Установите зависимости Frontend:
cd web/frontend npm install -
Запустите Backend (в первом терминале):
# Из корня проекта go run ./cmd/apiBackend будет доступен на
http://localhost:8080 -
Запустите 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 testGET /api/posts- Список постовGET /api/posts/:id- Получить пост по ID или slugGET /api/pages- Список страницGET /api/pages/:id- Получить страницу по ID или slugGET /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- Получить пользователя по IDPOST /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)
- Минимальные зависимости
- Эффективная работа с базой данных
- Архитектура проекта
- Новые функции
- Настройка фронтенда
- Инструкция по запуску фронтенда
- Тестирование
- Статус проекта
- Fork проекта
- Создайте ветку для фичи (
git checkout -b feature/AmazingFeature) - Commit изменения (
git commit -m 'Add some AmazingFeature') - Push в ветку (
git push origin feature/AmazingFeature) - Откройте Pull Request
Этот проект создан для образовательных целей.
Создано с использованием современных практик разработки и принципов чистой архитектуры.
Примечание: Проект следует принципам KISS, DRY, SOLID, YAGNI и современным трендам разработки.