В одной из прошлых статей мы рассказывали о нашем первом опенсорсе — Smartup Time Tracker. Система нужна для компаний, которые хотят вести учет рабочего времени и организовать почасовую оплату. В этой статье дадим обзор ее технического решения.
Ознакомиться с Time Tracker можно по ссылке. Ждем ваших контрибьютов!
Тайм-трекер — это клиент-серверное приложение с REST api. Сервер — это монолитный Java Backend на Spring. Фронтенд — проект на Vue третьей версии. Для запросов к базе данных не стали использовать полноценный JPA, работаем с JPQL.
Технологии были выбраны сразу — руководствовались скоростным фактором, хотели успеть за три месяца.
Бэкенд
JPA — доминирующая спецификация на рынке, но она не подошла нам из-за медлительности и сложности запросов. На стадии проектирования стало ясно, что для построения отчетов потребуются тяжелые JOIN операции. С JPQL мы пишем запросы самостоятельно, чтобы обеспечить гибкость и возможность получить более сложную структуру данных, которую JPA не предоставляет.
Когда проект расширился, на бэкенде появилось аспектно-ориентированное программирование. Поскольку функционал проекта был уже достаточно большим, а внедрение уведомлений могло усложнить бизнес-логику, было принято решение использовать аспекты. Сейчас аспекты используются для нотификаций — чтобы уведомлять пользователя о разных процессах в системе.
Это похоже на фильтр: при прохождении запроса через определенную точку, аспекты проверяют, нужно ли реагировать на вызов метода. Они перехватывают момент выполнения метода и добавляют дополнительную логику. Все уведомления в системе срабатывают после того, как метод завершил свою работу.
Например, метод вычисляет количество часов пользователя и завершает выполнение. Аспекты определяют, что действие завершено, и реагируют на него, создавая уведомление для пользователя. Мы разделили бизнес-логику (например, подсчет и сохранение часов, добавление пользователей) и дополнительные требования к платформе (например, уведомления). Это позволяет не нагромождать бизнес-логику лишними деталями.
Для уведомления пользователя не нужно изменять бизнес-логику. Можно просто построить сквозную структуру, которая будет работать вне бизнес-логики, беря из нее данные для передачи пользователю. Таким образом, бизнес-логика остается неизменной.
Фронтенд
Во фронтенде изначально был выбран Vue. Сейчас проект переходит на Composition API.
Ранее во Vue был подход Vue Options API к написанию компонентов, а в третьей версии появился более удобный способ, который сейчас чаще всего используют компании. Новый синтаксис стал более лаконичным и читаемым. Если хотите подробностей, есть официальная документация Vue, где описывается причины появления Composition API.
Можно писать код и по старому синтаксису, он тоже работает. Однако новый подход улучшает читаемость и структуру кода, не влияя на производительность.
Во фронтенде используется библиотека компонентов ant-design-vue. Чтобы быстро набросать проект, мы применили готовую библиотеку компонентов. Интерфейс уже задан — мы подставляем свои данные и получаем аккуратный дизайн.
Со временем наш СЕО изменил требования и захотел более сложные таблицы для отображения данных. Основная страница трекера — это уже полностью переделанная версия. Эти таблицы не взяты из библиотеки, мы их верстали самостоятельно. То же касается и таблиц сложных отчетов.
Раньше у нас была ручная система подтверждения блокировки редактирования часов администратором. Сейчас сделано так: администратор выбирает дату блокировки и может запланировать её. Время вынесено в конфигурационный файл, при желании его легко можно настроить под себя. Ручное редактирование не требовалось. Стандартно установлено время 23.59 по МСК
Это реализовано с помощью Spring и его механизма планировщика задач. Мы используем пул потоков, которые ожидают начала работы. Всегда есть только один поток, который ждет выполнения задачи. Таким образом, если пользователь запланировал несколько дат для блокировки, в оперативной памяти будет храниться только ближайшая. Остальные даты будут выгружаться из базы данных по мере необходимости.
В дальнейшие планы входят небольшие улучшения системы оповещений, а также новая фича — аллокация. Она позволит планировать загрузку сотрудников на проектах в будущем. То есть можно будет распределять часы на весь срок проекта и затем сравнивать их с реально затреканным временем. Это даст возможность строить отчеты для прогнозирования доходов.
Заключение
Считаем, что выбранное техническое решение для разработки оказалось удачным. Использование монолитного бэкенда на Java и Vue-фронтенда обеспечило необходимую гибкость, высокую скорость разработки и удобство поддержки системы. Это позволило нам не только быстро выполнить проект, но и масштабировать его в будущем.
Мы продолжаем активно развивать Time Tracker и приглашаем всех к сотрудничеству и контрибьютингу в проект.
Скачивайте Smartup Time Tracker, оставляйте свои отзывы и вносите вклад в развитие нашего опенсорса!
csl
Рассматривали ли сборку Docker-образа не на Debian? Вижу Java 11. Если выбирать из других дистрибутивов, то со следующим LTS (17) есть Alpine со схожим размером образа?
ShadF0x
Более того, у openjdk в репо написано, что их образы помечены как deprecated. Вместо них предлагают использовать образы amazoncorretto, они сделаны на базе образа amazonlinux, который собран от alpine 3.17.