Хочу представить вам свой проект – библиотеку RUI (Remote User Interface). Библиотека предназначена для создания web-приложений на языке go. 

Особенностью библиотеки заключается в том, что вся обработка данных осуществляется на сервере, а браузер используется как тонкий клиент. Для связи клиента и сервера используется WebSocket. Для разработки вам не нужны HTML/CSS/JavaScript. Все разрабатывается на языке go.

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

Библиотека бесплатна и распространяется под MIT лицензией. В данный момент библиотека находится в статусе беты

Если вас это заинтересовало, то начнем

И начнем конечно с приложения “Hello world”

package main

import "github.com/anoshenko/rui"

type helloWorldSession struct {
}

func (content *helloWorldSession) CreateRootView(session rui.Session) rui.View {
	return rui.NewTextView(session, rui.Params {
		rui.Text : "Hello world!!!",
	})
}

func createHelloWorldSession(session rui.Session) rui.SessionContent {
	return new(helloWorldSession)
}

func main() {
	app := rui.NewApplication("Hello world", "icon.svg", createHelloWorldSession)
	app.Start("localhost:8000")
}

В функции main создается rui приложение и запускается основной цикл. При создании приложения задаются 3 параметра: имя приложения, имя иконки и функция createHelloWorldSession. Функция createHelloWorldSession создает структуру, реализующую интерфейс SessionContent:

type SessionContent interface {
	CreateRootView(session rui.Session) rui.View
}

 Для каждой новой сессии создается свой экземпляр структуры.

Функция CreateRootView интерфейса SessionContent создает корневой элемент. Когда пользователь обращается к приложению набрав в браузере адрес "localhost:8000", то создается новая сессия, для нее создается новый экземпляр структуры helloWorldSession и в конце вызывается функция CreateRootView. Функция createRootView возвращает представление строки текста, создаваемое с помощью функции NewTextView.

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

              app.Start(rui.GetLocalIP() + ":80")

 Давайте немного украсим нашу надпись: расположим ее по центру, добавим рамку, тень. Для этого изменим функцию CreateRootView

func (content *helloWorldSession) CreateRootView(session rui.Session) rui.View {
	return rui.NewGridLayout(session, rui.Params{
		rui.Width:               rui.Percent(100),
		rui.Height:              rui.Percent(100),
		rui.CellVerticalAlign:   rui.CenterAlign,
		rui.CellHorizontalAlign: rui.CenterAlign,
		rui.Content: []rui.View{
			rui.NewTextView(session, rui.Params{
				rui.Text:            "Hello world!!!",
				rui.FontName:        "Arial",
				rui.TextSize:        rui.Pt(24),
				rui.TextColor:       rui.White,
				rui.BackgroundColor: rui.Blue,
				rui.Padding:         rui.Px(40),
				rui.Border: rui.NewBorder(rui.Params{
					rui.Style:         rui.SolidLine,
					rui.Width:         rui.Px(2),
					rui.ColorProperty: 0xff808080,
				}),
				rui.Radius: rui.Px(8),
				rui.Shadow: rui.NewViewShadow(rui.Px(2), rui.Px(2), rui.Px(4), rui.Px(2), 0x80808080),
			}),
		},
	})
}

Данный текст, по-моему, довольно ясен. Поэтому сделаю к нему всего пару пояснений.

Функции rui.Percent, rui.Pt  и rui.Px используются для задания размеров, соответственно, в процентах, pt и пикселях

Для того чтобы разместить текст по центру мы помещаем его в контейнер GridLayout.

Пространство контейнера GridLayout разбито на ячейки в виде таблицы. Все дочерние элементы располагаются в ячейках таблицы. В наше примере у GridLayout одна ячейка, в которую помещается текст.

Помимо GridLayout в библиотеке имеются следующие контейнеры:

ListLayout – дочерние элементы располагаются в виде списка (вертикального или горизонтального)

StackLayout  – дочерние элементы занимают все пространство контейнера и располагаются один над одним. Виден только один верхний

ColumnLayout - дочерние элементы располагаются в виде вертикального списка в несколько колонок

AbsolutLayout – положение и размеры дочерних элементов задаются вручную

DetailsView – сворачиваемый контейнер

Resizable – контейнер меняющий размер путем перетаскивания сторон его рамки

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

ListView, TableView, DropDownList, Button, Checkbox, EditView, NumberPicker, ColorPicker, DatePicker, TimePicker, ProgressBar, ImageView, AudioPlayer, VideoPlayer

Назначение данных контролов понятно из их названия.

Кроме них есть еще  CanvasView. Это контрол на котором вы можете рисовать используя различные геометрические фигуры и изображения.

На этом пока все. Если вас заинтересовала моя библиотек, то почитать подробнее о ней можно в readme файле git репозитория (в нем библиотека описана довольно подробно).

Git репозиторий библиотеки

По адресу

Располагается demo программа которая показывает возможности библиотеки.

И в конце просьба не пинать меня сильно в коментах. Это просто проект для души, а не коммерческая библиотека.

Комментарии (9)


  1. Dekmabot
    08.09.2021 21:07

    Несколько обескуражен идеей замены "представления" на нечто напоминающее мобильную разработку. Это либо странно либо очень круто, пока не понял.

    А как пришла идея отказаться от html/css?


  1. RekGRpth
    09.09.2021 08:43

    Особенностью библиотеки заключается в том, что вся обработка данных осуществляется на сервере, а браузер используется как тонкий клиент. Для связи клиента и сервера используется WebSocket. Для разработки вам не нужны HTML/CSS/JavaScript.

    это очень похоже на https://www.webtoolkit.eu/wt


  1. Zuy
    09.09.2021 09:37
    +1

    Что-то не мог найти, а есть какое-то демо приложение там на гитхабе что-бы по-быстрому посмотреть как оно выглядит?



  1. GaryKomarov
    09.09.2021 11:30

    С похожим по назначению "Gowut" знакомы?
    https://github.com/icza/gowut


    1. anoshenko Автор
      09.09.2021 11:36

      Не был знаком. Посмотрел. На первый взгляд неплохо. Но мне показалось, что ради совместимости со старыми браузерами автор отказывается от слишком многих современных возможностей браузеров.


      1. GaryKomarov
        09.09.2021 12:36

        На основе gowut очень удобно админки быстро делать.
        Но лично мне хочется нечто похожее на УФ (управляемые формы) в 1С или хотя бы Webix.
        Т.е. программно в функции ПриСозданииНаСервере создаем элементы-контролы и назначаем сразу им функции - обработчики событий в виде имен функций которые надо вызывать
        Ну и свойства и модель расположения на форме чтобы как в УФ 1С, она там очень удобная и легко приводится (реализуется) к HTML/CSS.


        1. anoshenko Автор
          09.09.2021 12:43

          Т.е. программно в функции ПриСозданииНаСервере создаем элементы-контролы и назначаем сразу им функции - обработчики событий в виде имен функций которые надо вызывать

          Именно так в RUI и сделано. Например,

          rui.NewButton(session, rui.Params{
            rui.content : "Press me",
            rui.ClickEvent : clickFunc, 
          })

          Когда в клиенте нажимается кнопка, на сервере вызывается функция clickFunc


  1. Disinterpreter
    10.09.2021 04:04
    -2

    Для связи клиента и сервера используется WebSocket. Для разработки вам не нужны HTML/CSS/JavaScript. Все разрабатывается на языке go.

    А зачем? И почему не grpc?

    Оформите, пожалуйста, статью красивее.

    Скажите чем это лучше чем https://github.com/hexops/vecty и https://github.com/golang/go/wiki/WebAssembly или я просто не очень понял смысла всего этого. Можете написать введение яснее?