Skip to content

Turalchik/watcherry

Repository files navigation

WATCHERRY

ER-диаграмма Watcherry Database

watcherry

Развёртывание проекта Watcherry

Для развертывания нашего проекта необходимо использовать Docker.

Требования

  1. Для развёртывания проекта проверьте наличие этих приложений:
Docker
Docker Compose
Git

Минимальные системные требования:

CPU: 2 ядра
RAM: 4 ГБ
Место на диске: ~ 5 ГБ
  1. Шаги для развертывания

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

git clone https://github.com/your-username/watcherry.git

Скачайте IMDb Non-Commercial Datasets: https://developer.imdb.com/non-commercial-datasets/#imdb-non-commercial-datasets или же здесь в папке data https://drive.google.com/drive/folders/1-PBGeo6tkWFmXJOI1wop6DKBBUpuhVwH?usp=sharing

Перейдите в папку с проектом:

cd watcherry

Создайте в корневой папке проекта папку data:

mkdir data

Переместите файлы с базой данных туда.

Соберите и запустите контейнеры:

docker-compose up --build

или

docker compose build
docker compose up

Команда выполнит:

  • Сборку образов.
  • Применение миграций базы данных.

Проверьте доступность проекта: Перейдите в браузере по адресу:

http://localhost:8000 #для бекенда
http://localhost:5137 #для фронтенда
  1. Описание структуры данных База данных создаётся автоматически с помощью миграций Django.

Файлы .tsv в папке data/ загружаются через скрипт, расположенный в movies/management/commnds/import_movies.py

ТЗ, оформленное в XML, корректное относительно DTD

https://drive.google.com/drive/folders/1-PBGeo6tkWFmXJOI1wop6DKBBUpuhVwH?usp=sharing

Описание проекта

Проект создан в рамках дисциплин “Технологии Интернет и WEB-программирования” и “Введение в системы баз данных” студентами Девришевым Туралом, Ладнюк Кирой и Гареевым Эльдаром.

WATCHERRY – это онлайн-платформа для любителей кино. Сервис предоставляет пространство для просмотра информации о фильмах, а также для активного взаимодействия пользователей через оценки, комментарии и обсуждения.

Основные функции

  1. База данных фильмов: Подробные карточки фильмов с информацией о жанре, годе выпуска, продолжительности, актерах и режиссерах.
  2. Оценки и рецензии пользователей: Возможность ставить оценки и оставлять текстовые отзывы.
  3. Комментарии и обсуждения: Комьюнити, где пользователи могут участвовать в обсуждениях.
  4. Персонализированные рекомендации: Предложения фильмов на основе предпочтений пользователя.
  5. Списки (опционально): Возможность создавать свои списки фильмов.

Основные пути пользователя

  • Поиск фильма: Пользователь ищет фильм, просматривает его карточку и может добавить его в избранное или перейти к обсуждению.
  • Регистрация: Пользователь регистрируется и получает доступ к основным функциям платформы.
  • Оценка и рецензия: Пользователь находит фильм, ставит оценку и оставляет отзыв, который доступен другим пользователям.
  • Создание списков фильмов (опционально): Пользователь создает списки фильмов, на основе которых формируются рекомендации.

Архитектура

Клиентская часть (Frontend)

  • Технологии: Vue.js
  • Основные компоненты:
    • Главная страница: Список популярных фильмов, новинок и персонализированных рекомендаций.
    • Страница фильма: Информация о фильме, рейтинги, отзывы.
    • Профиль пользователя: Личные списки фильмов, избранное.
    • Система комментариев и обсуждений: Возможность оставлять отзывы и участвовать в обсуждениях.

Серверная часть (Backend)

  • Технологии: Python (Django)
  • Модули:
    • API для взаимодействия с клиентом: Работа с данными пользователей, фильмов, комментариев, аутентификация.
    • Модуль рейтингов и отзывов: Хранение и отображение оценок и отзывов пользователей.
    • ORM Django: Для работы с данными о фильмах, пользователях, отзывах и комментариях.

Роли пользователей

  • Пользователь: Просмотр информации, оставление оценок и отзывов, создание списков фильмов.
  • Администратор: Управление системой и пользователями, настройка прав доступа.
  • Гость: Просмотр публичного контента.

UI и API

API

  1. Получение списка популярных и новых фильмов
  • Endpoint: GET /api/movies/

  • Класс: MovieListAPIView

  • Описание: Возвращает список популярных фильмов (по голосам) и новых фильмов (по году выпуска).

  • Ответ:

{
    "popular_movies": [ ... ],
    "new_movies": [ ... ]
}
  1. Получение детальной информации о фильме
  • Endpoint: GET /api/movies/<title_id>/

  • Класс: MovieDetailAPIView

  • Authentication: JWT (опционально: для проверки наличия рецензии пользователя).

  • Описание: Возвращает информацию о фильме, список рецензий и статус пользователя (например, оставлял ли он рецензию и лайкал ли фильм).

  • Ответ:

{
    "movie": { ... },
    "reviews": [ ... ],
    "isAuthenticated": true,
    "userHasReviewed": false,
    "liked": true
}
  1. Поиск фильмов
  • Endpoint: GET /api/movies/search/?q=

  • Класс: SearchMoviesAPIView

  • Описание: Выполняет поиск фильмов по названию, используя строку запроса q.

  • Ответ:

[
    { "id": 1, "title": "Movie Title", "release_year": 2024 },
    ...
]
  • Ошибка при пустом запросе:
{ "detail": "Введите запрос для поиска." }
  1. Получение и создание рецензий на фильм
  • Endpoint:

    • GET /api/movies/<title_id>/reviews/
    • POST /api/movies/<title_id>/reviews/
  • Класс: ReviewListCreateAPIView

  • Authentication: JWT (обязательно для POST).

  • Описание:

    • GET: Возвращает список рецензий на фильм.
    • POST: Создаёт новую рецензию пользователя на фильм.
  • POST-запрос:

{
    "text": "Отличный фильм!",
    "rating": 10
}
  • Ответ на успешный POST:
{
    "id": 1,
    "text": "Отличный фильм!",
    "rating": 5,
    "user": 1,
    "movie": 1
}
  1. Получение и создание комментариев к рецензии
  • Endpoint:

    • GET /api/reviews/<review_id>/comments/
    • POST /api/reviews/<review_id>/comments/
  • Класс: CommentListCreateAPIView

  • Authentication: JWT (обязательно для POST).

  • Описание:

    • GET: Возвращает список комментариев к указанной рецензии.
    • POST: Создаёт новый комментарий к рецензии.
  • POST-запрос:

{
    "text": "Ну... ТАКОЙ СЕБЕ отзыв.... ",
}
  • Ответ на успешный POST:
{
    "id": 1,
    "text": "Ну... ТАКОЙ СЕБЕ отзыв.... ",
    "user": 1,
    "movie": 1
}
  1. Вход в систему
  • Endpoint: POST /api/login/

  • Класс: LoginView

  • Описание: Переопределяет поведение стандартного TokenObtainPairView Django Rest Framework для возвращения токена в виде response.token.

  • Ответ:

{
    "token": "jwt_token_here"
}
  1. Регистрация пользователя
  • Endpoint: POST /api/register/

  • Класс: RegisterAPIView

  • Описание: Создание нового пользователя и его профиля.

  • Ответ на успешный запрос:

{
    "message": "Регистрация прошла успешно!",
    "username": "new_user_name"
}
  1. Профиль пользователя
  • Endpoint: GET /api/profile/

  • Класс: ProfileAPIView

  • Описание: Получение и отображение информации о профиле пользователя, фильмов и рекомендаций.

  • Ответ

{
    "profile": { ... },
    "movies_with_reviews": [ ... ],
    "liked_movies": [ ... ],
    "recommendations": [ ... ]
}

  1. Рекомендации фильмов
  • Endpoint: GET /api/recommendations/

  • Класс: RecommendationsAPIView

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

  • Ответ:

[
    { "id": 1, "title": "Movie Title", "release_year": 2024 },
    ...
]
  • Статусы ответа:

    • 200 OK - успешный запрос
    • 201 Created - успешно создан новый объект
    • 400 Bad Request – ошибка ввода данных
    • 404 Not Found – объект не найден

UI

  1. Login.vue – Страница входа
  • Описание:
    • Компонент отвечает за авторизацию пользователя.
  • Основные функции и поведение:
    • login() – метод отправляет данные (логин и пароль) на сервер для авторизации. При успешном входе сохраняет токен в localStorage и перенаправляет пользователя на главную страницу.
    • v-model – связывает поля ввода с данными username и password.
  • Ошибка:
    • Показывает сообщение "Неверный логин или пароль" при неудачной авторизации.
  1. Register.vue – Страница регистрации
  • Описание:

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

    • register() – проверяет, совпадают ли пароли, отправляет данные на сервер и обрабатывает ответ. При успехе выводит сообщение об успешной регистрации. При ошибке выводит сообщение об ошибке.
    • resetForm() – сбрасывает поля формы после успешной регистрации.
    • v-model – связывает поля формы с данными (username, email, password, passwordConfirm).
  1. Profile.vue – Личный кабинет
  • Описание:

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

    • mounted() – з агружает профиль пользователя: информацию о пользователе (аватар, никнейм), фильмы, которые пользователь комментировал,понравившиеся фильмы и рекомендации.
    • logout() – удаляет токен из localStorage, обновляет глобальное состояние авторизации и перенаправляет на главную страницу.
    • Динамический рендеринг: v-if используется для отображения блоков фильмов и рекомендаций только при наличии данных.
  1. Homepage.vue – Главная страница
  • Описание:

    • Компонент показывает популярные и новые фильмы на главной странице.
  • Основные функции и поведение:

    • created() – загружает данные о популярных и новых фильмах с сервера.
    • isLoading – флаг состояния загрузки.
    • error – сообщение об ошибке при неудачной загрузке.
    • Динамическое отображение: списки фильмов рендерятся через v-for. Используются ссылки для перехода на страницы конкретных фильмов через router-link.
    • Импорт Navbar: Компонент Navbar добавляется для отображения панели навигации.
  1. SearchResults.vue - Результат поиска по странице
  • Описание:

    • Компонент отображает результаты поиска фильмов в зависимости от введенного запроса. Если фильмы не найдены, отображается сообщение о том, что фильмов не найдено.
  • Основные функции и поведение:

    • query — строка запроса, по которой будет выполняться поиск фильмов.
    • data() определен список movies, в который будут загружены результаты запроса.
    • fetchMovies(searchQuery) делает запрос к API для поиска фильмов, если searchQuery не пустой.
    • При изменении значения query (используется watch), компонент вызывает fetchMovies() для обновления списка фильмов.
    • В mounted() вызов fetchMovies() выполняется при загрузке компонента, если query существует.
    • В шаблоне отображаются результаты в виде миниатюр, а также сообщения об отсутствии фильмов или необходимости ввести запрос.
  1. MovieDetailPage.vue - Страница фильма
  • Описание:

    • Компонент отображает подробную информацию о фильме, а также позволяет добавлять фильм в список понравившихся, добавлять отзывы и комментарии к ним.
  • Основные функции и поведение:

    • Компонент получает movieId из маршрута и делает запрос для получения информации о фильме.
    • В data() хранится информация о фильме (movie), отзывы (reviews), а также формы для добавления нового отзыва и комментария.
    • В created() метод fetchMovieDetails запрашивает данные о фильме и отзывы.
    • Метод addReview() добавляет новый отзыв, проверяя валидность текста отзыва и рейтинг.
    • Метод addComment(reviewId) добавляет комментарий к отзыву, проверяя валидность текста комментария.
    • В шаблоне отображаются подробности фильма, включая постер, жанры, рейтинг и продолжительность.
    • В секциях отображаются актеры, режиссеры, продюсеры и отзывы к фильму с возможностью добавления новых комментариев.
    • Компонент автоматически обновляет данные после успешного добавления отзыва или комментария.

Технологии

  • Язык программирования: Python (Django), Vue.js
  • База данных: Используется ORM Django для работы с данными.
  • Тестирование: Ручное, Pytest

Бизнес-логика

Рекомендательная система (если успеем): Персонализированные рекомендации на основе понравившихся фильмов пользователя.

CI-диаграмма Watcherr

Alt text