Имя: Пароль:
IT
Веб-мастеринг
Построение веб UI без возни с HTML/CSS/JS
0 Garykom
 
гуру
06.12.19
19:24
Вот есть такая штука как QML и есть https://github.com/qmlweb/qmlweb
Можно потестить https://qmlweb.github.io/

Короче хочу рисовать UI в браузере для разных админок или бизнес/учетных приложений легко и просто.
Кто подскажет какие еще есть подобные штуки?

ЗЫ React, Angular и прочие Vue не предлагать.
Требуются UI фреймворки/библиотеки которые работают в браузере с декларативным описанием интерфейсов.
1 Fram
 
06.12.19
19:32
ты хочешь сделать функциональный сайт на декларативном интерфейсе.. ну, удачи
2 Garykom
 
гуру
06.12.19
19:35
(1) Мне надо нечто близкое к визуальному конструктору интерфейса, примерно как в 1С и прочих классических десктопных языках.
Всю динамику и функционал хочу разрулить бэком и минимальными вставками JS.
3 Garykom
 
гуру
06.12.19
19:36
(2)+ Самое близкое что видел это Vaadin но оно для Java а мне надо для Go.
4 ДенисЧ
 
06.12.19
19:45
1с же ))
5 Asmody
 
06.12.19
19:51
Flutter
6 Garykom
 
гуру
06.12.19
19:51
(4) Это идеально но дорого и временами тормозно.
7 Печник
 
06.12.19
19:52
(0) В Microsoft Word создай документ со всем оформлением. Потом сохраняешь его в формате html и сайт готов.
меню Файл ->  Сохранить копию -> Веб страница (*.htm, *.html)
8 Garykom
 
гуру
06.12.19
19:56
(5) Оно разве умеет в других браузерах отличных от Хрома?
9 trdm
 
06.12.19
19:56
(0) > Кто подскажет какие еще есть подобные штуки?

Будешь смеяться, но лучше идеи 1С-са никто ничего не придумал.
Визуальный генератор с предзаданными шаблонами.
10 Garykom
 
гуру
06.12.19
19:59
(9) Дык в курсе, см (6)
Сам когда то начинал переписывать УФ на JS (с описанием форм в JSON) но забросил.
11 rsv
 
06.12.19
19:59
(9) потащите формы в веб ... и за одно сервер приложений ....  субд  токма  типчиные для 1С и лицензии и тд и тп... т.е. как в (6)
12 trdm
 
06.12.19
20:00
+(9) мне особенно нравится фишка с деревом в управляемых формах с одновременным просмотром результата.
а то свалка с 7-ным зоопарком контролов иногда раздражают.
13 trdm
 
06.12.19
20:03
(10) вот может и зря забросил. Я и сам начинал такую поделку.

Я всегда думал, что самое эффективное (по времени/удобству) сайтостроительство возможно только генераторами.
14 Лефмихалыч
 
06.12.19
20:18
(2) я такую игру уже джва года жду...
15 andy_minsk
 
06.12.19
21:01
1с хорошо, но лицензирование ..... не для web ни разу.
много перепробовано для смх целей, но идеала нет. навскидку
spiderbasic,  nsbasic,  b4j , xojo     это все бейсикоподобные схемы с генерацией в js или код. Лицензирование у всех как средство разработки, без отчислений
16 trdm
 
06.12.19
21:02
+(13) прi условии если хорошо знаешь html/css/js.
17 trdm
 
06.12.19
21:02
(15) я имел ввиду построить на его базе конструктор сайтов.
18 icipher
 
06.12.19
21:06
может быть не совсем то что нужно, но все таки
https://ktor.io/
19 Fram
 
07.12.19
00:18
странно, что продукт на букву Ф еще никто не предложил )
20 Сияющий в темноте
 
07.12.19
02:42
так это,любая база данных с web интерфейсом из старых-там предполагалось,что браузер умеет только формы показывать.
21 Звездец
 
07.12.19
08:48
для GO я сам недавно искал на чем писать интерфейсы чтоб удобно и быстро. Толком ничего не нашел, очень мало информации, а на русском так вообще практически нет.


ps. про красивости и то что такими средствами нормальный интерфейс не создать не надо. Порой надо быстро для тестирования и прототипирования. А если идея вызрела - то можно потом и мишурой заняться
22 Garykom
 
гуру
07.12.19
08:52
(21) Есть https://github.com/icza/gowut но оно кодом а не декларативное в конструкторе.
Ну и слегка сложное для начального понимания, и пока маловато функционала ну и не красивое по дефолту.
23 Garykom
 
гуру
07.12.19
08:58
(22)+ Вот пример как на нем у меня сделано, вот это кодится форма https://1cvpn.ru/registration

func buildRegistration(s gwu.Session) {
    win := gwu.NewWindow("registration", "Регистрация на 1cVPN")
    win.AddHeadHTML("<link rel=\"shortcut icon\" href=\"/static/favicon.ico\" />")

    win.Style().SetFullWidth()
    win.SetHAlign(gwu.HACenter)
    win.SetCellPadding(2)

    titleLabel := gwu.NewLabel("1cVPN.ru")
    titleLabel.Style().SetFontWeight(gwu.FontWeightBold).SetFontSize("1.8em")
    win.Add(titleLabel)
    titleLabel2 := gwu.NewLabel("Публикация сервера через VPN")
    titleLabel2.Style().SetFontWeight(gwu.FontWeightBold).SetFontSize("1.4em")
    win.Add(titleLabel2)

    lbTitle := gwu.NewLabel("Регистрация")
    lbTitle.Style().SetFontWeight(gwu.FontWeightBold).SetFontSize("1.4em")
    win.Add(lbTitle)

    p := gwu.NewPanel()
    p.SetHAlign(gwu.HACenter)
    p.SetCellPadding(2)

    errL := gwu.NewLabel("")
    errL.Style().SetColor(gwu.ClrRed)
    p.Add(errL)

    table := gwu.NewTable()
    table.SetCellPadding(2)
    table.EnsureSize(10, 2)

    lbEmailAlert := gwu.NewLabel("")
    //lbEmailAlert.Style().SetFontSize("0.8em")
    lbEmailAlert.Style().SetWidthPx(250)
    lbEmailAlert.Style().SetColor(gwu.ClrRed)

    table.Add(lbEmailAlert, 1, 1)

    lbEmail := gwu.NewLabel("E-mail")
    lbEmail.Style().SetFontSize("0.8em")
    table.Add(lbEmail, 0, 0)

    tbEmail := gwu.NewTextBox("")
    tbEmail.AddSyncOnETypes(gwu.ETypeKeyUp) // This is here so we will see up-to-date value in the event handler
    tbEmail.AddEHandlerFunc(func(e gwu.Event) {
        lbEmail.SetText("E-mail")
        lbEmail.Style().SetColor(gwu.ClrBlack)
        if !validateEmail(tbEmail.Text()) {
            lbEmail.SetText("E-mail некорректный!")
            lbEmail.Style().SetColor(gwu.ClrRed)
        }
        if !validateEmailFree(tbEmail.Text()) {
            lbEmail.SetText("E-mail уже зарегистрирован!")
            lbEmail.Style().SetColor(gwu.ClrRed)
        }
        e.MarkDirty(lbEmail)

        //tbEmail.SetToolTip("")
        //tbEmail.Style().SetBackground(gwu.ClrWhite)
        //e.MarkDirty(tbEmail)
    }, gwu.ETypeKeyUp)
    tbEmail.Style().SetWidthPx(300).SetHeightPx(30)
    tbEmail.Style().SetFontSize("1.0em")
    table.Add(tbEmail, 1, 0)

    lbLogin := gwu.NewLabel("Имя пользователя")
    lbLogin.Style().SetFontSize("0.8em")
    table.Add(lbLogin, 2, 0)
    tbLogin := gwu.NewTextBox("")
    tbLogin.Style().SetWidthPx(300).SetHeightPx(30)
    tbLogin.Style().SetFontSize("1.0em")
    tbLogin.AddSyncOnETypes(gwu.ETypeKeyUp)
    tbLogin.AddEHandlerFunc(func(e gwu.Event) {
        lbLogin.SetText("Имя пользователя")
        lbLogin.Style().SetColor(gwu.ClrBlack)
        if !validateLogin(tbLogin.Text()) {
            fmt.Println("Login is invalid")
            lbLogin.SetText("Имя пользователя некорректно!")
            lbLogin.Style().SetColor(gwu.ClrRed)
        } else {
            fmt.Println("Login is VALID")
        }
        if !validateLoginFree(tbLogin.Text()) {
            fmt.Println("Login is occupied")
            lbLogin.SetText("Имя пользователя уже зарегистрировано!")
            lbLogin.Style().SetColor(gwu.ClrRed)
        } else {
            fmt.Println("Login is free")
        }
        e.MarkDirty(lbLogin)
    }, gwu.ETypeKeyUp)
    table.Add(tbLogin, 3, 0)

    lbPass := gwu.NewLabel("Пароль")
    lbPass.Style().SetFontSize("0.8em")
    table.Add(lbPass, 4, 0)
    pbPass := gwu.NewPasswBox("")
    pbPass.Style().SetWidthPx(300).SetHeightPx(30)
    pbPass.Style().SetFontSize("1.0em")
    pbPass.AddSyncOnETypes(gwu.ETypeKeyUp)
    pbPass.AddEHandlerFunc(func(e gwu.Event) {
        lbPass.SetText("Пароль")
        lbPass.Style().SetColor(gwu.ClrBlack)
        if !validatePassword(pbPass.Text()) {
            fmt.Println("Password is invalid")
            lbPass.SetText("Пароль слишком простой!")
            lbPass.Style().SetColor(gwu.ClrRed)
        } else {
            fmt.Println("Password is VALID")
        }
        e.MarkDirty(lbPass)
    }, gwu.ETypeKeyUp)
    table.Add(pbPass, 5, 0)

    lbPass2 := gwu.NewLabel("Пароль еще раз")
    lbPass2.Style().SetFontSize("0.8em")
    table.Add(lbPass2, 6, 0)
    pbPass2 := gwu.NewPasswBox("")
    pbPass2.Style().SetWidthPx(300).SetHeightPx(30)
    pbPass2.Style().SetFontSize("1.0em")
    pbPass2.AddSyncOnETypes(gwu.ETypeKeyUp)
    pbPass2.AddEHandlerFunc(func(e gwu.Event) {
        lbPass2.SetText("Пароль еще раз")
        lbPass2.Style().SetColor(gwu.ClrBlack)
        if pbPass.Text() != pbPass2.Text() {
            lbPass2.SetText("Пароли не совпадают!")
            lbPass2.Style().SetColor(gwu.ClrRed)
        }
        e.MarkDirty(lbPass2)
    }, gwu.ETypeKeyUp)
    table.Add(pbPass2, 7, 0)

    pbPass.AddSyncOnETypes(gwu.ETypeKeyUp)
    pbPass.AddEHandlerFunc(func(e gwu.Event) {
        lbPass2.SetText("Пароль еще раз")
        lbPass2.Style().SetColor(gwu.ClrBlack)
        if pbPass.Text() != pbPass2.Text() {
            lbPass2.SetText("Пароли не совпадают!")
            lbPass2.Style().SetColor(gwu.ClrRed)
        }
        e.MarkDirty(lbPass2)
    }, gwu.ETypeKeyUp)

    bReg := gwu.NewButton("Зарегистрироваться")
    bReg.Style().SetWidthPx(300).SetHeightPx(30)
    bReg.AddEHandlerFunc(func(e gwu.Event) {
        //         if tb.Text() == "admin" && pb.Text() == "a" {
        //             //             e.Session().RemoveWin(win) // Login win is removed, password will not be retrievable from the browser
        //             //             buildPrivateWins(e.Session())
        //             //             e.ReloadWin("main")
        //         } else {
        //             //             e.SetFocusedComp(tb)
        //             //             errL.SetText("Invalid user name or password!")
        //             //             e.MarkDirty(errL)
        //         }

        allPass := true
        if !validateEmail(tbEmail.Text()) {
            allPass = false
            lbEmail.SetText("E-mail некорректный!")
            lbEmail.Style().SetColor(gwu.ClrRed)
            e.MarkDirty(lbEmail)
        }
        if !validateEmailFree(tbEmail.Text()) {
            allPass = false
            lbEmail.SetText("E-mail уже зарегистрирован!")
            lbEmail.Style().SetColor(gwu.ClrRed)
            e.MarkDirty(lbEmail)
        }

        if !validateLogin(tbLogin.Text()) {
            allPass = false
            lbLogin.SetText("Имя пользователя некорректно!")
            lbLogin.Style().SetColor(gwu.ClrRed)
            e.MarkDirty(lbLogin)
        }
        if !validateLoginFree(tbLogin.Text()) {
            allPass = false
            lbLogin.SetText("Имя пользователя уже зарегистрировано!")
            lbLogin.Style().SetColor(gwu.ClrRed)
            e.MarkDirty(lbLogin)
        }

        fmt.Println("Email: " + tbEmail.Text() + " Login: " + tbLogin.Text() + " Pass: " + pbPass.Text())
        if allPass {
            fmt.Println("Все проверки прошли")

            emailFrom := "[email protected]"
            emailTo := tbEmail.Text()
            emailSubject := "Регистрация на 1cVPN.ru"
            emailMessage := "Вы зарегистрированы в сервисе 1cVPN.ru, используйте для входа\r\n"
            emailMessage = emailMessage + "Имя пользователя (логин): " + tbLogin.Text() + "\r\n"
            emailMessage = emailMessage + "Пароль: " + pbPass.Text() + "\r\n"

            sendEmail(emailFrom, emailTo, emailSubject, emailMessage)
            user := User{}
            user.EMail = tbEmail.Text()
            user.Name = tbLogin.Text()
            user.Password = pbPass.Text()
            createUser(user)

            e.ReloadWin("login")
        } else {
            fmt.Println("Не прошли проверки")
        }
        //sendEmail("[email protected]", "[email protected]", "Регистрация на 1cVPN.ru", "Регался "+tbEmail.Text())
    }, gwu.ETypeClick)

    //p.Add(b)
    table.Add(bReg, 8, 0)

    p.Add(table)

    table2 := gwu.NewTable()
    table2.SetCellPadding(2)
    table2.EnsureSize(2, 2)
    table2.Style().SetWidthPx(300)

    lbIn := gwu.NewLabel("Уже зарегистрированы?")
    lbIn.Style().SetFontSize("0.8em")
    table2.Add(lbIn, 1, 0)

    lkIn := gwu.NewLink("Авторизуйтесь", "/login")
    lkIn.Style().SetFontSize("0.8em")
    lkIn.SetTarget("")
    table2.Add(lkIn, 1, 1)

    p.Add(table2)

    win.Add(p)

    s.AddWin(win)
    //return win
}
24 Garykom
 
гуру
07.12.19
09:00
(23)+ Слишком долго кодом по элементам создавать, хочется некий конструктор форм стандартных а далее уже кодом только динамику.
25 ДенисЧ
 
07.12.19
09:02
(23) Какой ужас... И даже тихим его не назвать...
26 Garykom
 
гуру
07.12.19
09:05
(25) Зато там все описано, никакого кода больше нету при нажатиях кнопок и прочих действиях эвенты срабатывают "AddEHandlerFunc"
И простой вызов внешних функций из других модулей по работе с БД и прочим что надо.

Короче все на Golang полностью, больше ничего нет.
27 Garykom
 
гуру
07.12.19
09:06
(26)+ Меня все устраивает кроме рисования форм кодом, хочется нечто вроде QML куда только код обработчиков вставить и все.
28 Fram
 
07.12.19
09:45
(27) чего ты так html/css/js боишься?.. все равно придется освоить, если хочешь веб поделки делать
29 ДенисЧ
 
07.12.19
09:47
30 Garykom
 
гуру
07.12.19
10:09
(28) Не боюсь и даже вполне освоил.
Медленно и печально оно по сравнению с более высокоуровневыми способами создания UI.
31 ДенисЧ
 
07.12.19
10:12
(30) Осталось найти эти более высокоуровневые...
32 Garykom
 
гуру
07.12.19
10:20
(31) Ну React и прочие как раз поэтому и популярны, что позволяют перейти от уровня HTML/CSS на уровень компонентов.
Но да эти компоненты самому пилить надо предварительно (на том же HTML/CSS или с применением шаблонизаторов типа JSX) а затем уже только можешь использовать что наваял.
33 Sysanin_1ц
 
08.12.19
20:19
(24) Посмотри webflow или dreamweaver
34 Garykom
 
гуру
08.12.19
20:27
(33) Это совсем не то что требуется, мне не редактор нужен а некий фреймворк или технология с набором контролов или виджетов в комплекте с layout.
35 Garykom
 
гуру
08.12.19
20:29
(34)+ Причем в виде JS кода, которому можно на вход подать некий файл декларативно описывающий интерфейс.
Все что видел оно в массе предполагает написание кода на JS на котором контролы и прочее создаются, без декларативной прослойки.
36 Garykom
 
гуру
12.12.19
20:19
Нашел почти то что надо под названием w2ui
http://w2ui.com/web/demos/
http://w2ui.com/web/demo
37 Garykom
 
гуру
12.12.19
20:19
(36)+ Главный плюс MIT License
38 ДенисЧ
 
12.12.19
20:44
(36) Совершенно декларативный подход...

function update() {
    $('#isBin').html(w2utils.isBin($('#str')[0].value) ? 'Yes' : '-');
    $('#isInt').html(w2utils.isInt($('#str')[0].value) ? 'Yes' : '-');
    $('#isFloat').html(w2utils.isFloat($('#str')[0].value) ? 'Yes' : '-');
    $('#isHex').html(w2utils.isHex($('#str')[0].value) ? 'Yes' : '-');
39 ДенисЧ
 
12.12.19
20:44
Перлятиной и пыхом пованивает.
40 Garykom
 
гуру
12.12.19
21:31
(38) Пофиг я на это свою обертку поверх накручу с внешними файликами JSON (оно и так почти оно) в которых будет как мне надо UI описываться.
41 trdm
 
12.12.19
21:47
(40) но визуального эдитора все равно нет.
42 Asmody
 
12.12.19
22:11
Декларативный, говоришь?
Elm - модно, декларативно, функционально.
43 Garykom
 
гуру
12.12.19
22:12
(41) Вот у этих есть https://designer.webix.com/welcome/ но они зажрались и много денег хотят
44 Garykom
 
гуру
12.12.19
22:15
(42) Прикольная штука но слишком напоминает фузину ))
45 Fragster
 
гуру
12.12.19
23:32
На хтмл и всяких вуях налепляют компонентов и получается quasar.dev
46 Fragster
 
гуру
12.12.19
23:33
Ну или вуетифи и прочего
47 Asmody
 
13.12.19
00:05
(44) фузина тоже декларативная и местами даже функциональная
48 trad
 
13.12.19
16:29
(36) интересно, спасибо
49 trdm
 
23.12.19
12:10
осталось связать с БД и сделать автогенерацию форм :)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший