Справочник
Все маршруты публичной части, REST-эндпоинты панели, параметры конфигурации, ограничения полей и структура каталога медиафайлов — для быстрого поиска.
Страница для сверки, а не для чтения подряд. Всё собрано по исходникам версии
из ветки main.
Публичные страницы#
| Метод | Адрес | Что делает |
|---|---|---|
GET | / | главная: 5 последних постов и 2 последних альбома |
GET | /records | лента постов, на одну больше размера страницы |
GET | /records/page | JSON-порция ленты для подгрузки |
GET | /records/read?id=N | страница поста |
GET | /media | лента альбомов |
GET | /media/page | JSON-порция лент альбомов |
GET | /media/album?id=N | фотоальбом; для видеоальбома сам переадресует |
GET | /media/video_album?id=N | видеоальбом |
GET | /author?id=N | страница автора со всеми его работами |
GET | /tag?id=N | страница тега |
GET | /history | «Летопись» — статическая |
GET | /about | «О нас» — статическая |
GET | /projects | «Проекты» — статическая |
GET | /education | «Образовательные программы» — статическая |
GET | /auth | форма входа |
POST | /process_login | обработка входа, под лимитом попыток |
POST | /auth/logout | выход, сброс сессии и cookie |
GET | /go/{path} | короткая ссылка, внутренняя переадресация |
GET | /sitemap.xml | карта сайта, кешируется на час |
GET | /robots.txt | статический файл |
GET | /media/** | медиафайлы: за nginx отдаются с диска |
* | /error | страница ошибки |
Параметры лент page (с нуля) и type необязательны. Неизвестное значение
type не вызывает ошибку — фильтр просто не применяется. Допустимые значения:
NEWS, STORY, ANNOUNCEMENT для постов и PHOTO, VIDEO для альбомов;
регистр не важен.
Панель: контент#
Требуется роль ROLE_ADMIN или ROLE_MODERATOR. Изменяющие запросы требуют
CSRF-токен в заголовке X-CSRF-TOKEN.
| Метод | Адрес | Что делает | В журнале |
|---|---|---|---|
GET | /dashboard | главная панели | |
GET | /dashboard/tags | страница менеджера тегов | |
POST | /dashboard/tags/create | создать тег | да |
GET | /dashboard/tags/edit?id=N | данные тега | |
PUT | /dashboard/tags/edit | изменить тег | да |
DELETE | /dashboard/tags/delete?id=N | удалить тег | да |
GET | /dashboard/authors | страница менеджера авторов | |
POST | /dashboard/authors/create | создать автора | да |
GET | /dashboard/authors/edit?id=N | данные автора | |
PUT | /dashboard/authors/edit | изменить автора | да |
DELETE | /dashboard/authors/delete?id=N | удалить автора и весь его контент | да |
GET | /dashboard/posts | страница менеджера постов | |
GET | /dashboard/posts/required | списки авторов и тегов для формы | |
POST | /dashboard/posts/create | создать пост | да |
GET | /dashboard/posts/edit?id=N | данные поста | |
PUT | /dashboard/posts/edit | изменить пост | да |
DELETE | /dashboard/posts/delete?id=N | удалить пост | да |
GET | /dashboard/media | страница менеджера медиа | |
GET | /dashboard/media/page | JSON-порция списка медиа | |
POST | /dashboard/media/upload | загрузить один файл в каталог batchId | |
DELETE | /dashboard/media/upload | удалить один файл по публичному пути | |
POST | /dashboard/media/create | создать запись альбома | да |
GET | /dashboard/media/edit?id=N | данные альбома | |
PUT | /dashboard/media/edit | изменить альбом | да |
DELETE | /dashboard/media/delete?id=N | удалить альбом и файлы с диска | да |
Панель: администрирование#
Требуется роль ROLE_ADMIN.
| Метод | Адрес | Что делает | В журнале |
|---|---|---|---|
GET | /dashboard/users | менеджер пользователей | |
POST | /dashboard/users/create | создать пользователя | да |
GET | /dashboard/users/edit?id=N | данные пользователя | |
PUT | /dashboard/users/edit | изменить пользователя | да |
DELETE | /dashboard/users/delete?id=N | удалить пользователя | да |
GET | /dashboard/journal | страница журнала аудита | |
GET | /dashboard/journal_data | записи журнала с пагинацией | |
GET | /dashboard/seo | менеджер SEO | |
GET | /dashboard/seo/edit?path=… | текущие title и описание адреса | |
POST | /dashboard/seo/edit | изменить title и описание | да |
POST | /dashboard/protection | включить или выключить режим защиты, задать токен | да |
GET | /dashboard/postprotectionxss | переключить санитизацию постов | да |
POST | /dashboard/global_notification | текст и видимость баннера | да |
POST | /dashboard/contacts/address | адрес организации | да |
POST | /dashboard/contacts/phone | телефон | да |
POST | /dashboard/contacts/email | да | |
POST | /dashboard/shortcut | добавить короткую ссылку | да |
DELETE | /dashboard/shortcut?key=… | удалить короткую ссылку | да |
POST | /dashboard/social_media | добавить соцсеть | да |
DELETE | /dashboard/social_media?name=… | удалить соцсеть по названию | да |
POST | /dashboard/clear_cache | сбросить все кеши | да |
GET | /actuator/health, /metrics, /info | телеметрия Spring Boot |
Ограничения полей#
| Сущность | Поле | Правило |
|---|---|---|
| Пользователь | логин | не короче 4 символов, уникальный |
| Пользователь | пароль | не короче 8 символов, минимум 1 латинская буква и 1 цифра |
| Пользователь | роль, имя | не пустые |
| Пост | заголовок | 4–50 символов |
| Пост | введение | от 4 символов |
| Пост | текст | не пустой |
| Пост | тип | NEWS, STORY или ANNOUNCEMENT |
| Пост | автор | ровно один, обязателен при создании |
| Альбом | название | 4–50 символов |
| Альбом | batchId | обязателен при создании, уникальный |
| Альбом | тип | PHOTO или VIDEO |
| Альбом | автор | ровно один, обязателен при создании |
| Тег | имя | 2–30 символов, уникальное |
| Тег | описание | от 4 символов |
| Автор | имя | 2–30 символов |
| Автор | «о себе» | без ограничений, необязательно |
При редактировании пользователя пустой пароль означает «оставить прежний».
Ограничения на загрузку в интерфейсе панели: превью — только .jpg, один файл,
до 15 МБ; содержимое альбома — изображения и видео, до 20 ГБ на файл. Реальный
максимум определяется меньшим из spring.servlet.multipart.max-file-size и
client_max_body_size в nginx.
Параметры конфигурации#
Знаком ! отмечены те, что обязательно менять при развёртке.
| Параметр | По умолчанию | Смысл |
|---|---|---|
server.port | ${SERVER_PORT:80} | ! порт приложения |
server.forward-headers-strategy | выключен | ! учитывать заголовки прокси; нужен для правильных абсолютных адресов |
system.storage.path | C:/Users/Electron/Downloads/ | ! корень хранилища медиафайлов |
web.storage.url-prefix | /media/ | префикс публичных адресов файлов |
web.storage.default-preview | /media/author.jpg | обложка для альбомов без превью |
web.storage.local-serving | true | ! отдавать файлы силами Spring; за nginx — false |
spring.servlet.multipart.max-file-size | 10GB | ! предел на файл |
spring.servlet.multipart.max-request-size | 50GB | ! предел на запрос |
spring.datasource.url | jdbc:postgresql://${DB_HOST:localhost}:${DB_PORT:5432}/${DB_NAME:otryadwebsite} | адрес базы |
spring.datasource.username | ${DB_USER:postgres} | ! пользователь базы |
spring.datasource.password | ${DB_PASSWORD:postgres} | ! пароль базы |
spring.jpa.hibernate.ddl-auto | update | автосоздание схемы |
spring.jpa.open-in-view | false | сессия закрыта до рендеринга; менять не нужно |
page-size | 6 | размер страницы в лентах |
app.cache.lifetime | 60 | минуты жизни записи кеша с последнего обращения |
app.cache.maxsize | 500 | записей на кеш |
server.compression.enabled | true | сжатие html, xml, текста и JSON |
security.admin.login | otryad | ! логин первого администратора |
security.admin.password | nadezda123 | ! пароль первого администратора |
security.attempts.limit | 5 | нигде не читается, значения лимитов заданы в коде |
management.endpoints.web.exposure.include | health,metrics,info | какая телеметрия открыта |
dev | true | по замыслу — девелоперский режим; фактически ни на что не влияет |
spring.thymeleaf.prefix | выключен | читать шаблоны из каталога на диске вместо jar |
Переменные окружения SERVER_PORT, DB_HOST, DB_PORT, DB_NAME, DB_USER,
DB_PASSWORD подставляются в соответствующие свойства.
Структура каталога медиафайлов#
<system.storage.path>/
├── 3f9c1b2e-.../ каталог одного альбома, имя = batchId
│ ├── preview.jpg обложка; всегда это имя, в галерею не попадает
│ ├── 01-first.jpg содержимое; порядок в галерее — алфавитный
│ ├── 02-second.jpg
│ └── 03-video.mp4
└── 7a1d4c8f-.../
├── preview.jpg
└── 01-clip.mp4
Публичный адрес файла собирается как
web.storage.url-prefix + batchId + / + имя файла, то есть
/media/3f9c1b2e-.../01-first.jpg.
Таблицы базы данных#
| Таблица | Содержимое |
|---|---|
posts | посты; индекс по типу и дате |
media_collections | альбомы; path — это batchId, уникален |
content_authors | авторы материалов |
content_tags | теги |
post_tags_map | связь постов и тегов |
collection_tags_map | связь альбомов и тегов |
users | сотрудники панели |
action_logs | журнал аудита |
Кеши#
| Имя | Что | Время жизни |
|---|---|---|
post | посты по id | 60 минут с последнего обращения |
medium | альбомы по id | 60 минут с последнего обращения |
author | авторы с их работами | 60 минут с последнего обращения |
tag | теги с их материалами | 60 минут с последнего обращения |
sitemap | адреса карты сайта | 60 минут с момента записи |
buckets | счётчики лимитов запросов | 24 часа, до 10 000 записей |
Технологии и версии#
| Что | Версия или роль |
|---|---|
| Java | 17 в настройках сборки, работает и на новее |
| Spring Boot | 4.0.2 |
| Стартеры | Web MVC, Data JPA, Security, Validation, Cache, Actuator, Thymeleaf, DevTools |
| PostgreSQL | драйвер в зависимостях, версия сервера любая поддерживаемая |
| Caffeine | кеш в памяти |
| Bucket4j | 8.10.0, ограничение частоты запросов |
| AspectJ | аудит и лимиты |
| Lombok | геттеры, сеттеры, логгер |
| Thymeleaf | серверные шаблоны |
| EasyMDE | редактор Markdown в панели |
| Marked.js | рендеринг Markdown в браузере |
| Dropzone.js | загрузка файлов перетаскиванием |
| SweetAlert2 | диалоги и уведомления |
| H2 | только для тестов |
Сборка — Maven, есть wrapper (./mvnw). Пакет — исполняемый jar
target/OtryadWebsite-1.0.jar. Фронтенд-сборки нет: все библиотеки лежат
готовыми файлами в статике.