Producte show

Producte werden nun angezeigt .
This commit is contained in:
2023-11-14 20:27:23 +01:00
parent 8d81958da3
commit 54fdfe30a9
11 changed files with 458 additions and 29 deletions

View File

@@ -160,6 +160,9 @@ func (server *Server) routeInit() {
server.Router.HandleFunc("/register", server.DoRegister).Methods("POST")
server.Router.HandleFunc("/logout", server.Logout).Methods("GET")
server.Router.HandleFunc("/products", server.Products).Methods("GET")
server.Router.HandleFunc("/products/{slug}", server.GetProductByID).Methods("GET")
staticFileDirectory := http.Dir("./assets/")
staticFileHandler := http.StripPrefix("/public/", http.FileServer(staticFileDirectory))
server.Router.PathPrefix("/public/").Handler(staticFileHandler).Methods("GET")

View File

@@ -0,0 +1,62 @@
package controllers
import (
"github.com/gorilla/mux"
"github.com/unrolled/render"
"moretcgshop/app/models"
"net/http"
"strconv"
)
func (server *Server) Products(w http.ResponseWriter, r *http.Request) {
renderer := render.New(render.Options{
Layout: "layout",
Extensions: []string{".html", ".tmpl"},
})
q := r.URL.Query()
page, _ := strconv.Atoi(q.Get("page"))
if page <= 0 {
page = 1
}
perPage := 9
productModel := models.Product{}
products, totalRows, err := productModel.GetProducts(server.DB, perPage, page)
if err != nil {
return
}
_ = totalRows
_ = renderer.HTML(w, http.StatusOK, "products", map[string]interface{}{
"products": products,
})
}
func (server *Server) GetProductByID(w http.ResponseWriter, r *http.Request) {
renderer := render.New(render.Options{
Layout: "layout",
Extensions: []string{".html", ".tmpl"},
})
vars := mux.Vars(r)
if vars["slug"] == "" {
return
}
productModel := models.Product{}
product, err := productModel.FindByID(server.DB, vars["slug"])
if err != nil {
println(err.Error())
return
}
_ = renderer.HTML(w, http.StatusOK, "product", map[string]interface{}{
"product": product,
"success": GetFlash(w, r, "success"),
"error": GetFlash(w, r, "error"),
})
}

View File

@@ -0,0 +1,16 @@
package models
import "time"
type ProductImage struct {
ID string `gorm:"size:36;not null;uniqueIndex;primary_key"`
Product Product
ProductID string `gorm:"size:36;index"`
Path string `gorm:"type:text"`
ExtraLarge string `gorm:"type:text"`
Large string `gorm:"type:text"`
Medium string `gorm:"type:text"`
Small string `gorm:"type:text"`
CreatedAt time.Time
UpdatedAt time.Time
}

View File

@@ -10,5 +10,6 @@ func RegisterModels() []Model {
{Model: Product{}},
{Model: Category{}},
{Model: Section{}},
{Model: ProductImage{}},
}
}

View File

@@ -1,16 +1,55 @@
package models
import (
"github.com/shopspring/decimal"
"gorm.io/gorm"
"time"
)
type Product struct {
ID string
ParentID string
Name string
Categories []Category `gorm:"many2many:product_categories;"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt
ID string `gorm:"size:36;not null;uniqueIndex;primary_key"`
ParentID string `gorm:"size:36;index"`
Name string `gorm:"size:255"`
Slug string `gorm:"size:255"`
ProductImages []ProductImage
Price decimal.Decimal `gorm:"type:decimal(16,2);"`
Categories []Category `gorm:"many2many:product_categories;"`
ShortDescription string `gorm:"type:text"`
Description string `gorm:"type:text"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt
}
func (p *Product) GetProducts(db *gorm.DB, perPage int, page int) (*[]Product, int64, error) {
var count int64
var products []Product
err := db.Debug().Model(&Product{}).Count(&count).Error
if err != nil {
return nil, 0, err
}
offset := (page - 1) * perPage
err = db.Debug().Model(&Product{}).Order("created_at desc").Limit(perPage).Offset(offset).Find(&products).Error
if err != nil {
return nil, 0, err
}
return &products, count, nil
}
func (p *Product) FindByID(db *gorm.DB, productID string) (*Product, error) {
var err error
var product Product
err = db.Debug().Preload("ProductImages").Model(&Product{}).Where("id = ?", productID).First(&product).Error
//err = db.Debug().Model(&Product{}).Where("id = ?", productID).First(&product).Error
if err != nil {
return nil, err
}
return &product, nil
}