Python. Первый проект
Время чтения: 4 минут
В этой статье я приведу пример задачи на ООП и покажу как её решить. После этого я дам несколько самостоятельных заданий.
Читаем ТЗ
Представляем ситуацию – ты пришёл работать в компанию, которая занимается продажей обучающих курсов. До тебя никто не занимался автоматизацией, и все задачи выполнялись вручную.
Директор даёт тебе такое техническое задание:
- Создать сайт, на котором пользователи смогут зарегистрироваться
- Зарегистрированный пользователь может оплатить курс
- Оплата курса на данном этапе не встроена в сайт, и пользователь напрямую связывается с сотрудником компании
- Сотрудник компании может зайти на сайт под своим профилем, и отметить какой курс был куплен каким пользователем
- После оплаты пользователь может просматривать материалы курса
- Курс состоит из N занятий
- Каждое занятие является произвольной веб-страницей
Кажется сложным, поэтому давай сначала продумаем архитектуру нашей системы.
Вот, я набросал UML диаграмму, на которой отразил архитектуру системы в целом (слева) и архитектуру сервера в частности (справа).
UML (Unified Modeling Language) – унифицированный язык описания систем программного обеспечения. Я рисовал через программу draw.io.
С точки зрения архитектуры всей системы, можно выделить следующие компоненты:
- Пользователь – будет пользоваться сайтом, чтобы смотреть курсы
- Сотрудник – будет определять доступ пользователя к курсам
- Администратор – будет определять кто из пользователей является сотрудником
- Сервер – содержит всю логику сайта
- База данных – содержит данные, необходимые пользователям и сотрудникам
С точки зрения архитектуры сервера, можно выделить следующие компоненты:
- Пользователь:
- Уникальный для каждого пользователя id
- Имя пользователя
- Статус сотрудника (да/нет)
- Список купленных курсов
- Метод, позволяющий изменить статус сотрудника (будет изменяться администратором сервера)
- Метод, позволяющий изменить состав купленных курсов (будет изменяться сотрудником)
- Метод, позволяющий проверить был ли куплен тот или иной курс
- Курс
- Уникальный для каждого курса id
- Название курса
- Веб-страница, на которой размещены занятия
- Список уникальных id занятий
- Метод, позволяющий показать пользователю страницу покупки курса
- Метод, позволяющий показать пользователю страницу курса (если курс куплен)
- Занятие
- Уникальный для каждого занятия id
- Название занятия
- Веб-страница занятия
- Метод, позволяющий показать пользователю страницу занятия (если курс куплен)
Рисовать диаграммы перед разработкой – хорошая практика. Рисуя диаграмму, можно сразу примерно понять какие классы необходимо создать и как они будут друг с другом связаны, что потенциально сократит время разработки.
Начинаем разработку
В нашей программе будут использованы СУБД SQLite (разбор) и веб-фреймворк Flask (разбор).
Я начну с организации базы данных.
Организуем базу данных
Основываясь на архитектуре сервера можно определить, что нам нужно хранить следующие данные:
- Пользователь:
- Уникальный для каждого пользователя id
- Имя пользователя
- Статус сотрудника (да/нет)
- Список купленных курсов
- Курс
- Уникальный для каждого курса id
- Название курса
- Веб-страница, на которой размещены занятия
- Список уникальных id занятий
- Занятие
- Уникальный для каждого занятия id
- Название занятия
- Веб-страница занятия
Переведём это на язык запросов SQL:
- Пользователь
CREATE TABLE user(
id INTEGER PRIMARY KEY,
name TEXT,
is_employee BOOLEAN
);
- Курс
CREATE TABLE course(
id INTEGER PRIMARY KEY,
name TEXT,
page_file TEXT
);
- Занятие
CREATE TABLE lesson(
id INTEGER PRIMARY KEY,
name TEXT,
page_file TEXT
);
Так как в SQL нельзя хранить списки в полях таблицы, мы создадим две дополнительных таблицы, чтобы хранить:
- Связь пользователь-купленный курс
CREATE TABLE user_to_course(
user_id INTEGER,
course_id INTEGER,
PRIMARY KEY(user_id, course_id)
);
- Связь курс-занятие
CREATE TABLE course_to_lesson(
course_id INTEGER,
lesson_id INTEGER,
PRIMARY KEY(course_id, lesson_id)
);
Таким образом, чтобы узнать какие курсы были куплены у пользователя, нужно будет посмотреть на все записи в таблице user_to_course, где user_id равен id пользователя. Вот как будет выглядеть такой запрос на SQL:
-- 666 это просто какой-то id пользователя
SELECT course_id FROM user_to_course WHERE user_id = 666;
Получив курсы, пользователь сможет открыть один из них, и посмотреть какие в курсе есть занятия. Вот как на SQL я вытащу все занятия для курса:
-- 666 это просто какой-то id курса
SELECT lesson_id FROM course_to_lesson WHERE course_id = 666;
По ТЗ не надо реализовывать “админку” для наполнения курсов занятиями, поэтому первоначальное наполнение базы будем делать через SQLiteBrowser.
Пишем сервер
Начнём с кода, который поднимает простейший веб-сервер на Flask:
from flask import Flask
app = Flask('courses')
@app.route('/')
def test():
return 'test'
app.run(port=1234)
Окей, всё работает. Осталось дело за малым – дописать всю остальную систему :)
Каждый аспект реализации сервера я вынесу в отдельную статью, где подробно разберу и объясню что и зачем делаю.
- Регистрация – без неё не будет пользователей, а без пользователей не будет продаж курсов.
- Авторизация – пользователи могут заходить только под своими профилями (под чужими нельзя).
- …
…
Заключение
Итого, мы изучили:
- Заполню после написания всех статей
Если что – пиши, я помогу и постараюсь объяснить лучше.