====== Техническое задание на разработку ====== ===== Техническое задание на разработку LSS протокола ===== Разработать LSS протокол для обмена данными и управляющими командами между LSS визуализатором, размещенном на клиенте и слоем бизнес логики, размещенном на сервере. ==== Общие требования к LSS протоколу ==== Протокол должен удовлетворять следующим требованиям: * Использовать в качестве транспортного слоя HTTP и/или HTTPS. * Использовать XML представление. * Использовать кодировку UTF-8. * Протокол должен быть независим от деталей реализации как LSS визуализатора, так и от деталей реализации слоя бизнес логики. * Протокол должен быть нагляден и понятен человеку (программисту, разработчику, тестировщику), даже если эта наглядность приведет к потерям в производительности компьютера. * Протокол должен опираться на паттерн REST. * Протокол должен опираться на паттерн MVC. * Протокол должен поддерживать защиту от CRF атак посредством использования CRF ключа. * Должен быть разработан унифицированный LSS формат данных для единообразного и независимого от особенностей площадок представления данных. ==== Требования к запросам ==== Запрос это то, что LSS визуализатор направляет слою бизнес логики, размещенному на сервере. * Запросы должны иметь простую, унифицированную структуру: * заголовок запроса, содержащий основное описание требуемых действий. * параметры запроса, позволяющие передать на сервер дополнительную информацию, требуемую выполнения запроса. * Необходимо разработать запросы для реализации аутентификации в системе. * Необходимо разработать запросы для получения визуализатором декларативных описаний наборов строк и экранных форм. * Необходимо разработать запросы для чтения и правки данных наборами строк. * Необходимо разработать служебные запросы, обрабатываемы на клиенте и не отсылаемые на сервер, например запрос на закрытие активной экранной формы. ==== Требования к ответам ==== Ответ это то, что слой бизнес логики отправляет LSS визуализатору в качестве результата запроса. * Необходимо разработать ответ, содержащий декларативное описание экранной формы. Это описание должно состоять из следующих разделов: * Раздел иерархического описания наборов строк, задействованных в экранной форме. * Раздел описания запросов уровня экранной формы, представляющие собой именованные цепочки последовательно выполняемых запросов. * Раздел описания внешнего вида экранной формы, представляющий собой вложенную иерархию панелей, связанных с соответствующими наборами строк и предназначенными для отображения их содержимого. * Необходимо разработать ответ, содержащий декларативное описание табличного набора строк. Это описание должно состоять из следующих разделов: * Раздел описания полей набора строк. * Раздел описания поддерживаемых набором строк запросов. * Необходимо разработать ответ, содержащий декларативное описание древовидного набора строк. Это описание должно быть устроено следующим образом: * Строки древовидного набора строк должны различаться по типам. * Для каждого типа строк описание должно быть устроено аналогично описанию табличного набора строк: описание полей и описание запросов. * Необходимо разработать ответ, содержащий данные - результаты выполнения запроса: * Необходимо разработать вариант ответа, содержащий данные, уже сохраненные в базе и позволяющий передать в визуализатор текущее актуальное состояние данных в базе на сервере. * Необходимо разработать вариант ответа, содержащий данные, еще не сохраненные в базе, которые будут отображены визуализатором и сохранены только при очередном сохранении текущей строки. * Необходимо разработать вариант ответа, содержащий сведения об удаленных в результате выполнения запроса строках. * Необходимо разработать ответ, описывающий неуспешность выполнения запроса. * Необходимо разработать ответ, описывающий необходимость выполнить экранной формой или набором строк определенный запрос с заданными значениями параметров запроса. ==== Требования к формату представления данных ==== LSS протокол должен быть реализован посредством XML описания. Данные в нем должны описываться в виде строк. Нужно унифицированное описание строкового представления для всех используемых типов данных. * Разработать список допустимых в протоколе типов данных. * Разработать унифицированный формат представления числовых данных. * Разработать унифицированный формат представления дат. ===== Техническое задание на разработку LSS визуализатора ===== ==== Общие требования ==== * LSS визуализатор должен быть реализован в виде одностраничного сайта, использующего JavaScript и AJAX. * Необходимо обеспечить высокую степень совместимости с различными web-браузерами, в том числе с Internet Explorer, браузерами на основе Chromium и FireFox. * В качестве библиотеки построения экранных элементов необходимо использовать Dojo Toolkit (лицензия BSD). * В качестве сторонних графических элементов дизайна необходимо использовать ресурсы сайта icons8.ru ==== Требования к модулю взаимодействия с сервером по AJAX ==== * Все взаимодействие по с сервером по LSS протоколу должно происходить через единый модуль, обеспечивающий это взаимодействие посредством AJAX. * Должна быть реализована удобная технология логирования LSS запросов к серверу и ответов на них сервера. * Запросы должны делиться на * синхронные, с принудительным ожиданием ответа * асинхронные, не блокирующие работу визуализатора до получения ответа * модуль взаимодействия должен анализировать ответы и направлять их для последующей обработки в соответствующую экранную форму или набор строк. * модуль взаимодействия должен реализовать механизм отправки на сервер выбранных пользователем файлов и скачивания файлов с сервера. ==== Требования к модулю табличного набора строк ==== * Набор строк должен обеспечить работу с данными согласно LSS протоколу. * Все строки в наборе строк должны иметь уникальный id * Необходимо реализовать несколько стратегий формирования уникального id строки: * При создании пустой строки, до ее сохранения в базе данных - как результат запроса append * При первом сохранении строки в базе данных - как результат первого save, при этом до сохранения у строки значение id временное, которое меняется после сохранение на постоянное * Набор строк должен обеспечить построение списка полей и списка допустимых запросов по декларативному XML описанию набора строк. * Набор строк должен обеспечить хранение данных в виде упорядоченной таблицы, с удобным поиском по уникальному ключу, нахождением первой, последней, следующей и предыдущей строки. * Набор строк должен обеспечить оповещение визуальных элементов экранной формы о необходимости перерисовки при изменении своего содержимого. При этом следует разделять изменения только в полях текущей строки и изменения, затрагивающие и другие строки. * Набор строк должен обеспечивать выполнение запросов посредством отправки запросов на сервер через единый модуль взаимодействия и обеспечения приема и обработки ответов. * Набор строк должен обеспечить возможность постраничной работы с данными. * Набор строк должен обеспечить автоматический вызов сохранения накопившихся изменений при смене текущей строки или при передаче фокуса на другой набор строк. * Набор строк должен обеспечить автоматическую перечитку подчиненных наборов строк при смене текущей строки. * Должна быть реализована возможность работы набора строк в качестве фильтра: * У такого набора строк должна быть одна и только одна строка. Соответственно, недопустимы операции добавления и удаления строк. * Подчиненные наборы строк автоматически перечитываются при смене значения любого поля. * Набор строк должен обеспечить работу механизма пометок строк - хранение списка помеченных строк, возможность отправки этого списка на сервер, возможность корректировки этого списка посредством поступивших ответов от сервера. * Набор строк должен обеспечивать контроль доступности правки в зависимости от признаков readonly, на уровне всего набора строк, строки и поля. ==== Требования к модулю древовидного набора строк ==== * Древовидный набор строк должен быть сделан на основе табличного. * Он должен обеспечивать работу с разными типами строк. * Для каждого типа строк свой набор полей и свой набор допустимых запросов. * Должна быть обеспечена возможность хранения данных в виде дерева. * Должна быть обеспечена навигация по древовидным данным. * Предполагается уникальность id среди дочерних строк одного родительского узла. ==== Требование к модулю визуальных панелей ==== Необходимо разработать панели следующих типов: * Необходимо разработать панель, обеспечивающую отображение и правку данных в виде таблицы * Необходимо разработать панель, обеспечивающую отображение и правку данных в виде полей текущей строки набора строк * Необходимо разработать панель, обеспечивающую отображение дерева из древовидного набора строк * Необходимо разработать панель, обеспечивающую отображение произвольного HTML содержимого по адресу * Необходимо разработать панели, обеспечивающие размещение внутри себя других панелей * панель TAB размещающая другие панели в виде закладок. * панель SCROLL обеспечивающая последовательное вертикальное размещение дочерних панелей с возможностью прокрутки при необходимости. * панель PANEL обеспечивающая размещение дочерних панелей слева, справа, снизу, сверху и по середине * Необходимо разработать панель FORM обеспечивающую размещение внутри себя экранной формы Панели должны обеспечивать: * Панели должны быть привязаны к набору строк и отображать его содержимое. * Панели должны обеспечивать перерисовку содержимого при получении соответствующего оповещения от набора строк. * Необходимо разработать механизм, позволяющий разрабатывать и регистрировать в системе новые типы панелей, делая тем самым их доступными для использования в визуализаторе. * Панели должны уметь автоматически рассчитывать свои размеры по своему содержимому. * Необходимо разработать механизм изменения видимости панели по условию, задаваемому предикатом. * Необходимо разработать механизм цветовых схем, позволяющий изменять цветовые решения дизайна панелей. * Необходимо разработать механизм размещения на панелях управляющих кнопок, позволяющих запускать выполнение запросов. * В рамках экранной формы только одна панель должна быть текущей. На нее направляется ввод с клавиатуры. Связанный с ней набор строк считается текущим, при смене текущего набора строк несохраненные изменения в нем должны отписываться на сервер посредством вызова запроса save. ==== Требование к модулю экранных форм ==== * Модуль экранных форм должен обеспечить построение экранной формы по декларативному описанию согласно LSS протоколу: * Обеспечить построение описанных в экранной форме наборов строк. * Обеспечить построение описанных в экранной форме визуальных панелей. * Сформировать список именованных запросов уровня формы. * обеспечить построение наборов строк справочников, на основании описания полей, требующих для своей работы начитки данных из справочников. * Модуль экранных форм должен обеспечить вызов именованных цепочек запросов уровня формы. * Модуль экранных форм должен обеспечить перерисовку панелей по оповещениям, поступающим от источников данных. * Модуль экранных форм должен обеспечить механизм переключения от одной экранной формы к другой и механизм закрытия экранной формы. * Модуль экранных форм должен обеспечить механизм смены фокуса ввода между визуальными панелями. ==== Требование к модулю виджетов для разных типов полей ==== Необходимо разработать следующие виджеты для отображения и редактирования полей: * Поле для отображения и редактирования строк. * Поле для отображения и редактирования дат с выпадающим диалогом календаря. * Поле для отображения и редактирования чисел. * Поле многострочного редактора. * Поле выбора из справочника. * Поле выбора из фиксированного списка значений. * Поле галочки. * Поле радио-группы. * Поле отображения иконки по имени иконки. * Поле справочника множественного выбора. Виджеты полей должны обеспечивать: * Автоматическую синхронизацию в обе стороны со значениями полей набора строк. * Удобное управление с помощью клавиатуры без использования мыши. * Автоматический расчет высоты многострочных элементов. ===== Техническое задание на разработку LSS сервера ===== ==== Общие требования ==== * LSS сервер должен работать по HTTP и/или HTTPS. * LSS сервер должен обеспечивать корректную обработку LSS запросов. * LSS сервер должен обеспечивать работу с SQL серверами PostgreSql, MySql, MSSQL. * LSS сервер должен работать на основе паттерна REST. * Необходимо использовать язык программирования PHP, не ниже 7. * В качестве основного web-сервера следует использовать Apache. * LSS сервер должен быть кроссплатформенным - работать как под Windows так и под Linux. * LSS сервер должен быть явно разделен на: * Общие для всех прикладных проектов библиотечные элементы. * Элементы, уникальные для каждого прикладного проекта. ==== Требования к контроллерам источников данных ==== Контроллер источника данных это экземпляр класса, обеспечивающий обработку LSS запросов к данным. Обычно источник данных соответствует таблице SQL сервера. * Необходимо реализовать механизм, позволяющий по имени источника данных найти и загрузить в память соответствующий контроллер источника данных. * Необходимо реализовать механизм описания в виде массива списка полей источника данных. * Необходимо реализовать механизм описания в виде массива списка поддерживаемых источником данных запросов. * Необходимо реализовать механизм прав, проверяющий доступность выполнения источником данных запроса для текущего пользователя. * Необходимо реализовать формирование контроллером источника данных декларативного описания согласно LSS протоколу, на основе описателей полей и описателей поддерживаемых запросов. * Необходимо реализовать механизм формирования SQL запроса SELECT для источника данных. * Необходимо настроить механизм фильтров - дополнительных условий в секции WHERE запроса SELECT на основе переданных в запросе к источнику данных значений параметров фильтра. * Необходимо реализовать механизм формирования SQL запросов INSERT, UPDATE, DELETE для правки источника данных, на основе описателей полей и переданных в запросе параметров. * Необходимо реализовать механизм выполнения адресованных источнику данных запросов и получения результатов в виде массива строк - для удобного использования источников данных на стороне сервера при обработке промежуточных результатов * Необходимо реализовать механизм преобразования массива строк, являющегося результатом выполнения запроса, в XML согласно LSS протоколу. * Необходимо реализовать механизм, позволяющий описывать структуру базы данных в виде описателей, по этим описателям автоматически строить контроллеры источников данных базовой функциональности. * Необходимо наладить механизм внесения изменения в автоматически сформированные контроллеры источников данных. Нужна возможность ==== Требования к контроллерам экранных форм ==== Контроллер экранной формы это экземпляр класса обеспечивающий обработку LSS запросов адресованных к экранной форме. * Необходимо реализовать механизм, позволяющий по имени экранной формы найти и загрузить в память соответствующий контроллер экранной формы. * Контроллер экранной формы должен обеспечивать формирование декларативного описания экранной формы в формате LSS протокола, с учетом переданных в соответствующем запросе значений параметров. * Необходимо реализовать механизм получения декларативного описания экранной формы из соответствующего XML файла шаблона. * Необходимо реализовать механизм обработки запросов, адресованных контроллеру экранной формы. * Необходимо реализовать возможность дополнительной обработки запросов, адресованных источникам данных, размещенным в экранной форме. ==== Требования к контроллерам отчетов ==== Контроллер отчета это экземпляр класса, обеспечивающий анализ входных параметров и формирование соответствующего отчета. * Необходимо реализовать механизм, позволяющий по имени отчета найти и загрузить в память соответствующий контроллер отчета. * Необходимо реализовать интерфейс разбора передаваемых через url входных параметров. * Контроллер отчетов должен уметь формировать отчет в виде HTML для отображения на экране. * Контроллер отчетов должен уметь формировать отчет в виде MS Excel и MS Word. Допустимым является вариант формирования HTML, который корректно воспринимается и отображается в Excel и Word. ==== Требования к контроллерам утилит ==== Контроллер утилиты это экземпляр класса, обеспечивающий анализ входных параметров и вызов соответствующей утилиты. Утилита это длительная операция, позволяющая отображать процесс своей работы в виде отображаемого на экране лога. * Необходимо реализовать механизм, позволяющий по имени утилиты найти и загрузить в память соответствующий контроллер утилиты. * Необходимо спроектировать интерфейс разбора передаваемых через url входных параметров. * Необходимо реализовать механизм логирования процесса работы утилиты посредством поэтапной передачи HTML лога для отображения клиентским приложением. * Необходимо спроектировать интерфейс выполнения операции утилиты для удобного наполнения его нужной функциональностью при разработке конкретной реализации утилиты. ==== Требования к контроллерам сервисов ==== Контроллер сервиса это экземпляр класса, обеспечивающий анализ входных параметров и вызов соответствующего сервиса. Сервис это произвольный серверный код взаимодействующий с клиентом по HTTP и/или HTTPS используя паттерн REST. * Необходимо реализовать механизм, позволяющий по имени сервиса найти и загрузить в память соответствующий контроллер сервиса. * Необходимо спроектировать интерфейс разбора передаваемых через url входных параметров. * Необходимо спроектировать интерфейс выполнения сервиса для удобного наполнения его нужной функциональностью при разработке конкретной реализации. ==== Требования к точкам входа ==== Точки входа это PHP скрипты, к которым можно непосредственно обращаться из клиентского приложения. * Весь PHP код, не являющийся точкой входа, должен быть размещен так, что бы к нему нельзя было непосредственно обратиться из клиентского приложения. * Точка входа должна быть организована по принципу подключения и вызова стандартного общего библиотечного элемента, не зависящего от реализации конкретного прикладного приложения. * Необходимо реализовать точку входа для обработки запросов LSS протокола. * Необходимо реализовать точку входа для формирования отчетов. * Необходимо реализовать точку входа для выполнения утилит. * Необходимо реализовать точку входа для вызова сервисов. ==== Требования к ресурсам ==== Ресурсы это статичные файлы, непосредственно доступные по HTTP и/или HTTPS. * В ресурсах должны размещаться файлы, необходимые для развертывания LSS визуализатора. * В ресурсах должны размещаться необходимые JavaScript и CSS библиотеки, например bootstrap/ * В ресурсах должны размещаться необходимые для работы приложения иконки. * В ресурсах должны размещаться CSS стили необходимые для отображения отчетов и утилит. ==== Требования к описанию главного меню системы ==== Описатель главного меню системы должен представлять собой XML файл с древовидным описанием наименований пунктов меню и вызываемым по ним экранным формам. ==== Требования к контроллеру прав ==== Контроллер прав это экземпляр класса, обеспечивающий проверку доступности запрашиваемых возможностей для текущего пользователя с учетом его прав. * Контроллер прав необходимо разработать в виде абстрактного класса, с соответствующими интерфейсами, так, что бы в процессе разработки конкретного прикладного проекта можно было бы породить потомок от этого класса и реализовать в нем систему прав согласно требованиям этого проекта. * Контроллер прав должен обеспечивать интерфейс аутентификацию пользователя, по умолчанию предполагается схема сохранения сведений о пользователе и его правах в сессии. * Контроллер прав должен обеспечивать интерфейс проверки доступности запрашиваемого действия для текущего пользователя. Действие задается 2-мя идентификаторами: * permmode - группирует доступные ресурсы проекта с точки зрения прав * permoper - операция в контексте permmode, например read или write * Необходимо связать контроллеры источников данных с контроллером прав посредством группировки таблиц по permmode и связывания запросов с permoper. * Необходимо связать описатель главного меню системы с контроллером прав посредством назначения пунктам меню соответствующих permmode и permoper. * Необходимо обеспечить проверку доступности по правам в контроллерах экранных форм, отчетов, утилит и сервисов.