Список пользователей

1
Админ
Постов: 288
2
VIP
Постов: 75
3
Элита
Постов: 62
4
Проверенные
Постов: 46
5
Проверенные
Постов: 45
6
Проверенные
Постов: 39
7
VIP
Постов: 36
8
VIP
Постов: 35

  • Страница 1 из 1
  • 1
Шаблон Поисковая система списка пользователей v1.0 для uCoz
Дата: Понедельник, 06.07.2026, 08:20 | Сообщение # 1 | | Написал: Известный
Автор темы
Мурчанн не в сети
        Сообщений:288
         Регистрация:20.10.2016
За уважение окружающих За уважение окружающих За хорошее поведение За преданность форуму За любовь народа

uSearch v1.0 - поисковая система пользователей для uCoz

Продолжаем разработку шаблона социальной сети.

Прежде чем приступить к созданию страницы поиска пользователей для uCoz, я долго изучал принципы работы поисковой системы социальной сети «ВКонтакте». Главная цель заключалась не в том, чтобы просто повторить существующий функционал, а максимально приблизиться к нему, а в некоторых аспектах даже превзойти его.



Для этого пришлось глубоко разобраться в устройстве системы, изучить её логику, возможности и ограничения. Основной задачей было найти способы реализовать подобный функционал средствами uCoz, обходя существующие технические ограничения платформы без нарушения её работы.

Именно такой подход позволяет постепенно стирать границы между тем, что принято считать невозможным для uCoz, и тем, что действительно можно реализовать на практике. В результате рождаются решения, которые ещё недавно казались недостижимыми, но сегодня становятся полноценной частью проекта.

Главное в любом проекте это опыт, который получаешь с каждой новой разработкой. Именно он позволяет постоянно совершенствовать свои решения и смотреть на уже сделанную работу совершенно иначе.

Основная задача скрипта загрузка и обработка списка пользователей. При запуске он способен загрузить до 10 000 пользователей, после чего все дальнейшие операции выполняются уже на стороне клиента без постоянных обращений к серверу. Именно поэтому поиск и фильтрация работают быстро и практически мгновенно.

Справа расположена панель фильтров, выполненная по аналогии с поисковой системой «ВКонтакте». Пользователь может фильтровать список по различным параметрам: возрасту, полу, имени, рейтингу и другим критериям.

Если в базе данных пользователей больше 10 000 записей, скрипт автоматически продолжит их подгрузку в фоновом режиме. Для этого используется механизм ленивой загрузки (Lazy Load), который работает с заданным интервалом и не создаёт заметной нагрузки на сервер или браузер. Данные загружаются постепенно, только тогда, когда это действительно необходимо.

Разумеется, данный скрипт не рассчитан на обработку миллионов пользователей, как это реализовано в «ВКонтакте», где используются совершенно другие технологии, серверная индексация и распределённые базы данных. Однако для большинства проектов на uCoz его производительности более чем достаточно.

Отдельного внимания заслуживает правая панель фильтров. Она реализована по принципу «липкого» блока (Sticky Sidebar): во время прокрутки страницы панель остаётся в зоне видимости и не дёргается, обеспечивая комфортную работу с поиском.

Кроме того, реализовано интересное поведение самой панели. При наведении курсора она становится активной, позволяя прокручивать её содержимое колесом мыши. При этом предусмотрены ограничения по высоте и области прокрутки, благодаря чему навигация остаётся удобной и предсказуемой. Как только курсор покидает панель, она плавно возвращается в исходное положение. Такой эффект создаёт ощущение лёгкой «вязкости» и делает взаимодействие с интерфейсом более естественным и приятным.

В скрипт уже встроен список крупнейших городов России. Если ваш сайт ориентирован на другую страну, вы можете без труда заменить этот список на собственный, указав нужные города.

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

В некоторых случаях результаты могут обновляться не мгновенно, поэтому предусмотрена кнопка «Применить фильтры», которая принудительно запускает поиск с учётом всех выбранных параметров.

Для удобства работы также добавлена кнопка «Сбросить фильтры». Она позволяет одним нажатием очистить все выбранные параметры и быстро вернуть поиск к исходному состоянию.

Верхняя строка поиска работает по тому же принципу, что и современные поисковые системы. Пользователю не обязательно нажимать кнопку «Поиск» достаточно начать вводить текст, и скрипт автоматически начнёт анализировать введённые символы и отображать подходящие результаты.

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

Такой подход делает поиск максимально удобным и интуитивно понятным: система сама «понимает», что именно вы пытаетесь найти, и практически в реальном времени отображает наиболее подходящие совпадения без необходимости каждый раз запускать поиск вручную.

Скрипт также умеет работать с группами пользователей, что значительно расширяет возможности поиска и сортировки.

Например, если пользователь заблокирован, его аватар автоматически отображается в чёрно-белых тонах с тёмным оттенком. Такое визуальное оформление сразу даёт понять, что профиль находится в неактивном или заблокированном состоянии, не требуя дополнительных обозначений.

Кроме того, реализован поиск по группам пользователей. Вы можете выбрать интересующую категорию например, Администрация, VIP, Модераторы, Проверенные пользователи или любую другую группу, существующую на вашем сайте. После выбора скрипт мгновенно отобразит всех пользователей, относящихся к выбранной группе.

Такой подход делает поиск не только быстрым, но и удобным, особенно на сайтах с большим количеством пользователей, где необходимо быстро найти представителей определённой группы или администрации.

Честно говоря, в этот шаблон уже вложено столько функций и различных решений, что описать каждую из них становится всё сложнее.

Система фильтрации также учитывает ранги пользователей. В uCoz существует встроенная система активности, основанная на количестве опубликованных сообщений. По мере роста активности пользователю могут автоматически присваиваться различные звания или ранги. Например, после определённого количества сообщений пользователь получает более высокий статус, который отражает его активность на сайте.

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

Однако ранг — это лишь один из факторов. Если пользователь имеет низкий ранг или он вовсе отсутствует, система переходит к анализу других критериев. Скрипт оценивает степень заполненности профиля, начисляя внутренние баллы за каждое заполненное поле.

Например:

указано настоящее имя +20 баллов;

заполнена подпись +20 баллов;

добавлен аватар;

указаны город, возраст и другая информация;

заполнены дополнительные поля профиля.

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

Также была реализована функция добавления в друзья — аналогичная по логике социальной сети «ВКонтакте». При её разработке я тестировал поведение системы в реальном времени: отправлял запросы, наблюдал за реакцией интерфейса, уведомлениями и тем, как система обрабатывает события через консоль браузера.

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

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

Также в системе реализована кнопка **«Написать сообщение»**. При её нажатии пользователь автоматически перенаправляется на отдельную страницу отправки сообщения, где можно сразу приступить к переписке.

Для корректной и стабильной работы скрипта важно соблюдать строгую структуру полей. Все элементы формы должны быть пронумерованы и располагаться в заданном порядке, как это предусмотрено в текущей реализации.

Нарушение порядка или изменение структуры полей может привести к некорректной работе скрипта, так как логика обработки данных завязана именно на последовательность элементов. Поэтому система ожидает строго определённый формат ввода и вывода данных.



В системе также реализован индикатор активности пользователей, отображающий их текущее состояние онлайн или офлайн. Данная функция носит исключительно информационный характер и не используется в фильтрации или сортировке результатов поиска. Её задача дать пользователю понимание того, находится ли человек в сети в данный момент.

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

Отдельно стоит отметить, что для демонстрации возможностей проекта было записано видео, в котором показана работа всех основных функций в реальном времени. Именно в таком формате лучше всего видно поведение системы и её взаимодействие с пользователем.

Также был создан небольшой музыкальный трек с использованием сервиса SUNO «Чудная долина». Он не относится напрямую к функционалу скрипта, но является частью общего творческого оформления проекта и атмосферы вокруг него.



Исходный код

Код
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8" />
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Список пользователей</title>

<link rel="stylesheet" href="/.s/src/base.min.css" />
<link rel="stylesheet" href="/.s/src/layer7.min.css" />
<link rel="stylesheet" href="https://bro.usite.pro/css/users.css?v=1" media="all">
<link rel="stylesheet" href="https://bro.usite.pro/css/find.css?v=2" media="all">

</head>
<body>

<!-- МЕНЮ -->
<div class="header">
<div class="header-inner">

<a href="/" class="logo">DOM <span class="logo-box">LinkUp</span></a>

<form class="vk-search" action="/search" method="get">
<span class="vk-search-icon"></span>
<input type="text" name="q" placeholder="Поиск" />
</form>

$GLOBAL_GLOCKE$

<?if($USER_LOGGED_IN$)?>
<div class="nav-cta-wrapper">
<div class="nav-cta">

<!-- Пользователь -->
<div class="user-box" id="userMenu">

<!-- Аватар -->
<img src="$USER_AVATAR_URL$"
alt="$USERNAME$"
class="user-avatar real-avatar"
onerror="this.style.display='none';
this.nextElementSibling.style.display='block';">

<!-- Дефолтный аватар -->
<img src="/.s/src/profile/img/profile_photo_thumbnail.png"
alt="default"
class="user-avatar default-avatar"
style="display:none;">

<!-- Выпадающее меню -->
<div class="user-dropdown">
<div class="user-dropdown-header">
<span class="username">$USERNAME$</span>
</div>

<a href="/index/14" class="dropdown-item icon-messages">Личные сообщения</a>
<a href="/index/11" class="dropdown-item icon-settings">Настройки</a>
<a href="/index/8" class="dropdown-item icon-profile">Моя страница</a>
<a href="/index/15" class="dropdown-item icon-users">Пользователи</a>

<div class="dropdown-separator"></div>

<a href="$LOGOUT_LINK$" class="dropdown-item icon-logout logout">Выход</a>

</div>

</div>

</div>
</div>

<script>
document.addEventListener("click", function (e) {
const userBox = document.getElementById("userMenu");
if (!userBox) return;

if (userBox.contains(e.target)) {
userBox.classList.toggle("active");
} else {
userBox.classList.remove("active");
}
});
</script>

<?endif?>

</div>
</div>

<!-- КОНТЕНТ - 3 КОЛОНКИ -->
<div class="container">

<!-- ЛЕВАЯ КОЛОНКА - МЕНЮ -->
<aside class="left-col">
$GLOBAL_MENU$
</aside>

<!-- ЦЕНТРАЛЬНАЯ КОЛОНКА - СПИСОК ПОЛЬЗОВАТЕЛЕЙ -->
<main class="center-col">
<div class="center-content" id="ajaxBody">

<!-- Заголовок и строка поиска -->
<div class="vk-search-header">
<h1 class="vk-page-title">Поиск людей</h1>
<div class="vk-search-bar">
<div class="vk-search-input-wrapper">
<svg class="vk-search-icon" viewBox="0 0 24 24" width="20" height="20">
<path fill="#888" d="M10 2a8 8 0 105.293 14.293l4.707 4.707 1.414-1.414-4.707-4.707A8 8 0 0010 2zm0 2a6 6 0 110 12 6 6 0 010-12z"/>
</svg>
<input type="text" class="vk-search-field" placeholder="Поиск по пользователям..." value="" id="vkUserSearch">
<button class="vk-search-clear" type="button" id="vkSearchClear">
<svg viewBox="0 0 24 24" width="16" height="16">
<path fill="#888" d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
</svg>
</button>
</div>
<button class="vk-search-btn" type="button" id="vkSearchBtn">Найти</button>
</div>
</div>

<!-- Статистика и пагинация -->
<div class="vk-results-info">
<div class="vk-results-count">
$ITEMS_STAT$
</div>
</div>

<div class="vk-users-list" id="vkUsersList">
$BODY$
</div>

<!-- Пагинация внизу -->
<div class="vk-pagination-bottom">
$PAGING$
</div>

</div>
</main>

<!-- ПРАВАЯ КОЛОНКА - БЛОКИ ИСКАТЬ И ПАРАМЕТРЫ ПОИСКА -->
<aside class="right-col">

<!-- Блок Искать -->
<div class="vk-sidebar-block">
<div class="vk-sidebar-header">
<svg viewBox="0 0 24 24" width="18" height="18">
<path fill="#fff" d="M10 2a8 8 0 105.293 14.293l4.707 4.707 1.414-1.414-4.707-4.707A8 8 0 0010 2zm0 2a6 6 0 110 12 6 6 0 010-12z"/>
</svg>
Искать
</div>
<div class="vk-sidebar-content">
<a href="/index/15" class="vk-filter-link active">Люди</a>
<a href="/forum/0-0-1-34" class="vk-filter-link">Посты</a>
<a href="/forum" class="vk-filter-link">Сообщества</a>
<a href="/news" class="vk-filter-link">Новости</a>
</div>
</div>

<!-- Блок Параметры поиска -->
<div class="vk-sidebar-block">
<div class="vk-sidebar-header">
<svg viewBox="0 0 24 24" width="18" height="18">
<path fill="#fff" d="M3 4h18v2H3V4zm3 7h12v2H6v-2zm4 7h4v2h-4v-2z"/>
</svg>
Параметры поиска
</div>
<div class="vk-sidebar-content vk-filters-form">
<form method="post" name="memform" action="/index/" id="vkFiltersForm">

<!-- Город (с поиском) -->
<div class="vk-filter-group">
<label class="vk-filter-label">Город</label>
<div class="vk-city-search-wrapper" id="vkCityWrapper">
<input type="text"
class="vk-city-input"
id="vkCityInput"
placeholder="Начните вводить город..."
autocomplete="off">
<button type="button" class="vk-city-clear" id="vkCityClear" title="Очистить">
<svg viewBox="0 0 24 24" width="14" height="14">
<path fill="#888" d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
</svg>
</button>
<input type="hidden" id="vkCityFilter" value="">
<div class="vk-city-dropdown" id="vkCityDropdown"></div>
</div>
</div>

<!-- Возраст -->
<div class="vk-filter-group">
<label class="vk-filter-label">Возраст</label>
<div class="vk-age-range">
<input type="number" class="vk-age-input" placeholder="От" min="14" max="100" value="14" id="vkAgeFrom">
<span class="vk-age-separator">—</span>
<input type="number" class="vk-age-input" placeholder="До" min="14" max="100" value="100" id="vkAgeTo">
</div>
</div>

<!-- Пол -->
<div class="vk-filter-group">
<label class="vk-filter-label">Пол</label>
<div class="vk-radio-group">
<label class="vk-radio-label">
<input type="radio" name="gender" value="0" checked>
<span class="vk-radio-text">Любой</span>
</label>
<label class="vk-radio-label">
<input type="radio" name="gender" value="1">
<span class="vk-radio-text">Мужской</span>
</label>
<label class="vk-radio-label">
<input type="radio" name="gender" value="2">
<span class="vk-radio-text">Женский</span>
</label>
</div>
</div>

<!-- Дата рождения -->
<div class="vk-filter-group">
<label class="vk-filter-label">Дата рождения</label>
<div class="vk-date-selectors">
<select class="vk-select-small" id="birthDay">
<option value="">День</option>
</select>
<select class="vk-select-small" id="birthMonth">
<option value="">Месяц</option>
<option value="1">Январь</option>
<option value="2">Февраль</option>
<option value="3">Март</option>
<option value="4">Апрель</option>
<option value="5">Май</option>
<option value="6">Июнь</option>
<option value="7">Июль</option>
<option value="8">Август</option>
<option value="9">Сентябрь</option>
<option value="10">Октябрь</option>
<option value="11">Ноябрь</option>
<option value="12">Декабрь</option>
</select>
<select class="vk-select-small" id="birthYear">
<option value="">Год</option>
</select>
</div>
</div>

<!-- Группа пользователей -->
<div class="vk-filter-group">
<label class="vk-filter-label">Группа</label>
<div class="vk-select-wrapper">
<select class="vk-select" name="group" id="vkGroupFilter">
<option value="0">Все группы</option>
<option value="1">Пользователи</option>
<option value="2">VIP</option>
<option value="3">Модераторы</option>
<option value="4">Администратор</option>
<option value="251">Друзья</option>
<option value="255">Заблокированные</option>
</select>
</div>
</div>

<!-- Сортировка -->
<div class="vk-filter-group">
<label class="vk-filter-label">Сортировать по</label>
<div class="vk-select-wrapper">
<select class="vk-select" name="sort" id="vkSortFilter">
<option value="1">Популярности</option>
<option value="2">Дате регистрации</option>
<option value="3">Имени</option>
</select>
</div>
</div>

<!-- Кнопки -->
<div class="vk-filter-actions">
<button type="submit" class="vk-btn vk-btn-primary vk-btn-block">
Применить фильтры
</button>
<button type="reset" class="vk-btn vk-btn-secondary vk-btn-block" id="vkResetFilters">
Сбросить
</button>
</div>

<input type="hidden" name="a" value="15">
<input type="hidden" name="s" value="1">
<input type="hidden" name="res" value="999">
</form>
</div>
</div>

</aside>

</div>

<script src="https://bro.usite.pro/js/people.js?v=1"></script>

<!-- Контейнер для уведомлений -->
<div class="vk-toast-container" id="vkToastContainer"></div>

<!-- Скрытый блок с онлайн пользователями -->
<div id="onlineUsersData" style="display:none;">
$ONLINE_USERS_LIST$
</div>
<div id="onlineCounter" style="display:none;">$ONLINE_COUNTER$</div>

</body>
</html>


Мурчанн

Признаюсь, не знаю почему, но глядя на звезды мне всегда хочется мечтать.
  • Страница 1 из 1
  • 1
Поиск: