initial version
commit
afd43e3ff3
|
|
@ -0,0 +1 @@
|
|||
*.exe
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
<svg width="135" height="140" viewBox="0 0 135 140" xmlns="http://www.w3.org/2000/svg" fill="#fff">
|
||||
<rect y="10" width="15" height="120" rx="6">
|
||||
<animate attributeName="height"
|
||||
begin="0.5s" dur="1s"
|
||||
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
<animate attributeName="y"
|
||||
begin="0.5s" dur="1s"
|
||||
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
</rect>
|
||||
<rect x="30" y="10" width="15" height="120" rx="6">
|
||||
<animate attributeName="height"
|
||||
begin="0.25s" dur="1s"
|
||||
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
<animate attributeName="y"
|
||||
begin="0.25s" dur="1s"
|
||||
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
</rect>
|
||||
<rect x="60" width="15" height="140" rx="6">
|
||||
<animate attributeName="height"
|
||||
begin="0s" dur="1s"
|
||||
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
<animate attributeName="y"
|
||||
begin="0s" dur="1s"
|
||||
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
</rect>
|
||||
<rect x="90" y="10" width="15" height="120" rx="6">
|
||||
<animate attributeName="height"
|
||||
begin="0.25s" dur="1s"
|
||||
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
<animate attributeName="y"
|
||||
begin="0.25s" dur="1s"
|
||||
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
</rect>
|
||||
<rect x="120" y="10" width="15" height="120" rx="6">
|
||||
<animate attributeName="height"
|
||||
begin="0.5s" dur="1s"
|
||||
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
<animate attributeName="y"
|
||||
begin="0.5s" dur="1s"
|
||||
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
</rect>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
|
|
@ -0,0 +1,6 @@
|
|||
package frontend
|
||||
|
||||
import "embed"
|
||||
|
||||
//go:embed templates/*
|
||||
var Frontend embed.FS
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
.indicator {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.htmx-request .indicator {
|
||||
position: fixed;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
z-index: 9999;
|
||||
display: block;
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
{{ define "index" }}
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link href="https://cdn.jsdelivr.net/npm/daisyui@4.6.0/dist/full.min.css" rel="stylesheet" type="text/css" />
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<script src="https://unpkg.com/htmx.org@latest"></script>
|
||||
<script src="https://unpkg.com/htmx.org@latest/dist/ext/client-side-templates.js"></script>
|
||||
<script src="https://unpkg.com/mustache@latest"></script>
|
||||
<link rel="stylesheet" href="/css/custom.css">
|
||||
<title>HTMX Test</title>
|
||||
</head>
|
||||
|
||||
<body class="bg-[#a600f9] min-h-screen text-center text-white">
|
||||
<div id="app">
|
||||
<button class="btn btn-accent text-black text-2xl m-8" hx-disabled-elt="this" hx-get="/users"
|
||||
hx-swap="innerHTML transition:true" hx-indicator="#indicator" hx-target="#content">Get
|
||||
list of users</button>
|
||||
</div>
|
||||
|
||||
<div id="indicator">
|
||||
<img src="/assets/bars.svg" alt="Loading..." class="h-12 w-12 mx-auto indicator">
|
||||
</div>
|
||||
|
||||
<div id="content">
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
{{ end }}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
{{ define "init_page" }}
|
||||
<p>Init page</p>
|
||||
<button class="btn btn-accent" hx-get="/users" hx-swap="outerHTML" hx-target="#content">Get
|
||||
list of users</button>
|
||||
{{ end }}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
{{ define "users" }}
|
||||
<h1 class="text-3xl mb-8">Users</h1>
|
||||
<ul>
|
||||
{{ range .Users }}<li class="italic hover:font-bold">{{ .FirstName }}, {{ .Age }} years old</li>{{ end }}
|
||||
</ul>
|
||||
{{ end }}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
module todo
|
||||
|
||||
go 1.21.6
|
||||
|
||||
require github.com/gofiber/fiber/v2 v2.52.0
|
||||
|
||||
require (
|
||||
github.com/andybalholm/brotli v1.0.5 // indirect
|
||||
github.com/google/uuid v1.5.0 // indirect
|
||||
github.com/klauspost/compress v1.17.0 // indirect
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.15 // indirect
|
||||
github.com/rivo/uniseg v0.2.0 // indirect
|
||||
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
||||
github.com/valyala/fasthttp v1.51.0 // indirect
|
||||
github.com/valyala/tcplisten v1.0.0 // indirect
|
||||
golang.org/x/sys v0.15.0 // indirect
|
||||
)
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
|
||||
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
|
||||
github.com/gofiber/fiber/v2 v2.52.0 h1:S+qXi7y+/Pgvqq4DrSmREGiFwtB7Bu6+QFLuIHYw/UE=
|
||||
github.com/gofiber/fiber/v2 v2.52.0/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ=
|
||||
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
|
||||
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM=
|
||||
github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
|
||||
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||
github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA=
|
||||
github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g=
|
||||
github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
|
||||
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
|
||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
|
||||
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
|
|
@ -0,0 +1,104 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"html/template"
|
||||
"io"
|
||||
"net/http"
|
||||
"todo/frontend"
|
||||
"todo/models"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
var Tmpl *template.Template
|
||||
|
||||
func doGet(url string) ([]byte, error) {
|
||||
// Perform an HTTP GET request
|
||||
response, err := http.Get(url)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer response.Body.Close()
|
||||
|
||||
// Read the response body
|
||||
body, err := io.ReadAll(response.Body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return body, nil
|
||||
}
|
||||
|
||||
func SetupTemplates() error {
|
||||
|
||||
tmpl, err := template.New("").ParseFS(frontend.Frontend, "templates/*.html")
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
Tmpl = tmpl
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func main() {
|
||||
|
||||
SetupTemplates()
|
||||
|
||||
app := fiber.New(fiber.Config{
|
||||
StrictRouting: false,
|
||||
DisableStartupMessage: false,
|
||||
})
|
||||
|
||||
app.Static("/", "./frontend")
|
||||
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
|
||||
var result bytes.Buffer
|
||||
|
||||
err := Tmpl.ExecuteTemplate(&result, "index", nil)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return err
|
||||
}
|
||||
|
||||
c.Set("Content-Type", "text/html")
|
||||
|
||||
return c.SendString(result.String())
|
||||
|
||||
})
|
||||
|
||||
app.Get("/users", func(c *fiber.Ctx) error {
|
||||
|
||||
response, err := doGet("https://dummyjson.com/users")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return err
|
||||
}
|
||||
|
||||
var users models.Users
|
||||
|
||||
err = json.Unmarshal(response, &users)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return err
|
||||
}
|
||||
|
||||
var result bytes.Buffer
|
||||
|
||||
err = Tmpl.ExecuteTemplate(&result, "users", users)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return err
|
||||
}
|
||||
|
||||
return c.SendString(result.String())
|
||||
})
|
||||
|
||||
app.Listen(":3000")
|
||||
}
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
package models
|
||||
|
||||
type Users struct {
|
||||
Users []User `json:"users"`
|
||||
}
|
||||
|
||||
type User struct {
|
||||
ID int `json:"id"`
|
||||
FirstName string `json:"firstName"`
|
||||
LastName string `json:"lastName"`
|
||||
MaidenName string `json:"maidenName"`
|
||||
Age int `json:"age"`
|
||||
Gender string `json:"gender"`
|
||||
Email string `json:"email"`
|
||||
Phone string `json:"phone"`
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
BirthDate string `json:"birthDate"`
|
||||
Image string `json:"image"`
|
||||
BloodGroup string `json:"bloodGroup"`
|
||||
Height int `json:"height"`
|
||||
Weight float64 `json:"weight"`
|
||||
EyeColor string `json:"eyeColor"`
|
||||
Hair struct {
|
||||
Color string `json:"color"`
|
||||
Type string `json:"type"`
|
||||
} `json:"hair"`
|
||||
Domain string `json:"domain"`
|
||||
IP string `json:"ip"`
|
||||
Address struct {
|
||||
Address string `json:"address"`
|
||||
City string `json:"city"`
|
||||
Coordinates struct {
|
||||
Lat float64 `json:"lat"`
|
||||
Lng float64 `json:"lng"`
|
||||
} `json:"coordinates"`
|
||||
PostalCode string `json:"postalCode"`
|
||||
State string `json:"state"`
|
||||
} `json:"address"`
|
||||
MacAddress string `json:"macAddress"`
|
||||
University string `json:"university"`
|
||||
Bank struct {
|
||||
CardExpire string `json:"cardExpire"`
|
||||
CardNumber string `json:"cardNumber"`
|
||||
CardType string `json:"cardType"`
|
||||
Currency string `json:"currency"`
|
||||
Iban string `json:"iban"`
|
||||
} `json:"bank"`
|
||||
Company struct {
|
||||
Address struct {
|
||||
Address string `json:"address"`
|
||||
City string `json:"city"`
|
||||
Coordinates struct {
|
||||
Lat float64 `json:"lat"`
|
||||
Lng float64 `json:"lng"`
|
||||
} `json:"coordinates"`
|
||||
PostalCode string `json:"postalCode"`
|
||||
State string `json:"state"`
|
||||
} `json:"address"`
|
||||
Department string `json:"department"`
|
||||
Name string `json:"name"`
|
||||
Title string `json:"title"`
|
||||
} `json:"company"`
|
||||
Ein string `json:"ein"`
|
||||
Ssn string `json:"ssn"`
|
||||
UserAgent string `json:"userAgent"`
|
||||
Crypto struct {
|
||||
Coin string `json:"coin"`
|
||||
Wallet string `json:"wallet"`
|
||||
Network string `json:"network"`
|
||||
} `json:"crypto"`
|
||||
}
|
||||
Loading…
Reference in New Issue