01

Идея и возможности

Задача StoneLi — помочь сохранить знания, разбивая материал на небольшие карточки и возвращаясь к ним по расписанию.

  • Создание карточек с вопросом и ответом;
  • Организация карточек по категориям и вложенным категориям;
  • Редактирование, перемещение и удаление карточек и категорий;
  • Повторение с оценкой сложности ответа;
  • Планирование следующего повторения с учётом результата.

02

Как это работает

Пользователь создаёт категории и наполняет их карточками. Во время обучения он вспоминает ответ, открывает его и выбирает оценку: «Снова», «Сложно», «Хорошо» или «Легко».

Выбранная оценка используется планировщиком повторений для расчёта следующего срока. Карточки, срок которых наступил, становятся приоритетными для повторения.

03

Архитектура и технологии

Приложение построено как серверное Java-приложение с отдельными REST API для операций с учебными данными.

Java 21 Spring Boot 3 Spring Security PostgreSQL Redis Thymeleaf Vite Tiptap JWT
  • Backend: контроллеры, сервисный слой и работа с данными.
  • Frontend: Thymeleaf для страниц, JavaScript-модули для клиентской логики, Tiptap для редактирования содержимого карточек.
  • Аутентификация: access- и refresh-токены; refresh-токены хранятся в Redis.
  • Хранение: PostgreSQL используется для пользователей, категорий и карточек.

04

Безопасность и развёртывание

  • Spring Security ограничивает доступ к REST API; JWT передаётся в защищённых cookie.
  • Приложение слушает локальный адрес 127.0.0.1:8080 и не публикует порт приложения напрямую.
  • Nginx обслуживает публичную страницу и проксирует запросы к приложению.
  • WireGuard обеспечивает VPN-доступ к приватной части приложения.
  • HTTPS настроен с помощью сертификата Let's Encrypt.
  • Приложение запускается как системный сервис systemd на VPS.
Публичная часть предназначена для описания проекта и документации. Рабочее приложение доступно через VPN.

05

Текущий статус

Основной функционал реализован, приложение развёрнуто на сервере, а конфигурация доступа и модель безопасности проверены в рамках текущего проекта.

Дальнейшее развитие возможно в зависимости от практической необходимости: улучшение документации, тестов и пользовательского опыта. Это персональный проект, поэтому новые функции не являются обязательной целью сами по себе.