Compare commits
11 Commits
eff740072d
...
v1.3.0
Author | SHA1 | Date | |
---|---|---|---|
cf8aea5115 | |||
c510646c84 | |||
a4366c7395 | |||
073dfafb28 | |||
3fa5cf46d2 | |||
bd8b015f44 | |||
5a1cd77676 | |||
012906eee2 | |||
2a705483d9 | |||
be2c3ae178 | |||
f32223f12c |
24
.gitignore
vendored
24
.gitignore
vendored
@ -1,4 +1,26 @@
|
||||
# GoWeb specific
|
||||
env.json
|
||||
logs/
|
||||
*.log
|
||||
/.idea
|
||||
|
||||
# Binaries for programs and plugins
|
||||
*.exe
|
||||
*.exe~
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
|
||||
# Test binary, built with `go test -c`
|
||||
*.test
|
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
|
||||
# Dependency directories
|
||||
vendor/
|
||||
|
||||
# Go workspace file
|
||||
go.work
|
||||
|
||||
# IDE files
|
||||
/.idea
|
||||
|
59
README.md
Normal file
59
README.md
Normal file
@ -0,0 +1,59 @@
|
||||
# GoWeb 🌐
|
||||
|
||||
GoWeb is a simple Go web framework that aims to only use the standard library. The overall file structure and
|
||||
development flow is inspired by larger frameworks like Laravel. It is partially ready for smaller projects if you are
|
||||
fine with getting your hands dirty, but I plan on having it ready to go for more serious projects when it hits version
|
||||
2.0.
|
||||
|
||||
<hr>
|
||||
|
||||
## Current features 🚀
|
||||
|
||||
- Routing/controllers
|
||||
- Templating
|
||||
- Simple database migration system
|
||||
- CSRF protection
|
||||
- Minimal user login/registration + sessions
|
||||
- Config file handling
|
||||
- Entire website compiles into a single binary (~10mb) (excluding env.json)
|
||||
- Minimal dependencies (just standard library, postgres driver, and experimental package for bcrypt)
|
||||
|
||||
<hr>
|
||||
|
||||
## When to use 🙂
|
||||
|
||||
- You need to build a dynamic web application with persistent data
|
||||
- You need to build a dynamic website using Go and need a good starting point
|
||||
- You need to build an API in Go and don't know where to start
|
||||
- Pretty much any use-case where you would use Laravel, Django, or Flask
|
||||
|
||||
## When not to use 🙃
|
||||
|
||||
- You need a static website (see [Hugo](https://gohugo.io/))
|
||||
- You need a simple blog (see [Hugo](https://gohugo.io/))
|
||||
- You need a simple site for your projects' documentation (see [Hugo](https://gohugo.io/))
|
||||
|
||||
## How to use 🤔
|
||||
|
||||
1. Clone
|
||||
2. Run `go get` to install dependencies
|
||||
3. Copy env_example.json to env.json and fill in the values
|
||||
4. Run `go run main.go` to start the server
|
||||
5. Start building your app!
|
||||
|
||||
## How to contribute 👨💻
|
||||
|
||||
- Open an issue on GitHub if you find a bug or have a feature request.
|
||||
- [Email](mailto:contact@mpatterson.xyz) me a patch if you want to contribute code.
|
||||
- Please include a good description of what the patch does and why it is needed, also include how you want to be
|
||||
credited in the commit message.
|
||||
|
||||
<hr>
|
||||
|
||||
### License and disclaimer 😤
|
||||
|
||||
- You are free to use this project under the terms of the MIT license. See LICENSE for more details.
|
||||
- You and you alone are responsible for the security and everything else regarding your application.
|
||||
- It is not required, but I ask that when you use this project you give me credit by linking to this repository.
|
||||
- I also ask that when releasing self-hosted or other end-user applications that you release it under
|
||||
the [GPLv3](https://www.gnu.org/licenses/gpl-3.0.html) license. This too is not required, but I would appreciate it.
|
2
go.mod
2
go.mod
@ -4,5 +4,5 @@ go 1.20
|
||||
|
||||
require (
|
||||
github.com/lib/pq v1.10.7
|
||||
golang.org/x/crypto v0.6.0
|
||||
golang.org/x/crypto v0.7.0
|
||||
)
|
||||
|
4
go.sum
4
go.sum
@ -1,4 +1,4 @@
|
||||
github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
|
||||
github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc=
|
||||
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
|
||||
golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
|
||||
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
|
||||
|
@ -3,6 +3,7 @@ package routes
|
||||
import (
|
||||
"GoWeb/app"
|
||||
"GoWeb/controllers"
|
||||
"io/fs"
|
||||
"log"
|
||||
"net/http"
|
||||
)
|
||||
@ -15,8 +16,14 @@ func GetRoutes(app *app.App) {
|
||||
}
|
||||
|
||||
// Serve static files
|
||||
http.Handle("/file/", http.FileServer(http.Dir("./static")))
|
||||
log.Println("Serving static files from: ./static")
|
||||
staticFS, err := fs.Sub(app.Res, "static")
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
staticHandler := http.FileServer(http.FS(staticFS))
|
||||
http.Handle("/static/", http.StripPrefix("/static/", staticHandler))
|
||||
log.Println("Serving static files from embedded file system /static")
|
||||
|
||||
// Pages
|
||||
http.HandleFunc("/", getController.ShowHome)
|
||||
|
75
static/css/style.css
Normal file
75
static/css/style.css
Normal file
@ -0,0 +1,75 @@
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
background-color: lightblue;
|
||||
color: #333;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: 80%;
|
||||
padding: 20px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.footer-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 80px;
|
||||
background-color: lightblue;
|
||||
}
|
||||
|
||||
footer {
|
||||
color: #0077be;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
form label {
|
||||
display: block;
|
||||
font-weight: bold;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
form input[type="text"],
|
||||
form input[type="password"] {
|
||||
padding: 10px;
|
||||
font-size: 16px;
|
||||
border-radius: 5px;
|
||||
border: none;
|
||||
margin-bottom: 10px;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
form input[type="submit"] {
|
||||
display: inline-block;
|
||||
padding: 10px 20px;
|
||||
background-color: #0077be;
|
||||
color: #fff;
|
||||
border-radius: 5px;
|
||||
text-decoration: none;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
form input[type="submit"]:hover {
|
||||
background-color: #005fa3;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #0077be;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
@ -3,11 +3,14 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>SiteName - {{ template "pageTitle" }}</title>
|
||||
<link rel="stylesheet" href="/static/css/style.css">
|
||||
</head>
|
||||
<body>
|
||||
{{ template "content" . }}
|
||||
<div class="footer-container">
|
||||
<footer>
|
||||
<p>SiteName - Powered by GoWeb!</p>
|
||||
</footer>
|
||||
</div>
|
||||
</body>
|
||||
<footer>
|
||||
<p>SiteName - Powered by Go!</p>
|
||||
</footer>
|
||||
</html>
|
||||
</html>
|
||||
|
@ -1,13 +1,16 @@
|
||||
{{ define "pageTitle" }}Login{{ end }}
|
||||
|
||||
{{ define "content" }}
|
||||
<form action="/login-handle" method="post">
|
||||
<input name="csrf_token" type="hidden" value="{{ .CsrfToken }}">
|
||||
<h1>Login</h1>
|
||||
<div class="container">
|
||||
<form action="/login-handle" method="post">
|
||||
<input name="csrf_token" type="hidden" value="{{ .CsrfToken }}">
|
||||
|
||||
<label for="username">Username:</label><br>
|
||||
<input id="username" name="username" type="text" value="John"><br><br>
|
||||
<label for="password">Password:</label><br>
|
||||
<input id="password" name="password" type="password"><br><br>
|
||||
<input type="submit" value="Submit">
|
||||
</form>
|
||||
<label for="username">Username:</label><br>
|
||||
<input id="username" name="username" type="text" placeholder="John"><br><br>
|
||||
<label for="password">Password:</label><br>
|
||||
<input id="password" name="password" type="password"><br><br>
|
||||
<input type="submit" value="Submit">
|
||||
</form>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
@ -1,13 +1,16 @@
|
||||
{{ define "pageTitle" }}Register{{ end }}
|
||||
|
||||
{{ define "content" }}
|
||||
<form action="/register-handle" method="post">
|
||||
<input name="csrf_token" type="hidden" value="{{ .CsrfToken }}">
|
||||
<h1>Register</h1>
|
||||
<div class="container">
|
||||
<form action="/register-handle" method="post">
|
||||
<input name="csrf_token" type="hidden" value="{{ .CsrfToken }}">
|
||||
|
||||
<label for="username">Username:</label><br>
|
||||
<input id="username" name="username" type="text" value="John"><br><br>
|
||||
<label for="password">Password:</label><br>
|
||||
<input id="password" name="password" type="password"><br><br>
|
||||
<input type="submit" value="Submit">
|
||||
</form>
|
||||
<label for="username">Username:</label><br>
|
||||
<input id="username" name="username" type="text" placeholder="John"><br><br>
|
||||
<label for="password">Password:</label><br>
|
||||
<input id="password" name="password" type="password"><br><br>
|
||||
<input type="submit" value="Submit">
|
||||
</form>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
Reference in New Issue
Block a user