TasteBook — это веб-приложение для публикации и обмена рецептами. Пользователи могут публиковать свои рецепты, добавлять чужие рецепты в избранное и подписываться на публикации других авторов. Зарегистрированным пользователям также будет доступен сервис «Список покупок». Он позволит создавать список продуктов, которые нужно купить для приготовления выбранных блюд.
-
Главная страница:
- Отображаются первые шесть рецептов, отсортированных по дате (от новых к старым).
- Реализована постраничная пагинация для дальнейших рецептов.
-
Страница регистрации:
- Необходимые поля: имя, фамилия, никнейм, электронная почта и пароль.
-
Страница входа:
- Доступна после успешной регистрации для входа в систему.
-
Статические страницы:
- «О проекте» и «Технологии».
-
Страница рецепта:
- Полное описание рецепта.
- Возможность добавить рецепт в избранное, в список покупок и подписаться на автора.
- Короткая ссылка на рецепт для быстрого обмена.
-
Страница пользователя:
- Имя пользователя и все его рецепты.
- Кнопка для подписки или отписки от этого пользователя.
-
Страница подписок:
- Пользователь может подписываться на рецепты других авторов.
- Доступна только для владельца аккаунта, отображает список подписанных пользователей и их рецепты.
-
Избранное:
- Добавление рецептов в избранное.
- Список избранных рецептов доступен только владельцу аккаунта.
-
Список покупок:
- Создание списка продуктов для рецептов.
- Возможность скачать список покупок в формате
.csv
.
-
Создание и редактирование рецепта:
- Доступно только для авторизованных пользователей.
- Все поля обязательны для заполнения.
-
Страница смены пароля:
- Изменение пароля доступно только для авторизованных пользователей.
-
Фильтрация по тегам:
- Рецепты можно фильтровать по тегам.
- Фильтрация осуществляется по комбинации нескольких тегов.
-
Смена аватара:
- После регистрации пользователю предоставляется изображение профиля по умолчанию, которое можно заменить или удалить.
- Клонируйте репозиторий:
git clone https://github.com/ShiroyashaSG/tastebook.git
- Перейдите в директорию проекта:
cd tastebook
- Cоздайте и активируйте виртуальное окружение:
py -3.9 -m venv venv source venv\Scripts\activate # Для Linux: venv/bin/activate
- Установите зависимости из файла requirements.txt:
python -m pip install --upgrade pip pip install -r requirements.txt
- Создайте миграции:
python manage.py makemigrations
- Примените миграции:
python manage.py migrate
- Загрузите данные из csv - файлов в базу данных:
python manage.py import_data
- Запустите сервер:
python manage.py runserver
- Установить docker на сервер (Linux):
sudo apt update sudo apt install curl curl -fSL https://get.docker.com -o get-docker.sh sudo sh ./get-docker.sh
- Установить докер docker-compose:
sudo apt install docker-compose-plugin sudo systemctl status docker
- Установить nginx:
sudo apt install nginx -y sudo systemctl start nginx
- Настроить nginx:
sudo nano /etc/nginx/sites-enabled/default sudo nginx -t sudo systemctl reload nginx
- Создать директорию проекта и добавить .env:
Пример .env:
mkdir tastebook && cd tastebook/ nano .env
SECRET_KEY=<Your_django_secret_key> DEBUG=<debug> ALLOWED_HOSTS=<Your_host> POSTGRES_DB=<db_name> POSTGRES_USER=<db_user> POSTGRES_PASSWORD=<db_pass> DB_NAME=<db_name> DB_HOST=<db_host> DB_PORT=5432
- Скопировать в директорию проекта папки data, docs и docker-compose.yml файл:
scp -r data/* docs/* docker-compose.yml <server user>@<server IP>:/home/<server user>/tastebook/
- Выполнить сборку статики:
sudo docker compose -f docker-compose.yml pull sudo docker compose -f docker-compose.yml down sudo docker compose -f docker-compose.yml up -d sudo docker compose -f docker-compose.yml exec backend python manage.py migrate sudo docker compose -f docker-compose.yml exec backend python manage.py collectstatic sudo docker compose -f docker-compose.yml exec backend cp -r /app/collected_static/. /backend_static/static/
- Создать суперпользователя:
sudo docker compose -f docker-compose.yml exec backend python manage.py createsuperuser
- Импортировать ингредиенты:
sudo docker compose -f docker-compose.yml exec backend python manage.py import_data
POST запрос на /api/users/
Тело запроса:
{
"email": "[email protected]",
"username": "vasya.pupkin",
"first_name": "Вася",
"last_name": "Иванов",
"password": "Qwerty123"
}
Ответ:
{
"email": "[email protected]",
"id": 0,
"username": "vasya.pupkin",
"first_name": "Вася",
"last_name": "Иванов"
}
GET запрос на /api/recipes/
Ответ:
{
"count": 123,
"next": "http://tastebook.example.org/api/recipes/?page=4",
"previous": "http://tastebook.example.org/api/recipes/?page=2",
"results": [
{
"id": 0,
"tags": [
{
"id": 0,
"name": "Завтрак",
"slug": "breakfast"
}
],
"author": {
"email": "[email protected]",
"id": 0,
"username": "string",
"first_name": "Вася",
"last_name": "Иванов",
"is_subscribed": false,
"avatar": "http://tastebook.example.org/media/users/image.png"
},
"ingredients": [
{
"id": 0,
"name": "Картофель отварной",
"measurement_unit": "г",
"amount": 1
}
],
"is_favorited": true,
"is_in_shopping_cart": true,
"name": "string",
"image": "http://tastebook.example.org/media/recipes/images/image.png",
"text": "string",
"cooking_time": 1
}
]
}
POST запрос на /api/recipes/
Тело запроса:
{
"ingredients": [
{
"id": 1123,
"amount": 10
}
],
"tags": [
1,
2
],
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAgMAAABieywaAAAACVBMVEUAAAD///9fX1/S0ecCAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAACklEQVQImWNoAAAAggCByxOyYQAAAABJRU5ErkJggg==",
"name": "string",
"text": "string",
"cooking_time": 1
}
Ответ:
{
"id": 0,
"tags": [
{
"id": 0,
"name": "Завтрак",
"slug": "breakfast"
}
],
"author": {
"email": "[email protected]",
"id": 0,
"username": "string",
"first_name": "Вася",
"last_name": "Иванов",
"is_subscribed": false,
"avatar": "http://tastebook.example.org/media/users/image.png"
},
"ingredients": [
{
"id": 0,
"name": "Картофель отварной",
"measurement_unit": "г",
"amount": 1
}
],
"is_favorited": true,
"is_in_shopping_cart": true,
"name": "string",
"image": "http://tastebook.example.org/media/recipes/images/image.png",
"text": "string",
"cooking_time": 1
}
GET запрос на /api/recipes/{id}/
Ответ:
{
"id": 0,
"tags": [
{
"id": 0,
"name": "Завтрак",
"slug": "breakfast"
}
],
"author": {
"email": "[email protected]",
"id": 0,
"username": "string",
"first_name": "Вася",
"last_name": "Иванов",
"is_subscribed": false,
"avatar": "http://tastebook.example.org/media/users/image.png"
},
"ingredients": [
{
"id": 0,
"name": "Картофель отварной",
"measurement_unit": "г",
"amount": 1
}
],
"is_favorited": true,
"is_in_shopping_cart": true,
"name": "string",
"image": "http://tastebook.example.org/media/recipes/images/image.png",
"text": "string",
"cooking_time": 1
}
PATCH запрос на /api/recipes/{id}/
Тело запроса:
{
"ingredients": [
{
"id": 1123,
"amount": 10
}
],
"tags": [
1,
2
],
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAgMAAABieywaAAAACVBMVEUAAAD///9fX1/S0ecCAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAACklEQVQImWNoAAAAggCByxOyYQAAAABJRU5ErkJggg==",
"name": "string",
"text": "string",
"cooking_time": 1
}
Ответ:
{
"id": 0,
"tags": [
{
"id": 0,
"name": "Завтрак",
"slug": "breakfast"
}
],
"author": {
"email": "[email protected]",
"id": 0,
"username": "string",
"first_name": "Вася",
"last_name": "Иванов",
"is_subscribed": false,
"avatar": "http://tastebook.example.org/media/users/image.png"
},
"ingredients": [
{
"id": 0,
"name": "Картофель отварной",
"measurement_unit": "г",
"amount": 1
}
],
"is_favorited": true,
"is_in_shopping_cart": true,
"name": "string",
"image": "http://tastebook.example.org/media/recipes/images/image.png",
"text": "string",
"cooking_time": 1
}
GET запрос на /api/recipes/{id}/get-link/
Ответ:
{
"short-link": "https://tastebook.example.org/s/3d0"
}
POST запрос на /api/users/{id}/subscribe/
Ответ:
{
"email": "[email protected]",
"id": 0,
"username": "string",
"first_name": "Вася",
"last_name": "Иванов",
"is_subscribed": true,
"recipes": [
{
"id": 0,
"name": "string",
"image": "http://tastebook.example.org/media/recipes/images/image.png",
"cooking_time": 1
}
],
"recipes_count": 0,
"avatar": "http://tastebook.example.org/media/users/image.png"
}
Проект построен с использованием следующих технологий:
- Python 3.9.0
- Django
- Django REST Framework
- PostgreSQL
- React
- Docker
- CI/CD (GitHub Actions)
Проект лицензирован под лицензией MIT
.