{"id":51385735,"url":"https://github.com/kite-house/studyspot","last_synced_at":"2026-07-03T20:04:10.894Z","repository":{"id":367148352,"uuid":"1279471793","full_name":"kite-house/StudySpot","owner":"kite-house","description":"StudySpot","archived":false,"fork":false,"pushed_at":"2026-06-24T18:15:29.000Z","size":47,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-24T20:09:07.226Z","etag":null,"topics":["css","docker","docker-compose","gin","go","html","js","jwt","nginx","postgrsql","redis","sql"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kite-house.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-24T18:07:53.000Z","updated_at":"2026-06-24T18:54:45.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kite-house/StudySpot","commit_stats":null,"previous_names":["kite-house/studyspot"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/kite-house/StudySpot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kite-house%2FStudySpot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kite-house%2FStudySpot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kite-house%2FStudySpot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kite-house%2FStudySpot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kite-house","download_url":"https://codeload.github.com/kite-house/StudySpot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kite-house%2FStudySpot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35099548,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-03T02:00:05.635Z","response_time":110,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["css","docker","docker-compose","gin","go","html","js","jwt","nginx","postgrsql","redis","sql"],"created_at":"2026-07-03T20:04:09.997Z","updated_at":"2026-07-03T20:04:10.886Z","avatar_url":"https://github.com/kite-house.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003e📚 StudySpot\u003c/h1\u003e\n  \u003cp\u003e\u003cstrong\u003eСервис поиска мероприятий для студентов на Go с современным веб-интерфейсом\u003c/strong\u003e\u003c/p\u003e\n  \u003cp\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Go-1.22-00ADD8?style=flat-square\u0026logo=go\" alt=\"Go 1.22\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/PostgreSQL-16-336791?style=flat-square\u0026logo=postgresql\" alt=\"PostgreSQL\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Redis-7.4-DC382D?style=flat-square\u0026logo=redis\" alt=\"Redis\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Docker-✓-2496ED?style=flat-square\u0026logo=docker\" alt=\"Docker\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/JWT-✓-000000?style=flat-square\u0026logo=jsonwebtokens\" alt=\"JWT\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/license-MIT-green?style=flat-square\" alt=\"License MIT\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/HTML5-CSS3-orange?style=flat-square\u0026logo=html5\" alt=\"HTML5/CSS3\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/JavaScript-Vanilla-F7DF1E?style=flat-square\u0026logo=javascript\" alt=\"JavaScript\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Nginx-1.27-009639?style=flat-square\u0026logo=nginx\" alt=\"Nginx\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Gin-1.10-00ADD8?style=flat-square\u0026logo=go\" alt=\"Gin\"\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n## ✨ О проекте\n\n**StudySpot** — это полностью контейнеризированный сервис для поиска студенческих мероприятий, написанный на современном стеке технологий. Проект создан с упором на производительность, масштабируемость и удобство использования.\n\n### Основные возможности:\n- 🎓 **Единая платформа** для всех мероприятий университета\n- 🔍 **Быстрый поиск** по названию с полнотекстовым поиском PostgreSQL\n- 📂 **Фильтрация** по категориям (Олимпиады, Хакатоны, Курсы, Стажировки)\n- ⚡ **Кэширование** в Redis для мгновенных ответов\n- 🔐 **Безопасная аутентификация** через JWT с ролевой моделью\n- 👑 **Администрирование** — создание, редактирование и удаление мероприятий\n- 🎨 **Современный веб-интерфейс** с тёмной темой и адаптивным дизайном\n- 🐳 **Docker-first подход** — весь стек поднимается одной командой\n- 🗄️ **Автоматические миграции** при запуске контейнеров\n\n## 🛠 Стек технологий\n\n| Компонент | Технология |\n|-----------|------------|\n| **Язык (Backend)** | [Go 1.22](https://go.dev/) |\n| **Веб-фреймворк** | [Gin 1.10](https://gin-gonic.com/) |\n| **База данных** | [PostgreSQL 16](https://www.postgresql.org/) |\n| **Кэш** | [Redis 7.4](https://redis.io/) |\n| **Аутентификация** | [JWT](https://jwt.io/) |\n| **Веб-сервер** | [Nginx](https://nginx.org/) |\n| **Фронтенд** | HTML5, CSS3, JavaScript (Vanilla) |\n| **Контейнеризация** | [Docker](https://www.docker.com/) + [Docker Compose](https://docs.docker.com/compose/) |\n\n## 🚀 Быстрый старт\n\n### Предварительные требования\n- Установленные [Docker](https://docs.docker.com/get-docker/) и [Docker Compose](https://docs.docker.com/compose/install/)\n- (Опционально) [Go 1.22+](https://go.dev/dl/) для локальной разработки\n\n### Установка и запуск\n\n1. **Клонируйте репозиторий**\n   ```bash\n   git clone https://github.com/yourusername/studyspot.git\n   cd studyspot\n   ```\n\n2. **Настройте переменные окружения**\n   \n   Скопируйте файл с примером конфигурации:\n   ```bash\n   cp .env.example .env\n   ```\n   \n   Минимально необходимые настройки:\n   ```env\n   # Сервер\n   SERVER_PORT=8080\n   GIN_MODE=release\n   \n   # PostgreSQL\n   DB_HOST=postgres\n   DB_PORT=5432\n   DB_USER=postgres\n   DB_PASSWORD=postgres\n   DB_NAME=studyspot\n   DB_SSL_MODE=disable\n   \n   # Redis\n   REDIS_HOST=redis\n   REDIS_PORT=6379\n   REDIS_PASSWORD=\n   REDIS_DB=0\n   \n   # JWT\n   JWT_SECRET=your-super-secret-key-change-in-production\n   JWT_EXPIRE_HOURS=24\n   ```\n\n3. **Запустите все сервисы**\n   ```bash\n   docker compose up -d --build\n   ```\n\n4. **Проверьте работу**\n   - Веб-интерфейс: http://localhost\n   - Health check: http://localhost:8080/health\n   - API документация: http://localhost:8080/api/events\n\n### Тестовый аккаунт администратора\n\n```\nEmail: admin@studyspot.com\nPassword: admin123\n```\n\n## 📖 Использование\n\n### 🌐 Веб-интерфейс\n\nГлавная страница сервиса предлагает интуитивно понятный интерфейс для поиска мероприятий.\n\n| Функция | Описание |\n|---------|----------|\n| **Поиск** | Введите название мероприятия в строку поиска |\n| **Фильтр** | Выберите категорию из выпадающего списка |\n| **Просмотр** | Карточки мероприятий с названием, описанием, датой и местом |\n| **Авторизация** | Вход и регистрация через модальное окно |\n| **Создание** | Администраторы могут создавать новые мероприятия |\n\n### 🔗 API Endpoints\n\n**Публичные маршруты (без авторизации):**\n\n| Метод | Путь | Описание |\n|-------|------|----------|\n| POST | `/api/auth/register` | Регистрация пользователя |\n| POST | `/api/auth/login` | Авторизация (JWT) |\n\n**Защищённые маршруты (JWT):**\n\n| Метод | Путь | Описание | Роль |\n|-------|------|----------|------|\n| GET | `/api/events` | Список мероприятий | user/admin |\n| GET | `/api/events/search?q=...` | Поиск по названию | user/admin |\n| GET | `/api/events/search?category=...` | Фильтр по категории | user/admin |\n| GET | `/api/events/:id` | Карточка мероприятия | user/admin |\n| GET | `/api/categories` | Список категорий | user/admin |\n\n**Административные маршруты (только admin):**\n\n| Метод | Путь | Описание |\n|-------|------|----------|\n| POST | `/api/events` | Создать мероприятие |\n| PUT | `/api/events/:id` | Обновить мероприятие |\n| DELETE | `/api/events/:id` | Удалить мероприятие |\n| POST | `/api/categories` | Создать категорию |\n| PUT | `/api/categories/:id` | Обновить категорию |\n| DELETE | `/api/categories/:id` | Удалить категорию |\n\n### 📝 Примеры API запросов\n\n**Регистрация:**\n```bash\ncurl -X POST http://localhost:8080/api/auth/register \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"email\":\"student@example.com\",\"password\":\"password123\"}'\n```\n\n**Вход (получение JWT):**\n```bash\ncurl -X POST http://localhost:8080/api/auth/login \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"email\":\"admin@studyspot.com\",\"password\":\"admin123\"}'\n```\n\n**Получение списка мероприятий:**\n```bash\ncurl http://localhost:8080/api/events \\\n  -H \"Authorization: Bearer \u003cyour_jwt_token\u003e\"\n```\n\n**Поиск мероприятий:**\n```bash\ncurl \"http://localhost:8080/api/events/search?q=хакатон\" \\\n  -H \"Authorization: Bearer \u003cyour_jwt_token\u003e\"\n```\n\n**Создание мероприятия (админ):**\n```bash\ncurl -X POST http://localhost:8080/api/events \\\n  -H \"Authorization: Bearer \u003cyour_jwt_token\u003e\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"title\": \"Хакатон 2026\",\n    \"description\": \"Грандиозный хакатон для студентов\",\n    \"category_id\": \"UUID_категории\",\n    \"date\": \"2026-07-15T10:00:00Z\",\n    \"location\": \"Главный корпус, ауд. 101\"\n  }'\n```\n\n## 📁 Структура проекта\n\n```\nstudyspot/\n├── cmd/                              # Точка входа\n│   └── app/\n│       └── main.go                   # Запуск сервера\n├── internal/                         # Внутренняя логика\n│   ├── cache/                        # Redis клиент\n│   │   └── redis.go\n│   ├── config/                       # Конфигурация\n│   │   └── config.go\n│   ├── domain/                       # Модели данных\n│   │   ├── user.go\n│   │   ├── event.go\n│   │   └── category.go\n│   ├── handler/                      # HTTP-обработчики\n│   │   ├── auth_handler.go\n│   │   ├── event_handler.go\n│   │   └── category_handler.go\n│   ├── middleware/                   # JWT и CORS\n│   │   └── auth.go\n│   ├── repository/                   # Работа с БД\n│   │   ├── user_repo.go\n│   │   ├── event_repo.go\n│   │   └── category_repo.go\n│   └── service/                      # Бизнес-логика\n│       ├── auth_service.go\n│       ├── event_service.go\n│       └── category_service.go\n├── pkg/                              # Вспомогательные пакеты\n│   ├── jwt/                          # JWT утилиты\n│   │   └── jwt.go\n│   ├── password/                     # Хеширование паролей\n│   │   └── password.go\n│   └── response/                     # Стандартизация ответов\n│       └── response.go\n├── frontend/                         # Фронтенд\n│   └── index.html                    # Весь фронтенд в одном файле\n├── migrations/                       # SQL-миграции\n│   └── 001_init_schema.sql\n├── docker/\n│   └── Dockerfile                    # Dockerfile для бэкенда\n├── docker-compose.yml                # Оркестрация всех сервисов\n├── .env.example                      # Пример конфигурации\n├── go.mod                            # Зависимости Go\n├── go.sum                            # Хеши зависимостей\n└── README.md                         # Документация\n```\n\n## 🗄️ Модели данных\n\n### User (пользователь)\n```sql\nid         UUID PRIMARY KEY\nemail      VARCHAR(255) UNIQUE NOT NULL\npassword   VARCHAR(255) NOT NULL\nrole       VARCHAR(20) DEFAULT 'user'\ncreated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n```\n\n### Category (категория)\n```sql\nid         UUID PRIMARY KEY\nname       VARCHAR(100) UNIQUE NOT NULL\ncreated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n```\n\n### Event (мероприятие)\n```sql\nid          UUID PRIMARY KEY\ntitle       VARCHAR(255) NOT NULL\ndescription TEXT\ncategory_id UUID REFERENCES categories(id)\ndate        TIMESTAMP NOT NULL\nlocation    VARCHAR(255)\ncreated_by  UUID REFERENCES users(id)\ncreated_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP\nupdated_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n```\n\n## 🎨 Особенности интерфейса\n\n- **Тёмная тема** для комфортной работы в любое время\n- **Адаптивный дизайн** для всех устройств\n- **Плавные анимации** при взаимодействии\n- **Карточки мероприятий** с всей необходимой информацией\n- **Модальные окна** для создания и редактирования\n- **Всплывающие уведомления** (toast-сообщения)\n\n## 🗄️ Управление миграциями\n\nМиграции применяются автоматически при первом запуске контейнера PostgreSQL.\n\n### Ручное применение миграций\n\n```bash\n# Подключиться к БД\ndocker exec -it studyspot-db psql -U postgres -d studyspot\n\n# Применить миграцию\n\\i /docker-entrypoint-initdb.d/001_init_schema.sql\n```\n\n## 🤝 Вклад в проект\n\nБудем рады вашим идеям и улучшениям! Чтобы внести вклад:\n\n1. Форкните репозиторий\n2. Создайте ветку для фичи (`git checkout -b feature/amazing-feature`)\n3. Закоммитьте изменения (`git commit -m '✨ Add some amazing feature'`)\n4. Запушьте ветку (`git push origin feature/amazing-feature`)\n5. Откройте Pull Request\n\n## 📄 Лицензия\n\nПроект распространяется под лицензией MIT. Подробности в файле LICENSE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkite-house%2Fstudyspot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkite-house%2Fstudyspot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkite-house%2Fstudyspot/lists"}