AzoftКейсыВеб-портал для “Космолаб”: система хранения научных статей

Веб-портал для “Космолаб”: система хранения научных статей

Ольга Аксёнова Октябрь 25, 2018

Веб-портал Космолаб

С чего всё начиналось

К нам обратилась компания “Космолаб” и попросила, ни много ни мало, разработать веб-портал для хранения научных статей. Клиент решил выстроить статьи на портале в виде дерева. Эта структура казалась наиболее удачной и наглядной, чтобы студенты и сотрудники научных институтов могли читать и комментировать тексты, искать нужные сведения, присваивать материалам разные степени достоверности.

Вариант дерева статей — сложный с точки зрения разработки, но куда удобнее для пользователей. Мы пошли навстречу клиенту и всё закрутилось.

Решение

Мы проанализировали требования к веб-порталу и составили подробное ТЗ с мокапами. Обсудили с заказчиком технологии, которые будем использовать на проекте. Изначально планировали работать на Drupal — он поддерживает версионирование статей и переводов. Но, детально изучив документацию, поняли, что лучше справится фреймворк Yii2: работает на порядок быстрее Drupal, использует меньше ресурсов и проще в поддержке и дальнейших доработках. Затем оценили проект и выделили два ключевых направления в работе:

  • построить дерево научных статей
  • сегментировать юзеров и каждому сегменту присвоить свои фичи

Дерево статей — задача с высоким приоритетом. И мы начали именно с неё.

Как делали дерево статей

Нам нужно было создать дерево научных публикаций, в котором:

  • у каждой статьи есть только одна родительская статья
  • у статьи может быть от нуля до бесконечности дочерних статей
  • в иерархии статей возможно сколько угодно уровней вложенности

Мы исследовали 4 паттерна для работы с деревьями:

  • Adjacency list. В таблицу с данными добавляется ID записи предка. Плюсы: простое наследование от предка к потомку. Минусы: нельзя получить полную структуру дерева статей и построить путь от корня дерева до конкретного элемента.
  • Nested Sets. В таблицу с данными добавляются сразу три поля: ID предка, ID потомка, уровень элемента. Плюсы: паттерн подходит для хранения направленных деревьев. Минусы: сложно удалять и перемещать отдельные элементы.
  • Materialized Path. В таблицу вносится текстовая строка, которая содержит полный путь — от корня дерева до текущего элемента. Плюсы: быстрая выборка части дерева. Минусы: сложно удалить или переместить узел дерева.
  • Closure Table. Создается отдельная таблица, которая хранит ID текущей записи и ID записи прямого потомка. По сути это вариант паттерна Adjacency List, но с использованием сторонней таблицы.

Взвесили все плюсы и минусы паттернов и остановились на Materialized Path — он максимально соответствовал нашим требованиям. Для реализации паттерна выбрали ltree, модуль PostgreSQL, который ускоряет и упрощает работу с иерархическими структурами. А для отрисовки дерева в 2D формате использовали библиотеку Viz.js. Она легко настраивается и может быстро отрисовать до 1500-2000 узлов дерева статей.

Дерево статей

Пока работали над деревом статей столкнулись с вопросом: сколько уровней вложенности отображать в окне, чтобы сохранить читабельность информации? В итоге сделали 4 уровня вложенности. Затем создали для статей стандартные компоненты:

  • название научной работы
  • автор: имя, научное звание
  • даты создания и последних изменений текста
  • собственно текст научной статьи
  • степень достоверности и её обоснование
  • комментарии к тексту
  • место статьи в иерархии всех материалов

Как сегментировали пользователей

Мы разделили пользователей системы на три сегмента, каждый со своим уровнем доступа.

  • Читатели — неавторизованные юзеры. Используют веб-портал, чтобы найти и почитать научные статьи. Могут оставить запрос на сайте “Хочу стать автором”.
  • Авторы/Редакторы — авторизуются через логин и пароль. Могут оставлять комментарии к статьям, добавлять и редактировать материалы ниже того узла, к которому имеют доступ, то есть, в пределах своего поддерева.
  • Администраторы — авторизованные пользователи. Управляют системой целиком. Добавляют, редактируют и удаляют статьи по всему дереву, модерируют списки авторов.

Для сегментации юзеров использовали подход к разделению прав доступа RBAC (Role Based Access Control) из ядра Yii2.

Сегментация юзеров

Результат

Система хранения статей — нестандартный проект. Мы постоянно экспериментировали с альтернативными библиотеками для работы с деревом статей — пробовали Cytoscape.js, Sigma js, Alchemy js, D3.js. Изучили новые технологии: ltree — модуль PostgreSQL для хранения дерева статей, и библиотеку Viz.js для отрисовки дерева в формате 2D. Чтобы вписаться в ограниченный бюджет, обсудили с клиентом и убрали из проекта несколько второстепенных фич: тэги по статьям, историю поиска, FAQ, но основной функционал реализовали в полном объёме:

  • пользователи в системе регистрируются и проходят авторизацию
  • просматривают и редактируют статьи
  • ищут нужные материалы по ключевому слову
  • создают обзоры статей — материалы, объединённые одной темой
  • добавляют обоснования к статьям

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

Стек технологий

PostgreSQL, PHP 7.2, Yii2, Bootstrap, ltree, Viz.js, Sphinx

Комментарии

комментарии