Add cart template & adding products to cart, implement views
This commit is contained in:
parent
4e0f22d0d2
commit
1aa32c0de9
@ -2,14 +2,17 @@ package initializers
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
. "Elektromarket/views"
|
||||
. "Elektromarket/models"
|
||||
)
|
||||
|
||||
func initializePages() {
|
||||
Pages = make(map[string]Page)
|
||||
Pages["index"] = Page{"/", "templates/index.html", map[string]interface{}{"categories": Categories}, nil}
|
||||
Pages["category"] = Page{"/category", "templates/category.html", map[string]interface{}{}, DynamicDataLoaderCategory}
|
||||
Pages["product"] = Page{"/product", "templates/product.html", map[string]interface{}{}, DynamicDataLoaderProduct}
|
||||
Pages["index"] = Page{"/", "templates/index.html", map[string]interface{}{"categories": Categories}, IndexView}
|
||||
Pages["category"] = Page{"/category", "templates/category.html", map[string]interface{}{}, CategoryView}
|
||||
Pages["product"] = Page{"/product", "templates/product.html", map[string]interface{}{}, ProductView}
|
||||
Pages["cart"] = Page{"/cart", "templates/cart.html", map[string]interface{}{}, CartView}
|
||||
Pages["addToCart"] = Page{"/addToCart", "templates/addToCart.html", map[string]interface{}{}, AddToCartView}
|
||||
}
|
||||
|
||||
func initializeData() {
|
||||
|
@ -2,39 +2,17 @@ package models
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"html/template"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type Page struct {
|
||||
Path string
|
||||
Template string
|
||||
Data map[string]interface{}
|
||||
DynamicDataLoader func(int) map[string]interface{}
|
||||
}
|
||||
|
||||
func DynamicDataLoaderCategory(id int) map[string]interface{}{
|
||||
return map[string]interface{}{
|
||||
"category": GetCategoryById(id),
|
||||
"products": GetCategoryProducts(id),
|
||||
}
|
||||
}
|
||||
|
||||
func DynamicDataLoaderProduct(id int) map[string]interface{}{
|
||||
return map[string]interface{}{
|
||||
"product": GetProductById(id),
|
||||
}
|
||||
View func(Page, http.ResponseWriter, *http.Request)
|
||||
}
|
||||
|
||||
func (p Page) HandlePage(w http.ResponseWriter, r *http.Request) {
|
||||
if p.DynamicDataLoader != nil {
|
||||
id, err := strconv.Atoi(r.URL.Query()["id"][0])
|
||||
if err == nil {
|
||||
p.Data = p.DynamicDataLoader(id)
|
||||
}
|
||||
}
|
||||
t, _ := template.ParseFiles(p.Template, "templates/base.html")
|
||||
t.ExecuteTemplate(w, "base", p.Data)
|
||||
p.View(p, w , r )
|
||||
}
|
||||
|
||||
type Category struct {
|
||||
@ -48,13 +26,45 @@ type Product struct {
|
||||
Name string
|
||||
Description string
|
||||
ImgUrl string
|
||||
Quantity uint
|
||||
Price uint
|
||||
Quantity int
|
||||
Price int
|
||||
}
|
||||
|
||||
type CartProduct struct {
|
||||
Product Product
|
||||
Quantity int
|
||||
PriceTotal int
|
||||
}
|
||||
|
||||
type Cart struct {
|
||||
Products []CartProduct
|
||||
PriceTotal int
|
||||
ItemsTotal int
|
||||
}
|
||||
|
||||
func (c Cart) Calculate() {
|
||||
ShoppingCart.PriceTotal = 0
|
||||
ShoppingCart.ItemsTotal = 0
|
||||
for i:= range c.Products {
|
||||
ShoppingCart.Products[i].PriceTotal = ShoppingCart.Products[i].Product.Price * ShoppingCart.Products[i].Quantity
|
||||
ShoppingCart.PriceTotal += ShoppingCart.Products[i].PriceTotal
|
||||
ShoppingCart.ItemsTotal += ShoppingCart.Products[i].Quantity
|
||||
}
|
||||
}
|
||||
|
||||
var Pages map[string]Page
|
||||
var Categories []Category
|
||||
var Products []Product
|
||||
var ShoppingCart Cart
|
||||
|
||||
func (p Product) Save() {
|
||||
for i:= range Products {
|
||||
if Products[i].Id == p.Id {
|
||||
Products[i] = p
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func GetCategoryByName(name string) Category {
|
||||
var category Category
|
||||
|
@ -10,6 +10,45 @@ body {
|
||||
header {
|
||||
box-shadow: 0 0 5px rgba(0,0,0,.4);
|
||||
padding: 20px;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.logoIcon {
|
||||
width: 200px;
|
||||
height: 50px;
|
||||
background-size: 100%;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
background-image: url(http://127.0.0.1:8000/static/icons/logo.png);
|
||||
float: left;
|
||||
}
|
||||
|
||||
.headerColumn {
|
||||
margin: auto;
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.cartIcon {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
background-size: 100%;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
background-image: url(http://127.0.0.1:8000/static/icons/shopping-cart.png);
|
||||
float: right;
|
||||
}
|
||||
|
||||
.cartItems {
|
||||
background-color: #d6dae2;
|
||||
position: absolute;
|
||||
padding: 3px;
|
||||
top: 19px;
|
||||
padding-left: 7px;
|
||||
border-radius: 3px;
|
||||
padding-right: 7px;
|
||||
font-size: small;
|
||||
right: 9px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
a {
|
||||
@ -111,3 +150,26 @@ input[type="button"] {
|
||||
border-radius: 10px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.cartItem {
|
||||
width: 90%;
|
||||
display: flex;
|
||||
text-align: center;
|
||||
margin: 20px auto;
|
||||
border-bottom: 1px solid rgba(0,0,0,.4);
|
||||
}
|
||||
|
||||
.cartItemColumn {
|
||||
width: 25%;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
.cartItemIcon {
|
||||
width: 90%;
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
background-size: 100%;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
margin: auto;
|
||||
}
|
||||
|
0
templates/addToCart.html
Normal file
0
templates/addToCart.html
Normal file
@ -9,7 +9,10 @@
|
||||
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
<header><a href="http://127.0.0.1:8000">[Strona główna]</a></header>
|
||||
<header>
|
||||
<div class="headerColumn"><a href="http://127.0.0.1:8000"><div class="logoIcon"></div></a></div>
|
||||
<div class="headerColumn"><a href="http://127.0.0.1:8000/cart"><div class="cartIcon"><div class="cartItems">{{.cart.ItemsTotal}}</div></a></div>
|
||||
</header>
|
||||
<div id="container">{{template "content" .}}</div>
|
||||
</body>
|
||||
</html>
|
||||
|
21
templates/cart.html
Normal file
21
templates/cart.html
Normal file
@ -0,0 +1,21 @@
|
||||
{{define "content"}}
|
||||
<h1>Koszyk</h1>
|
||||
<div class="cartItem">
|
||||
<div class="cartItemColumn"><h3>Produkt</h3></div>
|
||||
<div class="cartItemColumn"><h3>Cena za szt.</h3></div>
|
||||
<div class="cartItemColumn"><h3>Ilość</h3></div>
|
||||
<div class="cartItemColumn"><h3>Łącznie</h3></div>
|
||||
</div>
|
||||
{{range $.cart.Products}}
|
||||
<div class="cartItem">
|
||||
<div class="cartItemColumn">
|
||||
<a href="http://127.0.0.1:8000/product?id={{ .Product.Id }}"><b>{{ .Product.Name }}</b>
|
||||
<div class="cartItemIcon" style="background-image: url({{ .Product.ImgUrl }});"></div></a>
|
||||
</div>
|
||||
<div class="cartItemColumn">{{ .Product.Price }} zł</div>
|
||||
<div class="cartItemColumn">{{ .Quantity }}</div>
|
||||
<div class="cartItemColumn">{{ .PriceTotal }} zł</div>
|
||||
</div>
|
||||
{{end}}
|
||||
{{ .cart.PriceTotal }} zł
|
||||
{{end}}
|
@ -1,4 +1,9 @@
|
||||
{{define "content"}}
|
||||
<script type="text/javascript">
|
||||
function buy() {
|
||||
location.href = 'http://127.0.0.1:8000/addToCart?id=' + {{.product.Id}} + '&quantity=' + document.getElementById("quantity").value;
|
||||
}
|
||||
</script>
|
||||
<div class="productDescription">
|
||||
<div class="productDescriptionColumn">
|
||||
<div class="productDescriptionContent">
|
||||
@ -9,10 +14,10 @@
|
||||
<div class="productDescriptionColumn">
|
||||
<div class="productDescriptionText">
|
||||
{{.product.Description}}<br><br>
|
||||
<div class="productPrice">Ilość sztuk: <input type="number" name="quantity" min="1" max="{{.product.Quantity}}" value="1"></div>
|
||||
<div class="productPrice">Ilość sztuk: <input id="quantity" type="number" name="quantity" min="1" max="{{.product.Quantity}}" value="1"></div>
|
||||
<small>Dostępna Ilość: {{.product.Quantity}}</small><br><br>
|
||||
<div class="productPrice">Cena: {{.product.Price}} zł</div><br>
|
||||
<input type="button" value="Dodaj do koszyka" onclick="f()">
|
||||
<input type="button" value="Dodaj do koszyka" onclick="buy();">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
68
views/views.go
Normal file
68
views/views.go
Normal file
@ -0,0 +1,68 @@
|
||||
package views
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"strconv"
|
||||
"html/template"
|
||||
. "Elektromarket/models"
|
||||
)
|
||||
|
||||
func ExecuteView(w http.ResponseWriter, r *http.Request, templateName string, data map[string]interface{}) {
|
||||
data["cart"] = ShoppingCart
|
||||
t, _ := template.ParseFiles(templateName, "templates/base.html")
|
||||
t.ExecuteTemplate(w, "base", data)
|
||||
}
|
||||
|
||||
func IndexView(p Page, w http.ResponseWriter, r *http.Request) {
|
||||
ExecuteView(w, r, p.Template, p.Data)
|
||||
}
|
||||
|
||||
func CategoryView(p Page, w http.ResponseWriter, r *http.Request) {
|
||||
id, err := strconv.Atoi(r.URL.Query()["id"][0])
|
||||
if err == nil {
|
||||
p.Data = map[string]interface{}{
|
||||
"category": GetCategoryById(id),
|
||||
"products": GetCategoryProducts(id),
|
||||
}
|
||||
}
|
||||
ExecuteView(w, r, p.Template, p.Data)
|
||||
}
|
||||
|
||||
func ProductView(p Page, w http.ResponseWriter, r *http.Request) {
|
||||
id, err := strconv.Atoi(r.URL.Query()["id"][0])
|
||||
if err == nil {
|
||||
p.Data = map[string]interface{}{
|
||||
"product": GetProductById(id),
|
||||
}
|
||||
}
|
||||
ExecuteView(w, r, p.Template, p.Data)
|
||||
}
|
||||
|
||||
func CartView(p Page, w http.ResponseWriter, r *http.Request) {
|
||||
ExecuteView(w, r, p.Template, p.Data)
|
||||
}
|
||||
|
||||
func AddToCartView(p Page, w http.ResponseWriter, r *http.Request) {
|
||||
id, err := strconv.Atoi(r.URL.Query()["id"][0])
|
||||
quantity, erro := strconv.Atoi(r.URL.Query()["quantity"][0])
|
||||
if err == nil && erro == nil {
|
||||
prod := GetProductById(id)
|
||||
if prod.Quantity >= quantity {
|
||||
prod.Quantity -= quantity
|
||||
prod.Save()
|
||||
var exists bool = false
|
||||
for i:= range ShoppingCart.Products {
|
||||
if prod.Id == ShoppingCart.Products[i].Product.Id {
|
||||
exists = true
|
||||
ShoppingCart.Products[i].Quantity += quantity
|
||||
break
|
||||
}
|
||||
}
|
||||
if !exists {
|
||||
ShoppingCart.Products = append(ShoppingCart.Products, CartProduct{prod, quantity, 0})
|
||||
}
|
||||
ShoppingCart.Calculate()
|
||||
}
|
||||
}
|
||||
ExecuteView(w, r, "templates/cart.html", p.Data)
|
||||
}
|
Loading…
Reference in New Issue
Block a user