|
|
|
|
@ -1,36 +1,132 @@
|
|
|
|
|
Напиши unittest-ы
|
|
|
|
|
|
|
|
|
|
в случае фошибки вернуть JsonResponse({"error": format(error)}, status=500)
|
|
|
|
|
|
|
|
|
|
1 -http://localhost:8090/shop/
|
|
|
|
|
Запрос GET возвращает ответ JsonResponse c формата JsonResponse({"OK": products}, status=200)
|
|
|
|
|
пример products:
|
|
|
|
|
[{'id': 2, 'name': 'Серебрянный паровоз', 'count': 23, 'reserved': 0, 'picture_url': 'https://git.softwarrior.ru/stepik104/game_shop/raw/branch/main/images/silver_train.png ', 'description': 'Серебро - благородный метал, такой паровоз не стыдно выкатить на рельсы', 'type': 'skin', 'cost': Decimal('50.00')}, {'id': 4, 'name': 'Золотая башня', 'count': 10, 'reserved': 0, 'picture_url': 'https://git.softwarrior.ru/stepik104/game_shop/raw/branch/main/images/golden_tower.png ', 'description': 'Целая башня из чистого золота, кто-то скажет - непрактично, но мы ответим - да', 'type': 'skin', 'cost': Decimal('100.00')}, {'id': 6, 'name': 'Бронзовая башня', 'count': 100, 'reserved': 0, 'picture_url': 'https://git.softwarrior.ru/stepik104/game_shop/raw/branch/main/images/bronze_tower.png ', 'description': 'Бронзовая башня - великая классика, как оловянный солдатик', 'type': 'skin', 'cost': Decimal('10.00')}, {'id': 7, 'name': 'Капибара', 'count': 30, 'reserved': 0, 'picture_url': 'https://git.softwarrior.ru/stepik104/game_shop/raw/branch/main/images/capi_avatar.png ', 'description': 'Почему нет', 'type': 'avatar', 'cost': Decimal('25.00')}, {'id': 9, 'name': 'Штурмовик', 'count': 30, 'reserved': 0, 'picture_url': 'https://git.softwarrior.ru/stepik104/game_shop/raw/branch/main/images/starwars_avatar.png ', 'description': 'Не всегда попадает в цель, зато всегда лоялен императору', 'type': 'avatar', 'cost': Decimal('25.00')}, {'id': 3, 'name': 'Бронзовый паровоз', 'count': 98, 'reserved': 2, 'picture_url': 'https://git.softwarrior.ru/stepik104/game_shop/raw/branch/main/images/bronze_train.png ', 'description': 'Развитие цивилизации начиналось с бронзы, этот паровоз символизирует начало прогресса', 'type': 'skin', 'cost': Decimal('10.00')}, {'id': 8, 'name': 'Капитан-черепаха', 'count': 30, 'reserved': 1, 'picture_url': 'https://git.softwarrior.ru/stepik104/game_shop/raw/branch/main/images/tortule_avatar.png ', 'description': 'Настоящий пират никуда не торопиться', 'type': 'avatar', 'cost': Decimal('25.00')}, {'id': 5, 'name': 'Серебрянная башня', 'count': 18, 'reserved': 2, 'picture_url': 'https://git.softwarrior.ru/stepik104/game_shop/raw/branch/main/images/silver_tower.png ', 'description': 'Серебряная башня, такая серая и холодная, так бы и заточил туда принцессу', 'type': 'skin', 'cost': Decimal('50.00')}, {'id': 1, 'name': 'Золотой паровоз', 'count': 9, 'reserved': 0, 'picture_url': 'https://git.softwarrior.ru/stepik104/game_shop/raw/branch/main/images/golden_train.png ', 'description': 'Золотой, блестящий, ну разве не чудо', 'type': 'skin', 'cost': Decimal('100.00')}, {'id': 28, 'name': 'Тестовый товар 1', 'count': 8, 'reserved': 0, 'picture_url': '', 'description': 'Описание 1', 'type': 'test', 'cost': Decimal('50.00')}, {'id': 29, 'name': 'Тестовый товар 2', 'count': 4, 'reserved': 0, 'picture_url': '', 'description': 'Описание 2', 'type': 'test', 'cost': Decimal('30.00')}]
|
|
|
|
|
|
|
|
|
|
Проверить что не пустой
|
|
|
|
|
|
|
|
|
|
2 - http://localhost:8090/login/
|
|
|
|
|
Запрос POST с body
|
|
|
|
|
login: str
|
|
|
|
|
password: str
|
|
|
|
|
email: str
|
|
|
|
|
возвращает JsonResponse({"OK": token}, status=200)
|
|
|
|
|
пример token
|
|
|
|
|
token формата: uuid.uuid4(), пример: 44decdbc-7120-4838-abf8-7528a11467a9
|
|
|
|
|
|
|
|
|
|
3 - http://localhost:8090/logout/
|
|
|
|
|
Запрос POST с header:
|
|
|
|
|
Token: str пример: 44decdbc-7120-4838-abf8-7528a11467a9
|
|
|
|
|
возвращает JsonResponse({"OK": token}, status=200)
|
|
|
|
|
|
|
|
|
|
4 - http://localhost:8090/basket/
|
|
|
|
|
Запрос POST с header:
|
|
|
|
|
Token: str пример: 44decdbc-7120-4838-abf8-7528a11467a9
|
|
|
|
|
возвращает JsonResponse({"OK": basket}, status=200)
|
|
|
|
|
ошибка если токен невалидный, напиши тест на невалидный токен
|
|
|
|
|
|
|
|
|
|
5 - http://localhost:8090/history/
|
|
|
|
|
Запрос POST с header:
|
|
|
|
|
Token: str пример: 44decdbc-7120-4838-abf8-7528a11467a9
|
|
|
|
|
возвращает JsonResponse({"OK": histories}, status=200)
|
|
|
|
|
ошибка если токен невалидный, напиши тест на невалидный токен
|
|
|
|
|
# Курсовая работа: Интернет-магазин для игры
|
|
|
|
|
|
|
|
|
|
**Автор:** Пилипенко Степан Андреевич
|
|
|
|
|
**Год выполнения:** 2025
|
|
|
|
|
**Направление:** Разработка веб-приложения
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 📌 Описание проекта
|
|
|
|
|
|
|
|
|
|
В рамках курсовой работы разработан **интернет-магазин внутриигровых товаров** — полнофункциональное веб-приложение, позволяющее пользователям:
|
|
|
|
|
|
|
|
|
|
- Просматривать каталог игровых предметов,
|
|
|
|
|
- Добавлять товары в корзину и оформлять покупки,
|
|
|
|
|
- Просматривать историю своих заказов,
|
|
|
|
|
- Регистрироваться, авторизовываться и управлять профилем.
|
|
|
|
|
|
|
|
|
|
Проект реализован с использованием современных технологий фронтенда и бэкенда и соответствует принципам разделения ответственности, безопасности и удобства использования.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 🖥️ Фронтенд
|
|
|
|
|
|
|
|
|
|
- **Язык:** TypeScript
|
|
|
|
|
- **Сборка:** Vite
|
|
|
|
|
- **Фреймворк:** React
|
|
|
|
|
- **Управление состоянием:** Redux Toolkit
|
|
|
|
|
- **Формы:** React Hook Form
|
|
|
|
|
- **UI компонент:** Material UI
|
|
|
|
|
- **Маршрутизация:** React Router
|
|
|
|
|
|
|
|
|
|
### Основные функции фронтенда:
|
|
|
|
|
- Динамическая загрузка списка товаров,
|
|
|
|
|
- Валидация форм регистрации и входа,
|
|
|
|
|
- Отображение корзины и управление её содержимым,
|
|
|
|
|
- Защита маршрутов (только для авторизованных пользователей),
|
|
|
|
|
- Отображение личного кабинета и истории покупок.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## ⚙️ Бэкенд
|
|
|
|
|
|
|
|
|
|
- **Язык:** Python
|
|
|
|
|
- **Фреймворк:** Django
|
|
|
|
|
- **База данных:** PostgreSQL
|
|
|
|
|
- **Аутентификация:** Токены
|
|
|
|
|
- **API:** RESTful (через Django REST Framework или нативные view)
|
|
|
|
|
|
|
|
|
|
### Реализованные модели:
|
|
|
|
|
- `User` — пользователь,
|
|
|
|
|
- `Shop` — игровой товар (название, описание, цена, изображение),
|
|
|
|
|
- `Order` — заказ (связь с пользователем, дата, статус),
|
|
|
|
|
- `OrderItem` — позиция в заказе (товар + количество).
|
|
|
|
|
|
|
|
|
|
### Основные эндпоинты:
|
|
|
|
|
- `/api/auth/register/` — регистрация,
|
|
|
|
|
- `/api/auth/login/` — вход,
|
|
|
|
|
- `/api/products/` — список товаров,
|
|
|
|
|
- `/api/cart/` — управление корзиной,
|
|
|
|
|
- `/api/orders/` — история покупок.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 🔐 Безопасность
|
|
|
|
|
|
|
|
|
|
- Пароли хранятся в хэшированном виде (bcrypt через Django),
|
|
|
|
|
- Сессии управляются безопасно,
|
|
|
|
|
- Защита от CSRF и XSS (встроенные механизмы Django и React).
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 📁 Структура проекта
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
game-shop/
|
|
|
|
|
├── backend/ # Django-приложение
|
|
|
|
|
│ ├── ... # основное приложение
|
|
|
|
|
│ ├── manage.py
|
|
|
|
|
│ └── requirements.txt
|
|
|
|
|
├── frontend/ # React + Vite
|
|
|
|
|
│ ├── src/
|
|
|
|
|
│ │ ├── components/
|
|
|
|
|
│ │ ├── pages/
|
|
|
|
|
│ │ ├── storage/ # Redux slices
|
|
|
|
|
│ │ └── App.tsx
|
|
|
|
|
│ └── vite.config.ts
|
|
|
|
|
└── README.md
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## ▶️ Запуск проекта
|
|
|
|
|
|
|
|
|
|
1. **Бэкенд**:
|
|
|
|
|
```bash
|
|
|
|
|
cd backend
|
|
|
|
|
python -m venv venv
|
|
|
|
|
source venv/bin/activate # Linux/Mac
|
|
|
|
|
venv\Scripts\activate # Windows
|
|
|
|
|
pip install -r requirements.txt
|
|
|
|
|
python manage.py migrate
|
|
|
|
|
python manage.py runserver
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
2. **Фронтенд**:
|
|
|
|
|
```bash
|
|
|
|
|
cd frontend
|
|
|
|
|
npm install
|
|
|
|
|
npm run dev
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Приложение будет доступно по адресу: `https://shop.softwarrior.ru`
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 💡 Заключение
|
|
|
|
|
|
|
|
|
|
Данная курсовая работа демонстрирует навыки:
|
|
|
|
|
- проектирования full-stack веб-приложений,
|
|
|
|
|
- работы с базами данных,
|
|
|
|
|
- реализации аутентификации и управления состоянием,
|
|
|
|
|
- интеграции фронтенда и бэкенда через API.
|
|
|
|
|
|
|
|
|
|
Проект может быть расширен за счёт добавления:
|
|
|
|
|
- платёжных систем (Stripe, PayPal),
|
|
|
|
|
- поиска и фильтрации товаров,
|
|
|
|
|
- админ-панели,
|
|
|
|
|
- уведомлений и email-рассылок.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
> **Примечание:** Исходный код доступен по запросу.
|