Ниже — компактное руководство пользователя для движка заметок UR4UQU / Notes, рассчитанное на обычного пользователя.

1. Назначение и вход

UR4UQU / Notes — это простая система для хранения заметок, логов и статей, с удобным поиском и фильтрацией по разделам.

Система поддерживает три режима доступа:

  • Гость (не авторизован)
  • Авторизованный пользователь
  • Администратор

Кто что видит

  • Гость видит только публичный контент:
  • все записи типа page;
  • записи типа post в разделе Blog, которые были изменены не более 48 часов назад.
  • Авторизованный пользователь после входа по логину и паролю видит все записи, включая закрытые материалы.
  • Администратор с уровнем доступа 9 может добавлять и редактировать записи, управлять пользователями и пересобирать FTS-индекс.

Как войти

1. Откройте страницу ?action=login через кнопку «Вход» в верхнем меню.
2. Введите логин и пароль.
3. Нажмите «Войти».

Если логин или пароль неверны, система покажет сообщение об ошибке и вернёт вас на форму входа.

2. Основные разделы интерфейса

Верхнее меню

В шапке сайта доступны ссылки:

  • Поиск — ?action=search
  • Последние — ?action=list
  • Разделы Blog, News, Pro
  • Пользователи — только для администратора
  • Новая запись — только для авторизованного пользователя
  • Выход (username) — завершение сессии
  • Вход — если вы не авторизованы

Страница быстрой заметки

Администратор видит форму создания и редактирования записи.

Поля формы:

  • Раздел — один из доступных разделов (Blog, News, Pro)
  • Тип:
  • section — служебная заметка или лог, доступна только авторизованным
  • page — статическая страница, доступна всем
  • post — обычный пост
  • Текст:
  • первая непустая строка — заголовок записи;
  • всё, что ниже — тело заметки.
  • Файлы:
  • можно прикрепить изображения, видео и другие файлы;
  • можно вставить изображение из буфера обмена через Ctrl+V.

После нажатия «Сохранить» запись будет занесена в базу, а вложения автоматически добавятся в конец текста в виде строк [file ...].

3. Просмотр и поиск записей

Список записей

Страница ?action=list показывает последние записи.

В списке доступны:

  • общий список последних записей;
  • фильтрация по разделу через Blog, News, Pro или all.

Для каждой записи отображаются:

  • раздел;
  • тип (section, page, post);
  • заголовок;
  • дата создания;
  • дата обновления;
  • короткое превью текста.

По клику на заголовок открывается страница просмотра ?action=view&id=....

Просмотр одной записи

На странице ?action=view&id=N отображаются:

  • заголовок;
  • раздел;
  • тип;
  • ID;
  • дата создания;
  • дата обновления;
  • основной текст записи.

Если вы администратор, над просмотром также отображается форма редактирования этой записи.

Если запись недоступна гостю, система покажет сообщение:
Эта запись доступна только авторизованным пользователям.

Поиск

Страница ?action=search использует полнотекстовый индекс SQLite FTS5 (таблица materials_fts, колонки section + body) в сочетании с обычным LIKE для отдельных типов запросов. Движок не просто ищет "подстроку" — он разбирает ваш запрос на слова и обрабатывает разные типы слов по-разному.

Как пользоваться:

1. Введите запрос.
2. Нажмите «Найти».
3. Результаты появятся списком, отсортированным по релевантности (или по дате, см. ниже), с общим числом найденных записей и постраничной навигацией.

Что происходит с вашим запросом (по словам, через пробел):

| Тип слова | Пример | Как ищется |
|---|---|---|
| Обычное слово (буквы/цифры) | антенна, nginx | Полнотекстовый поиск по началу слова (префиксный *-матч), с подсветкой найденного фрагмента и сортировкой по релевантности (bm25) |
| Хэштег (начинается с #) | #радио, #todo | Точный поиск подстроки (LIKE %...%) в теле или названии раздела — без учёта релевантности |
| Дата в формате YYYY-MM-DD | 2026-07-24 | Точный поиск подстроки (LIKE) |
| Слово с -, / или : внутри | 192.168.1-5, 10.0.0.0/24, 18:30 | Точный поиск подстроки (LIKE), а не префиксный FTS-матч |

Правила и ограничения:

  • слова короче 2 символов полностью игнорируются (не влияют на поиск и не выбрасывают ошибку);
  • если в запросе несколько слов — все условия объединяются через И (запись должна подходить под каждое слово, а не хотя бы под одно);
  • обычные слова ищутся и по названию раздела, и по телу заметки (FTS-индекс включает обе колонки);
  • хэштеги, даты и составные термины ищутся только по телу и разделу через LIKE, регистронезависимо, в любом месте строки (не только в начале слова);
  • гостю всегда скрываются закрытые записи — правила видимости (раздел 5) применяются и к результатам поиска, и к их числу в счётчике «Найдено».

Подсветка и сортировка:

  • если в запросе есть хотя бы одно обычное слово — результаты сортируются по релевантности (bm25), затем по дате обновления; в тексте показывается фрагмент с подсветкой найденного (<mark>…</mark>);
  • если запрос состоит только из хэштегов/дат/составных терминов (без обычных слов) — подсветки не будет, показывается обычное превью начала заметки, а сортировка — просто по дате обновления (от новых к старым), релевантность здесь не считается.

Рекомендации: как писать заметки, чтобы их было легко находить

  • Ключевые слова — в первую строку. Первая непустая строка становится заголовком и попадает в списки — но для самого поиска важнее, что заголовок физически находится в теле, которое индексируется целиком. Тем не менее используйте в заголовке точные, характерные слова (например «Настройка WireGuard» лучше, чем «Заметка 12»).
  • Хэштеги как теги/категории. Так как #хэштег ищется точной подстрокой в любом месте текста, удобно завести себе устойчивый набор меток и всегда писать их одинаково, например #todo, #radio, #ansible, #несделано. Опечатка или другая форма слова (#todo vs #to-do) даст разные результаты — придерживайтесь одного написания.
  • Даты — строго YYYY-MM-DD. Если хотите находить заметки по дате события (не по дате создания/изменения записи, а по дате внутри текста — например «эфир 2026-07-20»), пишите дату именно в этом формате внутри тела. Другие форматы (20.07.2026, 20/07/26) не совпадут с ISO-запросом при поиске.
  • Технические идентификаторы — одним токеном, без пробелов. IP-адреса, CIDR-маски, MAC-адреса, host:port, время HH:MM — всё, что содержит -, / или :, ищется как точная подстрока. Пишите их слитно (192.168.10.5, eth0:enp3s0, 14:00-15:30) — так вы сможете найти заметку, вставив в поиск ровно эту подстроку.
  • Обычные слова можно искать не полностью. Префиксный поиск (индекс настроен на префиксы длиной 2, 3 и 4 символа) позволяет находить антенна по запросу анте, konfiguraciya по konfig и т.п. — не обязательно дописывать слово до конца, но начало должно совпадать точно (посередине слова префикс не сработает).
  • Не смешивайте несочетаемые условия в одном запросе. Поскольку все слова объединяются через И, запрос #todo 2026-07-24 антенна найдёт только заметки, где есть все три условия одновременно. Если нужно «или» — делайте несколько отдельных поисков.
  • Раздел (Blog/News/Pro) — тоже часть индекса. Если вы ищете обычным словом, оно может совпасть и с названием раздела, а не только с телом — это иногда объясняет неожиданные, но валидные совпадения в результатах.
  • Если после массового импорта заметок (например через import_txt.py) поиск выглядит неполным — это почти всегда синхронизируется автоматически через триггеры базы; ручной пересбор (?action=rebuild_fts, доступен администратору) нужен крайне редко, но не помешает как профилактика.

4. Форматирование текста

Движок поддерживает простой текстовый формат, похожий на Markdown.

4.1. Заголовок записи

Первая непустая строка текста считается заголовком записи.

Она используется:

  • в списке записей;
  • на странице просмотра;
  • в заголовке страницы браузера.

Пример:

Запуск новой антенны
Лог испытаний на частоте 14 МГц...

4.2. Абзацы и переносы

  • Обычный текст разделяется пустыми строками.
  • Непрерывный блок строк считается одним абзацем.
  • Переводы строк внутри абзаца сохраняются.

Пример:

Первая строка абзаца
Вторая строка абзаца

Новый абзац после пустой строки

4.3. Заголовки внутри текста

Поддерживаются заголовки от первого до шестого уровня:

# Заголовок уровня 1
## Заголовок уровня 2
### Заголовок уровня 3
#### Заголовок уровня 4
##### Заголовок уровня 5
###### Заголовок уровня 6

Правило: в начале строки ставится #, затем пробел и текст.

> Совет для поиска: заголовки внутри текста (#, ##...) — это часть обычного текста, они попадают в тело и, соответственно, в полнотекстовый индекс на общих основаниях. Отдельное значение имеет только #слово_без_пробела — это хэштег для точного LIKE-поиска (раздел 3), а # слово с пробелом в начале строки — заголовок Markdown.

4.4. Списки

Поддерживаются ненумерованные списки с маркерами - и *.

Пример:

- Первый пункт
- Второй пункт
- Третий пункт

* Альтернативный синтаксис
* Ещё один пункт

4.5. Кодовые блоки

Поддерживаются fenced code blocks.

Чтобы показать кодовый блок, используйте тройные обратные кавычки:


ping -c 4 example.com
traceroute example.com

Можно указать язык после открывающих кавычек, например bash, php, json.

Если закрывающие тройные кавычки забыты, всё оставшееся будет считаться кодовым блоком.

> Совет для поиска: содержимое кодовых блоков тоже индексируется как обычный текст. Команды с -, /, : (например traceroute -m 30, 10.0.0.0/24) будут находиться точным LIKE-поиском по этой подстроке, а не префиксным словом.

4.6. Вставка изображений и видео

Есть два основных способа.

Через строку [file ...]

После загрузки файла система сама добавляет в текст строки вида:

[file uploads/20260711_123456_abcd1234.jpg]
[file uploads/20260711_123457_efgh5678.mp4]

Такие строки отображаются как медиакарточки.

  • Для изображений — картинка и подпись.
  • Для видео — встроенный плеер и подпись.

Через чистый URL на отдельной строке

Если строка состоит только из URL и расширение похоже на изображение или видео, ссылка автоматически превращается в медиакарточку.

Правильный пример:

https://example.com/path/to/picture.jpg
https://example.com/path/to/video.mp4

Если расширение не поддерживается, URL будет обычной ссылкой.

4.7. Ссылки, жирный текст и инлайн-код

Поддерживаются такие inline-элементы:

  • Жирный текст через двойные звёздочки:
Это **важный фрагмент** текста.
  • Инлайн-код через одну обратную кавычку:
Команда `systemctl status nginx` показала ошибку.

Важно: синтаксис Markdown-ссылок вида [текст](https://example.com)` не поддерживается. Используйте обычный URL прямо в тексте.

5. Видимость записей

Система использует правила видимости, которые зависят от типа записи, раздела и авторизации пользователя.

Кто что видит

  • Неавторизованный посетитель видит:
  • все записи типа page;
  • записи типа post из раздела Blog, если с момента последнего изменения прошло не более 48 часов (см. предупреждение о несоответствии в разделе 1 — в коде сейчас именно 48, а не 72).
  • Авторизованный пользователь видит все записи, включая закрытые.
  • Администратор видит все записи и может изменять их, создавать новые и управлять пользователями.

Как это понимать на практике

  • Если запись должна быть доступна всем всегда, используйте тип page.
  • Если запись должна быть видна только ограниченное время для гостей, используйте тип post и раздел Blog.
  • Если запись служебная, рабочая или внутренняя, используйте тип section.

Рекомендации по выбору типа

  • page — для постоянных материалов: справка, описание, инструкции, статические страницы.
  • post + Blog — для временно публичных заметок, объявлений и свежих публикаций.
  • post в других разделах — для непубличных материалов.
  • section — для внутренних логов, черновиков и рабочих заметок.

Важный нюанс

Для записей типа post в разделе Blog срок публичности считается от времени последнего изменения, а не от времени создания.

Если такую запись отредактировать, окно публичности для гостей начнётся заново и продлится ещё на 48 часов.

Где запись будет видна

Правила видимости действуют:

  • в списке последних записей;
  • в списке выбранного раздела;
  • в результатах поиска;
  • при прямом открытии записи по ссылке.

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

6. Права доступа и публикация для гостей

При работе без логина важно помнить:

  • гость видит все записи типа page;
  • гость видит post из Blog, если запись обновлялась в пределах последних 48 часов;
  • записи типа section и любые закрытые материалы для гостя недоступны;
  • редактирование Blog/post продлевает публичность ещё на 48 часов;
  • то же самое окно (48 часов) действует и на результаты поиска — гость не увидит закрытую запись, даже если она точно совпадает с его запросом.

7. Управление пользователями

Администратор через ?action=users может:

  • просматривать список пользователей;
  • создавать нового пользователя;
  • менять уровень доступа;
  • менять пароль;
  • удалять пользователя, кроме самого себя.

Для нового пользователя:

  • логин допускает латиницу, цифры, _, -, ., @;
  • пароль должен быть не короче 6 символов;
  • уровень доступа задаётся числом от 0 до 9.

При каждом успешном входе обновляется время последнего входа last_login_at.