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
Текущий статус
Основной функционал реализован, приложение развёрнуто на сервере, а конфигурация доступа и модель безопасности проверены в рамках текущего проекта.
Дальнейшее развитие возможно в зависимости от практической необходимости: улучшение документации, тестов и пользовательского опыта. Это персональный проект, поэтому новые функции не являются обязательной целью сами по себе.