Веб-интерфейс для программы

Недавно прошёл курс молодого бойца по веб-вёрстке. Хочу закрепить успех и сверстать какой-нибудь веб-интерфейс для своей программы. В связи с этим встал вопрос - а как, собственно, это делается? :thinking: Не в одном же проекте с программой? :man_shrugging: А если в разных, то как потом их связать?
Вижу одно простое решение. Создать новый проект для веб-интерфейса, а потом копировать файлы с версткой в какую-нибудь папку рядом с ехе-шником программы, и выдавать браузеру эту папку при помощи сервера.
Но проблема в том, что в вижуалке нет шаблона проекта для веб-страниц :man_shrugging:

Обычно никак потому что мало кому надо делать веб-интерфейс для .ехе )) Как минимум потому что на серверах обычно линукс.
А так где что лежит не имеет значения, добавить путь в PATH переменную ОС или прописать путь в каком-нибудь конфиге.

А чего там шаблонить? Просто создать .html файл.

Там есть шаблоны для ASP .NET и т.п. А что-то более простое и нестандартное сложно угадать кому как надо, в вебе 100500 вариантов как делать всё. Наверно есть сторонние шаблоны для разных задач (Webpack, …) в расширениях и т.п.

Почему? :man_shrugging: uTorrent и qBittorrent же :point_up:

Не понял, какая связь? :thinking: Какая разница, линукс или не линукс? :thinking:

Да это понятно, что путь какой хочешь можно задать. Я про другое немного.

Это тоже понятно (видимо, самое простое решение). Но ведь в вижуалке не будет подсветки HTML / CSS синтаксиса и автодописывания (как в VS code и шторме) :man_shrugging: Или будет? :thinking:
Или просто папку с вёрсткой параллельно в VS code держать открытой и там редактировать :thinking:

ну вот можно его и посмотреть ) qBittorrent/src/webui at master · qbittorrent/qBittorrent · GitHub

Смотря для чего интерфейс нужен, если у пользователя доступ только к нему (сервер делает что-то с .ехе у себя), то тогда линуксовый сервер не запустит .ехе ) Ну и обычно удобнее тогда переделать программу в библиотеку и т.п.
А если оба на десктопе, то такое мало кто делает, как и в целом десктопное ПО.

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

Я уже смотрел, но там чёт слишком запутано. Не могу уловить суть :man_shrugging: В исходниках есть папка webui, а в релизе её нет. Не понятно, откуда он выдаёт файлы веб-интерфейса.
Наверное, стоит посмотреть ранние коммиты.

не совсем понял, при чём тут .exe :man_shrugging: Такую программу можно легко и под линукс на QT написать, наверное :thinking:

Ну вот хотя-бы самый тупой пример. Ставим в качестве рута какую-нибудь папку, например D:\SharedFiles\. Потом в браузере заходим на 127.0.0.1:5555 и сервер выдаёт страницу со списком файлов в этой папке. Ну или страницу с текущем временем на сервере. Пока не важно, с чем именно.

Но если уж писать, то скорее всего проще сразу делать в каком-то более удобном для автоматизации виде, библиотека или просто часть кода веб-бэкэнда )

Путь типа mysite.com/folder/file.png не означает, что такой файл обязательно лежит как обычный файл на сервере.

В ресурсах внутри файла программы всё. Пути с : это ресурсы в Qt.

Но можно задать и свой путь.

А программа причем тут?

Да это понятно. Сервер может выдавать что угодно на любой запрос.

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

Вот этого не знал :thinking: На QT не пишу :man_shrugging:

Ну сервер ведь это программа, разве нет? :man_shrugging:

Я не собираюсь писать бэкэнд :smiley:
Я хочу написать минимальный веб-интерфейс, который будет как-то взаимодействовать с программой. Например, нажимаем на кнопку и получаем от программы что-нибудь в ответ - например, текущее время.
Или чтобы программа по какому-нибудь событию сама что-то выводила на страницу (если хотя-бы один клиент подключен).
Как это делается?

Из клиентской части (HTML/JS) нельзя вызвать программу. А то б тогда любой сайт мог сделать что-нибудь плохое с компом пользователя )

Всмысле нельзя? :thinking:
В uTorrent / qBittorrent через веб-интерфейс ведь можно запускать/останавливать/удалять раздачи. Редактировать трекеры, группы. Добавлять torrent-файлы. И даже менять некоторые настройки самого uTorrentа / qBittorrentа.
Естественно, функционал ограничен по причинам безопасности. Но почему “нельзя”-то? :man_shrugging: Как тогда это происходит, если нельзя?

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

И каждую секунду запрос для получения состояния.

Я, собственно, это и имел ввиду. Возможно, вопрос не совсем правильно сформулировал :thinking: Мне казалось, что если речь идёт про веб-интерфейс, априори должно быть понятно, что имеется ввиду :thinking: Ладно, попробую ещё раз :man_shrugging:
Пишем программу, в которой запускаем сокет на прослушивание (ака сервер). Где-нибудь в какой-нибудь папке верстаем веб-страницу с кнопкой. Потом из браузера заходим на 127.0.0.1:5555 и сервер выдаёт содержимое папки с вёрсткой (собственно, сам веб-интерфейс). Что должна послать кнопка, чтобы обратиться к серверу на “той” стороне?
Если я пошлю запрос GET http://127.0.0.1:5555/api/blabla, я ведь обращусь к тому “самому себе”, откуда зашел клиент :man_shrugging: То есть, если клиент и сервер будут находиться на разных компах, то такой запрос не сработает, правильно? :thinking:

Думаю, это не обязательно. Можно написать сервер так, чтобы клиенты просто подключались и слушали сервер. А он при возникновении нужных событий будет слать клиентам сообщения.

Ну сервер это и есть бэкэнд.

Так надо зайти или отправить по IP сервера, а не 127.0.0.1.

В вебе это разве что с веб-сокетами, но это не так просто и проще отправлять каждую секунду не парясь про оптимизацию пока не надо )

Эт понятно. Просто “бэкэнд” предполагает что-то более комплексное, чем просто открытый сокет :smiley:

Всмысле зайти? Куда, по IP в браузере? А как кнопка этот IP узнает? :thinking:

А страница отдельно от сервера или что? В случае с торрентами это ж просто один сервер, который и страницы отдает, и команды выполняет. На него можно зайти и по 127.0.0.1, и по другим адресам (IP компа-сервера, …). На страницах (в формах, скриптах, ссылках) использовать относительные адреса типа /delete.

Ну если я вас правильно понял, страница может лежать где угодно, а сервер должен ее просто выдать (ну и JS / CSS, если надо) :man_shrugging:

То есть, fetch в скриптах вызываем вообще без указания IP-адреса?

Да. Ну или можно писать там какой-то адрес, по которому сервер везде доступен (или не в самом коде писать, а из какого-то конфига брать).

Спасибо, попробую.