Скриншот архива с проектом
Структура проекта
Задание
Разработать веб-сервис для магазина оптики используя современный стек технологий - 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
-