ადმინ-პანელი
Что видит человек за экраном: витрина каталога, подтверждение синка, заявки, сессии и записи сеансов.
TL;DR
Админка живёт на /admin и состоит из двух половин. Первая — управление витриной: какие лоты показывать, в каком порядке, какие проекты поднять вперёд, и подтверждение утреннего переноса данных из таблицы поставщика. Вторая — своя аналитика: сессии, воронка, заявки, поисковые запросы, ошибки, скорость и запись сеансов посетителей.
Это отдельная ветка приложения со своим корневым макетом, своей палитрой и системными шрифтами. Она закрыта паролем, помечена noindex, не отдаётся из кэша и не пускает на страницу ни одного внешнего ресурса.
Обзор админки
Каталог: что показывать
Раздел «Каталог» отвечает на два разных вопроса в одном месте — как витрина показывает лоты и какие лоты она показывает.
Настроек витрины четыре: сколько карточек на странице (от 6 до 96), порядок по умолчанию, что делать с лотами без фотографии (опустить ниже или убрать совсем) и насколько сильно приоритет обложки перебивает остальное. Настройки общие для каталога, хаба комплексов и подборок.
Снятие лота с витрины — главная операция этого раздела, и она не означает удаления. Снятая карточка пропадает из списков, с главной, из подборок, из гидов, из блока «похожие» и из всех публичных счётчиков. Её собственная страница остаётся: код ответа 200, прежний robots, ссылка в карте сайта и ссылка со страницы своего комплекса. Оператор видит эту разницу в таблице прямо на странице, потому что «убрать с витрины» и «удалить объект» путают постоянно.
Предпросмотр «что изменится»
Перед сохранением настроек админка показывает пять списков последствий, посчитанных тем же кодом, которым считает сам сайт:
— Уйдут из поиска. Страницы, которые перейдут из index в noindex: листинг района с двумя лотами вместо трёх.
— Исчезнут совсем. Адреса, которые станут 404. У подборок и листингов политика переполнения разная — одни отдают 404, другие зажимают номер страницы, — поэтому списка два, а не один.
— Комплексы уйдут из списков. При этом страница комплекса и её адрес в карте сайта остаются живыми.
Смысл предпросмотра простой: настройка «убрать лоты без фотографии» выглядит косметической, а на деле может снять с индексации десяток листингов.
Порядок карточек и рекомендованные проекты
Оператор закрепляет карточки вручную, но хранится не весь порядок выдачи, а закреплённая голова списка — остальное сохраняет вычисленный порядок. Закрепление бывает глобальным и на конкретную выдачу; своя выдача перебивает глобальную. Если посетитель сам выбрал «сначала дешевле», закрепления уходят в конец сравнения: выбранная сортировка обязана значить именно то, что написано.
Отдельная вкладка — рекомендованные проекты. Владелец отмечает комплексы, которые идут первыми на главной и в сортировке «рекомендуем». Это меняет только порядок: ни один объект не появляется и не исчезает, счётчики и карта сайта не двигаются. Групповая кнопка работает по найденным строкам — набрал в поиске имя застройщика, отметил все девятнадцать проектов разом.
Закрепления и пометки, которые перестали срабатывать, показываются отдельным списком с причиной: лот ушёл из таблицы, снят с витрины, не входит в эту выдачу, слаг переехал. Автоматически они не переснимаются — переснятый снимок тихо оживил бы закрепление на другом объекте.
Подтверждение утреннего синка
Страница /admin/catalog/sync показывает результат ночного переноса: что изменилось, поля «до и после», карантин, ошибки и расхождение поколения базы с поколением кэша. План можно подтвердить или отклонить целиком, по его точному номеру.
Конвейер сам останавливается и просит человека, когда изменение выглядит слишком крупным: больше 25% изменённых лотов, больше 5% пропавших строк, падение отдельного листа больше чем на четверть, скачок отдельной цены больше 30%. Новый проект не появляется на сайте никогда автоматически — только через явно проверенный список соответствий. Ошибки структуры источника кнопкой подтверждения не обходятся.
Если служба падает или требует просмотра, в личку приходит сообщение от бота со статусом, именами тревог и ссылкой на эту страницу.
Аналитика
Остальные разделы — про посетителей. Обзор, объекты (включая страницы, которые никто не открывает), воронка, поиск и спрос, сессии с таймлайном, заявки со сменой статуса, ошибки и «нервные клики», скорость по p75 и живая лента с поллингом раз в пять секунд, которая останавливается на скрытой вкладке.
Измерения — город, район, тип жилья, конкретный объект — выводятся из адреса теми же функциями, которыми отрисовывается каталог. Поэтому цифра в отчёте и страница на сайте не расходятся.
Период выбирается кнопками (1, 7, 30, 90 дней) или произвольным диапазоном; диапазон режется потолком в 400 дней, чтобы один клик не запускал многолетний скан.
Записи сеансов
Сессию можно посмотреть как запись. rrweb стартует со второй страницы визита — одностраничные заходы и боты не пишутся. Поля ввода маскируются целиком, блок контактов и форма заявки не записываются вовсе. Записи живут 7 дней, события — 180, заявки — 3 года.
Воспроизведение идёт в песочнице без разрешения на скрипты: страница из записи не может ничего выполнить в админке.
Заявки и приватность
Заявка — отдельная бизнес-запись. Она намеренно не связана внешним ключом с сессией: чистка статистики не должна удалять заявки, а сама заявка обязана сохраниться при выключенном сборе и запрещённых куках.
Посетитель отключает сбор на странице «Данные и приватность». Отказ сквозной: кука не выдаётся, сборщик не запускается, запись не стартует, роуты приёма отбивают запросы. Своим (нам, агентству, менеджерам) раздаётся ссылка, которая выключает сбор сразу при открытии — по ссылке можно только выключить, включают всегда кнопкой.
Для удаления по запросу человека есть три команды: забыть визитора, забыть сессию, обезличить заявку.
Вход
Пароль и ключ подписи — обе переменные обязательны и не короче 16 символов; при пустых или коротких значениях вход закрыт для всех, а не открыт. Срок жизни куки лежит внутри подписи и проверяется на сервере, потому что атрибут Max-Age правит кто угодно. Проверка доступа вызывается в каждом защищённом обработчике: проверки в макете хватает для страниц, но не для API.
Известная недоделка, которую видно в этом разделе: в 11 файлах админки осталось 22 инлайновых стиля. На проде политика безопасности срезает их молча, локально они применяются, поэтому глазами разница не видна. В разделе «Каталог» инлайновых стилей нет — там только классы.