Скриншот архива с проектом
Структура проекта
Задание
Разработать приложение, позволяющее вести учет арендованных велосипедов. Базовое название приложения: "Аренда велосипедов". Ваша задача состоит в том, чтобы с помощью изученного материала по программированию на таких языках как C# и Python разработать приложение соответствующее следующим условиям: приложение реализовано на одном из указанных выше языков, имеет вид - веб-приложения, обладает функционалом для выполнения CRUD операций, реализовано с использованием Flask или ASP.NET Core MVC, имеет систему регистрации и авторизации, работает с базой данных и имеет красивый дизайн - используется Bootstrap.
Функционал программы
- Регистрация и авторизация пользователей
- Добавление аренды
- Просмотр сведений об аренде велосипеда (кем , когда, на какой срок, какая модель и стоимость)
- Редактирование аренды
- Удаление аренды
- Поиск по арендатору.
- Отправка сообщений связанных с арендой и учет таких сообщений.
Фрагмент программного кода (формы)
from email_validator import validate_email, EmailNotValidError from flask_wtf import FlaskForm from wtforms import StringField, DateField, PasswordField, SubmitField, FileField from wtforms.fields.choices import SelectField from wtforms.fields.numeric import IntegerField, FloatField from wtforms.fields.simple import TextAreaField from wtforms.validators import DataRequired, EqualTo, ValidationError, Email from models import Rental class RentalForm(FlaskForm): renter_name = StringField('Арендатор', validators=[DataRequired()]) bike_model = StringField('Модель велосипеда', validators=[DataRequired()]) bike_photo = FileField('Фото велосипеда') rental_date = DateField('Дата аренды', format='%Y-%m-%d', validators=[DataRequired()]) return_date = DateField('Дата возврата велосипеда', format='%Y-%m-%d', validators=[DataRequired()]) rental_category = SelectField('Категория', choices=Rental.CATEGORY_CHOICES) rental_duration = IntegerField('Длительность аренды (в днях)', validators=[DataRequired()]) rental_cost = FloatField('Стоимость аренды', validators=[DataRequired()]) class RegistrationForm(FlaskForm): username = StringField('Username', validators=[DataRequired()]) email = StringField('Email', validators=[DataRequired()]) password = PasswordField('Password', validators=[DataRequired()]) confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')]) submit = SubmitField('Sign Up') def validate_email(self, email): try: # Валидация email valid_email = validate_email(email.data) email.data = valid_email['email'] # нормализованный адрес except EmailNotValidError as e: raise ValidationError(str(e)) class LoginForm(FlaskForm): email = StringField('Email', validators=[DataRequired()]) password = PasswordField('Password', validators=[DataRequired()]) submit = SubmitField('Login') def validate_email(self, email): try: # Валидация email valid_email = validate_email(email.data) email.data = valid_email['email'] # нормализованный адрес except EmailNotValidError as e: raise ValidationError(str(e)) class SearchForm(FlaskForm): renter_name = StringField('Арендатор') submit = SubmitField('Поиск') clear = SubmitField('Очистить поиск') # Новое поле для очистки # Форма для отправки сообщений class MessageForm(FlaskForm): name = StringField('Имя', validators=[DataRequired()]) phone = StringField('Телефон', validators=[DataRequired()]) email = StringField('Электронная почта', validators=[DataRequired(), Email()]) message = TextAreaField('Сообщение', validators=[DataRequired()]) submit = SubmitField('Отправить')
Фрагмент программного кода (модели)
from datetime import datetime, timezone from flask_sqlalchemy import SQLAlchemy from werkzeug.security import generate_password_hash, check_password_hash from flask_login import UserMixin db = SQLAlchemy() class Rental(db.Model): id = db.Column(db.Integer, primary_key=True) renter_name = db.Column(db.String(100), nullable=False, info={'help_text': 'Введите арендатора', 'verbose_name': 'Арендатор'}) bike_model = db.Column(db.String(100), nullable=False, info={'help_text': 'Введите модель', 'verbose_name': 'Модель велосипеда'}) bike_photo = db.Column(db.String(200), nullable=True) # Путь к изображению rental_date = db.Column(db.DateTime, nullable=False, default=datetime.now(timezone.utc), info={'help_text': 'Введите дату аренды', 'verbose_name': 'Дата аренды'}) return_date = db.Column(db.DateTime, nullable=False, default=datetime.now(timezone.utc), info={'help_text': 'Введите дату возврата велосипеда', 'verbose_name': 'Дата возврата велосипеда'}) CATEGORY_CHOICES = [ ('', 'Выберите категорию'), ('Долгосрочная', 'Долгосрочная'), ('Краткосрочная', 'Краткосрочная'), ] rental_category = db.Column(db.String(50), nullable=False, info={'verbose_name': 'Категория'}) # краткосрочная или долгосрочная rental_duration = db.Column(db.Integer, nullable=False, info={'help_text': 'Введите длительность аренды', 'verbose_name': 'Длительность аренды'}) # в днях rental_cost = db.Column(db.Float, nullable=False, info={'help_text': 'Введите стоимость аренды', 'verbose_name': 'Стоимость аренды'}) def __repr__(self): return f'<Rental {self.renter_name}, {self.bike_model}>' class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(150), unique=True, nullable=False) email = db.Column(db.String(150), unique=True, nullable=False) password = db.Column(db.String(150), nullable=False) is_active = db.Column(db.Boolean, default=True) def __init__(self, username, email): self.username = username self.email = email def set_password(self, password): self.password = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.password, password) # Модель для хранения сообщений class Message(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False, info={'help_text': 'Введите имя', 'verbose_name': 'Имя'}) phone = db.Column(db.String(15), nullable=False, info={'help_text': 'Введите телефон', 'verbose_name': 'Телефон'}) email = db.Column(db.String(120), nullable=False, info={'help_text': 'Введите Email', 'verbose_name': 'Email'}) message = db.Column(db.Text, nullable=False, info={'help_text': 'Введите сообщение', 'verbose_name': 'Сообщение'})
Пояснения по запуску программы
Приветствую! За раннее выражаю благодарность за покупку данной работы (данного проекта)!!!!
Для эффективной работы вам потребуется выполнить ряд действий:
- Убедитесь, что у вас установлен интерпретатор языка Python, желательно той же верси и, что и у меня (я использовал версию 3.12 с изменениями и исправлениями ошибок 3.12.3, так же у меня установлена версия 3.12.4) вам же нужна 3.12.3. Если еще не установили, то скачайте с оффициального сайта - https://www.python.org/
- Убедитесь что вы установили редактор кода - PyCharm или Visual Studio Code. Если вы этого не сделали, то скачайте и установите один из вариантов с оффициальных сайтов: PyCharm можно скачать по данной ссылке - https://www.jetbrains.com/pycharm/download/?section=windows Скачивать и устанавливать необходимо Community версию. Скачать VS Code можно по данной ссылке - https://code.visualstudio.com/download
- После установки всего выше описанного, настройте VS Code для работы с Python установив необходимые расширения (см. инструкцию - https://youtu.be/j5e5gwZgMH8) . Если используете PyCharm то необходимо зайти в настройки, выбрать данный проект BicycleRental и выбрать интерпретатор. При необходимости переустановить библиотеки: Flask, Flask-Login, Flask-Bootstrap, Flask-SQLAlchemy, email-validator, Flask-WTF и ряд других которые будут выделятся как не установленные.
- Запускаете приложение и пользуетесь. Также вы можете самостоятельно выложить проект на Heroku или любой другой хостинг по вашему выбору .
admin