Главная/Портфолио/Веб-портал для “Космолаб”: система хранения научных статей
КосмолабВеб-портал для “Космолаб”: система хранения научных статей
С чего всё начиналось
Веб-разработка портала для хранения научных статей — такой была задача от наших новых партнеров, компании «Космолаб». Клиент решил выстроить статьи на портале в виде дерева. Эта структура казалась наиболее удачной и наглядной, чтобы студенты и сотрудники научных институтов могли читать и комментировать тексты, искать нужные сведения, присваивать материалам разные степени достоверности.
Вариант дерева статей — сложный с точки зрения разработки, но куда удобнее для пользователей. Мы пошли навстречу клиенту и всё закрутилось.
Решение
Мы проанализировали требования к веб-порталу и составили подробное ТЗ с мокапами. Обсудили с заказчиком технологии, которые будем использовать на проекте. Изначально планировали работать на 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