Dodavanje podešavanja u bazu, logo zona sa tri opcije

This commit is contained in:
2026-06-01 01:16:37 +02:00
parent 3b9e0c081a
commit acf8cada0e
7 changed files with 123 additions and 31 deletions
+48
View File
@@ -0,0 +1,48 @@
package sqlite
import (
"context"
"database/sql"
"fmt"
)
// DohvatiPodesavanje čita jednu vrednost iz tabele podešavanja
func DohvatiPodesavanje(ctx context.Context, db *sql.DB, kljuc string) (string, error) {
var vrednost string
err := db.QueryRowContext(ctx, "SELECT vrednost FROM podesavanja WHERE kljuc = ?", kljuc).Scan(&vrednost)
if err != nil {
return "", fmt.Errorf("ntech: DohvatiPodesavanje: %s: %w", kljuc, err)
}
return vrednost, nil
}
// SacuvajPodesavanje upisuje ili menja vrednost u tabeli podešavanja
func SacuvajPodesavanje(ctx context.Context, db *sql.DB, kljuc, vrednost string) error {
_, err := db.ExecContext(ctx,
"INSERT INTO podesavanja (kljuc, vrednost) VALUES (?, ?) ON CONFLICT(kljuc) DO UPDATE SET vrednost = excluded.vrednost",
kljuc, vrednost,
)
if err != nil {
return fmt.Errorf("ntech: SacuvajPodesavanje: %s: %w", kljuc, err)
}
return nil
}
// DohvatiSvaPodesavanja čita sva podešavanja i vraća ih kao mapu
func DohvatiSvaPodesavanja(ctx context.Context, db *sql.DB) (map[string]string, error) {
redovi, err := db.QueryContext(ctx, "SELECT kljuc, vrednost FROM podesavanja")
if err != nil {
return nil, fmt.Errorf("ntech: DohvatiSvaPodesavanja: %w", err)
}
defer redovi.Close()
rezultat := make(map[string]string)
for redovi.Next() {
var kljuc, vrednost string
if err := redovi.Scan(&kljuc, &vrednost); err != nil {
return nil, fmt.Errorf("ntech: DohvatiSvaPodesavanja: scan: %w", err)
}
rezultat[kljuc] = vrednost
}
return rezultat, nil
}
+14 -6
View File
@@ -4,18 +4,28 @@ import (
"html/template"
"net/http"
"ntech/internal/db/sqlite"
"ntech/internal/model"
)
// Dashboard renderuje početnu stranicu
func Dashboard(w http.ResponseWriter, r *http.Request) {
// za sad koristimo testne podatke — kasnije će ići iz baze
func (h *Handler) Dashboard(w http.ResponseWriter, r *http.Request) {
// čitamo sva podešavanja iz baze
podesavanja, err := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB)
if err != nil {
http.Error(w, "Greška pri učitavanju podešavanja", http.StatusInternalServerError)
return
}
podaci := model.PodaciDashboarda{
PodaciStranice: model.PodaciStranice{
Stranica: "dashboard",
NaslovStranice: "Dashboard",
Tema: "tamna",
NazivFirme: "NTech",
Tema: podesavanja["tema"],
NazivFirme: podesavanja["naziv_firme"],
Podnazlov: podesavanja["podnazlov"],
LogoTip: podesavanja["logo_tip"],
LogoPutanja: podesavanja["logo_putanja"],
Korisnik: "Admin",
},
BrojArtikala: 0,
@@ -26,7 +36,6 @@ func Dashboard(w http.ResponseWriter, r *http.Request) {
KriticneZalihe: []model.StavkaZalihe{},
}
// učitavamo sve potrebne šablone zajedno
tmpl, err := template.ParseFiles(
"web/templates/teme/podrazumevana/base.html",
"web/templates/komponente/sidebar.html",
@@ -38,7 +47,6 @@ func Dashboard(w http.ResponseWriter, r *http.Request) {
return
}
// renderujemo base šablon sa podacima
if err := tmpl.ExecuteTemplate(w, "base", podaci); err != nil {
http.Error(w, "Greška pri prikazu stranice", http.StatusInternalServerError)
return
+13
View File
@@ -0,0 +1,13 @@
package handler
import "database/sql"
// Handler drži zavisnosti koje su potrebne svim handlerima
type Handler struct {
DB *sql.DB
}
// Novi kreira novi Handler sa datom bazom
func Novi(db *sql.DB) *Handler {
return &Handler{DB: db}
}
+15 -13
View File
@@ -4,7 +4,7 @@ package model
type StavkaServisa struct {
Uredjaj string
Status string
BojaTacke string // "#16a34a" zelena, "#f59e0b" žuta, "#dc2626" crvena
BojaTacke string
}
// StavkaZalihe prikazuje jedan artikal sa kritičnom zalihom
@@ -16,21 +16,23 @@ type StavkaZalihe struct {
// PodaciStranice su zajednički podaci koje svaka stranica prima
type PodaciStranice struct {
Stranica string // naziv aktivne stranice za sidebar
NaslovStranice string // naslov u topbaru
Tema string // aktivna tema: "tamna", "svetla", "zelena", "ljubicasta"
NazivFirme string // naziv firme za logo zonu
Logo string // putanja do logo fajla, opciono
Korisnik string // ime korisnika za avatar
Stranica string
NaslovStranice string
Tema string
NazivFirme string
Podnazlov string
LogoTip string // "ikonica", "tekst", "slika"
LogoPutanja string // putanja do slike, koristi se samo kada je LogoTip "slika"
Korisnik string
}
// PodaciDashboarda su podaci specifični za dashboard stranicu
type PodaciDashboarda struct {
PodaciStranice
BrojArtikala int
AktivniServisi int
ProdajaOvogMeseca int
KriticnaZaliha int
PoslednjiServisi []StavkaServisa
KriticneZalihe []StavkaZalihe
BrojArtikala int
AktivniServisi int
ProdajaOvogMeseca int
KriticnaZaliha int
PoslednjiServisi []StavkaServisa
KriticneZalihe []StavkaZalihe
}