В одной из прошлых статей мы рассказывали о нашем первом опенсорсе — 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, оставляйте свои отзывы и вносите вклад в развитие нашего опенсорса!

   

Комментарии (2)


  1. csl
    23.10.2024 13:44

    Рассматривали ли сборку Docker-образа не на Debian? Вижу Java 11. Если выбирать из других дистрибутивов, то со следующим LTS (17) есть Alpine со схожим размером образа?


    1. ShadF0x
      23.10.2024 13:44

      Более того, у openjdk в репо написано, что их образы помечены как deprecated. Вместо них предлагают использовать образы amazoncorretto, они сделаны на базе образа amazonlinux, который собран от alpine 3.17.