package main
import (
"flag"
"fmt"
"html/template"
"log"
"net/http"
"sync"
)
// User struktura za uporabniške podatke
type User struct {
ID int
Username string
Password string
Email string
FullName string
}
// In-memory shranjevanje uporabnikov
var (
users = make(map[string]*User)
usersMux = &sync.RWMutex{}
lastID = 0
)
// Template cache
var templates *template.Template
func init() {
// Privzeti uporabniki
addUser("jnovak", "secure123", "janez.novak@securebank.si", "Janez Novak")
addUser("mpetric", "banking456", "maja.petric@securebank.si", "Maja Petrič")
}
func addUser(username, password, email, fullName string) {
usersMux.Lock()
defer usersMux.Unlock()
lastID++
users[username] = &User{
ID: lastID,
Username: username,
Password: password,
Email: email,
FullName: fullName,
}
}
func main() {
// Nastavimo port preko command line argumenta
var port = flag.String("port", "8080", "Port na katerem se bo zagnal server")
flag.Parse()
// Naložimo HTML predloge
var err error
templates, err = template.ParseGlob("templates/*.html")
if err != nil {
log.Fatal("Napaka pri nalaganju predlog:", err)
}
// Statične datoteke (CSS)
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static/"))))
// Routes
http.HandleFunc("/", homeHandler)
http.HandleFunc("/register", registerHandler)
http.HandleFunc("/login", loginHandler)
http.HandleFunc("/dashboard", dashboardHandler)
http.HandleFunc("/logout", logoutHandler)
// Zagon strežnika
fmt.Printf("SecureBank aplikacija se zaganja na portu %s\n", *port)
fmt.Printf("Dostop: http://localhost:%s\n", *port)
serverAddr := ":" + *port
log.Fatal(http.ListenAndServe(serverAddr, nil))
}
func homeHandler(w http.ResponseWriter, r *http.Request) {
templates.ExecuteTemplate(w, "home.html", nil)
}
func registerHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
templates.ExecuteTemplate(w, "register.html", nil)
return
}
if r.Method == "POST" {
username := r.FormValue("username")
password := r.FormValue("password")
email := r.FormValue("email")
fullName := r.FormValue("fullName")
//Validacija
if username == "" || password == "" || email == "" || fullName == "" {
templates.ExecuteTemplate(w, "register.html", map[string]string{
"Error": "Vsa polja so obvezna!",
})
return
}
// Preverimo če uporabnik že obstaja
usersMux.RLock()
_, exists := users[username]
usersMux.RUnlock()
if exists {
templates.ExecuteTemplate(w, "register.html", map[string]string{
"Error": "Uporabniško ime že obstaja!",
})
return
}
// Dodamo novega uporabnika
addUser(username, password, email, fullName)
// Preusmeri na prijavo
http.Redirect(w, r, "/login?registered=1", http.StatusSeeOther)
return
}
}
func loginHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
data := map[string]string{}
if r.URL.Query().Get("registered") == "1" {
data["Success"] = "Registracija je bila uspešna! Sedaj se lahko prijavite."
}
templates.ExecuteTemplate(w, "login.html", data)
return
}
if r.Method == "POST" {
username := r.FormValue("username")
password := r.FormValue("password")
// Preverimo podatke
usersMux.RLock()
user, exists := users[username]
usersMux.RUnlock()
if !exists || user.Password != password {
templates.ExecuteTemplate(w, "login.html", map[string]string{
"Error": "Napačno uporabniško ime ali geslo!",
})
return
}
// Uspešna prijava - preusmeri na dashboard
// POZOR: Brez session management za demo!
http.Redirect(w, r, "/dashboard?user="+username, http.StatusSeeOther)
return
}
}
func dashboardHandler(w http.ResponseWriter, r *http.Request) {
username := r.URL.Query().Get("user")
if username == "" {
http.Redirect(w, r, "/login", http.StatusSeeOther)
return
}
usersMux.RLock()
user, exists := users[username]
usersMux.RUnlock()
if !exists {
http.Redirect(w, r, "/login", http.StatusSeeOther)
return
}
// Simuliramo "bančne" podatke
accounts := []map[string]interface{}{
{
"Name": "Glavni račun",
"Number": "SI56 1234 5678 9012 345",
"Balance": "€2,456.78",
},
{
"Name": "Varčevalni račun",
"Number": "SI56 1234 5678 9012 999",
"Balance": "€15,230.45",
},
}
data := map[string]interface{}{
"User": user,
"Accounts": accounts,
}
templates.ExecuteTemplate(w, "dashboard.html", data)
}
func logoutHandler(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "/", http.StatusSeeOther)
}