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

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


Задание
Разработать веб-приложение на Django для ведения онлайн-журнала успеваемости учеников: веб-приложение должно предоставлять педагогам возможность добавления оценок, отметок о посещаемости и отслеживания успеваемости каждого ученика
Функционал программы
- форма авторизации;
- вывод всех данных, хранящихся на сервере;
- добавление новых данных о успеваемости и посещаемости;
- редактирование данных;
- удаление данных;
- поиск по фамилии студента;
- построение графиков – два общих графика успеваемости строятся по датам выставления и редактирования оценки соответственно и два графика для каждого студента в отдельности, которые строятся по тому же принципу, что и первые два.
Содержание отчета к программе

Фрагмент программного кода (код модели Statement)
from django.db import models
# Create your models here.
class Statement(models.Model):
objects = models.Manager()
student = models.CharField(max_length=100, help_text='Введите студента', verbose_name='Студент')
subject = models.CharField(max_length=100, help_text='Введите предмет', verbose_name='Предмет')
estimation = models.IntegerField(help_text='Введите оценку', verbose_name='Оценка')
ATTENDANCE_CHOICES = [
('Высокая', 'Высокая'),
('Средняя', 'Средняя'),
('Низкая', 'Низкая'),
]
attendance = models.CharField(max_length=50, choices=ATTENDANCE_CHOICES, verbose_name='Посещаемость')
GRADE_CHOICES = [
('Высокая', 'Высокая'),
('Средняя', 'Средняя'),
('Низкая', 'Низкая'),
]
grade = models.CharField(max_length=50, choices=GRADE_CHOICES, verbose_name='Успеваемость')
date_of_rating = models.DateField(auto_now_add=True, verbose_name='Дата выставления оценки')
date_of_change = models.DateField(null=True, blank=True, verbose_name='Дата изменения оценки')
def __str__(self):
return f'{self.student} - {self.subject}: {self.estimation}, Посещаемость: {self.attendance}'
class Meta:
verbose_name = 'Ведомость'
verbose_name_plural = 'Ведомость'
Фрагмент программного кода (код компонента ShowStatement.jsx)
import React, { useEffect, useState } from 'react';
import axios from 'axios';
import { Link } from 'react-router-dom';
function ShowStatement() {
const [statements, setStatements] = useState([]);
const [searchTerm, setSearchTerm] = useState(''); // 🔍 состояние для поиска
useEffect(() => {
const fetchStatements = async () => {
try {
const response = await axios.get('http://127.0.0.1:8000/api/students/');
setStatements(response.data);
} catch (error) {
console.error('Ошибка при загрузке данных:', error);
}
};
fetchStatements();
}, []);
// 🔍 Фильтрация по имени студента (без учета регистра)
const filteredStatements = statements.filter((item) =>
item.student.toLowerCase().includes(searchTerm.toLowerCase())
);
return (
<div className="container">
<h2>Ведомость студентов</h2>
<div className="mb-3">
<input
type="text"
className="form-control"
placeholder="Поиск по имени студента..."
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
</div>
{/* 🔹 Оригинальные оценки */}
<h4>📘 Оригинальные оценки</h4>
<table className="statement-table table table-hover table-striped table-bordered text-start">
<thead>
<tr>
<th className="text-center">Студент</th>
<th className="text-center">Предмет</th>
<th className="text-center">Оценка</th>
<th className="text-center">Посещаемость</th>
<th className="text-center">Успеваемость</th>
<th className="text-center">Дата выставления</th>
<th className="text-center">Детали</th>
</tr>
</thead>
<tbody>
{filteredStatements
.filter(item => item.date_of_change === null)
.map(item => (
<tr key={`original-${item.id}`}>
<td className="text-center">{item.student}</td>
<td className="text-center">{item.subject}</td>
<td className="text-center">{item.estimation}</td>
<td className="text-center">{item.attendance}</td>
<td className="text-center">{item.grade}</td>
<td className="text-center">{item.date_of_rating}</td>
<td>
<Link to={`/student/${item.id}`}>
<button className="btn btn-primary">Детали</button>
</Link>
</td>
</tr>
))}
</tbody>
</table>
{/* 🔸 Отредактированные оценки */}
<h4>✏️ Отредактированные оценки</h4>
<table className="statement-table table table-hover table-striped table-bordered text-start">
<thead>
<tr>
<th className="text-center">Студент</th>
<th className="text-center">Предмет</th>
<th className="text-center">Оценка</th>
<th className="text-center">Посещаемость</th>
<th className="text-center">Успеваемость</th>
<th className="text-center">Дата изменения</th>
<th className="text-center">Детали</th>
</tr>
</thead>
<tbody>
{filteredStatements
.filter(item => item.date_of_change !== null)
.map(item => (
<tr key={`edited-${item.id}`}>
<td className="text-center">{item.student}</td>
<td className="text-center">{item.subject}</td>
<td className="text-center">{item.estimation}</td>
<td className="text-center">{item.attendance}</td>
<td className="text-center">{item.grade}</td>
<td className="text-center">{item.date_of_change}</td>
<td>
<Link to={`/student/${item.id}`}>
<button className="btn btn-primary">Детали</button>
</Link>
</td>
</tr>
))}
</tbody>
</table>
</div>
);
}
export default ShowStatement;
Пояснения по запуску программы
Node.js - https://nodejs.org/en - скачиваем и устанавливаемPython - https://www.python.org/Visual Studio Code - https://code.visualstudio.com/ - скачиваем и устанавливаем. Настраиваем редактор для работы с React и Python Запускаем сервер, проверяем работу api. в случае необходимости устанавливаем все необходимые библиотеки. Запускаем клиента. Радуемся успеху и пользуемся приложением. Приятного вам пользования.


Телеграм
-