Урок 8. Дополнительные возможности
Contents
Урок 8. Дополнительные возможности#
В данном уроке рассматриваются:
Поиск по шаблону
Универсальный фильтр
Работа с файлами
Точки расширений
Проектное переопределение кода
Шаблоны thymeleaf
Логирование
Мониторинг производительности
SSH-сервис сервера приложений
Локализация приложений
Миграция данных
Поиск по шаблону#
Руководство разработчика: Сервисные возможности для классов # Поиск по шаблону
Универсальный фильтр#
Универсальный фильтр - сервис позволяющий осуществлять фильтрацию в списках. Позволяет фильтровать записи по коллекциям и значениям атрибутов объектов, на которые ссылаются объекты текущего класса.
Работа с файлами#
Сервис прикрепленных файлов позволяет прикреплять к объектам класса произвольные файлы, которые сохраняются в специальном хранилище на сервере и сопоставляются с конечным объектом-владельцем.
Руководство разработчика: Сервисы класса # Сервис прикрепленных файлов
Шаблоны Thymeleaf#
Шаблонизатор Thymeleaf используется для реализации наследования разметки выборки.
Руководство разработчика: Выборки # Использование шаблонов в разметке
Кроме использования шаблонизации в разметке, есть возможность использования шаблонов и в прикладном коде, например, формировать текст для html-фреймов.
Точки расширений#
Функционал для исполнения кода в модулях, от которых нет зависимости.
Руководство разработчика: Дополнительные возможности # Точка расширения
Проектное переопределение кода#
С помощью проектного переопределения возможно заменить оригинальные выборки/отображения или исполняемые методы проектными.
Руководство разработчика: Дополнительные возможности # Проектное перекрытие кода Api, Avi, Lib, Pkg
Логирование#
Для логирования существует сразу несколько инструментов:
Логирование через
Btk_Log
Использует специальную коллекцию переменной ссылочности
Btk_Log
и пишет данные в базу. Для логирования коллекция подключается как обычно, после чего доступны для использования методы вставки записей через обычные транзакции или автономныеЛогирование сервера приложений
Использует
Logger
сервера для вывода информации в консоль. Для логирования есть методыtrace
,debug
,info
,warn
иerror
, которые сохраняют в консоли сервера переданные сообщения с соответствующим уровнем.Пример использования -
_logger.info("Пересчет регистра прав ролей")
Логирование в инфо-панель
Использует
InfoLog
приложения для записи информации в лог сообщений. Для вывода сообщений создано отображениеBtk_InfoLogAvi#Default
, которое принято выводить на отдельной панели для основной выборки приложения в нижней части. Для логирования есть методыinfo
,warn
,error
иconfirm
, которые сохраняют в логере переданные сообщения с соответствующим уровнем.Пример использования -
application.infoLog.error("Отмена загрузки файла")
Пример открытия инфо-панели -
val vMaster = application.mainSelection if (vMaster.form.findSelection(Btk_InfoLogAvi.default()) == null) { vMaster.createPanelBuilder(Btk_InfoLogAvi.default()).align(Align.bottom).toggle() }
Вручную инфо-панель можно открыть/закрыть из меню
Сервис -> Открыть информационную панель
Логирование действий пользователя
Используется для отслеживания процесса выполнения запросов и подстановки параметров, последовательности вызова операций и открытия форм.
Руководство разработчика: Отладка приложений # Логирование на сторону клиента
Мониторинг производительности#
Руководство разработчика: Отладка приложений # Мониторинг производительности
Наиболее часто используется VisualVM для поиска узких мест в части обращений к базе данных. Пример результата мониторинга производительности с использованием VisualVM
:
По данным можно определить наличие одинаковых повторяющихся обращений к базе данных или запросы, которые выполняются слишком долго, для дальнейшей оптимизации работы бизнес-логики
SSH-сервис сервера приложений#
Руководство разработчика: Сервисы сервера приложений # SSH консоль сервера
Локализация приложений#
Руководство разработчика: Сервисы сервера приложений # SSH консоль сервера
Миграция данных#
Практическое задание#
Поиск по шаблону#
Для книг добавьте поле «Описание» в перечень полей, по которым будет работать поиск.
Проверьте, что при вводе части описания книги осуществляется подбор книги в ссылочном поле.
Для книг переопределите метод поиска по шаблону, сделайте возможность поиска по автору и году публикации книги.
Например, при вводе значения
Иванов 2002
искались книги, чей авторИванов
и год публикации2002
Для этого:
Переопределите метод поиска по шаблону в
Api
классаКнига
Если текст не содержит пробелов, то вызывайте стандартный метод поиска по шаблону.
Входящий текст бейте на 2 части, определяя автора и год выпуска.
Если вторая часть текста - число, то:
осуществите поиск авторов по первой части введенного текста (вызовите метод поиска по шаблону)
если авторы найдены, то запросите книги по этим авторам, чей год публикации подходит под условие поиска.
если записей не найдено, то вызывайте стандартный метод поиска по шаблону
Проверьте, что при вводе автора и года выпуска в ссылочное на книгу поле осуществляется новая логика поиска (в позициях документа).
Примечание
Для проверки, что строка является числом, используйте метод
org.apache.commons.lang3.math.NumberUtils#isCreatable
Универсальный фильтр#
Отключите доступность фильтрации по полю «Описание» для списка книг.
Для книг подключите новую коллекцию универсального фильтра, позволяющую фильтроваться по позициям заказов
Lbr_InOrderDet
.Из списка авторов реализуйте операцию открытия книг текущего автора, для этого передайте в открываемый список книг условие универсального фильтра, наложенное по полю
idAuthor
Работа с файлами#
Создайте на диске
C
папкуstorage
и настройте в системе файловые хранилища, указав данный путьc:\storage
и тип хранилищаЛокальное
Руководство разработчика: Сервисы класса # Файловое хранилищеВ odm класса
Lbr_InAct
настройте сервис прикрепленных файлов в простом режиме.Запустите кодогенерацию, скомпилитесь, обновите код, библиотеки, orm.
В справочнике закладок найдите закладку с системным именем
Btk_AttachItemAvi.List_SimpleAttach
и добавьте в детализацию классLbr_InAct
В справочнике типов объекта отфильтруйтесь по классу
Lbr_InAct
и для найденных типов настройте новую закладкуПрикрепленные файлы
После сброса всех кэшей, переоткройте карточку накладной и на новой закладке попробуйте добавить файлы (например
readme.txt
)
Точки расширений#
Добавьте scala class для расширений
Lbr_BtkExt
(шаблон для создания Global Ext)Добавьте расширением метода
deleteObjectTypeBefore
, в котором будет проверка, что для удаляемого типа объекта нет документов, в которых он был бы указан.
Проектное переопределение кода#
Переопределите в модуле
lbr
классBs_PersonAvi
Создайте
avm
-файл, и унаследуйте его от базовойavm
используя язык шаблонов.Добавьте в переопределенную выборку фильтр-галку «С невыполненными приходными накладными». При включенном фильтре должны выводиться только те записи, на которые есть ссылки в документах
Lbr_InAct
с состоянием < 300Убедитесь, что при открытии списка физических лиц выводится новый фильтр (список можно открыть из карточки Приходной накладной - атрибута «Библиотекарь»)
Логирование#
В позициях возврата книг
Lbr_InOrderDet
на создание записей по мультиселекту добавьте запись в инфо-панель с перечнем книг, добавленных по операции.При создании позиции
Lbr_InOrderDet
должна открываться инфо-панель, если она закрыта.
Мониторинг производительности#
Подключите
VisualVM
к запущенному серверуЗапустите запись отслеживания соединений с БД
Добавьте книги в позиции возврата книг
Lbr_InOrderDet
и посмотрите результат мониторинга
SSH-сервис сервера приложений#
Используя Putty подключитесь к SSH-серверу
Подключитесь к базе данных для выполнения сервисных операций
Выполните создание/обновление объектов схемы БД
Миграция данных#
Создайте миграционный пакет для модуля
lbr
Добавьте в него
upTask
, в котором для всех объектов классаLbr_Publisher
, которые не входят не в одну из групп, будет регистрироваться запись вBtk_ObjectGroup
и устанавливаться корневая группа класса.Запустите миграцию по модулю
lbr
черезexternal tools
-Run Migrations
Создайте миграционные скрипты модуля
lbr
Напишите скрипт, который обновит для таблицы
lbr_book
колонкуsDesc
. Для всех записей, у которых не заполнена это колонка, установите в него значение колонкиsCaption
Запустите миграцию по модулю
lbr
черезexternal tools
-Run Migrations