Как стать автором
Обновить

Как я создал клон Pinterest с использованием Vue 3 и FastAPI

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров3K

GitHub: Ссылка на репозиторий Live Preview: Проект вживую

👋 Привет, Habr!

Вы когда-нибудь пытались найти качественный open-source клон Pinterest — с real-time функционалом, полноценной архитектурой, удобным UI и современной технологической основой? Я — да. И не нашёл. Поэтому решил создать свой.

Представляю вам Pinterest Clone — мой pet-проект, над которым я работал в одиночку 4 месяца, чтобы воссоздать не просто копию, а полнофункциональную платформу с реальным пользовательским опытом, максимально приближённым к оригиналу. Реализация включает:

  • Полноценный REST API на FastAPI — с чёткой архитектурой, валидацией, пагинацией и фильтрацией.

  • Современный фронтенд на Vue 3 — с использованием Tailwind CSS для адаптивной стилизации и Axios для взаимодействия с API.

  • Real-time чаты и уведомления — реализованы через WebSockets и Server-Sent Events (SSE).

  • Аутентификация — с поддержкой JWT и входом через Google OAuth2.

  • Фоновая обработка задач и планирование — с помощью Celery и Celery Beat

  • Кеширование — реализовано через Redis для ускорения работы с наиболее запрашиваемыми данными.

  • CI/CD, Docker, деплой на VPS — с автоматической сборкой и доставкой, настройкой Nginx и SSL.

  • Клонирование ключевого функционала Pinterest — пины, доски, подписки, лайки, комментарии, поиск, профили пользователей, загрузка media, система рекомендаций и многое другое.

И всё это — за 4 месяца, полностью в одиночку.
Буду очень благодарен, если поддержите проект звёздочкой на GitHub!

🚀 Live-версия

Я предусмотрел Live Preview, где вы можете протестировать весь функционал без регистрации — достаточно использовать quick login как тестовый пользователь. Всё отлажено и протестировано вручную. Можете смело играться с интерфейсом, создавать пины, чатиться и проверять real-time фичи.

🤝 Зачем эта статья?

Я пишу эту статью не только чтобы поделиться опытом и описать проект, но и чтобы привлечь разработчиков, которым интересна идея. Если вы хотите поучаствовать в open source, внести вклад или просто вдохновиться архитектурой — добро пожаловать в репозиторий! Уверен, вместе мы можем довести проект до нового уровня.

📄 Welcome Page

На странице приветствия пользователю доступны следующие возможности:

  • 🔑 Quick Login — мгновенный вход в систему как тестовый пользователь, чтобы сразу протестировать весь функционал без необходимости регистрации.

  • 📝 Signup — регистрация нового пользователя с созданием собственного профиля.

  • 🔐 Login — вход для ранее зарегистрированных пользователей.

  • 🌍 Google OAuth2 — авторизация через аккаунт Google для удобства.

После входа пользователь попадает в полноценную платформу, где может создавать пины, комментировать, подписываться, лайкать, взаимодействовать с real-time функционалом и многое другое. 🎥 Также на странице доступен Video Overview — видеообзор, демонстрирующий весь ключевой функционал проекта в действии.

🌸 Feed Page

Страница ленты — это главная точка входа в контент платформы. Здесь пользователи могут просматривать пины — изображения, гифки и видео — размещённые другими участниками сообщества. Основные особенности ленты:

  • 🧱 Masonry Grid Layout
    Все пины располагаются в формате «кирпичной кладки», повторяя узнаваемый стиль оригинального Pinterest. Это обеспечивает плотное, но визуально гармоничное размещение карточек разной высоты.

  • 🔄 Бесконечная прокрутка (Infinite Scrolling)
    Новые пины автоматически подгружаются по мере прокрутки страницы вниз, что делает просмотр контента непрерывным и более удобным.

  • 🏷️ Поиск по тегам (Tags Search)
    Пользователи могут находить интересующие их пины по тегам — реализован быстрый и интуитивный поиск по ключевым темам.

  • 🎨 Primary Color при загрузке
    Пока изображение пина загружается, отображается его доминирующий цвет (primary color). Это придаёт визуальную завершённость и сглаживает момент загрузки, особенно при медленном интернете.

  • 👤 Информация об авторе
    Под каждым пином указано имя пользователя, разместившего его. Можно перейти в профиль, чтобы увидеть больше его пинов и досок.

📌 Страница пина + Похожие пины

Каждый пин в приложении имеет свою отдельную страницу с детальной информацией и возможностью взаимодействия. Вот основные возможности этой страницы:

  • 🖼️ Детали пина
    Отображается полная информация о пине: изображение, заголовок, описание, ссылка (href), теги и автор пина. Такой подход позволяет пользователям глубже познакомиться с контентом и перейти к его источнику.

  • 💬 Комментарии и лайки
    Пользователи могут:

    • 💖 Лайкать как сам пин, так и отдельные комментарии.

    • ✍️ Оставлять комментарии под пином.

    • 🔁 Отвечать на комментарии других пользователей (вложенные комментарии).

  • 🧠 Похожие пины (Related Pins)
    Ниже основного пина отображаются другие пины, связанные по тегам. Это помогает пользователю находить похожий контент и оставаться дольше на платформе.

✨ Создание нового пина

Создание пина — одна из ключевых функций приложения. Пользователь может загрузить изображение, GIF или видео, а также добавить к пину дополнительную информацию:

  • 📝 Название и описание

  • 🔗 Ссылку (href)

  • 🏷 Теги, по которым пин будет легче найти через поиск

Интерфейс реализован удобно и интуитивно: после выбора файла появляется превью, поля для ввода данных, а также выбор подходящих тегов.

💡 Благодаря гибкой архитектуре, пины сразу отображаются в ленте и могут быть найдены другими пользователями через поиск по тегам.

🔍Поиск пинов

🔍 В приложении реализован удобный и быстрый поиск по пинам:

  • 📌 Поиск по текстовому запросу — вы можете искать пины по их названию, описанию и другим параметрам.

  • 🏷 Поиск по тегам — просто кликните на тег, и вы сразу увидите все пины с этим тегом.

  • Быстрый поиск доступен на любой странице приложения.

  • 🔥 Популярные пины отображаются как рекомендации.

  • 🕘 История последних поисков сохраняется для быстрого доступа.

💡 Такой подход позволяет пользователям быстро находить нужный контент и возвращаться к интересным пинам без повторного ввода запроса.

👤 Профиль пользователя

Каждый пользователь имеет собственную страницу профиля с множеством функций:

  • ✏️ Редактирование профиля — пользователь может изменить имя, аватар и другую информацию.

  • 📌 Создание досок — для организации пинов по тематикам.

  • ❤️ Просмотр понравившихся пинов, 🧷 сохранённых, а также созданных лично.

  • 🗂 Работа с досками — просмотр пинов на досках, удаление и редактирование содержимого.

  • Подписки — можно подписаться на других пользователей или отписаться.

  • 💬 Отправка сообщений другим пользователям прямо из профиля.

💡 Профиль — это персональный центр управления, который позволяет не только следить за контентом, но и взаимодействовать с другими участниками платформы.

🧷 Доски (Boards)

Доски — это удобный способ организации пинов по темам, коллекциям или интересам.

  • Создание досок — пользователь может создать неограниченное количество досок.

  • 📌 Добавление пинов — пины можно сохранять на конкретные доски.

  • Удаление пинов с доски — если что-то больше не актуально, пин легко убрать.

  • 👁 Просмотр всех досок — как собственных, так и у других пользователей.

📁 Доски позволяют структурировать контент по категориям — например, "Дизайн", "Путешествия", "Рецепты", что делает навигацию и вдохновение намного удобнее.

⭐ Рекомендации

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

  • 📌 Персональные рекомендации — формируются на основе недавно просмотренных пинов.

  • ⚙️ Фоновая обработка через Celery — задачи по подбору рекомендаций выполняются асинхронно, не нагружая основной поток приложения.

  • 🔄 Реальное время — обновления рекомендаций происходят автоматически, без перезагрузки страницы.

Благодаря использованию Celery и Redis, рекомендации работают быстро и не мешают основной работе приложения, оставаясь всегда актуальными.

🔔 Уведомления в реальном времени

Пользователь получает мгновенные уведомления, когда его пин был:

  • 💾 сохранён другим пользователем

  • 💬 прокомментирован

  • ❤️ понравился (лайкнут)

⚙️ Техническая реализация:

  • 🧵 Celery — формирует уведомления в фоновом режиме после событий (лайк, коммент, сохранение).

  • 🧠 Redis Streams — используется как канал для связи между FastAPI и Celery, обеспечивая надёжную очередь событий.

  • 🌐 SSE (Server-Sent Events) — клиент подписывается на поток уведомлений через FastAPI StreamingResponse.

  • 🔁 Уведомления отображаются без перезагрузки страницы, полностью в реальном времени.

Такой подход обеспечивает масштабируемость и отказоустойчивость, а также разделяет логику работы с событиями между сервисами.

💬 Чаты

При обмене сообщениями с другим пользователем создаётся чат, где можно обмениваться как текстовыми сообщениями, так и медиафайлами в реальном времени.

⚙️ Особенности чатов:

  • 💬 Возможность отправки текстовых сообщений и медиафайлов (изображений, видео, GIF).

  • 🖌️ Настройка — пользователи могут изменять цвет и размер чата для персонализации.

  • 🔵 Статус онлайн — отображается, кто из пользователей в данный момент онлайн на сайте или в чате.

  • 🗣️ Прочитанные сообщения — чаты отображают статус сообщений, показывая, были ли они прочитаны другой стороной, что помогает отслеживать активность в переписке.

Эта система позволяет пользователям обмениваться сообщениями, не переживая о задержках, и видеть, когда собеседник прочитал их сообщение.

💬🔔 Обновления чатов в реальном времени

На любой странице приложения пользователи получают обновления чатов в реальном времени о новых сообщениях от других пользователей. Это позволяет не пропустить важные уведомления, не переключаясь на страницу чата.

⚙️ Особенности обновлений чатов:

  • 📩 Мгновенные уведомления — при получении нового сообщения, пользователи сразу же получают уведомление, которое отображается в интерфейсе.

  • 🔄 Обновление без перезагрузки страницы — чаты и сообщения обновляются в реальном времени без необходимости вручную обновлять страницу.

  • 🔔 Оповещения о новых сообщениях — пользователи получают пуш-уведомления, когда им отправляют сообщение в чате.

Таким образом, вся система чатов и уведомлений настроена так, чтобы вы всегда были в курсе новых событий, не отвлекаясь от работы с приложением.

Архитектура приложения

⚠️ Единственная загвоздка

Так как фронтенда оказалось очень много, и я работал один, самой сложной частью оказался responsive design. Пока клон адаптирован исключительно под разрешение 1536 × 864. В будущем, конечно, планирую расширить поддержку под все устройства — с удовольствием приму помощь, если у кого-то есть опыт в этой части.

🌟 Открытый исходный код

Проект Pinterest Clone является открытым исходным кодом, и я с радостью делюсь им с вами! Если вам понравился проект или вы хотите внести улучшения, вы можете помочь развивать его. Все изменения приветствуются, и я буду рад любому вкладу в развитие!

👉 GitHub репозиторий: Перейти на GitHub и поставить звездочку ⭐ — если проект вам понравился, не забудьте поставить ⭐, чтобы поддержать меня!

🔗 Live Preview: Посмотреть проект вживую — не пропустите возможность попробовать все фичи прямо в браузере с быстрым login как тестовый пользователь или создайте свой личный профиль.

💬 Заключение

Этот проект стал ценным опытом для меня, как для разработчика. Работая над ним, я значительно улучшил свои навыки как в фронтенде, так и в бэкенде. Я освоил интеграцию реальных обновлений через WebSockets, улучшил взаимодействие с Vue 3 и FastAPI, а также научился эффективно работать с фоновыми задачами и кешированием.

Я буду рад услышать ваши замечания, идеи и предложения! Ваши отзывы очень важны для улучшения проекта и его развития. Всегда открыт для конструктивной критики и предложений!

💡 Если у вас есть идеи или пожелания, не стесняйтесь оставлять их в Issues на GitHub или пишите мне напрямую! Ваш вклад и поддержка значат для меня очень много.

🙌 Благодарю за внимание и участие!

Теги:
Хабы:
+20
Комментарии16

Публикации

Работа

Data Scientist
46 вакансий

Ближайшие события