gora.
Aperwind — каталог недвижимости Таиланда

Admin skydelis

Что видит человек за экраном: витрина каталога, подтверждение синка, заявки, сессии и записи сеансов.

~5 min skaityti · 927 žodžių

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 инлайновых стиля. На проде политика безопасности срезает их молча, локально они применяются, поэтому глазами разница не видна. В разделе «Каталог» инлайновых стилей нет — там только классы.