readme.md

    Описание

    OneCore - это фреймворк на движке onescript, созданный для разработки web-приложений любой сложности, используя компонентный подход.

    Проект находится в активной разработке. Фреймворк перешёл на onescript 2.0!!!

    Установка

    Перед установкой у вас уже должна быть установлена платформа onescript версией не менее 2.0RC4 ветка develop. Рекомендовано использовать OVM для установки платформы onescript.

    1. Скачать архив и распаковать в корень проекта, в корне проекта должен быть каталог “onecore”. (временно)
    2. Создать файл main.os и заполнить по примеру:
    #Использовать "onecore"
    
    Приложение.Запустить();
    
    1. Создать файл oscript.cfg со следующим содержимым:
    lib.additional=./oscript_modules
    
    1. Создать файл packagedef со следующим содержимым (временно):
    Описание.Имя("onecore")
    	.Версия("0.1.2")
    	.ЗависитОт("json")
    	.ЗависитОт("strings")
    	.ЗависитОт("entity")
    	.ЗависитОт("cli")
    	.ЗависитОт("fs")
    	.ЗависитОт("logos");
    ;
    
    1. Выполнить консольную команду: opm install -l

    Структура проекта

    └── Компонент                  # Каталог компонента, имя каталога соответствует имени компонента
        ├── Модели                 # Модели ORM (не реализовано)
        ├── Представления          # Представления данных, они же контроллеры
        ├── Ресурсы                # Статические данные (скрипты, картинки и т. д)
        ├── Сервисы                # Произвольные сервисы, реализующие бизнес логику
        ├── Шаблоны                # HTML шаблоны для шаблонизатора
        └── МодульКомпонента.os    # Скрипт модуля компонента
    ├── main.os                    # Стартовый скрипт
    ├── oscript.cfg                # Конфигурационный файл onescript
    └── settings.json              # Системный файл с информацией о текущей версии
    

    В корне каталога проекта создаются каталоги компонентов, внутри которых реализуется логика отдельно взятого компонента. При разработке компонентов желательно соблюдать изолированность. В служебных каталогах компонента (Модели, Представления, Ресурсы, Сервисы, Шаблоны) разрешено использовать вложенные каталоги для удобной структуризации логики.

    Начало работы

    Создание любого приложения на onecore начинается с создания компонента, так как компонент приложения является обособленной функциональной областью, при желании он может быть один, но не советую так поступать.

    Создание и регистрация компонента

    Для создания компонента необходимо создать каталог в корне проекта и указать имя каталога в соответствии с именем планируемого компонента, например “Ядро”, и создать служебные каталоги компонента (см. Структура проекта), также скрипт МодульКомпонента.os с следующим содержимым:

    Процедура ПриИнициализацииКомпонента() Экспорт
        // Код, выполняемый при инициализации приложения до его запуска
    КонецПроцедуры
    
    Процедура ПриФормированииМаршрутов(Маршруты) Экспорт
        // Код, заполняющий коллекцию маршрутов
    КонецПроцедуры
    

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

    #Использовать "onecore"
    
    МенеджерКомпонентов = Приложение.МенеджерКомпонентов();
    МенеджерКомпонентов.Инициализировать("Ядро", "core");
    
    Приложение.Запустить();
    

    При выполнении процедуры “Инициализировать” класса “МенеджерКомпонентов”, будет вызвана процедура “ПриИнициализацииКомпонента” модуля компонента, в данной процедуре можно выполнять любые действия, например объявить настройки приложения для файла settings.json.

    Маршрутизация и создание представления (контроллера)

    Для того, чтобы ваше приложение принимало запросы, необходимо создать контроллер, контроллеры в onecore называются представлениями, так как они обязаны формировать ответ, в котором данные могут быть представлены в разном формате, например как html, или внешний api для интеграции и т. д.

    Для того, чтобы создать контроллер, необходимо в каталоге “Представления” вашего компонента создать скрипт и назвать его так, как далее вы хотите его использовать, например “Приветствие.os” и обязательно заполнить его по шаблону:

    Перем Контекст;
    
    Процедура GET() Экспорт
        // Код обработчика запроса
    КонецПроцедуры
    

    Процедуры обработчиков запросов должны обязательно называться в соответствии с методами HTTP, которые необходимо обработать (GET, POST, PUT, DELETE, HEAD, CONNECT, OPTIONS, PATCH, TRACE), маршрутизатор самостоятельно запустит выполнение нужной процедуры в зависимости от метода поступившего запроса.

    Для тестирования сразу напишем код обработчика:

    Процедура GET() Экспорт
        Контекст.Ответ.ТипКонтента = "html";
        Контекст.Ответ.Записать("<h1>Привет мир!!! Как банально...</h1>");
    КонецПроцедуры
    

    На данный момент мы имеем объект контроллера, но не понятно, как приложение будет понимать, что запрос адресован именно ему, для этого существует маршрутизация, и указать соответствие адреса с обработчиком мы должны в том же модуле компонента в процедуре “ПриФормированииМаршрутов”:

    Процедура ПриФормированииМаршрутов(Маршруты) Экспорт
        Маршруты.Добавить("/", "Приветствие");
    КонецПроцедуры
    

    Согласно тому, что мы указали, сервер, при обращении клиента к корневому адресу, будет переадресовывать выполнение в наш контроллер. Процедура “Добавить” принимает в себя 2 параметра, первый - это шаблон адреса, второй - это строковый путь к объекту обработчика запроса через точку, при этом, если бы у нас объект обработчика находился не в корневом каталоге “Представления”, а например в каталоге “Тестирование”, тогда указание маршрута выглядило бы так Маршруты.Добавить("/", "Тестирование.Приветствие");.

    Шаблоны адресов могут содержать параметы, например: /users/<Число:Идентификатор>, что позволяет нам создавать динамические маршруты, сами же параметры части маршрута передаются в качестве параметров в обработчик запроса:

    Процедура GET(Идентификатор) Экспорт
        Контекст.Ответ.ТипКонтента = "html";
        Контекст.Ответ.Записать("Идентификатор пользователя" + Строка(Идентификатор));
    КонецПроцедуры
    

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

    Запуск и отладка

    Для запуска приложения достаточно выполнить команду oscript main.os, и перейти по адресу, указанному в консоли. Второй вариант - это настроить отладку, для этого нужно создать файл отладки по инструкции платформы onescript и указать следующее содержимое:

    {
        // Используйте IntelliSense, чтобы узнать о возможных атрибутах.
        // Наведите указатель мыши, чтобы просмотреть описания существующих атрибутов.
        // Для получения дополнительной информации посетите: https://go.microsoft.com/fwlink/?linkid=830387
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Приложение",
                "type": "oscript",
                "request": "launch",
                "program": "${workspaceRoot}\/main.os",
                "args": [],
                "cwd": "${workspaceRoot}",
                "env": {},
                "runtimeExecutable": null,
                "runtimeArgs": [],
                "debugPort": 2801
            }
        ]
    }
    

    Далее запускаем отладку привычным нам способом.

    Разработка и использование сервисов

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

    Например, создадим несколько сервисов:

    └── Компонент
        └── Сервисы
            └── ОбщегоНазначения
                ├── ДатаВремя.os
                └── СтроковыеФункции.os
    

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

    &Сервис("ОбщегоНазначения.СтроковыеФункции")
    Перем СтроковыеФункции;
    

    Следует учесть, что если сервис используется в объекте компонента, который находится в том же компоненте, что и сам сервис, то указание параметра аннотации “Сервис” должен писаться в сокращенном виде:

    &Сервис("ОбщегоНазначения.СтроковыеФункции")
    Перем СтроковыеФункции;
    

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

    &Сервис("Ядро.Сервисы.ОбщегоНазначения.СтроковыеФункции")
    Перем СтроковыеФункции;
    

    Далее сервисы можно использовать в других сервисах и в представлениях любых компонентов приложения.

    Статические файлы

    Встроенный web-сервер позволяет отдавать статические файлы, для этого необходимо разместить файл в каталоге “Ресурсы” вашего компонента. При этом струкура каталогов в каталоге “Ресурсы” учитывается при генерации маршрутов.

    Адрес к каждому статическому файлу будет формироваться по следующему шаблону: <адрес сервера или ip>/<латинское имя компонента>/<путь к статическому файлу>

    Например, если в компоненте Ядро (core), в ресурсах размещен файл index.html: http://127.0.0.1:5555/core/index.html

    Если необходимо, чтобы статический файл был доступен в корне приложения, то есть возможность при инициализации компонента установить третий параметр в “Истина”:

    #Использовать "onecore"
    
    МенеджерКомпонентов = Приложение.МенеджерКомпонентов();
    МенеджерКомпонентов.Инициализировать("Ядро", "core", Истина);
    
    Приложение.Запустить();
    

    Далее все ресурсы компонента будут доступны по нескольким адресам: http://127.0.0.1:5555/index.html и http://127.0.0.1:5555/core/index.html

    Перехватчики (Middleware)

    Фреймворк позволяет перехватывать выполнение запроса перед обработкой представлением и перед отправкой ответа, это позволяет гибко управлять данными для отправки. Перехватчики отрабатывают в той очередности, в которой они указаны разработчиком, при этом сначала запускаются процедуры “ПередВыполнениемПредставления” перед отправкой в представление, и уже после обработки представлением в том же порядке выполняются процедуры “ПослеВыполненияПредставления”. Для написания обработчиков перехватчиков используются сервисы, а в стартовом файле прописываются пути к сервисам перехватчиков. Для того, чтобы обработать событие необходимо создать экспортные процедуры “ПередВыполнениемПредставления” или/и ПослеВыполненияПредставления, указав в них 2 параметра: Контекст и ПродолжитьОбработку. Для инициализации сервисов перехватчиков нужно воспользоваться объектом “МенеджерОбъектов”, получить его можно с помощью модуля глобального контекста “Приложение”, “Приложение.МенеджерКомпонентов()”.

    Пример стартового скрипта:

    #Использовать "onecore"
    
    МенеджерКомпонентов = Приложение.МенеджерКомпонентов();
    МенеджерКомпонентов.Инициализировать("Ядро", "core", Истина);
    
    МенеджерОбъектов.ИнициализироватьПерехватчики("Ядро.Перехватчики.ПроверкаТокена");
    МенеджерОбъектов = Приложение.МенеджерОбъектов();
    
    Приложение.Запустить();
    

    В метод ИнициализироватьПерехватчики менеджера объектов можно передавать сервисы через запятую или массивом строк, как вам будет удобнее.

    Пример сервиса перехватчика по пути: Ядро/Сервисы/Перехватчики/ПроверкаТокена.os

    Процедура ПередВыполнениемПредставления(Контекст, ПродолжитьОбработку) Экспорт
    
        Лог.Отладка("Проверяю токен");
        Токен = Контекст.Запрос.Заголовки.Получить("Token");
    
        Если НЕ ЗначениеЗаполнено(Токен) Тогда
            Ответ.Отправить(401);
            Лог.Отладка("Отсутствует токен в заголовках");
        КонецЕсли;
    
        Лог.Отладка("Токен типа проверен");
    
    КонецПроцедуры
    
    Процедура ПослеВыполненияПредставления(Контекст, ПродолжитьОбработку) Экспорт
    
        Лог.Отладка("Что-то делаем после того, как обработалось представление");
    
    КонецПроцедуры
    

    Перед выполнением каждой процедуры сервиса перехватчика проверяется признак отправленности ответа, в случае, если ответ отправлен, процедура не будет выполнена. Если необходимо прервать дальнейшее выполнение обработки запроса необходмо параметр “ПродолжитьОбработку” установить в Ложь.

    Описание

    Фреймворк на движке onescript, созданный для разработки web-приложений любой сложности, используя компонентный подход.

    Конвейеры
    0 успешных
    0 с ошибкой