Скриншот архива с проектом
Структура проекта
Задание
Разработать веб-приложение на Django, которое будет учитывать пробег автомобилей и предоставлять статистику о пройденном расстоянии: веб-приложение должно позволять пользователям записывать и отслеживать пробег автомобилей, вводить данные о начальном и конечном пробеге, а также дату и время поездки. Затем оно должно рассчитывать пройденное расстояние и предоставлять статистику о пробеге для каждого автомобиля
Функционал программы
- Учёт автомобилей
- учёт пробега автомобилей
- построение графиков статистики как для каждого автомобиля в отдельности, так и общего графика
Содержание отчета к программе
Фрагмент программного кода (бэкенд - модели)
from django.db import models from django.contrib.auth.models import User from django.core.exceptions import ValidationError # Create your models here. class Car(models.Model): """Модель автомобиля""" objects = models.Manager() brand = models.CharField(max_length=100) # Марка (Toyota, BMW и т. д.) model = models.CharField(max_length=100) # Модель (Camry, X5 и т. д.) year = models.IntegerField(blank=True, null=True) # Год выпуска class Meta: verbose_name = 'Автомобиль' verbose_name_plural = 'Автомобили' def __str__(self): return f"{self.brand} {self.model} ({self.year})" class Trip(models.Model): """Модель записи пробега""" objects = models.Manager() car = models.ForeignKey(Car, on_delete=models.CASCADE, related_name="trips") date = models.DateField() start_mileage = models.PositiveIntegerField() # Начальный пробег end_mileage = models.PositiveIntegerField() # Конечный пробег class Meta: verbose_name = 'Запись' verbose_name_plural = 'Записи' def save(self, *args, **kwargs): if self.end_mileage < self.start_mileage: raise ValidationError("Конечный пробег должен быть больше начального.") super().save(*args, **kwargs) def distance(self): """Вычисление расстояния поездки""" return int(self.end_mileage) - int(self.start_mileage) def __str__(self): return f"{self.car.brand}: {self.date} - {self.distance()} км"
Фрагмент программного кода (фронтенд - компонент Cars)
<script setup> import { ref, onMounted } from 'vue'; import axios from 'axios'; const cars = ref([]); onMounted(async () => { try { const response = await axios.get('http://localhost:8000/api/cars/'); cars.value = response.data; } catch (error) { console.error('Ошибка при загрузке автомобилей:', error); } }); </script> <template> <div> <h1>Список автомобилей</h1> <div class="mb-3 text-start"> <router-link to="/cars/add" class="btn btn-success mb-3 ">Добавить автомобиль</router-link> <router-link to="/" class="btn btn-secondary mb-3" >← На главную</router-link> </div> <table class="table table-hover table-striped table-bordered text-start align-middle"> <thead class="table-info"> <tr> <th class="text-center">ИД</th> <th class="text-center">Марка</th> <th class="text-center">Модель</th> <th class="text-center">Год</th> <th class="text-center">Детали</th> </tr> </thead> <tbody> <tr v-for="car in cars" :key="car.id"> <td class="text-center">{{ car.id }}</td> <td class="text-center">{{ car.brand }}</td> <td class="text-center">{{ car.model }}</td> <td class="text-center">{{ car.year }}</td> <td class="text-center"> <router-link :to="`/cars/${car.id}`" class="btn btn-primary btn-sm">Подробнее</router-link> | <router-link :to="`/cars/${car.id}/edit`" class="btn btn-warning btn-sm"> Редактировать </router-link> </td> </tr> </tbody> </table> </div> </template> <style scoped> .table { width: 100%; margin-bottom: 1rem; color: #212529; vertical-align: top; border-collapse: collapse; } .table-hover tbody tr:hover { background-color: rgba(0, 0, 0, 0.075); } .table-striped tbody tr:nth-of-type(odd) { background-color: rgba(0, 0, 0, 0.05); } .table-bordered { border: 1px solid #dee2e6; } .table-bordered th, .table-bordered td { border: 1px solid #dee2e6; } .text-start { text-align: left !important; } .align-middle { vertical-align: middle !important; } </style>
Пояснения по запуску программы
Все подробно рассписал в документе 📘 Инструкция по запуску и использованию приложения. в документе приведены основные ключевые моменты с настройкой и работой приложения / с приложением. Кроме того записал две видеоинструкции. В случае возникновения сложностей со мной можно связаться в мессенджере Telegram или написав мне в соцсети Вконтакте (ссылка на ВК есть на канале в Ютуб).
-