Add product template & styling, models bug fix

This commit is contained in:
mikgor 2018-10-26 17:53:00 +02:00
parent fe8b875365
commit 4e0f22d0d2
8 changed files with 183 additions and 10 deletions

2
.gitignore vendored
View File

@ -10,3 +10,5 @@
# Output of the go coverage tool, specifically when used with LiteIDE # Output of the go coverage tool, specifically when used with LiteIDE
*.out *.out
static/icons/*

View File

@ -9,6 +9,7 @@ func initializePages() {
Pages = make(map[string]Page) Pages = make(map[string]Page)
Pages["index"] = Page{"/", "templates/index.html", map[string]interface{}{"categories": Categories}, nil} Pages["index"] = Page{"/", "templates/index.html", map[string]interface{}{"categories": Categories}, nil}
Pages["category"] = Page{"/category", "templates/category.html", map[string]interface{}{}, DynamicDataLoaderCategory} Pages["category"] = Page{"/category", "templates/category.html", map[string]interface{}{}, DynamicDataLoaderCategory}
Pages["product"] = Page{"/product", "templates/product.html", map[string]interface{}{}, DynamicDataLoaderProduct}
} }
func initializeData() { func initializeData() {
@ -16,7 +17,7 @@ func initializeData() {
{1, "Laptopy"}, {1, "Laptopy"},
{2, "Komputery"}, {2, "Komputery"},
{3, "Smartfony"}, {3, "Smartfony"},
{4, "Smartwache"}, {4, "Smartwatche"},
{5, "Monitory"}, {5, "Monitory"},
{6, "Drukarki"}, {6, "Drukarki"},
{7, "Myszki"}, {7, "Myszki"},
@ -29,16 +30,25 @@ func initializeData() {
1, 1,
GetCategoryByName("Laptopy"), GetCategoryByName("Laptopy"),
"Apple MacBook Air 128 GB", "Apple MacBook Air 128 GB",
"Procesor Intel Core i5</br>Pamięć 8 GB</br>Dysk SSD M.2 PCIe 128 GB</br>Grafika Intel HD Graphics 6000</br>Typ ekranu Błyszczący, LED</br>System macOS Sierra", "Procesor Intel Core i5 | Pamięć 8 GB | Dysk SSD M.2 PCIe 128 GB | Grafika Intel HD Graphics 6000 | Typ ekranu Błyszczący, LED | System macOS Sierra",
"https://cdn.x-kom.pl/i/setup/images/prod/big/product-big,apple-macbook-air-i58gb128gbhd-6000mac-os-368639,pr_2016_4_28_12_39_54_140.jpg", "https://cdn.x-kom.pl/i/setup/images/prod/big/product-big,apple-macbook-air-i58gb128gbhd-6000mac-os-368639,pr_2016_4_28_12_39_54_140.jpg",
11, 11,
3999, 3999,
}, },
{ {
2, 2,
GetCategoryByName("Laptopy"),
"Dell Inspiron 5370",
"Procesor Intel Core i5-8250U | Pamięć 8 GB | Dysk SSD M.2 256 GB | Grafika AMD Radeon 530, + Intel UHD Graphics 620 | Typ ekranu Matowy, LED | System Microsoft Windows 10 Home PL",
"https://cdn.x-kom.pl/i/setup/images/prod/big/product-big,dell-inspiron-5370-i5-8250u8gb256win10-r530-fhd-393456,2017/12/pr_2017_12_14_9_40_43_405_10.jpg",
5,
3249,
},
{
3,
GetCategoryByName("Komputery"), GetCategoryByName("Komputery"),
"Dell Inspiron 3670", "Dell Inspiron 3670",
"System Microsoft Windows 10 Home PL</br>Procesor Intel Core i7-8700</br>Grafika NVIDIA GeForce GTX 1050Ti, + Intel UHD Graphics 630</br>Pamięć RAM 8 GB</br>Dysk SSD PCIe 128 GB</br>Dysk HDD SATA 7200 obr. 1000 GB</br>Miejsce na dodatkowy wewnętrzny dysk SATA Możliwość montażu dwóch dysków SATA", "System Microsoft Windows 10 Home PL | Procesor Intel Core i7-8700 | Grafika NVIDIA GeForce GTX 1050Ti, + Intel UHD Graphics 630 | Pamięć RAM 8 GB | Dysk SSD PCIe 128 GB | Dysk HDD SATA 7200 obr. 1000 GB | Miejsce na dodatkowy wewnętrzny dysk SATA Możliwość montażu dwóch dysków SATA",
"https://cdn.x-kom.pl/i/setup/images/prod/big/product-big,dell-inspiron-3670-i7-87008gb1281000win10-gtx1050ti-447395,2018/9/pr_2018_9_20_15_45_5_770_00.jpg", "https://cdn.x-kom.pl/i/setup/images/prod/big/product-big,dell-inspiron-3670-i7-87008gb1281000win10-gtx1050ti-447395,2018/9/pr_2018_9_20_15_45_5_770_00.jpg",
123, 123,
4299, 4299,

View File

@ -20,6 +20,12 @@ func DynamicDataLoaderCategory(id int) map[string]interface{}{
} }
} }
func DynamicDataLoaderProduct(id int) map[string]interface{}{
return map[string]interface{}{
"product": GetProductById(id),
}
}
func (p Page) HandlePage(w http.ResponseWriter, r *http.Request) { func (p Page) HandlePage(w http.ResponseWriter, r *http.Request) {
if p.DynamicDataLoader != nil { if p.DynamicDataLoader != nil {
id, err := strconv.Atoi(r.URL.Query()["id"][0]) id, err := strconv.Atoi(r.URL.Query()["id"][0])
@ -77,8 +83,18 @@ func GetCategoryProducts(id int) []Product {
for i:= range Products { for i:= range Products {
if Products[i].Category.Id == id { if Products[i].Category.Id == id {
products = append(products, Products[i]) products = append(products, Products[i])
break
} }
} }
return products return products
} }
func GetProductById(id int) Product {
var product Product
for i:= range Products {
if Products[i].Id == id {
product = Products[i]
break
}
}
return product
}

View File

@ -1,3 +1,113 @@
body { body {
font-family: 'Roboto', sans-serif; font-family: 'Roboto', sans-serif;
margin: 0 auto;
}
#container {
margin: 20px;
}
header {
box-shadow: 0 0 5px rgba(0,0,0,.4);
padding: 20px;
}
a {
text-decoration: none;
color: black;
}
.categoryTile, .productTile {
width: 200px;
height: 200px;
display: inline-flex;
box-shadow: 0 0 5px rgba(0,0,0,.4);
margin-right: 20px;
margin-bottom: 20px;
border-radius: 5px;
text-align: center;
}
.categoryTileContent {
margin: auto;
font-size: 25px;
}
.categoryIcon {
width: 50px;
height: 50px;
background-size: 100%;
background-position: center;
margin: 10px auto;
}
.productTile {
width: 350px;
height: 350px;
}
.productIcon {
width: 250px;
height: 250px;
background-size: 100%;
background-position: center;
margin: auto;
}
.productPrice {
font-size: 20px;
color: gray;
}
.productDescription {
margin: 0 auto;
width: 770px;
height: 500px;
text-align: center;
display: flex;
}
.productDescriptionColumn {
width: 50%;
height: 100%;
display: inline-flex;
}
.productDescriptionContent {
margin: auto;
}
.productDescriptionIcon {
width: 350px;
height: 350px;
background-size: 100%;
background-position: center;
margin: auto;
background-repeat: no-repeat;
}
.productDescriptionText {
margin: auto;
}
input[type="number"] {
text-align: center;
border-radius: 10px;
box-shadow: 0 0 5px rgba(0,0,0,.4);
border: none;
}
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button {
opacity: 1;
}
input[type="button"] {
background-color: #1d9d00;
border: none;
padding: 20px;
padding-bottom: 5px;
padding-top: 5px;
border-radius: 10px;
color: white;
} }

View File

@ -9,8 +9,8 @@
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet"> <link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
</head> </head>
<body> <body>
<a href="http://127.0.0.1:8000">[Strona główna]<a/> <header><a href="http://127.0.0.1:8000">[Strona główna]</a></header>
{{template "content" .}} <div id="container">{{template "content" .}}</div>
</body> </body>
</html> </html>
{{end}} {{end}}

View File

@ -1,6 +1,14 @@
{{define "content"}} {{define "content"}}
{{.category.Name}} <h1>{{.category.Name}}</h1>
{{range $.products}} {{range $.products}}
<a href="">{{ .Name }}</a> <a href="http://127.0.0.1:8000/product?id={{ .Id }}">
<div class="productTile">
<div class="categoryTileContent">
<div class="productIcon" style="background-image: url({{ .ImgUrl }});"></div>
<div class="categoryName">{{ .Name }}</div>
<div class="productPrice">{{ .Price }} zł</div>
</div>
</div>
</a>
{{end}} {{end}}
{{end}} {{end}}

View File

@ -1,5 +1,13 @@
{{define "content"}} {{define "content"}}
<h1>Kategorie</h1>
{{range $.categories}} {{range $.categories}}
<a href="/category?id={{ .Id }}">{{ .Name }}</a> <a href="/category?id={{ .Id }}">
<div class="categoryTile">
<div class="categoryTileContent">
<div class="categoryIcon" style="background-image: url(http://127.0.0.1:8000/static/icons/{{ .Name }}.png);"></div>
<div class="categoryName">{{ .Name }}</div>
</div>
</div>
</a>
{{end}} {{end}}
{{end}} {{end}}

19
templates/product.html Normal file
View File

@ -0,0 +1,19 @@
{{define "content"}}
<div class="productDescription">
<div class="productDescriptionColumn">
<div class="productDescriptionContent">
<h1>{{.product.Name}}</h1>
<div class="productDescriptionIcon" style="background-image: url({{ .product.ImgUrl }});"></div>
</div>
</div>
<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>
<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()">
</div>
</div>
</div>
{{end}}