From 4fc42bd251c3cab9dfa3f1a7e8a7938477c14b7f Mon Sep 17 00:00:00 2001 From: Evgeny Martynenkov Date: Thu, 10 Aug 2023 22:03:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C=D1=88?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20README.MD?= =?UTF-8?q?=20(#53)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit зпт, пробелы, ссылка --- README.MD | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/README.MD b/README.MD index 8dbdeb9..ddde5e9 100644 --- a/README.MD +++ b/README.MD @@ -2,7 +2,7 @@ Минималистичный веб-сервер, построен на нативном TCPСервер, и работает на желудях. -Зачем это нужно, когда есть OneScript.Web, -CGI и т.д.? Отвечаю - для того, что бы все было на чистом OneScript! И потому, что могу. С полным контролем, от входа двоичных данных на порт, до определения маршрута, получения данных, генерации ответа по шаблону и отправкой обратно клиенту. +Зачем это нужно, когда есть OneScript.Web, -CGI и т.д.? Отвечаю - для того, чтобы все было на чистом OneScript! И потому, что могу. С полным контролем, от входа двоичных данных на порт, до определения маршрута, получения данных, генерации ответа по шаблону и отправкой обратно клиенту. ## Установка @@ -35,7 +35,7 @@ opm install winow - Обрабатывать тело входящего POST запроса. - Работать с печеньками (Cookie). - Работать с сессиями. -- Отдавать статичные файлы(картинки, архивы и т.д.) +- Отдавать статичные файлы (картинки, архивы и т.д.) - Работать с шаблонами ответов (Синтаксис шаблона чем-то похож на jinja2, но сильно упрощен). - Базовая авторизация и управление доступом к страницам по ролям. - Использовать протокол WebSocket @@ -50,7 +50,7 @@ opm install winow ## Хеллоу ворлд ! -От слов - к делу. Что бы понять, как это все работает, давайте сделаем hello-world приложение, которое будет запускаться на localhost:3333 и отвечать простым текстом hello-world. +От слов - к делу. Чтобы понять, как это все работает, давайте сделаем hello-world приложение, которое будет запускаться на localhost:3333 и отвечать простым текстом hello-world. Первым делом, нам нужна точка входа, которая запустит приложение. @@ -151,7 +151,7 @@ app/ИнтерактивныйКонтролПриветствия.os КонецПроцедуры ``` -Файл, который мы только что сделали, описывает определенную точку в адресной строке. При совпадении с которой, перехватывается управление над входящим запросом. Посмотрим поближе. +Файл, который мы только что сделали, описывает определенную точку в адресной строке. При совпадении с которой перехватывается управление над входящим запросом. Посмотрим поближе. ```bsl &Контроллер("/greeter") @@ -164,7 +164,7 @@ app/ИнтерактивныйКонтролПриветствия.os Этот метод имеет аннотацию ```&Контроллер("/greeter")``` как раз указывает, путь от корня, после которого будет осуществлен перехват. -Стоит отметить что аннотация может быть более длинной, что бы отвечать логике описания api. Например вот так ```&Контроллер("/app/api/v1/greeter")``` тоже рабочий вариант, только ходить нужно уже вот сюда http://localhost:3333/app/api/v1/greeter +Стоит отметить что аннотация может быть более длинной, чтобы отвечать логике описания api. Например, ```&Контроллер("/app/api/v1/greeter")``` тоже рабочий вариант, только ходить нужно уже вот сюда http://localhost:3333/app/api/v1/greeter У любого контроллера может быть любое множество методов, которыми он обрабатывает входящий запрос. @@ -173,14 +173,14 @@ app/ИнтерактивныйКонтролПриветствия.os Процедура Приветствие(Запрос, Ответ) Экспорт ``` -Для того, что бы процедура контроллера могла понимать, что ее вызывают из запроса, ее нужно пометить аннотацией ```&ТочкаМаршрута("getparams")```. Где параметр аннотации указывает имя в пути, после которого ей нужно сработать. +Для того, чтобы процедура контроллера могла понимать, что ее вызывают из запроса, ее нужно пометить аннотацией ```&ТочкаМаршрута("getparams")```. Где параметр аннотации указывает имя в пути, после которого ей нужно сработать. -Так же, что бы все получилось, процедура должна отвечать нескольким требованиям: +Так же, чтобы все получилось, процедура должна отвечать нескольким требованиям: - Быть экспортной - Принимать на вход параметры, имена которых ограничены и предопределены. Назначение параметров мы разберем по ходу дела. -```Запрос``` Например хранит всю информацию, которая пришла к нам от клиента. В том числе ```Запрос.ПараметрыИменные``` - соответствие, хранящее значения всех параметров, которые переданы после знака ```?``` +```Запрос```, например, хранит всю информацию, которая пришла к нам от клиента. В том числе ```Запрос.ПараметрыИменные``` - соответствие, хранящее значения всех параметров, которые переданы после знака ```?``` Дальше мы лихо эти параметры читаем. @@ -189,7 +189,7 @@ app/ИнтерактивныйКонтролПриветствия.os Фамилия = Запрос.ПараметрыИменные["familia"]; ``` -Следующий параметр ```Ответ```, в котором собирается все, что будет отправлено обратно клиенту. Например - вот так +Следующий параметр ```Ответ```, в котором собирается все, что будет отправлено обратно клиенту. Например, вот так: ```bsl Ответ.УстановитьТипКонтента("html"); @@ -584,7 +584,7 @@ app/files/fun/zl2.jpg просто не удобно, и мало приличных слов для такого подхода можно подобрать, и ни в одном не будет буквы V. Но у меня есть решение! -Сразу покажу пример, а потом разберем по строчкам. Давайте отобразим страницу, на которой выведем текущее время, совершенно псевдо-случайное число, динамически выведем случайное количество строк, и попробуем поиграться с условиями. +Сразу покажу пример, а потом разберем по строчкам. Давайте отобразим страницу, на которой выведем текущее время, совершенно псевдослучайное число, динамически выведем случайное количество строк, и попробуем поиграться с условиями. Поехали! @@ -673,7 +673,7 @@ app/view/view1.html ``` -Если присмотреться, то шаблон это просто HTML разметка, которую смешали с 1сным кодом. Вот это коктель получился! +Если присмотреться, то шаблон это просто HTML разметка, которую смешали с 1сным кодом. Вот это коктейль получился! Основные принципы разметки: @@ -693,7 +693,7 @@ app/view/view1.html Писать шаблоны круто, но что может быть еще круче? Писать меньше шаблонов, и переиспользовать уже имеющиеся. Представим, что вам в разных местах нужно отображать одну и туже информацию, (таблицы, элементы меню, и т.д.). для решения этой задачи, шаблон имеет секретную функцию ```{{ ВывестиПоШаблону(<Путь до шаблона>, <Модель для шаблона>) }}``` -Давайте покажу как это работает +Давайте покажу, как это работает ``` app/ИнтерактивныйКонтролПриветствия.os @@ -806,7 +806,7 @@ app/view/printarray.html ## Общее отображение контрола. -Для удобства разработки веб приложения хочется разделить отображения, и добавить что-то общее для всех точек маршрута. Например общая html разметка, с заголовками, меню, подвалом и тд. Для этих целей есть возможность с помощью аннотации в конструкторе контрола указать общий шаблон. +Для удобства разработки веб приложения хочется разделить отображения, и добавить что-то общее для всех точек маршрута. Например, общая html разметка, с заголовками, меню, подвалом и тд. Для этих целей есть возможность с помощью аннотации в конструкторе контрола указать общий шаблон. ```bsl &Контроллер("/demoviews") @@ -844,7 +844,7 @@ app/view/printarray.html Где тег ```@Контент``` будет заменен результатом ответа точки маршрута. -Однако бывают ситуации, когда у контроллера есть отображение, но какая точка маршрута должна возвращать ответ, без его применения. В такой ситуации, для метода точки маршрута нужно добавить аннотацию ```&НеВыводитОтображениеКонтроллера```. Например вот так: +Однако бывают ситуации, когда у контроллера есть отображение, но какая точка маршрута должна возвращать ответ, без его применения. В такой ситуации, для метода точки маршрута нужно добавить аннотацию ```&НеВыводитОтображениеКонтроллера```. Например, вот так: ```bsl &Отображение("./app/view/view1.html") @@ -896,7 +896,7 @@ app/КонтролПриветствия.os Иногда бывает так, что нужно с одной страницы, перенаправить позльзователя на другую. -Для этого, у объекта ```Ответ``` есть метод ```Перенаправить(<Адрес куда перенаправить>)```. Например подобная точка маршрута будет перенаправлять запрос в корень приложения +Для этого, у объекта ```Ответ``` есть метод ```Перенаправить(<Адрес куда перенаправить>)```. Например, подобная точка маршрута будет перенаправлять запрос в корень приложения ```bsl &ТочкаМаршрута("/redir") @@ -929,7 +929,7 @@ app/КонтролПриветствия.os # Управление доступом -Для управления доступом к точке маршрута, предусмотрена аннотация ```&Роли("<Список ролей через запятую>")```. Все очень просто, и остается ответить только на один вопрос - как эти роли раздать, и как хранить данные входа пользователей. Пока это mvp, точного ответа не дам. Разработчик может самостоятельно придумать, как и где хранить группы и пароли. Я только покажу как их подключить в наше приложение. +Для управления доступом к точке маршрута, предусмотрена аннотация ```&Роли("<Список ролей через запятую>")```. Все очень просто, и остается ответить только на один вопрос - как эти роли раздать, и как хранить данные входа пользователей. Пока это mvp, точного ответа не дам. Разработчик может самостоятельно придумать, как и где хранить группы и пароли. Я только покажу, как их подключить в наше приложение. ``` app/КонтролСУправлениемДоступом.os @@ -997,7 +997,7 @@ app/КонтролСУправлениемДоступом.os - Топик - имя топика, в рамках которого происходит общение - Сообщение - расшифрованное сообщение, которое пришло от клиента. -Для того, что бы отправлять сообщения, нужно получить желудь ```БрокерСообщенийВебСокетов```. Который умеет следующие действия с сообщениями: +Для того, чтобы отправлять сообщения, нужно получить желудь ```БрокерСообщенийВебСокетов```. Который умеет следующие действия с сообщениями: - ОтправитьСообщение(Топик, Сообщение, Идентификатор) - Отправляет определенному клиенту сообщение в указанный топик. - ОтправитьСообщениеВсем(Топик, Сообщение) - Отправляет сообщение всем клиентам, подключенным к указанному топику. @@ -1025,7 +1025,7 @@ app/КонтролСУправлениемДоступом.os &ТочкаМаршрута("message") // Обработчик входящего сообщения Процедура ВходящееСообщение(Идентификатор, Топик, Сообщение) Экспорт - // клиент понимает два вида сообщений, которые он отправил сам, и которые отправлены другими клиентами. Они по разному отображаются на фронте. + // клиент понимает два вида сообщений, которые он отправил сам, и которые отправлены другими клиентами. Они по-разному отображаются на фронте. // Тут мы получаем из кеша имя пользователя по идентификатору соединения и отправляем клиентам. ИмяПользователя = КешИменПользователей.Получить(Идентификатор); @@ -1130,10 +1130,10 @@ winow start Приложение на winow можно, конечно, запустить в контейнере. -В вот небольшой пример, как это сделать. +Вот небольшой пример, как это сделать. -Нужно в один каталог положить +Нужно в один каталог положить: * Само приложение [app](docker/app/), которое содержит скрипт запуска, контролы, файлы и картинки, ```autumn-properties.json``` со всеми настройками и т.д. -* [Dockerfile](example/hwapp/view/chat.html) для того, что бы собрать образ, и прокинуть в него все файлы. +* [Dockerfile](/docker/Dockerfile) для того, чтобы собрать образ, и прокинуть в него все файлы. * Скрипт запуска сервера [docker-entrypoint.sh](docker/docker-entrypoint.sh). * И все это дело удобно собирать одним скриптом [start.sh](docker/start.sh).