mod: данные о последних визитах пользователя полностью перенесены с сервера на клиент (в JS). Отключен из контекста всех шаблонов LAST_VISIT и связанные с ним функции в вьюшках

This commit is contained in:
2026-05-09 21:21:20 +03:00
parent b3aa0ce3b3
commit 978a3ad02e
14 changed files with 193 additions and 143 deletions

View File

@@ -0,0 +1,98 @@
/**
* Логика записи визитов пользователя в cookies.
* Отслеживает последние посещения страниц с ценовой выдачей.
*
* Используемые данные из HTML:
* - data-current-url: текущий URL страницы
* - data-address: адрес здания
* - data-apart: тип квартиры
*
* Сохраняет в куку 'LastVisit' максимум 3 последних визита в формате JSON.
*/
function trackUserVisit(currentUrl, address, apart) {
// Функция для получения значения куки по имени
function getCookieValue(name) {
try {
if (document.cookie) {
const cookies = document.cookie.split('; ');
for (let cookie of cookies) {
const [cookieName, cookieValue] = cookie.split('=');
if (cookieName === name) {
return decodeURIComponent(cookieValue);
}
}
}
} catch (e) {
console.warn('Ошибка при чтении куки:', e);
}
return null;
}
// Функция для установки куки с заданным сроком жизни
function setCookie(name, value, maxAge) {
try {
const cookieValue = encodeURIComponent(value);
let cookieString = `${name}=${cookieValue}; path=/`;
if (maxAge) {
cookieString += `; max-age=${maxAge}`;
}
document.cookie = cookieString;
} catch (e) {
console.warn('Ошибка при установке куки:', e);
}
}
// Получаем последние визиты из куки (если есть)
let lastVisits = [];
const cookieValue = getCookieValue('LastVisit');
if (cookieValue) {
try {
lastVisits = JSON.parse(cookieValue);
} catch (e) {
console.warn('Ошибка при разборе JSON из куки LastVisit:', e);
lastVisits = [];
}
}
// Создаём новый item посещения с текущей информацией
const newItem = {
LastURL: currentUrl,
LastAddress: address,
LastApart: apart,
Time: performance.now() // используем performance.now() как аналог time.perf_counter() в Python
};
// Добавляем новый item в начало списка
lastVisits.unshift(newItem);
// Оставляем максимум 3 последних записи
lastVisits = lastVisits.slice(0, 4);
// Упаковываем в JSON (JSON.stringify без пробелов для компактности)
const jsonData = JSON.stringify(lastVisits);
// Устанавливаем куки на 91 день (7862400 секунд)
setCookie('LastVisit', jsonData, 7862400);
}
/**
* Инициализация отслеживания при загрузке документа.
* Ищет элемент с атрибутами data-current-url, data-address, data-apart
* и вызывает trackUserVisit с полученными значениями.
*/
document.addEventListener('DOMContentLoaded', function() {
// Ищем элемент со встроенными данными (например, скрытый div в шаблоне)
const trackingElement = document.querySelector('[data-current-url]');
if (trackingElement) {
const currentUrl = trackingElement.getAttribute('data-current-url');
const address = trackingElement.getAttribute('data-address');
const apart = trackingElement.getAttribute('data-apart');
if (currentUrl && address && apart) {
trackUserVisit(currentUrl, address, apart);
}
}
});