2021ВКР750107ИСАКОВ
.pdfДля проверки уникальности введенного логина и почты были
реализованы следующие аналогичные друг другу методы внутри класса
RegisterForm(FlaskForms):
def validate_username(self, username):
user = User.query.filter(username=username.data).firts()
if user is not None:
raise ValidationError(‘Имя пользователя занято’)
Рисунок 29 – Уведомление о необходимости заполнить обязательное поле
Включенный параметр «запомнить меня» (см. рисунок 30) ненадолго
отложит выход пользователя из системы и, в случае если браузер был
случайно закрыт, позволит восстановить страницу без повторного ввода
пароля сочетанием клавиш Ctrl+Shift+T.
Рисунок 30 – Экранная форма окон авторизации (слева) и регистрации (справа), отражающая реакцию системы на возможные пользовательские ошибки
61
Помимо хэширования паролей с целью повышения уровня конфиденциальности все запросы от клиента к серверу передаются по защищенному технологией сквозного TLS шифрования протоколу передачи данных HTTPS (см. рисунок 31). Также по умолчанию модуль flask-wtf
обеспечивает защиту от межсайтовой подделки запросов (CSRF).
Рисунок 31 – Безопасное подключение по протоколу HTTPS
Мы рассмотрели процесс авторизации и регистрации пользователя в системе, процесс создания записи в базе данных и механизмы шифрования информации. Нам удалось создать отзывчивый интерфейс с применением современных технологий ведения пользовательских сессий, учитывающих вероятность случайного выхода пациента из системы при закрытии браузера.
3.2 Добавление записи о приеме пищи
После регистрации и авторизации приложение переводит пользователя на страницу добавления приемов пищи. Как видно на рисунке 32 слева, форма состоит из полей добавления даты, времени и типа приема пищи. По умолчанию в окне «Укажите прием пищи» стоит «авто», это означает, что программа узнает текущее время исходя из выставленного на компьютере пользователя. Затем определит тип приема пищи «завтрак, обед, ужин,
перекус» в соответствии с правилами: завтрак с 7:00 до 11:30, обед с 12:00 до
15:00 и ужин с 18:00 до 22:00, остальное – перекусы. Однако, это необязательно, в случае если у пациента есть индивидуальный график питания по времени, он может вручную выставить правильное значение.
62
Последнее поле – «Сахар до приема пищи» принимает в себя как целые,
так и дробные значения, где дробная часть отделена точкой или запятой. При условии, что пользователь уже выбрал блюдо или несколько (например, как показано на рисунке 32 справа) и поле «Сахар до приема пищи» заполнено,
система рассчитает предположительный постпрандиальный гликемический ответ и сохранит значение в базе данных.
Рисунок 32 – Экранная форма мобильной версии страниц добавления приема пищи (слева) и поиска продукта в базе данных (справа)
Все когда-либо записанные приемы пищи хранятся в архиве (см.
рисунок 33). Здесь же представлена краткая информация по макронутриентам.
Рисунок 33 – Экранная форма архивной страницы всех приемов пищи
63
Для текущей недели выделена отдельная страница, блюда на которой отсортированы по дням и приемам пищи (см. рисунок 34). При необходимости внести изменения в один из дней достаточно нажать кнопку «Выбрать несколько» и отметить ошибочно введенные продукты. При удалении информация не исчезнет из системы полностью. В отчете, который получит врач, создан отдельный лист для краткой информации об удаленных записях.
Рисунок 34 – Экранная форма электронного дневника приемов пищи пользователя
Для повышения ответственности при заполнении дневника и отсеивания небрежно оформленных записей, пациенту предлагается отмечать дни,
которые, как он считает, заполнены полностью (см. рисунок 35).
Соответствующая информация также будет занесена в электронный отчет по пользователю.
Рисунок 35 – Календарная форма графика приемов пищи
64
При нажатии на кнопку «Отправить» (см. рисунок 35) скрипт формирует
Excel файл на основе записей, сохраненных в базе данных. Отчет содержит несколько таблиц, в том числе упомянутых нами ранее: приемы пищи,
предсказание уровня сахара в крови, физическая нагрузка и сон, список полных дней и удаленных записей. На рисунке 36 представлена лист «Приемы пищи». Дни чередуются в соответствии с цветовой раскраской. Ниже располагаются рассчитанные средствами библиотеки sqlite3 средние значения нутриентов по дням. Всего в таблицу в отчете входит 29 макро- и
микронутриента, среди них: белки, жиры, углеводы, витамины и минералы.
Рисунок 36 – Табличная форма дневника приемов пищи Для скачивая отчета на персональное устройство пациента была
реализована следующая функция:
@app.route('/download, methods=['GET', 'POST']) @login_required
def download_file():
if request.method == 'POST':
dirname = os.path.dirname(__file__)
file_path = os.path.join(dirname, '%s.xlsx' % session["username"])
do_table()
return send_file(file_path, as_attachment=True)
Метод do_table ( ) приведен в приложении А.
65
3.3 Добавление записи о физической нагрузке и сне
Раздел физической активности представлен на странице в виде двух таблиц: нагрузок в течение дня и продолжительности сна (см. рисунок 37).
Пользователю предлагается всего несколько видов активности: ходьба,
зарядка, спорт, уборка в квартире и работа в огороде. Для каждого из них необходимо указать время начала и длительность, после чего они сохраняются в базу данных и выводятся в соответствующий лист Excel отчета по пациенту.
Рисунок 37 – Экранная форма страницы добавления физической активности Регулярный учет количества и продолжительности итераций физической нагрузки и сна не всегда важен врачу. Нижеприведенное изображение (см. рисунок 38) демонстрирует то, как веб-приложение
обрабатывает пропущенные записи.
Рисунок 38 – Табличная форма дневника физической нагрузки и сна пользователя
В качестве дополнительного функционала в веб-приложении предлагается к использованию JavaScript виджет расчета ИМТ, см. рисунок 39.
При наборе параметров (массы в кг и роста в см) скрипт автоматически рассчитывает ваш ИМТ и динамически изменяет его значение. Виджет сделан средствами JavaScript модуля React. Суть его работы заключается в том, что
66
при срабатывании функции on_change ( ) React формирует виртуальную объектную модель документа (DOM) и сравнивает ее с той, что есть в действительности. Затем вычленяет тот react компонент, которые претерпел изменения и без перезагрузки страницы изменяет его содержание.
Рисунок 39 – Калькулятор индекса массы тела
При нажатии кнопки «Сохранить» происходит формирование JSON
файла и отправка его на сервер для последующей записи в базу данных:
@app.route("/setMBI", methods=['GET', 'POST']) def setMBI():
if request.method == 'POST': jsonBMI = request.get_json() con = sqlite3.connect(db) cur = con.cursor()
cur.execute("UPDATE user SET BMI = ? WHERE id = ?", (jsonBMI['BMI'], session["user_id"]))
con.commit()
con.close()
Такой подход стал возможным благодаря программному интерфейсу
JavaScript – Fetch API. Соответствующий ему метод fetch ( ) предоставляет нам возможность работы с запросами и ответами HTTP. В нашем случае со стороны клиента мы совершаем POST запрос к серверу, передавая в теле запроса JSON файл и ожидая ответ в виде Response объекта.
67
3.4 Модель прогнозирования уровня сахара в крови
В качестве модели предсказания уровня сахара в крови после приема пищи был выбран алгоритм градиентного бустинга деревьев регрессии.
Результаты предсказания уровня сахара в крови (УСК) выводятся в режиме реального времени при добавлении пользователем блюда в список потребленных продуктов, при этом необходимо указать начальный уровень сахара в крови. Если УСК после приема пищи превысит критическое значение
(7,0 ммоль/л), система выведет предупреждение «УСК превысит норму».
Кроме того, при формировании Excel отчета по пользователю, приложение добавит сводную таблицу (см. рисунок 40) в новый лист «Предсказание сахара». Помимо общей информации о приеме пищи и начального УСК,
указывается ИМТ и показатель гликемической нагрузки, полученный в результате умножения количества углеводов в потребляемой пище на ее гликемический индекс.
Рисунок 40 – Табличная форма результатов предсказания постпрандиального гликемического ответа
Оценка модели ранее была проведена сотрудниками кафедры и НМИЦ им. В.А. Алмазова в ходе исследования посвященного ГСД [24].
Окончательная точность оценивалась по данным ранее не привлекавшихся пациентов, численностью 25% от общей выборки. Окончательный набор данных составил 3240 записи. В качестве ключевых параметров для оценки модели были выбраны: коэффициент корреляции Пирсона (R = 0,644) и
средняя абсолютная ошибка (MAE = 0,377 ммоль/л*ч).
68
По итогам сравнения полученных показателей точности с результатами из недавних статей [45, 46], оценили их как аналогичные по уровню точности.
3.5 SQLite база данных
Итоговая структура БД (см. рисунок 41) отличается от теоретически изложенной нами в таблице 1.
Рисунок 41 – Структура базы данных Разобьем все таблицы на две категории: пользовательские записи и
продукты питания. К пользовательским относятся:
•user – регистрационные данные;
•activity и sleep – разбитые на две части для удобства записи и отображения информации таблицы физических нагрузок и сна;
•basket и favourites – вспомогательная и основная таблицы, содержащие записи о планируемой и потребленной пище;
•deleted – хранит сведения об удаленных записях;
•full_days – отражает регулярность внесения пациентами записей.
База данных продуктов питания интегрирована в общую структуру и разбита на две части: foodGroups и food. Первая таблица содержит исключительно категории блюд в то время, как вторая несет в себе подробную информацию о более, чем шести тысячах наименований продуктов питания.
3.6 Выводы
На основе современного веб-фреймворка Python Flask была реализована система удаленного мониторинга диеты и физической активности. Веб-
69
приложение представляет собой набор из нескольких интернет-страниц,
предлагающих выбрать из предложенной базы продуктов питания блюдо,
сохранить запись в личном электронном дневнике и отправить копию врачу по почте. Разработанная модель машинного обучения с заданной точностью прогнозирует повышение УСК и помогает пациенту лучше проанализировать собственную систему питания. Помимо внесения сведений о приемах пищи,
приложение реализует систему контроля над регулярностью физических нагрузок и продолжительностью сна. В будущем предполагается реализовать работу приложения в рамках медицинских исследовательских центров,
поликлиник. Однако, уже сейчас оно прошло первичную апробацию врачами Института Эндокринологии НМИЦ им. В.А. Алмазова. Впечатления в целом можно оценить как положительные. Процесс регистрации оказался удобнее,
чем в мобильном приложении ДиаКомпаньон [21], с другой стороны, процесс редактирования введенных приемов пищи ждут дальнейшие улучшения.
70