[Фоновые задачи ч.3]<< [Web страницы] >>[Безопасность]

Web страницы

Визуализация

Веб сервер SCAWARDA публикует HTML страницы, обеспечивая их взаимодействие с тегами проекта.
Для взаимодействия с тегами зарезервировано два расширения файлов:
- .html - передаются значения тегов при загрузке страницы (get) и принимаются значения тегов от страницы (post);
- .json - передаются в формате json значения тегов, арарии, сообщения, ряды данных из БД для построения трендов.
Файлы с другими расширениями (в т.ч. .htm) публикуются «как есть» и не взаимодействуют с тегами.

Для разграничения доступа пользователей к html файлу введён псевдо элемент <!--accesspattern=[N]-->. Если выполняется условие [уровень доступа пользователя] AND [N], доступ пользователя будет разрешён. Подробнее - в разделе безопасность.

Графический редактор в SCAWARADA 1.1 представляет собой редактор HTML страниц


Редактор позволяет редактировать HTML страницы "визуально" (вид - Страница)

или редактировать непосредственно HTML код (вид - Код)


Для разработки HTML страниц можно использовать сторонние программы и сервисы, начиная от текстовых редакторов (таких как Atom), заканчивая визуальными конструкторами (такими как Tilda) или ИИ сервисы.

Пример. Имеем html форму для отображения числа и картинки в качестве индикатора:

<!DOCTYPE html>
<html>
 <head>
   <title>My Page</title>
   <meta charset="utf-8">
 </head>
 <body>
   Значение тега = <span> Значение </span>
   <img src="images/up.jpg"/>
 </body>
</html>

Зададим уникальные идентификаторы для поля отображения значения <span id=“tagvalue”> и изображения <img id=“tagstatus”>
Добавим на страницу скрипт, изменяющий исходную форму в соответствии со значением тега:

<script>
 function showtag(){
  document.getElementById("tagvalue").innerHTML =$TagA;
  if($TagA>0)
    document.getElementById("tagstatus").src = "images/up.jpg";
    else document.getElementById("tagstatus").src = "images/down.jpg";
 }
</script>

Для записи значения в тег нужно использовать метод POST, а имя элемента должно совпадать с именем записываемого тега.
Чтобы записать значение тега добавим форму, реализующую метод POST и передающую значение тега $TagA, ввдённое в поле ввода:

<form method="post">
  Новое значение <input Type="number" id="newvalue" name="$TagA"/>
  <button Type="submit" value="Submit">Применить</button>
</form>

Для ограничения доступа к странице зададим <!--accesspattern=2-->.

В результате, получим следующий HTML код страницы, отображающей значение тега, изменяющей элементы в зависимости от значения тега и позволяющей изменять значение тега, доступной пользователям с уровнем доступа не менее 2:

<!--accesspattern=2-->
<!DOCTYPE html>
<html>
  <head>
   <title>My Page</title>
   <meta charset="utf-8">
  </head>
  <body onload="showtag()">
   Значение тега = <span id=“tagvalue”> Значение </span>
   <img id=“tagstatus” src="images/up.jpg"/>
   <form method="post">
    Новое значение <input Type="number" id="newvalue" name="$TagA"/>
    <button Type="submit" value="Submit">Применить</button>
   </form>
   <script>
    function showtag(){
     document.getElementById("tagvalue").innerHTML =$TagA;
     if($TagA>0)
      document.getElementById("tagstatus").src = "images/up.jpg";
      else document.getElementById("tagstatus").src = "images/down.jpg";
     }
   </script>
  </body>
</html>


Для получения значений тегов без перезагрузки страницы нужно сформировать запрос GET на получение JSON, запрос должен иметь следующий вид:
[имя тега 1]-[имя тега 2]-...-[имя тега N].json
Содержимое полученного ответа присвоить переменным, соответствующим тегам.
Например, формируем запрос на получение значений TagA и TagB:

function getvalues() {
  fetch("TagA-TagB.json").then(function(response) {
   response.text().then(function(text) {
   const jsonobj=JSON.parse(text);
   TagA=jsonobj.TagA;
   TagB=jsonobj.TagB;
   });
  });
}


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

<!DOCTYPE html>
<html>
  <head>
   <title>My Page</title>
   <meta charset="utf-8">
   <script>
    function showtag(){
     document.getElementById("tagvalue").innerHTML =$TagA;
     if($TagA>0)
      document.getElementById("tagstatus").src = "images/up.jpg";
      else document.getElementById("tagstatus").src = "images/down.jpg";
    }
    function getvalues() {
     fetch("TagA.json").then(function(response) {
      response.text().then(function(text) {
      const jsonobj=JSON.parse(text);
      TagA=jsonobj.TagA;
      showtag();
      });
     });
    }
   </script>
  </head>
  <body onload="showtag()">
   Значение тега = <span id=“tagvalue”> Значение </span>
   <img id=“tagstatus” src="images/up.jpg"/>
  </body>
  <script type="text/javascript">
   var myint = setInterval("getvalues()",2000);
  </script>
</html>


Для получения текущих (активных) аварий нужно сформировать запрос GET на получение JSON, запрос должен иметь следующий вид:
system.alarm.online.json
Полученный ответ будет содержать следующие массивы:
id - идентификатор аварии,
tagname - имя тега, вызвавшего аварию,
timestamp - дата и время возникновения аварии,
prefix - префикс,
text - текст аварии,
suffix1 - суффикс 1,
suffix2 - суффикс 2,
alrstatus - статус аварии (1-выполнено условие "<", 2-выполнено условие "<=", 4-выполнено условие ">=", 8-выполнено условие ">", 16-выполнено условие "==")
Например, каждую секунду формируем запрос на получение активных аварий и показываем их в таблице:

<!DOCTYPE HTML>
<html>
  <head>
   <script type="text/javascript">
    let alarmid;
    let alarmtxt;
    let alarmdatetime;
    let alarmprefix;
    let alarmsuff1;
    let alarmsuff2;
    let alarmstatus;
    function tablerows() {
     var table = document.getElementById("alarmtab");
     var tableHeaderRowCount = 1;
     var rowCount = table.rows.length;
     for (let i = tableHeaderRowCount; i < rowCount; i++) {
      table.deleteRow(tableHeaderRowCount);
     }
     for (let i = 0; i < id.length; i++) {
      var row = table.insertRow(1);
      var cell1 = row.insertCell(0);
      var cell2 = row.insertCell(1);
      var cell3 = row.insertCell(2);
      var cell4 = row.insertCell(3);
      var cell5 = row.insertCell(4);
      var cell6 = row.insertCell(5);
      cell1.innerHTML = alarmid[i];
      cell2.innerHTML = alarmdatetime[i];
      cell3.innerHTML = alarmprefix[i] + " " + alarmtxt[i];
      cell4.innerHTML = alarmsuff1[i];
      cell5.innerHTML = alarmsuff2[i];
      cell6.innerHTML = alarmstatus[i];
     }
    }
    function getalarm() {
     fetch("system.alarm.online.json").then(function(response) {
      response.text().then(function(text) {
      const jsonobj=JSON.parse(text);
      alarmid=jsonobj.id;
      alarmtxt=jsonobj.text;
      alarmdatetime=jsonobj.timestamp;
      alarmprefix=jsonobj.prefix;
      alarmsuff1=jsonobj.suffix1;
      alarmsuff2=jsonobj.suffix2;
      alarmstatus=jsonobj.alrstatus;
      tablerows();
      });
     });
    }
   </script>
   <title>Alarm online</title>
   <meta charset="utf-8">
  </head>
  <body>
   <table id="alarmtab">
    <tr>
    <th>ID</th>
    <th>Дата Время</th>
    <th>Описание аварии</th>
    <th>Суффикс1</th>
    <th>Суффикс2</th>
    <th>Статус</th>
    </tr>
   </table>
  </body>
  <script type="text/javascript">
   var myint = setInterval("getalarm()",1000);
  </script>
</html>


Для получения текущих сообщений нужно сформировать запрос GET на получение JSON, запрос должен иметь следующий вид:
system.messages.online.json
Полученный ответ будет содержать следующие массивы:
id - идентификатор (сейчас не используется,
timestamp - дата и время возникновения аварии,
user - пользователь отправитель сообщения,
recipient - получатель сообщения,
prefix - префикс сообщения,
text - текст сообщения,
suffix1 - суффикс 1,
suffix2 - суффикс 2,

Для получения архивных аварий нужно сформировать запрос GET на получение JSON, запрос должен иметь следующий вид:
system.alarm.hst-[Дата начала выборки]-[Дата конца выборки]-.json формат дат: гггг-мм-дд
Полученный ответ будет содержать следующие массивы:
id - идентификатор аварии,
tagname - имя тега, вызвавшего аварию,
timestamp - дата и время возникновения аварии,
prefix - префикс,
text - текст аварии,
suffix1 - суффикс 1,
suffix2 - суффикс 2,
alrstatus - статус аварии (1-выполнено условие "<", 2-выполнено условие "<=", 4-выполнено условие ">=", 8-выполнено условие ">", 16-выполнено условие "==")

Для получения архивных сообщений нужно сформировать запрос GET на получение JSON, запрос должен иметь следующий вид:
system.messages.hst-[Дата начала выборки]-[Дата конца выборки]-.json формат дат: гггг-мм-дд
Полученный ответ будет содержать следующие массивы:
id - идентификатор (сейчас не используется,
timestamp - дата и время возникновения аварии,
user - пользователь отправитель сообщения,
recipient - получатель сообщения,
prefix - префикс сообщения,
text - текст сообщения,
suffix1 - суффикс 1,
suffix2 - суффикс 2,

Для получения архивных значений тегов (Тренд) нужно сформировать запрос GET на получение JSON, запрос должен иметь следующий вид:
system.trend.hst-[Дата начала выборки]-[Дата конца выборки]-[Имя таблицы тренда]-[Имя тега с индексом]-...-[Имя тега с индексом]-.json формат дат: гггг-мм-дд; Имя и индекс тега указываются в виде: Имя_индекс.
Например: system.trend.hst-2024-12-31-2025-01-30-TREND1-MyTag_0-ArrayTag_2-.json

Полученный ответ будет содержать следующие массивы:
timestamp - дата и время записи значений,
[Имя тега с индексом] - массив значений тега, записанных в таблицу тренда




© Александр Байков.