Скриншот архива с проектом

Структура проекта


Задание
Разработать веб-сервис для магазина оптики используя современный стек технологий - Python Django - бекэнд и Vue + Vite - фронтенд. Приложение должно позволять вести учёт товаров, клиентов и продаж с построением аналитических графиков.
Функционал программы
- учёт товаров
- учёт клиентов
- учёт продаж
- аналитика по всем товарам и в разрезе каждого товара
Фрагмент программного кода
from django.db import models
from django.db.models.signals import pre_save
from django.dispatch import receiver
from django.core.exceptions import ValidationError
from decimal import Decimal
# Create your models here.
class Product(models.Model):
objects = models.Manager()
name = models.CharField(max_length=100, verbose_name="Товар")
description = models.TextField(verbose_name="Описание товара")
CATEGORY_CHOICES = [
('Очки', 'Очки'),
('Линзы', 'Линзы'),
('Аксессуары', 'Аксессуары'),
('Оправы', 'Оправы'),
]
category = models.CharField(max_length=50, choices=CATEGORY_CHOICES, verbose_name='Категория', null=True, blank=True)
price = models.DecimalField(verbose_name="Цена товара", max_digits=10,
decimal_places=2)
photo = models.ImageField(upload_to='uploads/images',
verbose_name="Фото товара",
null=True, blank=True)
def __str__(self):
return self.name
class Meta:
verbose_name = 'Товар'
verbose_name_plural = 'Товары'
class Client(models.Model):
objects = models.Manager()
name = models.CharField(max_length=100, verbose_name='Имя клиента')
email = models.EmailField(verbose_name='Email')
phone = models.CharField(max_length=15, verbose_name='Телефон')
photo = models.ImageField(upload_to='uploads/images',
help_text="Введите фото",
verbose_name="Фото клиента",
null=True, blank=True)
class Meta:
verbose_name = 'Клиент'
verbose_name_plural = 'Клиенты'
def __str__(self):
return self.name
class Sale(models.Model):
objects = models.Manager()
client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='sales', verbose_name='Клиент')
product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='sales', verbose_name='Товар')
date = models.DateField(verbose_name='Дата продажи')
start_quantity = models.PositiveIntegerField(verbose_name="Начальное количество")
end_quantity = models.PositiveIntegerField(verbose_name="Конечное количество")
price = models.DecimalField(verbose_name="Цена товара", max_digits=10, decimal_places=2)
amount = models.DecimalField(verbose_name="Итоговая сумма", max_digits=10, decimal_places=2, editable=False)
class Meta:
verbose_name = 'Продажа'
verbose_name_plural = 'Продажи'
def save(self, *args, **kwargs):
if self.end_quantity < self.start_quantity:
raise ValidationError("Конечные продажи должны быть больше или равны начальному количеству.")
self.amount = self.get_total_amount()
super().save(*args, **kwargs)
def get_sold_quantity(self):
"""Количество проданных единиц"""
return int(self.end_quantity) - int(self.start_quantity)
def get_total_amount(self):
"""Итоговая сумма: продано * цена"""
return Decimal(self.get_sold_quantity()) * self.price
def __str__(self):
return f"{self.client} - {self.product.name} | {self.date} | Продано: {self.get_sold_quantity()} шт. | На сумму: {self.get_total_amount()} руб."
Пояснения по запуску программы
Запускаем и радуемся! Шучу! 1. Ставим VSCode 2. Ставим Python 3. Ставим Node.js 4. Устанавливаем расширеня для VSCode для работы с Python и Vue.js 5. Запускаем сервер - cd Backend - cd server - python manage.py runserver 6. Запускаем фронтенд - так как Vue у нас с Vite, то запуск идет как npm run dev (cd Frontend- cd optics-frontend). Ну а после кликаем на соответствующие ссылки и радуемся. И не забываем создать суперпользователя - python manage.py createsuperuser
Телеграм
-