ProShop 1
ProShop 1
Experience
By
Kamrujama Siddique
(Deemed to be University)
2025
CERTIFICATE
i
DECLARATION
(Student’s Signature)
Date:
Place:
ii
ACKNOWLEDGEMENT
I would like to express my sincere gratitude to all those who supported me throughout the
development of this project, “ProShop – Electronics E-Commerce Website”. This project has
been a valuable learning experience and would not have been possible without the
encouragement, guidance, and support I received along the way.
First and foremost, I would like to thank my mentor and project guide, Dr. Abdul Majid
Farooqi, for their consistent support, insightful feedback, and technical guidance throughout the
duration of this project. Their expertise and encouragement played a vital role in shaping the
direction and quality of my work.
I am also extremely grateful to Jamia Hamdard University for providing the infrastructure,
resources, and a conducive learning environment that enabled the successful execution of this
project.
A special note of thanks to my classmates and friends for their constant motivation, constructive
suggestions, and help in testing the website and providing valuable feedback during different
stages of development.
I would also like to thank my family for their unwavering support, patience, and understanding
during the entire process. Their belief in me has always been a source of inspiration and strength.
Student’s Signature
Date:
iii
List of Abbreviation
______________________________________________________________________________
1. UI User Interface
2. UX User Experience
5. DB Database
iv
20. SEO Search Engine Optimization
33. JS JavaScript
v
Table of Contents
______________________________________________________________________________
Approved Performa
Declaration ……………………………………………………………………………………... ii
Approved Synopsis
1. Introduction …………………………………………………………………………… .. 1
2. Objective ……………………………………………………………………………….. 2
9. Conclusion …………………………………………………………………………….. 82
vi
11. Future Scope …………………………………………………………………………. 86
vii
List Of Figures
______________________________________________________________________________
viii
List of Tables
______________________________________________________________________________
ix
1. Introduction
______________________________________________________________________________
In the era of rapid digital transformation, online shopping has become a fundamental part of
everyday life. Consumers now expect convenience, speed, and a seamless experience when
purchasing products—especially in the domain of electronics, where up-to-date information,
specifications, and pricing play a crucial role. The project titled "ProShop – The Ultimate
Electronics Shopping Experience" aims to provide users with a dynamic and user-friendly
platform dedicated to browsing, selecting, and purchasing a wide range of electronic products
online.
The ProShop website is designed with a modern approach to UI/UX, enabling smooth
navigation, product filtering, detailed product views, customer reviews, and secure payment
functionality. It bridges the gap between consumers and top-notch electronics by offering an
accessible, virtual shopping space tailored to meet their technological needs. In addition, it
supports product categorization, promotional banners, featured product sections, and an admin
dashboard to manage product listings and customer orders effectively.
The core objective behind the development of this platform is not only to facilitate online sales
of electronic goods but also to empower users with knowledge and choices through transparent
information and ease of access. From small personal gadgets to large appliances, users can make
informed buying decisions from the comfort of their homes.
In conclusion, ProShop is more than just a website—it's an integrated solution that reflects the
current trends in e-commerce and digital shopping. The platform is developed to meet the
expectations of today’s tech-savvy consumers while ensuring performance, security, and
scalability for business growth.
1
2. Objective
______________________________________________________________________________
The primary objective of the ProShop e-commerce website project is to design and develop a
feature-rich, user-friendly, and responsive online platform for the sale and purchase of electronic
products. The platform aims to offer customers a convenient, efficient, and secure way to browse
and shop for a wide range of electronic items including smartphones, laptops, accessories, smart
devices, and home appliances.
❖ To ensure a seamless user experience through intuitive design, easy navigation, fast
loading speeds, and responsive layouts that work well on both desktop and mobile
devices.
❖ To integrate secure payment gateway functionality that allows users to make payments
safely and reliably.
❖ To allow product review and rating features that help users make informed purchasing
decisions based on other customers’ feedback.
❖ To incorporate modern design principles for better visual appeal and brand trust, using
components such as promotional banners, featured products, and new arrival sections.
❖ To reduce physical dependency on offline shopping by offering a virtual store that is
accessible 24/7 from anywhere.
❖ To enable scalability so that more features, products, or categories can be added in the
future without major restructuring.
2
3. Problem Statements
______________________________________________________________________________
With the rapid evolution of digital technologies and the internet, consumer behavior has shifted
significantly from traditional in-store shopping to online platforms. Despite this shift, many
customers still face challenges when searching for reliable and user-friendly e-commerce
websites, especially in the niche of electronic products. Existing platforms often suffer from
issues like poor user experience, limited product information, slow load times, lack of
responsiveness, and security concerns during transactions.
In many developing areas, small and medium-sized electronics retailers are unable to offer their
products online due to high development costs, lack of technical knowledge, or dependency on
third-party marketplaces. As a result, they miss out on the growing segment of digital consumers,
and customers, in turn, are limited to a few large players with limited variety or inflated prices.
Additionally, some e-commerce websites lack transparency in pricing, clear product
specifications, or user reviews, which affects consumer trust. Others are not optimized for mobile
users, making it difficult for a majority of users who shop using smartphones. A lack of
personalized shopping experience, limited filtering options, and poor backend management also
create friction in both the user and admin experience.
From a business perspective, the absence of an integrated admin system for managing inventory,
tracking orders, and processing sales can slow down operations, increase human errors, and
reduce customer satisfaction.
Hence, the key problems to address are:
4. Difficulty in managing inventory and orders effectively from the admin side.
6. Unavailability of product reviews, filters, and technical specifications for user assistance.
7. Lack of an affordable, scalable solution for smaller electronics businesses to sell online.
3
This project aims to solve these problems by building ProShop, a modern, responsive, and user-
centric electronic e-commerce website that delivers seamless shopping, efficient product
management, and a secure transaction environment.
4
4. Software Requirements Specification (SRS)
______________________________________________________________________________
1. Hardware Requirements
Component Specification
Table no:-4.1
2. Software Requirements
Component Specification
Web Browser Google Chrome, Mozilla Firefox, Microsoft Edge (latest versions)
Code Editor / IDE Visual Studio Code, Sublime Text, Atom, etc.
Table no:-4.2
5
5. Context Flow Chart
______________________________________________________________________________
Figure no:-5.1
6
6. Data Flow Diagram (DFD)
______________________________________________________________________________
Figure no:-6.1
7
Component Description / Role
User Management Handles user authentication, registration, and profile data. Connects
with the User Database.
User Database Stores all user-related data such as credentials, profiles, and order
history.
Admin Manages the platform including products, orders, users, and system
configurations.
Product Catalog Displays all available products. Admin uses this module to
add/update product listings.
Product Database Stores detailed product information like name, description, price,
inventory levels, and images.
Order Database Contains order records including product ID, user ID, quantity,
price, order status, etc.
Order Processing Validates and prepares orders for shipping. Links with the Order
Gateway and Shipping Provider.
Shipping & Manages packaging, tracking, and delivery process. Works with the
Fulfillment Shipping Provider and Inventory Sync.
Shipping Provider Third-party logistics service that delivers orders to the customer.
Shipping Data Ensures data integrity between order processing, shipping, and
Consistency inventory systems.
Supplier API Interface to third-party suppliers for inventory and stock updates.
Inventory Sync Syncs inventory levels between database, shipping, and supplier
systems.
Analytics Service Collects performance and user data for reporting and system
optimization.
Analytics & Visualizes collected data like sales trends, user behavior, and stock
Reporting analytics.
8
Logs & Analytics DB Stores system logs and analytics data used by reporting tools and
admin monitoring.
Table no:-6.1
Figure no:-6.2
9
Component Function / Role
Table no:-6.2
10
Data Flow Diagram Level 2
Figure no:-6.3
User Management Handles user login, password reset, authentication, and audit
logging.
11
Order Section Manages order creation, validation, and processing.
External Analytics Integrates external tools for deep analysis and fraud detection.
Table no:-6.3
12
7. Entity Relationship Diagram (ER – Diagram)
______________________________________________________________________________
Figure no:-7.1
13
8. Appendix A:-Source Code of the Project
______________________________________________________________________________
A.1 Index.js
import './assets/styles/bootstrap.custom.css';
import './assets/styles/index.css';
// import 'bootstrap/dist/css/bootstrap.min.css';
import {
createBrowserRouter,
createRoutesFromElements,
Route,
RouterProvider,
} from 'react-router-dom';
14
import ShippingScreen from './screens/ShippingScreen';
createRoutesFromElements(
<Route
path='/search/:keyword/page/:pageNumber'
element={<HomeScreen />}
/>
15
<Route path='/login' element={<LoginScreen />} />
</Route>
<Route
path='/admin/productlist/:pageNumber'
element={<ProductListScreen />}
/>
<Route path='/admin/product/:id/edit'
element={<ProductEditScreen />} />
</Route>
</Route>
16
);
root.render(
<React.StrictMode>
<HelmetProvider>
<Provider store={store}>
<PayPalScriptProvider deferLoading={true}>
</PayPalScriptProvider>
</Provider>
</HelmetProvider>
</React.StrictMode>
);
reportWebVitals();
A.2 Store,js
17
const store = configureStore({
reducer: {
[apiSlice.reducerPath]: apiSlice.reducer,
cart: cartSliceReducer,
auth: authReducer,
},
getDefaultMiddleware().concat(apiSlice.middleware),
devTools: true,
});
Figure no:-8.1
A.3 App.js
18
import { useEffect } from 'react';
import 'react-toastify/dist/ReactToastify.css';
useEffect(() => {
if (expirationTime) {
dispatch(logout());
}, [dispatch]);
19
return (
<>
<ToastContainer />
<Header />
<main className='py-3'>
<Container>
<Outlet />
</Container>
</main>
<Footer />
</>
);
};
A.4 Cartutilis.js
};
// NOTE: the code below has been changed from the course code to fix
an issue
20
// Our addDecimals function expects a number and returns a string, so
it is not
);
state.itemsPrice = addDecimals(itemsPrice);
state.shippingPrice = addDecimals(shippingPrice);
state.taxPrice = addDecimals(taxPrice);
state.totalPrice = addDecimals(totalPrice);
21
localStorage.setItem('cart', JSON.stringify(state));
return state;
};
Figure no:-8.2
A.5 cartslice.js
};
// NOTE: the code below has been changed from the course code to fix
an issue
22
// correct to call it passing a string as the argument.
);
state.itemsPrice = addDecimals(itemsPrice);
state.shippingPrice = addDecimals(shippingPrice);
state.taxPrice = addDecimals(taxPrice);
state.totalPrice = addDecimals(totalPrice);
localStorage.setItem('cart', JSON.stringify(state));
23
return state;
};
A.6 Productapi.js
getProducts: builder.query({
url: PRODUCTS_URL,
}),
keepUnusedDataFor: 5,
providesTags: ['Products'],
}),
getProductDetails: builder.query({
url: `${PRODUCTS_URL}/${productId}`,
}),
keepUnusedDataFor: 5,
}),
createProduct: builder.mutation({
24
query: () => ({
url: `${PRODUCTS_URL}`,
method: 'POST',
}),
invalidatesTags: ['Product'],
}),
updateProduct: builder.mutation({
url: `${PRODUCTS_URL}/${data.productId}`,
method: 'PUT',
body: data,
}),
invalidatesTags: ['Products'],
}),
uploadProductImage: builder.mutation({
url: `/api/upload`,
method: 'POST',
body: data,
}),
}),
deleteProduct: builder.mutation({
url: `${PRODUCTS_URL}/${productId}`,
method: 'DELETE',
}),
25
providesTags: ['Product'],
}),
createReview: builder.mutation({
url: `${PRODUCTS_URL}/${data.productId}/reviews`,
method: 'POST',
body: data,
}),
invalidatesTags: ['Product'],
}),
getTopProducts: builder.query({
keepUnusedDataFor: 5,
}),
}),
});
export const {
useGetProductsQuery,
useGetProductDetailsQuery,
useCreateProductMutation,
useUpdateProductMutation,
useUploadProductImageMutation,
useDeleteProductMutation,
useCreateReviewMutation,
useGetTopProductsQuery,
26
} = productsApiSlice;
Figure no:-8.3
A.7 Oderssliceapi.js
createOrder: builder.mutation({
url: ORDERS_URL,
method: 'POST',
body: order,
27
}),
}),
getOrderDetails: builder.query({
url: `${ORDERS_URL}/${id}`,
}),
keepUnusedDataFor: 5,
}),
payOrder: builder.mutation({
url: `${ORDERS_URL}/${orderId}/pay`,
method: 'PUT',
body: details,
}),
}),
getPaypalClientId: builder.query({
query: () => ({
url: PAYPAL_URL,
}),
keepUnusedDataFor: 5,
}),
getMyOrders: builder.query({
query: () => ({
url: `${ORDERS_URL}/mine`,
}),
keepUnusedDataFor: 5,
28
}),
getOrders: builder.query({
query: () => ({
url: ORDERS_URL,
}),
keepUnusedDataFor: 5,
}),
deliverOrder: builder.mutation({
url: `${ORDERS_URL}/${orderId}/deliver`,
method: 'PUT',
}),
}),
}),
});
export const {
useCreateOrderMutation,
useGetOrderDetailsQuery,
usePayOrderMutation,
useGetPaypalClientIdQuery,
useGetMyOrdersQuery,
useGetOrdersQuery,
useDeliverOrderMutation,
} = orderApiSlice;
29
A.8 Userapislice.js
import { apiSlice } from './apiSlice';
login: builder.mutation({
url: `${USERS_URL}/auth`,
method: 'POST',
body: data,
}),
}),
register: builder.mutation({
url: `${USERS_URL}`,
method: 'POST',
body: data,
}),
}),
logout: builder.mutation({
query: () => ({
url: `${USERS_URL}/logout`,
method: 'POST',
30
}),
}),
profile: builder.mutation({
url: `${USERS_URL}/profile`,
method: 'PUT',
body: data,
}),
}),
getUsers: builder.query({
query: () => ({
url: USERS_URL,
}),
providesTags: ['User'],
keepUnusedDataFor: 5,
}),
deleteUser: builder.mutation({
url: `${USERS_URL}/${userId}`,
method: 'DELETE',
}),
}),
getUserDetails: builder.query({
url: `${USERS_URL}/${id}`,
}),
31
keepUnusedDataFor: 5,
}),
updateUser: builder.mutation({
url: `${USERS_URL}/${data.userId}`,
method: 'PUT',
body: data,
}),
invalidatesTags: ['User'],
}),
}),
});
export const {
useLoginMutation,
useLogoutMutation,
useRegisterMutation,
useProfileMutation,
useGetUsersQuery,
useDeleteUserMutation,
useUpdateUserMutation,
useGetUserDetailsQuery,
} = userApiSlice;
32
Figure no:-8.4
A.9 Usercontroller.js
// @access Public
33
if (user && (await user.matchPassword(password))) {
generateToken(res, user._id);
res.json({
_id: user._id,
name: user.name,
email: user.email,
isAdmin: user.isAdmin,
});
} else {
res.status(401);
});
// @access Public
if (userExists) {
res.status(400);
34
}
name,
email,
password,
});
if (user) {
generateToken(res, user._id);
res.status(201).json({
_id: user._id,
name: user.name,
email: user.email,
isAdmin: user.isAdmin,
});
} else {
res.status(400);
});
// @access Public
35
const logoutUser = (req, res) => {
res.clearCookie('jwt');
};
// @access Private
if (user) {
res.json({
_id: user._id,
name: user.name,
email: user.email,
isAdmin: user.isAdmin,
});
} else {
res.status(404);
});
36
// @access Private
if (user) {
if (req.body.password) {
user.password = req.body.password;
res.json({
_id: updatedUser._id,
name: updatedUser.name,
email: updatedUser.email,
isAdmin: updatedUser.isAdmin,
});
} else {
res.status(404);
});
37
// @desc Get all users
// @access Private/Admin
res.json(users);
});
// @access Private/Admin
if (user) {
if (user.isAdmin) {
res.status(400);
} else {
res.status(404);
});
38
// @desc Get user by ID
// @access Private/Admin
if (user) {
res.json(user);
} else {
res.status(404);
});
// @access Private/Admin
if (user) {
user.isAdmin = Boolean(req.body.isAdmin);
39
res.json({
_id: updatedUser._id,
name: updatedUser.name,
email: updatedUser.email,
isAdmin: updatedUser.isAdmin,
});
} else {
res.status(404);
});
export {
authUser,
registerUser,
logoutUser,
getUserProfile,
updateUserProfile,
getUsers,
deleteUser,
getUserById,
updateUser,
};
40
Figure no:-8.5
A.10 Productcontroller.js
// @access Public
? {
41
name: {
$regex: req.query.keyword,
$options: 'i',
},
: {};
.limit(pageSize)
});
// @access Public
if (product) {
return res.json(product);
} else {
42
// NOTE: this will run if a valid ObjectId but no product was
found
res.status(404);
});
// @access Private/Admin
price: 0,
user: req.user._id,
image: '/images/sample.jpg',
countInStock: 0,
numReviews: 0,
});
res.status(201).json(createdProduct);
});
43
// @desc Update a product
// @access Private/Admin
req.body;
if (product) {
product.name = name;
product.price = price;
product.description = description;
product.image = image;
product.brand = brand;
product.category = category;
product.countInStock = countInStock;
res.json(updatedProduct);
} else {
res.status(404);
});
44
// @desc Delete a product
// @access Private/Admin
if (product) {
} else {
res.status(404);
});
// @access Private
if (product) {
45
(r) => r.user.toString() === req.user._id.toString()
);
if (alreadyReviewed) {
res.status(400);
const review = {
name: req.user.name,
rating: Number(rating),
comment,
user: req.user._id,
};
product.reviews.push(review);
product.numReviews = product.reviews.length;
product.rating =
product.reviews.length;
await product.save();
} else {
46
res.status(404);
});
// @access Public
res.json(products);
});
export {
getProducts,
getProductById,
createProduct,
updateProduct,
deleteProduct,
createProductReview,
getTopProducts,
};
A.11 Ordercontroller.js
47
import asyncHandler from '../middleware/asyncHandler.js';
// @access Private
res.status(400);
} else {
// NOTE: here we must assume that the prices from our client are
incorrect.
// side code -
https://gist.github.com/bushblade/725780e6043eaf59415fbaf6ca7376ff
48
});
// map over the order items and use the price from our items from
database
);
return {
...itemFromClient,
product: itemFromClient._id,
price: matchingItemFromDB.price,
_id: undefined,
};
});
// calculate prices
calcPrices(dbOrderItems);
orderItems: dbOrderItems,
user: req.user._id,
shippingAddress,
paymentMethod,
itemsPrice,
49
taxPrice,
shippingPrice,
totalPrice,
});
res.status(201).json(createdOrder);
});
// @access Private
res.json(orders);
});
// @access Private
'user',
'name email'
50
);
if (order) {
res.json(order);
} else {
res.status(404);
});
// @access Private
51
if (order) {
order.isPaid = true;
order.paidAt = Date.now();
order.paymentResult = {
id: req.body.id,
status: req.body.status,
update_time: req.body.update_time,
email_address: req.body.payer.email_address,
};
res.json(updatedOrder);
} else {
res.status(404);
});
52
// @access Private/Admin
if (order) {
order.isDelivered = true;
order.deliveredAt = Date.now();
res.json(updatedOrder);
} else {
res.status(404);
});
// @access Private/Admin
res.json(orders);
});
export {
53
addOrderItems,
getMyOrders,
getOrderById,
updateOrderToPaid,
updateOrderToDelivered,
getOrders,
};
Figure no:-8.6
54
import Loader from '../components/Loader';
keyword,
pageNumber,
});
return (
<>
{!keyword ? (
<ProductCarousel />
) : (
Go Back
</Link>
)}
{isLoading ? (
<Loader />
) : error ? (
55
<Message variant='danger'>
{error?.data?.message || error.error}
</Message>
) : (
<>
<Meta />
<h1>Latest Products</h1>
<Row>
{data.products.map((product) => (
</Col>
))}
</Row>
<Paginate
pages={data.pages}
page={data.page}
/>
</>
)}
</>
);
};
56
B.2 Login.jsx
57
const { search } = useLocation();
useEffect(() => {
if (userInfo) {
navigate(redirect);
e.preventDefault();
try {
navigate(redirect);
} catch (err) {
toast.error(err?.data?.message || err.error);
};
return (
<FormContainer>
<h1>Sign In</h1>
<Form onSubmit={submitHandler}>
58
<Form.Group className='my-2' controlId='email'>
<Form.Label>Email Address</Form.Label>
<Form.Control
type='email'
placeholder='Enter email'
value={email}
></Form.Control>
</Form.Group>
<Form.Label>Password</Form.Label>
<Form.Control
type='password'
placeholder='Enter password'
value={password}
></Form.Control>
</Form.Group>
Sign In
</Button>
</Form>
59
<Row className='py-3'>
<Col>
Register
</Link>
</Col>
</Row>
</FormContainer>
);
};
B.3 Registerscreen.jsx
60
import { toast } from 'react-toastify';
useEffect(() => {
if (userInfo) {
navigate(redirect);
61
e.preventDefault();
} else {
try {
navigate(redirect);
} catch (err) {
toast.error(err?.data?.message || err.error);
};
return (
<FormContainer>
<h1>Register</h1>
<Form onSubmit={submitHandler}>
<Form.Label>Name</Form.Label>
<Form.Control
type='name'
placeholder='Enter name'
value={name}
62
></Form.Control>
</Form.Group>
<Form.Label>Email Address</Form.Label>
<Form.Control
type='email'
placeholder='Enter email'
value={email}
></Form.Control>
</Form.Group>
<Form.Label>Password</Form.Label>
<Form.Control
type='password'
placeholder='Enter password'
value={password}
></Form.Control>
</Form.Group>
<Form.Label>Confirm Password</Form.Label>
<Form.Control
type='password'
63
placeholder='Confirm password'
value={confirmPassword}
></Form.Control>
</Form.Group>
Register
</Button>
</Form>
<Row className='py-3'>
<Col>
Login
</Link>
</Col>
</Row>
</FormContainer>
);
};
64
Figure no:-8.7
B.4 Productscreen.jsx
import {
Row,
Col,
Image,
ListGroup,
Card,
Button,
Form,
65
} from 'react-bootstrap';
import {
useGetProductDetailsQuery,
useCreateReviewMutation,
} from '../slices/productsApiSlice';
navigate('/cart');
};
66
const {
data: product,
isLoading,
refetch,
error,
} = useGetProductDetailsQuery(productId);
useCreateReviewMutation();
e.preventDefault();
try {
await createReview({
productId,
rating,
comment,
}).unwrap();
refetch();
} catch (err) {
toast.error(err?.data?.message || err.error);
67
}
};
return (
<>
Go Back
</Link>
{isLoading ? (
<Loader />
) : error ? (
<Message variant='danger'>
{error?.data?.message || error.error}
</Message>
) : (
<>
<Row>
<Col md={6}>
</Col>
<Col md={3}>
<ListGroup variant='flush'>
<ListGroup.Item>
<h3>{product.name}</h3>
</ListGroup.Item>
68
<ListGroup.Item>
<Rating
value={product.rating}
text={`${product.numReviews} reviews`}
/>
</ListGroup.Item>
<ListGroup.Item>Price:
${product.price}</ListGroup.Item>
<ListGroup.Item>
Description: {product.description}
</ListGroup.Item>
</ListGroup>
</Col>
<Col md={3}>
<Card>
<ListGroup variant='flush'>
<ListGroup.Item>
<Row>
<Col>Price:</Col>
<Col>
<strong>${product.price}</strong>
</Col>
</Row>
</ListGroup.Item>
<ListGroup.Item>
<Row>
<Col>Status:</Col>
69
<Col>
</Col>
</Row>
</ListGroup.Item>
<ListGroup.Item>
<Row>
<Col>Qty</Col>
<Col>
<Form.Control
as='select'
value={qty}
onChange={(e) =>
setQty(Number(e.target.value))}
>
{[...Array(product.countInStock).keys()].m
ap(
(x) => (
{x + 1}
</option>
)}
70
</Form.Control>
</Col>
</Row>
</ListGroup.Item>
)}
<ListGroup.Item>
<Button
className='btn-block'
type='button'
disabled={product.countInStock === 0}
onClick={addToCartHandler}
>
Add To Cart
</Button>
</ListGroup.Item>
</ListGroup>
</Card>
</Col>
</Row>
<Row className='review'>
<Col md={6}>
<h2>Reviews</h2>
<ListGroup variant='flush'>
{product.reviews.map((review) => (
71
<ListGroup.Item key={review._id}>
<strong>{review.name}</strong>
<p>{review.createdAt.substring(0, 10)}</p>
<p>{review.comment}</p>
</ListGroup.Item>
))}
<ListGroup.Item>
{userInfo ? (
<Form onSubmit={submitHandler}>
<Form.Label>Rating</Form.Label>
<Form.Control
as='select'
required
value={rating}
>
<option value=''>Select...</option>
72
<option value='4'>4 - Very Good</option>
</Form.Control>
</Form.Group>
<Form.Group className='my-2'
controlId='comment'>
<Form.Label>Comment</Form.Label>
<Form.Control
as='textarea'
row='3'
required
value={comment}
></Form.Control>
</Form.Group>
<Button
disabled={loadingProductReview}
type='submit'
variant='primary'
>
Submit
</Button>
</Form>
) : (
<Message>
73
</Message>
)}
</ListGroup.Item>
</ListGroup>
</Col>
</Row>
</>
)}
</>
);
};
B.5 Placeorderscreen.jsx
74
import { clearCartItems } from '../slices/cartSlice';
useEffect(() => {
if (!cart.shippingAddress.address) {
navigate('/shipping');
} else if (!cart.paymentMethod) {
navigate('/payment');
try {
orderItems: cart.cartItems,
shippingAddress: cart.shippingAddress,
paymentMethod: cart.paymentMethod,
itemsPrice: cart.itemsPrice,
shippingPrice: cart.shippingPrice,
75
taxPrice: cart.taxPrice,
totalPrice: cart.totalPrice,
}).unwrap();
dispatch(clearCartItems());
navigate(`/order/${res._id}`);
} catch (err) {
toast.error(err);
};
return (
<>
<Row>
<Col md={8}>
<ListGroup variant='flush'>
<ListGroup.Item>
<h2>Shipping</h2>
<p>
<strong>Address:</strong>
{cart.shippingAddress.address},
{cart.shippingAddress.city}{' '}
{cart.shippingAddress.postalCode},{' '}
{cart.shippingAddress.country}
</p>
</ListGroup.Item>
76
<ListGroup.Item>
<h2>Payment Method</h2>
<strong>Method: </strong>
{cart.paymentMethod}
</ListGroup.Item>
<ListGroup.Item>
<h2>Order Items</h2>
{cart.cartItems.length === 0 ? (
) : (
<ListGroup variant='flush'>
<ListGroup.Item key={index}>
<Row>
<Col md={1}>
<Image
src={item.image}
alt={item.name}
fluid
rounded
/>
</Col>
<Col>
<Link to={`/product/${item.product}`}>
{item.name}
77
</Link>
</Col>
<Col md={4}>
{item.qty} x ${item.price} = $
</Col>
</Row>
</ListGroup.Item>
))}
</ListGroup>
)}
</ListGroup.Item>
</ListGroup>
</Col>
<Col md={4}>
<Card>
<ListGroup variant='flush'>
<ListGroup.Item>
<h2>Order Summary</h2>
</ListGroup.Item>
<ListGroup.Item>
<Row>
<Col>Items</Col>
<Col>${cart.itemsPrice}</Col>
</Row>
</ListGroup.Item>
78
<ListGroup.Item>
<Row>
<Col>Shipping</Col>
<Col>${cart.shippingPrice}</Col>
</Row>
</ListGroup.Item>
<ListGroup.Item>
<Row>
<Col>Tax</Col>
<Col>${cart.taxPrice}</Col>
</Row>
</ListGroup.Item>
<ListGroup.Item>
<Row>
<Col>Total</Col>
<Col>${cart.totalPrice}</Col>
</Row>
</ListGroup.Item>
<ListGroup.Item>
{error && (
<Message
variant='danger'>{error.data.message}</Message>
)}
</ListGroup.Item>
<ListGroup.Item>
<Button
type='button'
79
className='btn-block'
disabled={cart.cartItems === 0}
onClick={placeOrderHandler}
>
Place Order
</Button>
</ListGroup.Item>
</ListGroup>
</Card>
</Col>
</Row>
</>
);
};
80
Figure no:-8.7
81
9. Conclusion
______________________________________________________________________________
The development of the ProShop e-commerce website signifies a comprehensive and modern
approach to the digital retail experience for electronic products. In a time where convenience,
accessibility, and speed are crucial for consumer satisfaction, ProShop is designed to bridge the
gap between customers and a wide range of electronics—offering them an intuitive, user-centric
platform to explore, compare, and purchase devices from the comfort of their homes.
The architecture of ProShop is built using web technologies that are scalable and
responsive. The design prioritizes mobile accessibility and fast performance, ensuring a
consistent and pleasant user experience across devices. The separation of user roles (customer
and admin), modular backend services (inventory, shipping, and analytics), and external
integrations (payment gateway, shipping providers, and analytics tools) illustrates the project’s
adaptability for real-world deployment and future expansion.
Throughout the system’s design, special attention has been paid to data integrity, security,
and performance. With secure authentication, real-time inventory sync, and transaction
validation, ProShop addresses the most critical concerns in online shopping—building user trust
and reliability. Features such as low-stock alerts, customer reviews, fraud detection, and analytics
reporting allow both users and administrators to benefit from a smarter, more intelligent system.
Moreover, ProShop supports business scalability. The system’s structure makes it easy to
incorporate additional product categories, enhance user features (like wishlists, coupons, and
chatbots), and expand to mobile or PWA versions. This flexibility ensures the website’s long-
term viability and adaptability in a competitive market.
From a development standpoint, this project enabled the practical application of theoretical
knowledge in web development, database management, UI/UX design, and system architecture.
It served as a hands-on experience in translating customer needs into functional software
modules, managing dynamic data flows, and ensuring cross-module integration.
82
for both consumers and sellers, enhances the shopping experience through speed and simplicity,
and meets today’s expectations for online electronic retail platforms. With future enhancements
and feature additions, ProShop has the potential to become a competitive player in the digital
electronics marketplace.
83
10. Limitations
______________________________________________________________________________
Despite being a well-structured and functional e-commerce website for electronics, the ProShop
platform does have certain limitations. These are areas that either restrict the system's current
capabilities or require further development to reach full commercial standards.
• The platform is responsive on mobile browsers but lacks a dedicated mobile app.
• This may affect user retention and push notification capabilities compared to native apps.
• Currently, only one or two payment gateways (e.g., Razorpay or Stripe) are integrated.
• There’s no support for UPI, net banking, EMI options, or wallet-based payments (like
Paytm, PhonePe, etc.).
• Users must rely on email/contact forms for support, which may slow down query
resolution.
4. No AI-Based Personalization
• The system does not personalize search results, home page, or product suggestions based
on user behavior.
84
• Real-time inventory sync with third-party vendors or ERP systems is limited or manual.
• While the current system works well for medium-sized inventory, it may face
performance issues with extremely large-scale datasets (thousands of SKUs).
• Database optimization and cloud hosting are required for scaling to enterprise levels.
• The current system has basic security (authentication, HTTPS), but lacks advanced
measures like 2FA (Two-Factor Authentication), data encryption at rest, and advanced
fraud detection systems.
8. No Multi-Vendor Support
• The platform does not support multiple sellers or vendor accounts (like Amazon or
Flipkart).
• While the system logs user activity and sales, analytics reporting is limited and does not
support visualizations, export options, or detailed business insights.
85
11. Future Scope
______________________________________________________________________________
While the current implementation of the ProShop e-commerce platform successfully delivers
core functionalities for browsing and purchasing electronic items, there are multiple
opportunities for further enhancement and expansion. These improvements can help the system
evolve into a fully scalable, intelligent, and competitive commercial-grade platform.
• Transforming ProShop into a multi-vendor platform will allow multiple sellers to list
their products.
• This expands the product catalog, increases competition, and boosts customer satisfaction
through varied options.
3. AI-Based Personalization
• Machine learning can be used to improve customer engagement, repeat visits, and
conversions.
• Future updates can include two-factor authentication (2FA), data encryption at rest,
fraud detection systems, and activity monitoring.
• Ensures compliance with data protection regulations like GDPR and PCI-DSS.
86
5. Automated Return and Refund System
• Develop a user-initiated return module with automatic refund processing, tracking, and
approval workflows.
• Integrate a chatbot for automated query handling and a live chat system for real-time
support.
• A full-featured admin analytics dashboard with charts, graphs, reports, and data
exports.
• Helps admins monitor sales, traffic, product performance, and customer behavior in real-
time.
• Extend the platform to support multiple languages and currencies, making it suitable
for international customers.
• Currency conversion, tax calculation, and language localization can be managed via
APIs.
87
• Seamless integration with third-party logistics providers (BlueDart, Delhivery, etc.)
and ERP systems (Tally, SAP) for automatic shipping and inventory updates.
• Convert the website into a Progressive Web App to provide app-like functionality
through the browser with offline capabilities.
88
12. Bibliography
______________________________________________________________________________
2. W3Schools – https://www.w3schools.com/
For frontend design references, web structure, and sample codes.
4. GeeksforGeeks – https://www.geeksforgeeks.org/
For backend logic explanation and JS concepts.
5. freeCodeCamp – https://www.freecodecamp.org/
For tutorials on responsive web design and JavaScript-based development.
8. GitHub – https://github.com/
For version control, code storage, and project management.
9. Visual Studio Code – https://code.visualstudio.com/
As the primary IDE used in project development.
E-Commerce & UX/UI Design Resources
89
AI-Assisted Tools
90