Ver Fonte

SVI Добавление страницы входа

SVI há 2 anos atrás
pai
commit
1215bc4c4d

+ 19 - 10
server/serv_web/serv_web.go

@@ -12,12 +12,13 @@ import (
 	"github.com/gofiber/template/html/v2"
 
 	"wartank/pkg/types"
+	"wartank/server/serv_web/web_api"
 	"wartank/server/serv_web/web_gui"
 )
 
 type СервВеб struct {
 	серв   types.ИСервер
-	роутер fiber.App
+	файбер fiber.App
 	порт   string
 }
 
@@ -88,14 +89,14 @@ func НовСервВеб(серв types.ИСервер) (*СервВеб, error
 	}
 	сам := &СервВеб{
 		серв:   серв,
-		роутер: *fiber.New(конф),
+		файбер: *fiber.New(конф),
 		порт:   порт,
 	}
 	compresConfig := compress.Config{
 		Level: compress.LevelBestCompression,
 	}
-	сам.роутер.Use(compress.New(compresConfig))
-	сам.роутер.Static("/static", "./web/static", fiber.Static{
+	сам.файбер.Use(compress.New(compresConfig))
+	сам.файбер.Static("/static", "./web/static", fiber.Static{
 		Compress:      true,
 		ByteRange:     true,
 		Browse:        true,
@@ -103,11 +104,19 @@ func НовСервВеб(серв types.ИСервер) (*СервВеб, error
 		CacheDuration: 30 * time.Second,
 		MaxAge:        3600,
 	})
-	сам.роутер.Get("/list_bot/get", сам.гетСписБот)
-	сам.роутер.Post("/list_bot/add", сам.постБотНов)
-	сам.роутер.Post("bot/stat", сам.постБотСтат)
 
-	_, ош := web_gui.НовВебГуи(сам)
+	type Login struct {
+		Login string `cookie:"login"`
+	}
+
+	сам.файбер.Get("/list_bot/get", сам.гетСписБот)
+	сам.файбер.Post("/list_bot/add", сам.постБотНов)
+	сам.файбер.Post("/bot/stat", сам.постБотСтат)
+	_, ош := web_api.НовВебАпи(сам)
+	if ош != nil {
+		return nil, fmt.Errorf("НовСерВеб(): при создании веб-апи, ош=\n\t%w", ош)
+	}
+	_, ош = web_gui.НовВебГуи(сам)
 	if ош != nil {
 		return nil, fmt.Errorf("НовСерВеб(): при создании веб-гуи, ош=\n\t%w", ош)
 	}
@@ -116,7 +125,7 @@ func НовСервВеб(серв types.ИСервер) (*СервВеб, error
 
 // Файбер -- возвращает файбер
 func (сам *СервВеб) Файбер() *fiber.App {
-	return &сам.роутер
+	return &сам.файбер
 }
 
 // Сервер -- возвращает сервер
@@ -127,7 +136,7 @@ func (сам *СервВеб) Сервер() types.ИСервер {
 // Пуск -- запускае веб-сервер в работу
 func (сам *СервВеб) Пуск() {
 	фнПуск := func() {
-		ош := сам.роутер.Listen(":" + сам.порт)
+		ош := сам.файбер.Listen(":" + сам.порт)
 		if ош != nil {
 			log.Printf("СервВеб.Пуск(): при работе веб-сервера, ош=\n\t%v\n", ош)
 			сам.серв.CancelApp()

+ 66 - 0
server/serv_web/web_api/web_api.go

@@ -0,0 +1,66 @@
+// package web_api -- веб-сервер для API
+package web_api
+
+import (
+	"fmt"
+	"log"
+	"time"
+
+	"github.com/gofiber/fiber/v2"
+
+	"wartank/pkg/types"
+)
+
+// ВебАпи -- веб-сервер для API
+type ВебАпи struct {
+	серв   types.ИСервер
+	файбер fiber.App
+}
+
+// НовВебАпи -- возвращает новый веб-сервер для API
+func НовВебАпи(вебСервер types.ИВебСервер) (*ВебАпи, error) {
+	if вебСервер == nil {
+		return nil, fmt.Errorf("НовВебАпи(): ИВебСервер==nil")
+	}
+	сам := &ВебАпи{
+		серв:   вебСервер.Сервер(),
+		файбер: *вебСервер.Файбер(),
+	}
+	сам.файбер.Post("/api/login", сам.логин)
+	return сам, nil
+}
+
+type LoginRequest struct {
+	Логин_            string `json:"login" form:"login"`
+	Пароль_           string `json:"password" form:"password"`
+	КонтрольноеСлово_ string `json:"control_word" form:"control_word"`
+}
+
+// Вызывается при попытке войти
+func (сам *ВебАпи) логин(кнт *fiber.Ctx) error {
+	запрос := new(LoginRequest)
+	if err := кнт.BodyParser(запрос); err != nil {
+		return кнт.JSON(fiber.Map{
+			"status": "ошибка в разборе формы",
+		})
+	}
+	log.Printf("ВебАпи.логин(): : %#+v\n", *запрос)
+	if запрос.Логин_ == "" || запрос.Пароль_ == "" {
+		return кнт.JSON(fiber.Map{
+			"status": "пустой логин/пароль",
+		})
+	}
+
+	if запрос.Логин_ != "svi" || запрос.Пароль_ != "Lera_07091978" {
+		return кнт.JSON(fiber.Map{
+			"status": "ошибка логина/пароля",
+		})
+	}
+	кнт.Cookie(&fiber.Cookie{
+		Name:     "login",
+		Value:    "svi",
+		Expires:  time.Now().Add(24 * time.Hour),
+		HTTPOnly: true,
+	})
+	return кнт.Redirect("/gui/list_bot")
+}

+ 19 - 2
server/serv_web/web_gui/web_gui.go

@@ -3,10 +3,11 @@ package web_gui
 
 import (
 	"fmt"
-
-	"wartank/pkg/types"
+	"log"
 
 	"github.com/gofiber/fiber/v2"
+
+	"wartank/pkg/types"
 )
 
 // ВебГип -- веб-сервер для графики
@@ -25,9 +26,25 @@ func НовВебГуи(вебСервер types.ИВебСервер) (*Веб
 		файбер: вебСервер.Файбер(),
 	}
 	сам.файбер.Get("/", сам.индекс)
+	сам.файбер.Get("/gui/list_bot", сам.списокБотов)
 	return сам, nil
 }
 
+// Возвращает страницу со списком ботов
+func (сам *ВебГуи) списокБотов(кнт *fiber.Ctx) error {
+	имя := кнт.Cookies("login")
+	if имя != "svi" {
+		return кнт.Render("index", fiber.Map{
+			"Title": "WarTank",
+			"err":   "Не выполнен вход",
+		})
+	}
+	log.Printf("ВебГуи.списокБотов(): логин=%s\n", имя)
+	return кнт.Render("list_bot", fiber.Map{
+		"Title": "WarTank",
+	})
+}
+
 // Возвращает индексную страницу
 func (сам *ВебГуи) индекс(кнт *fiber.Ctx) error {
 	return кнт.Render("index", fiber.Map{

+ 1 - 0
web/tmpl/footer.tmpl.html

@@ -1,6 +1,7 @@
 {{ define "footer" }}
 <br>
 Тут подвал.
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>
 </body>
 
 </HTML>

+ 5 - 1
web/tmpl/header.tmpl.html

@@ -1,4 +1,5 @@
 {{ define "header" }}
+<!doctype html>
 <HTML lang="ru">
 
     <head>
@@ -6,7 +7,10 @@
         <meta charset="utf-8">
         <meta name="viewport" content="width=device-width, initial-scale=1">
         <meta pragma="no-cache">
+        <!-- Bootstrap CSS -->
+        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet"
+            integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">
     </head>
 
     <body>
-{{end}}
+        {{end}}

+ 19 - 0
web/tmpl/index.tmpl.html

@@ -1,3 +1,22 @@
 {{ define "index" }}
+{{ template "header" . }}
 <h1>WarTank</h1>
+Стартовая страница игры вартанк.
+
+<!-- Форма логина -->
+<form action="/api/login" method="POST">
+    <label for="login">Логин:</label>
+    <input type="text" id="login" name="login"><br><br>
+
+    <label for="password">Пароль:</label>
+    <input type="password" id="password" name="password"><br><br>
+
+    <input type="submit" value="Вход">
+</form>
+
+{{ if .err }}
+    <p>{{ .err }}</p>
+{{ end }}
+
+{{ template "footer" . }}
 {{end}}

+ 7 - 0
web/tmpl/list_bot.tmpl.html

@@ -0,0 +1,7 @@
+{{ define "list_bot" }}
+<!-- web/tmpl/list_bot.tmpl.html -->
+{{ template "header" . }}
+<h1>WarTank</h1>
+Страница списка ботов вартанк.
+{{ template "footer" . }}
+{{end}}