Fortech
  • Aутстаффинг
  • Аутсорс
  • Веб-разработка
  • Мобильная разработка
  • ИИ-решения
  • UI/UX-дизайн
  • Техническая поддержка
Наши продуктыКейсыКонтактыО насБлогКарьера
Связаться
Наши продуктыКейсыКонтактыО насБлогКарьера
Связаться
Fortech
Юридический адрес
344011, Ростовская область, г. Ростов-на-Дону, Лермонтовская ул, д. 22, офис 6, 7, 8
ИНН / КПП
6154162274 / 616401001
ОГРН
1226100005922
ОКВЭД
62.01 Разработка компьютерного программного обеспечения
Код вида деятельности в области IT
1.01, 1.04, 1.05, 1.06

Услуги

  • Аутстаф
  • Аутсорс
  • Веб-разработка
  • Мобильная разработка
  • ИИ-решения
  • UI/UX-дизайн
  • Техническая поддержка

Компания

  • Наши продукты
  • Кейсы
  • Контакты
  • О нас
  • Блог

Соцсети

  • ВКонтакте
  • MAX
  • Telegram
  • Workspace
  • YouTube

Аккредитованная IT-компания
Запись №25727 от 13.04.2022

Минцифры России

Позвать нас в тендер

  • bidzaar
  • B2B-Center
Контент © fortech.dev • 2026Политика конфиденциальностиПолитика обработки персональных данных
  1. Главная/
  2. Кейсы/
  3. Тендерная площадка: разработка клиентской части на Next.js

Тендерная площадка: разработка клиентской части на Next.js

Разбираем разработку фронтенд-модулей для коммерческой B2B-платформы на Next.js и TypeScript

О проекте

Коммерческая электронная торговая площадка для B2B-закупок. Организаторы публикуют тендеры, поставщики ищут профильные, подают заявки и торгуются на аукционах.

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

Почему участник закупок не может просто зайти на площадку и посмотреть тендеры

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

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

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

Frame 2131329866.png

Реализация

Ограничения задачи

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

Два противоположных требования к рендерингу. Новости, статьи, FAQ и инструкции должны индексироваться и открываться быстро. Личный кабинет, календарь, чаты и аукцион должны вести себя как приложение с мгновенной реакцией.

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

Аукцион не прощает ошибок. Пошаговый процесс с таймером не допускает состояния, когда пользователь видит одно время, а сервер считает другое.

Решение

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

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

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

Redis перед PostgreSQL. Ленты тендеров, календарь и обсуждения читаются несопоставимо чаще, чем меняются. Кэш снимает эту нагрузку с базы, при изменении инвалидируется точечно.

MinIO для документов. Уставные документы при подтверждении организации, приложения к тендерам, инструкции и картинки новостей лежат в объектном хранилище. База остаётся базой.

Storybook как контроль регрессии. На платформе такого размера один и тот же компонент живёт в десятке контекстов: карточка тендера, календарь, избранное, результаты поиска. Компоненты собирались и проверялись изолированно, поэтому правка в одном месте не ломала вёрстку в другом.

Docker на всех окружениях. Одинаковые версии Node.js и библиотек у разработчиков и на тестовом контуре.

Next.jsTypeScriptMaterial UIStorybookPostgreSQLDocker

реализация.png

Результат

Участник настраивает поисковый шаблон по своим кодам ОКВЭД и ключевым словам один раз, дальше площадка сама сообщает о подходящих закупках и об изменении их статусов, в том канале и в то время, которое он выбрал. Тендеры видны в календаре по датам, ближайшие по срокам вынесены на главную.

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

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

Частые вопросы

Как устроен поиск тендеров по ОКВЭД?
Поиск идёт по названию, тегам, кодам ОКВЭД и ключевым словам, а набор условий сохраняется как пользовательский шаблон. Дальше подходящие закупки приходят в уведомлениях, и площадку не нужно открывать вручную.

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

Можно ли совместить индексируемые разделы и закрытый кабинет в одном приложении?
Да, Next.js отдаёт информационные страницы статикой, а закрытые разделы рендерит динамически. Отдельный сайт под контент заводить не нужно.

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

Готовы выстроить стабильную команду?

Расскажите о проекте — предложим схему работы под ваш горизонт.

Написать в Telegram →

Связанные услуги

  • Frontend-разработка
  • Backend-разработка

Связаться с нами