Calculator Tools Calculator Tools

Bookstore - Shopping Cart Application

Sep 11, 2023

About this app

A simple shopping cart application for selling books

Bookstore - Shopping Cart Application Bookstore {{ book.title }} By {{ book.author }} ${{ book.price }} Add to Cart Total: ${{ cartTotal }} Checkout Your cart is empty {{ item.title }} Quantity: {{ item.quantity }} ${{ item.price }} ✖ Loading catalog...

Put this on your site

Source

                    <html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1">

<title>Bookstore - Shopping Cart Application</title>
<meta name="description" content="A simple shopping cart application for selling books">
<meta name="keywords" content="bookstore, shopping cart, books, checkout, catalog">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Roboto:400,700" rel="stylesheet">

<style>
body {
font-family: 'Roboto', sans-serif;
background-color: #f8f8f8;
}

.container {
max-width: 800px;
margin-top: 30px;
}

.title {
text-align: center;
margin-bottom: 30px;
}

.book-list {
list-style: none;
padding: 0;
}

.book-item {
display: flex;
justify-content: space-between;
margin-bottom: 20px;
padding: 10px;
background-color: #fff;
border-radius: 5px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

.book-image {
width: 100px;
height: 150px;
flex-shrink: 0;
margin-right: 20px;
object-fit: cover;
}

.book-details {
flex-grow: 1;
}

.book-title {
font-weight: bold;
margin-bottom: 5px;
}

.book-author {
margin-bottom: 10px;
}

.book-price {
font-size: 18px;
font-weight: bold;
}

.add-to-cart {
background-color: #007bff;
color: #fff;
border: none;
padding: 5px 10px;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.3s ease;
}

.add-to-cart:hover {
background-color: #0056b3;
}

.checkout-button {
background-color: #28a745;
color: #fff;
border: none;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.3s ease;
float: right;
}

.checkout-button:hover {
background-color: #218838;
}

.cart-total {
text-align: right;
margin-top: 20px;
font-weight: bold;
}

.cart-item {
display: flex;
justify-content: space-between;
padding: 10px;
background-color: #fff;
border-radius: 5px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

.cart-item-details {
flex-grow: 1;
}

.cart-item-title {
font-weight: bold;
}

.cart-item-quantity {
margin-top: 5px;
}

.cart-item-price {
font-weight: bold;
}

.remove-item {
color: #dc3545;
cursor: pointer;
transition: color 0.3s ease;
}

.remove-item:hover {
color: #c82333;
}

.empty-cart {
text-align: center;
margin-top: 30px;
font-weight: bold;
}
</style>
</head>
<body>
<div id="main-container" class="container">
<h1 class="title">Bookstore</h1>

<div v-if="showCatalog">
<ul class="book-list">
<li v-for="book in books" :key="book.id" class="book-item">
<img :src="book.image" alt="Book Cover" class="book-image">
<div class="book-details">
<h3 class="book-title">{{ book.title }}</h3>
<p class="book-author">By {{ book.author }}</p>
<p class="book-price">${{ book.price }}</p>
</div>
<button class="add-to-cart" @click="addToCart(book)">Add to Cart</button>
</li>
</ul>

<div class="cart-total" v-if="cartItems.length > 0">
Total: ${{ cartTotal }}
<button class="checkout-button" @click="checkout">Checkout</button>
</div>

<div v-if="cartItems.length === 0" class="empty-cart">Your cart is empty</div>

<div class="cart-item" v-for="item in cartItems" :key="item.id">
<div class="cart-item-details">
<h3 class="cart-item-title">{{ item.title }}</h3>
<p class="cart-item-quantity">Quantity: {{ item.quantity }}</p>
</div>
<p class="cart-item-price">${{ item.price }}</p>
<span class="remove-item" @click="removeFromCart(item)">&#10006;</span>
</div>
</div>

<div v-else>
<p>Loading catalog...</p>
</div>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min.js"></script>
<script>
try {
// App Javascript Goes Here. Place your entire script content inside the try block for error handling.
new Vue({
el: '#main-container',
data: {
showCatalog: false,
books: [],
cartItems: []
},
created() {
// Fetch books data from the server
fetch('books.json')
.then(response => response.json())
.then(data => {
this.books = data;
this.showCatalog = true;
})
.catch(error => {
console.error('Error loading books:', error);
});
},
computed: {
cartTotal() {
return this.cartItems.reduce((total, item) => total + (item.price * item.quantity), 0);
}
},
methods: {
addToCart(book) {
const existingItem = this.cartItems.find(item => item.id === book.id);
if (existingItem) {
existingItem.quantity++;
} else {
this.cartItems.push({
id: book.id,
title: book.title,
price: book.price,
quantity: 1
});
}
},
removeFromCart(item) {
const index = this.cartItems.findIndex(cartItem => cartItem.id === item.id);
if (index > -1) {
this.cartItems.splice(index, 1);
}
},
checkout() {
// Perform checkout logic here
alert('Checkout completed!');
}
}
});
} catch (error) {
// This will throw the error to the parent window.
throw error;
}
</script>
</body>
</html>