article feature
This commit is contained in:
@@ -12,19 +12,22 @@ version: 1.0.0
|
||||
|
||||
## Содержание
|
||||
|
||||
1. [Введение](#введение)
|
||||
2. [Идея и архитектура](#идея-и-архитектура)
|
||||
3. [Минимальный GUI](#минимальный-gui)
|
||||
4. [Сборка фронтенда](#сборка-фронтенда)
|
||||
5. [Встраивание в Go-сервис](#встраивание-в-go-сервис)
|
||||
6. [API: контракт и примеры](#api-контракт-и-примеры)
|
||||
7. [Запуск и проверка](#запуск-и-проверка)
|
||||
8. [FAQ и типичные ошибки](#faq-и-типичные-ошибки)
|
||||
- [Встраиваем веб-GUI в консольную утилиту: практический гайд](#встраиваем-веб-gui-в-консольную-утилиту-практический-гайд)
|
||||
- [Содержание](#содержание)
|
||||
- [Введение](#введение)
|
||||
- [Идея и архитектура](#идея-и-архитектура)
|
||||
- [Минимальный GUI](#минимальный-gui)
|
||||
- [Сборка фронтенда](#сборка-фронтенда)
|
||||
- [Встраивание в Go-сервис](#встраивание-в-go-сервис)
|
||||
- [API: контракт и примеры](#api-контракт-и-примеры)
|
||||
- [Запуск и проверка](#запуск-и-проверка)
|
||||
- [FAQ и типичные ошибки](#faq-и-типичные-ошибки)
|
||||
|
||||
## Введение
|
||||
|
||||
Задача: добавить простой веб-интерфейс к консольной утилите, собрать его один раз и отдавать статические файлы прямо из бинарника или из каталога рядом. В качестве примера используем минимальный UI со следующими полями:
|
||||
- Targets (строка вида `tcp:host:port;udp:host:port`)
|
||||
|
||||
- Targets (строка вида `tcp:host:port;udp:host:port...`)
|
||||
- Delay (например `1s`)
|
||||
- Флаг Wait connection
|
||||
- Кнопка Execute
|
||||
@@ -42,6 +45,7 @@ version: 1.0.0
|
||||
Мы упростили компонент до минимума в ветке `for-article`. Основной экран — одна форма и кнопка запуска.
|
||||
|
||||
Ключевой шаблон компонента:
|
||||
|
||||
```12:60:/home/su/projects/articles/embed-gui-article/ui/src/app/knock/knock-page.component.html
|
||||
<div class="container">
|
||||
<p-card header="Port Knocker (Минимальный UI)">
|
||||
@@ -69,6 +73,7 @@ version: 1.0.0
|
||||
```
|
||||
|
||||
Логика отправки запроса:
|
||||
|
||||
```1:40:/home/su/projects/articles/embed-gui-article/ui/src/app/knock/knock-page.component.ts
|
||||
this.http.post('/api/v1/knock-actions/execute', {
|
||||
targets: v.targets,
|
||||
@@ -82,6 +87,7 @@ this.http.post('/api/v1/knock-actions/execute', {
|
||||
Собираем Angular-приложение и копируем артефакты в каталог, из которого Go-сервис будет обслуживать статику.
|
||||
|
||||
Скрипт сборки:
|
||||
|
||||
```1:20:/home/su/projects/articles/embed-gui-article/ui/build-for-embeding.sh
|
||||
#!/bin/bash
|
||||
# Использование: ./build-for-embeding.sh /abs/path/to/back/cmd/public
|
||||
@@ -96,12 +102,14 @@ cp -r /home/su/projects/angular/project-front/dist/project-front/browser/* "$DES
|
||||
## Встраивание в Go-сервис
|
||||
|
||||
Вариант А: раздача файлов из папки (`back/cmd/public`).
|
||||
|
||||
- Положите файлы фронта в `back/cmd/public`.
|
||||
- Убедитесь, что роутер отдаёт `/` и `/*` из этой папки.
|
||||
|
||||
Вариант Б: `embed.FS` в бинарник.
|
||||
|
||||
Пример (концептуально):
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
@@ -128,6 +136,7 @@ func main() {
|
||||
Endpoint: `POST /api/v1/knock-actions/execute`
|
||||
|
||||
Request JSON:
|
||||
|
||||
```json
|
||||
{
|
||||
"targets": "tcp:127.0.0.1:22;udp:1.2.3.4:53",
|
||||
@@ -137,11 +146,13 @@ Request JSON:
|
||||
```
|
||||
|
||||
Response 200:
|
||||
|
||||
```json
|
||||
{ "status": "ok" }
|
||||
```
|
||||
|
||||
Пример curl:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/v1/knock-actions/execute \
|
||||
-H 'Content-Type: application/json' \
|
||||
@@ -150,17 +161,19 @@ curl -X POST http://localhost:8080/api/v1/knock-actions/execute \
|
||||
|
||||
## Запуск и проверка
|
||||
|
||||
1) Собрать фронт и скопировать файлы:
|
||||
1 Собрать фронт и скопировать файлы:
|
||||
|
||||
```bash
|
||||
cd /home/su/projects/articles/embed-gui-article/ui
|
||||
./build-for-embeding.sh /home/su/projects/articles/embed-gui-article/back/cmd/public
|
||||
```
|
||||
|
||||
2) Запустить бэкенд (варианты):
|
||||
2 Запустить бэкенд (варианты):
|
||||
|
||||
- Через make/скрипт, если есть.
|
||||
- Локально `go run ./back` (или соответствующая команда в вашем проекте).
|
||||
|
||||
3) Открыть в браузере `/` и проверить, что форма грузится, а `Execute` бьёт в API.
|
||||
3 Открыть в браузере `/` и проверить, что форма грузится, а `Execute` бьёт в API.
|
||||
|
||||
## FAQ и типичные ошибки
|
||||
|
||||
|
Reference in New Issue
Block a user