wadf
wadf
A Course Based Project Report Submitted in partial fulfilment of the requirements for the
award of the degree of
BACHELOR OF TECHNOLOGY IN
COMPUTER SCIENCE AND
ENGINEERING
Submitted by
VI
VALLURUPALLI NAGESWARA RAO VIGNANA JYOTHI INSTITUTE OF
ENGINEERING and TECHNOLOGY
An Autonomous, ISO 9001:2015 & QS I-Gauge Diamond Rated Institute, Accredited by NAAC with ‘A++’ Grade
NBA Accreditation for B.Tech. CE,EEE,ME,ECE,CSE,EIE,IT,AME, M.Tech. STRE, PE, AMS, SWE Programmes
Approved by AICTE, New Delhi, Affiliated to JNTUH, NIRF (2023) Rank band:101-150 in Engineering Category
College with Potential for Excellence by UGC,JNTUH-Recognized Research Centres:CE,EEE,ME,ECE,CSE
Vignana Jyothi Nagar, Pragathi Nagar, Nizampet (S.O.), Hyderabad – 500 090, TS, India.
DEPARTMENT OF COMPUTER SCIENCE AND ENGINEERING
CERTIFICATE
This is to certify that the project report entitled “HAND AND HUE” is a bonafide work done
under our supervision and is being submitted by Miss.Puchakayala Samhitha
Reddy(23071A05J7), Miss. Rangu Chetana(23071A05J8), Miss. Tandra Vaishnavi
(23071A05K1), Miss. Thummanapelli Spoorthi(23071A05K2) in partial fulfilment for the
award of the degree of Bachelor of Technology in Computer Science and Engineering, of
VNRVJIET, Hyderabad during the academic year 2024- 2025.
Certified further that to the best of our knowledge the work presented in this thesis has not
been submitted to any other University or Institute for the award of any Degree or Diploma.
VI
VALLURUPALLI NAGESWARA RAO VIGNANA JYOTHI INSTITUTE OF
ENGINEERING and TECHNOLOGY
An Autonomous, ISO 9001:2015 & QS I-Gauge Diamond Rated Institute, Accredited by NAAC with ‘A++’ Grade
NBA Accreditation for B.Tech. CE,EEE,ME,ECE,CSE,EIE,IT,AME, M.Tech. STRE, PE, AMS, SWE Programmes
Approved by AICTE, New Delhi, Affiliated to JNTUH, NIRF (2023) Rank band:101-150 in Engineering
CategoryCollege with Potential for Excellence by UGC,JNTUH-Recognized Research Centres:CE,EEE,ME,ECE,CSE
Vignana Jyothi Nagar, Pragathi Nagar, Nizampet (S.O.), Hyderabad – 500 090, TS, India.
DECLARATION
We declare that the course based project work entitled entitled “HAND AND HUE”
submitted in the department of Computer Science and Engineering, Vallurupalli Nageswara Rao
Vignana Jyothi Institute of Engineering and Technology, Hyderabad, in partial fulfilment of the
requirement for the award of the degree of Bachelor of Technology in Computer Science and
Engineering is a bonafide record of our own work carried out under the supervision of I.
Ravindra Kumar, Assistant Professor, Department of CSE, VNRVJIET. Also, we
declare that the matter embodied in this thesis has not been submitted by us in full or in any part
thereof for the award of any degree/diploma of any other institution or university previously.
Place: Hyderabad.
VI
ACKNOWLEDGEMENT
Firstly, we would like to express our immense gratitude towards our institution VNR
Vignana Jyothi Institute of Engineering and Technology, which created a great platform to
attain profound technical skills in the field of Computer Science, thereby fulfilling our
most cherished goal.
We are very much thankful to our Principal, Dr. Challa Dhanunjaya Naidu and our
Head of Department, Dr. V. Baby, for extending their cooperation in doing this project in
stipulated time.
We extend our heartfelt thanks to our project guide, I.Ravindra Kumar and Mr .P.
Rajesh, for their guidance throughout the course of our project.
Last but not least, our appreciable obligation also goes to all the staff members of
Computer Science & Engineering department and to our fellow classmates who directly or
indirectly helped us.
P.SAMHITHA 23071A05J7
R.CHETANA 23071A05J8
T.VAISHNAVI
23071A05K1
T.SPOORTHI 23071A05K2
VI
ABSTRACT
As online marketplaces become increasingly popular, there are new opportunities for artists to
display and sell their pieces on the internet. Hand and Hue is an online art commerce platform with the
goal of bridging the gap between artists and people who appreciate art through a very user-friendly,
visually engaging, and user-first interface. Built with the latest web technologies like React.js on the
frontend and Postman for API testing and validation, the platform provides end-to-end seamless
navigation and interaction for buyers as well as sellers.
The platform has separate dashboards for both users and sellers. Sellers are provided with a specific
dashboard where they can control their profile, upload and update artwork using a simple form, see their
listings, and monitor orders. Meanwhile, users can browse curated collections, access rich product pages
that are supported by multimedia, and purchase artworks securely, providing an immersive and
seamless buying process.
Hand and Hue tackles typical issues in online art business platforms, including shortage of
personalization, restricted control for sellers, and complex user interfaces. Through the emphasis on
modularity, simplicity, and design aesthetic, the site guarantees scalability and future-proofing for
advancements such as real-time messaging between buyers and artists, and mobile app integration.
Developed on responsive design guidelines and tested for API stability, Hand and Hue provides an
efficient, secure, and artist-friendly e-commerce solution. It is a technological and creative blueprint for
future digital marketplaces that intend to empower individual creators within the art world.
VI
INDEX
CONTENT PAGE NO
CHAPTER 1: INTRODUCTION 7 - 10
1.1 Introduction 7
4.1 Introduction 17
4.2 System Architecture 17-18
CONCLUSION 47
FUTURE WORK 48
REFERENCES 49
6
CHAPTER 1: INTRODUCTION
1.1 INTRODUCTION
Hand and Hue is a modern web-based platform designed to empower artists by providing a dedicated
space to showcase and sell their artwork directly to a global audience. By eliminating traditional barriers
and intermediaries, the platform fosters a more inclusive and accessible art marketplace.
Utilizing contemporary web technologies, Hand and Hue offers distinct dashboards for sellers and
buyers. Artists can effortlessly upload their creations, manage their portfolios, and engage with potential
buyers. Simultaneously, art enthusiasts can explore a curated collection of artworks, ensuring a seamless
and personalized purchasing experience.
In an era where digital platforms are reshaping commerce and creativity, Hand and Hue stands out by
prioritizing user-centric design, scalability, and simplicity. Its responsive interface ensures accessibility
across various devices, catering to a diverse, global community of art lovers.
As the digital art market continues to evolve, platforms like Hand and Hue play a pivotal role in
democratizing access to art, supporting independent artists, and fostering a vibrant online art
community.
In the contemporary digital landscape, artists and artisans often face significant challenges in reaching
broader audiences and effectively marketing their creations. Traditional art marketplaces and galleries
can be restrictive, often favoring established names and limiting opportunities for emerging talents.
Moreover, existing online platforms may not provide the necessary tools or visibility for artists to
showcase their work to potential buyers. Additionally, buyers interested in unique, handcrafted artworks
may struggle to find authentic pieces amidst a sea of mass-produced items. The lack of a centralized,
user-friendly platform that connects artists directly with consumers hampers the growth of independent
art commerce.
Hand and Hue aims to address these issues by creating a dedicated online marketplace that empowers
artists to present and sell their work directly to a global audience. By providing tailored dashboards for
both sellers and buyers, the platform facilitates seamless interactions, enhances visibility for creators,
and offers consumers access to a diverse range of authentic artworks.
7
Through this initiative, Hand and Hue seeks to democratize the art-selling process, foster a supportive
community for artists, and enrich the purchasing experience for art enthusiasts worldwide.
8
Update personal information and track purchase history through a simple, clean interface.
Responsive UX Design
Intuitive, aesthetically pleasing interface tailored for a seamless shopping experience across
devices.
2. Technical Architecture
2.1 Frontend (Client Side)
Developed using React.js for a responsive, component-based UI.
Implements role-based dashboards for buyers and sellers.
Uses Axios or Fetch API to communicate with backend services via RESTful APIs.
Handles routing using React Router.
Provides form validations, image uploads, and a visually rich product display interface.
2.2 Authentication & Authorization
Secure JWT-based authentication for both users and sellers.
Role-based access control ensures only authorized users can access specific features or
dashboards.
Login/Signup flows are validated on both frontend and backend.
2.3 Backend (Server Side)
Built with Node.js and Express.js for handling HTTP requests and server-side logic.
Manages APIs for:
o User registration and login
o Artwork posting and retrieval
o Profile updates
o Order management
Middleware is used for authentication and request validation.
3. Future Enhancements
Payment Gateway Integration
Enable secure and seamless transactions using Razorpay or similar platforms.
Multilanguage Support
Add support for multiple languages using i18n for a more inclusive user experience.
9
Mobile App Extension
Launch a mobile version of the platform for buyers and sellers using React Native or Flutter.
10
CHAPTER 2: EXISTING TECHNIQUES AND SYSTEMS
11
Saatchi Art
A platform for buying and selling original artwork, offering global reach for artists.
Etsy
Popular for handmade and vintage art, facilitating an easy-to-use marketplace for independent
artists.
Artfinder
A global marketplace for independent artists to showcase and sell their artwork.
Artsy
Focuses on connecting collectors with galleries and exhibitions, primarily offering high-end art.
12
The art marketplace continues to evolve, with innovations enhancing the buying and selling process.
These trends are shaping the future of platforms like Hand and Hue:
AI-Driven Personalization
Using AI to suggest artworks based on individual buyer tastes, past purchases, and browsing
behavior.
Blockchain for Provenance
Implementing blockchain technology to verify and track the authenticity of artworks, ensuring
transparency.
Augmented Reality (AR)
Allowing buyers to visualize artworks in their homes or spaces before purchase, creating an
immersive shopping experience.
Virtual Art Exhibitions
Hosting online art exhibitions or live-streamed art shows, where buyers can interact with artists
virtually.
Social Shopping
Integrating social media elements, enabling users to share their favorite artwork and receive
recommendations from their network.
Customizable Art
Offering buyers the option to commission personalized or custom artwork from artists directly
through the platform.
Hand and Hue is designed to bridge the gap between traditional art marketplaces and modern digital
platforms. By leveraging contemporary technologies, it empowers both buyers and sellers to engage
in an enriching art experience.
13
This content outlines Hand and Hue’s approach to revolutionizing the online art marketplace
by addressing the shortcomings of traditional art systems while leveraging modern technologies for a
seamless, secure, and personalized user experience.
14
CHAPTER 3: PROPOSED SYSTEM
4.1 INTRODUCTION
The proposed system for Hand and Hue aims to provide an innovative, seamless,
and secure e-commerce platform dedicated to buying and selling art. The system is
designed to offer a unique space for artists to showcase their work while providing
buyers with a personalized, intuitive browsing experience.
Unlike generic e-commerce platforms, Hand and Hue is focused on providing an
immersive art experience, integrating art purchasing with features like artist profiles,
reviews, and custom artwork listings. The platform is also designed to grow with
future integrations, including enhanced AI-driven recommendations, payment
gateways, and mobile apps.
The system focuses on scalability, security, and user-centric design, making it
suitable for artists, art buyers, and administrators alike. It is modular, allowing for
future enhancements like AI integration for personalized recommendations, advanced
search filters, and real-time notifications.
15
o Authentication Service: Stateless authentication using JWT tokens to secure
user sessions and provide role-based access.
o Artwork Management API: Handles CRUD operations (Create, Read,
Update, Delete) for artwork listings, managing the artist's portfolio and art
details.
o User Profile Service: Manages user data such as registration, profile
customization, and preferences (for both buyers and sellers).
o Order Management API: Handles user transactions, shopping cart
management, order history, and payment status.
API Gateway (Planned)
o Centralized request routing and API management.
o Secure HTTPS endpoints with rate-limiting, authentication, and validation
middleware for enhanced security.
16
CHAPTER 4: OBJECTIVES OF THE PROJECT
1. Empower Artists and Independent Creators
Direct Market Access: Artists can list and sell their artworks without
intermediaries, enabling better profit margins.
Control Over Pricing: Artists set their own pricing and manage their sales
strategies.
Portfolio Management: Ability for sellers to create, update, and manage their
digital portfolio on the platform.
Global Reach: Artists can showcase their work to a global audience, increasing
exposure and sales opportunities.
Reduced Barriers: Eliminates the need for physical galleries and traditional art
marketplaces, democratizing the art-selling process.
Artwork Discovery: Implement a powerful search and filter system that allows
buyers to easily find artworks by category, artist, price, or style.
Smooth Transaction Flow: Simplified checkout process for buyers with easy cart
management and quick payment options.
17
listings, view sales, and analyze performance metrics.
Artist Profiles and Bios: Enable buyers to learn more about the artists, fostering a
personal connection and encouraging purchases.
4. Facilitate Seamless Transactions and Efficient Order Management
Secure Checkout System: Provide a smooth and secure checkout process with
multiple payment methods and options.
Seller Order Management: Sellers can view and manage orders, update order
statuses, and process returns or cancellations.
5. Encourage Trust and Transparency
Reviews and Ratings System: Enable buyers to leave ratings and reviews for
artworks and sellers, enhancing trust and providing valuable feedback.
Localization: Localize the platform for different regions to ensure the content and
interface meet the cultural and business expectations of each region.
19
CHAPTER 5: SOFTWARE REQUIREMENTS
3.1 INTRODUCTION
This chapter outlines the technical specifications required to develop and deploy Hand and Hue,
categorizing the requirements into both functional and non-functional aspects to ensure the
platform is user-friendly, scalable, and robust.
Frontend Framework:
Programming Languages:
JavaScript (ES6+), HTML5, CSS3 (for building the interactive web application)
Development Tools:
Git (for version control) with GitHub or GitLab repositories (for collaboration and source code
management)
Backend:
20
Express.js (framework for building the RESTful API)
MongoDB (for database management, handling user data and artwork details)
Additional Libraries:
For Development:
Processor: Intel Core i5 or above
Memory (RAM): Minimum 8GB (Recommended 16GB for better performance)
Storage: Minimum 500GB HDD or 256GB SSD
Display: 1080p Full HD monitor
Internet Connectivity: Stable broadband connection for accessing development libraries, APIs,
and deployment tools
For End-Users (Buyers and Sellers):
Web Browsers: Chrome, Firefox, Edge (latest versions)
Mobile Devices: Android 8.0+ / iOS 12+
Internet Speed: Minimum 5 Mbps for smooth browsing and transactions
21
3.4 FUNCTIONAL REQUIREMENTS
User Management:
Registration & Login: Email-based sign-up/login, with future support for social
login.
Profile Customization: Option to update bio, profile picture, password, and
display user-specific preferences.
Role-Based Access: Buyers and Sellers have different roles and access to
personalized dashboards.
Art Management (Seller Features):
Post Artworks: Sellers can upload, manage, and list their artworks with
descriptions, pricing, and categories.
Artwork Categorization: Organize artworks by medium, style, price range, etc.
Visibility Control: Option to save listings as drafts or make them public.
Buyer Features:
Browse & Search Artworks: Users can filter artworks based on categories, style,
price, and artist.
Add to Cart & Checkout: Buyers can add artworks to the cart and complete
transactions.
Purchase History: Track previous purchases and view order details.
Wishlist: Save favorite artworks for future viewing or purchasing.
Engagement & Notifications:
Review & Rating System: Allow buyers to rate and review artworks.
Notifications: Updates on new listings, price changes, and order status via email
and in-app notifications.
Feedback System: Enable buyers and sellers to provide feedback to enhance the
platform experience.
Security & Access:
22
Session Handling: Auto logout on inactivity for security.
JWT Authentication: Secure login, role-based access control, and protected
routes
23
CHAPTER 5: ARCHITECHTURE DIAGRAM
24
User Pages: CartPage, WishlistPage, Profile - for authenticated users
Dashboard Pages: UserDashboard and SellerDashboard - personalized interfaces
Listings: SellersList - for discovery and browsing
Context Layer
AuthContext: Manages authentication state, sessions, and login/logout functionality
UserContext: Provides user data and preferences across the application
Application Core
App.jsx: Root component setting up routing and global providers
main.jsx: Entry point rendering the React application to DOM
Server-Side Architecture
Routes Layer
apiRoutes.js: General API endpoints and utilities
artRoutes.js: CRUD operations for artwork management
sellerRoutes.js: Seller-specific functionality
userRoutes.js: User authentication and profile management
Models Layer
artModel.js: Database schema for artwork data
userModel.js: User data structure and validation
Middleware
auth.js: Authentication and authorization
Request processing and validation
Server Core
server.js: Main entry point
Database connection management
API configuration and security
Data Flow
1. User interacts with React components in the client
2. Client sends HTTP requests to appropriate server routes
3. Server middleware processes and validates requests
4. Server routes handle business logic and database operations
5. Database stores and retrieves persistent data
6. Server sends JSON responses back to client
7. Client updates UI based on received data
This architecture provides a scalable foundation for the Hand-and-Hue marketplace, with clear
25
separation between presentation logic (client) and business logic (server).
26
CHAPTER 6: MODULES
hand-and-hue/
├── client/
│ ├── node_modules/
│ ├── public/
│ ├── src/
│ │ ├── assets/
│ │ ├── components/
│ │ │ ├── ArtCard.jsx
│ │ │ ├── ArtCard.css
│ │ │ ├── ArtGallery.jsx
│ │ │ ├── ArtGallery.css
│ │ │ ├── CategoryFilter.jsx
│ │ │ ├── CommentSection.jsx
│ │ │ ├── Footer.jsx
│ │ │ ├── Header.jsx
│ │ │ ├── SellerArts.jsx
│ │ │ ├── SellerForm.jsx
│ │ ├── context/
│ │ │ ├── AuthContext.jsx
│ │ │ ├── UserContext.jsx
│ │ ├── pages/
│ │ │ ├── ArtDetails.jsx
27
│ │ │ ├── CartPage.jsx
│ │ │ ├── Home.jsx
│ │ │ ├── Home.css
│ │ │ ├── Login.jsx
│ │ │ ├── Login.css
│ │ │ ├── Register.jsx
│ │ │ ├── Register.css
│ │ │ ├── Profile.jsx
│ │ │ ├── SellerDasboard.jsx
│ │ │ ├── SellersList.jsx
│ │ │ ├── UserDasboard.jsx
│ │ │ ├── UserDashboard.css
│ │ │ ├── WishlistPage.jsx
│ │ ├── App.jsx
│ │ ├── App.css
│ │ ├── index.css
│ │ ├── main.jsx
│ ├── .env
│ ├── .gitignore
│ ├── eslint.config.js
│ ├── index.html
│ ├── package.json
│ ├── package-lock.json
│ ├── README.md
28
│ ├── vite.config.js
├── server/
│ ├── middleware/
│ │ ├── auth.js
│ ├── models/
│ │ ├── artModel.js
│ │ ├── userModel.js
│ ├── node_modules/
│ ├── routes/
│ │ ├── apiRoutes.js
│ │ ├── artRoutes.js
│ │ ├── sellerRoutes.js
│ │ ├── userRoutes.js
│ ├── .env
│ ├── .gitignore
│ ├── package.json
│ ├── package-lock.json
│ ├── req.http
│ ├── server.js
FRONTEND – client/src/
App.jsx
The root component that defines the structure and routing for the app.
It usually includes the BrowserRouter and Routes components to manage navigation.
All main pages like Home, Login, Register, and Dashboards are rendered through this file.
main.jsx
29
Entry point of the React application, used by Vite to render the App component.
Wraps the app in providers like AuthContext or UserContext if needed.
components/
▶ ArtCard.jsx
Renders individual cards for artwork showing image, title, and price.Used inside gallery or seller views
to represent artworks visually.
Each card may link to the detailed view via ArtDetails.
▶ ArtGallery.jsx
1.Displays a grid or list of multiple ArtCard components.
2.It may accept props for filtering or sorting the artworks.
3.Helps in showcasing all artworks or search results to users.
▶ CategoryFilter.jsx
Enables users to filter artworks by specific categories (e.g., painting, sculpture).
Triggers changes in displayed items on selection.
Improves navigation and user experience in browsing.
▶ Footer.jsx
Static component shown at the bottom of all pages.
Usually includes site info, contact links, and legal disclaimers.
Helps in maintaining consistent UI across pages.
▶ Header.jsx
Top navigation bar shown across all pages.
Contains links to Home, Login/Register, Cart, and Dashboard.
Also conditionally renders based on user role or authentication.
▶ SellerArts.jsx
Displays a seller's own uploaded artworks.
Used in the SellerDashboard for managing listings.
Includes options for edit, delete, or view each art item.
pages/
▶ ArtDetails.jsx
Detailed view of a specific art item.
Shows full image, title, seller info, description, price, and comments.
Includes "Add to Cart", "Add to Wishlist", and possibly "Buy Now" buttons.
▶ CartPage.jsx
Shows the user's shopping cart with a list of added items.
Allows users to modify quantity, remove items, and proceed to checkout.
Calculates total cost dynamically and interacts with backend if needed.
30
▶ Home.jsx
Main landing page displaying featured arts, categories, and call-to-action banners.
Uses ArtGallery and CategoryFilter to show artworks.
Acts as the central point to attract and direct users.
▶ Login.jsx
Handles user login with email and password form.
On successful authentication, stores user token/context and redirects.
Includes error validation and user feedback for invalid attempts.
▶ Register.jsx
Form for creating new user or seller accounts.
Includes fields for name, email, password, confirm password, and user type.
After successful signup, redirects users to login or dashboard.
▶ Profile.jsx
Allows users to view and update their profile information.
Fields like name, email, password can be edited.
It may also show their account activity or orders.
▶ SellerDashboard.jsx
Main control panel for seller accounts.
Displays seller’s artworks, upload options (SellerForm), and buyer interactions.
Empowers sellers to manage and grow their store on the platform.
▶ UserDashboard.jsx
Personalized dashboard for regular users (buyers).
Shows past orders, saved items, and profile info.
May include quick links to Wishlist, Cart, or Logout.
▶ WishlistPage.jsx
Displays artworks the user has saved to their wishlist.
Allows moving items to the cart or removing from wishlist.
Acts as a reminder list and supports future purchases.
context/
▶ AuthContext.jsx
Handles global authentication state across the app.
Provides methods like login, logout, and keeps user info in context.
Used to show/hide components based on login status or role.
BACKEND – server/
31
✅ server.js
Entry point for the Node.js/Express backend server.
Sets up middleware, connects to MongoDB, and registers all routes.
Runs the server and listens for API requests from the frontend.
middleware/
▶ auth.js
Middleware to protect private routes.
Verifies JWT tokens to authenticate requests.
Used for actions like uploading art, updating profile, or accessing dashboards.
models/
▶ artModel.js
Mongoose schema for artworks in the database.
Defines fields like title, description, image, category, price, and sellerId.
Used by routes to create, read, update, or delete art items.
▶ userModel.js
Mongoose schema for user and seller accounts.
Includes name, email, password (hashed), role (user/seller), and metadata.
Manages authentication, dashboard access, and account settings.
routes/
▶ apiRoutes.js
Main API router that combines all sub-routes (user, art, seller).
Centralized entry point for all route paths.
Helps in organizing and modularizing the route structure.
▶ artRoutes.js
Handles endpoints for artworks like:
GET all artworks
GET by ID
POST new art (seller only)
DELETE or PUT (edit)
Connects with artModel and uses auth.js middleware.
▶ sellerRoutes.js
32
Routes specific to seller operations.
Includes endpoints for viewing seller profiles, listing their arts, etc.
Allows sellers to interact with the system securely.
▶ userRoutes.js
Handles authentication (login/register) and profile routes.
Manages JWT issuance and user data updates.
Used by Login, Register, and Profile frontend pages.
33
CHAPTER 7: IMPLEMENTATION
34
o Browse artwork by tags such as painting, ceramic, textile, etc.
Seller-Based Filtering
o View artworks posted by specific sellers or favorite artists.
userSchema.js
artSchema.js:
const mongoose = require('mongoose');
35
},
profileImageUrl: {
type: String,
required: true
}
}, { _id: false });
// Art Schema
const artSchema = new mongoose.Schema({
title: { type: String, required: true },
description: { type: String, required: true },
price: { type: Number, required: true },
category: { type: String, required: true },
image: { type: [String], required: true },
sellerDetails: sellerDetailsSchema, // Embed seller details as a subdocument
comments: [userCommentSchema]
}, { timestamps: true });
module.exports = Art;
Home.jsx
import React, { useState, useEffect } from 'react';
import { useNavigate } from 'react-router-dom';
import { useAuth } from '../context/AuthContext';
import ArtCard from '../components/ArtCard'; // Use ArtCard for individual artwork
import './Home.css';
const sampleArts = [
{
_id: '1',
title: 'Mystic Forest',
description: 'A magical depiction of an enchanted forest in acrylic.',
author: 'Anaya Roy',
price: 1200,
image: '/assets/sample1.jpg',
36
likes: 56,
},
{
_id: '2',
title: 'Urban Chaos',
description: 'Street art-inspired expression of city life.',
author: 'Ritvik Menon',
price: 850,
image: '/assets/sample2.jpg',
likes: 34,
},
{
_id: '3',
title: 'Serene Lake',
description: 'Tranquil vibes with a watercolor lake view.',
author: 'Tanvi Sharma',
price: 950,
image: '/assets/sample3.jpg',
likes: 40,
},
{
_id: '4',
title: 'Bold Portrait',
description: 'A colorful character study using pastels.',
author: 'Aarav Sinha',
price: 1600,
image: '/assets/sample4.jpg',
likes: 71,
},
{
_id: '5',
title: 'Dreamscape',
description: 'Abstract dream world with mixed media.',
author: 'Sneha Kapoor',
price: 1100,
image: '/assets/sample5.jpg',
likes: 62,
},
{
_id: '6',
title: 'Sunset Boulevard',
description: 'Golden hour over a lazy boulevard in oils.',
author: 'Ishaan Verma',
price: 1350,
image: '/assets/sample6.jpg',
likes: 48,
37
}
];
useEffect(() => {
// Simulating fetch with sample data
setArts(sampleArts);
}, []);
return (
<div className="home-container">
<h1 className="home-title">Welcome to ArtCraft</h1>
{isAuthenticated ? (
// Check if currentUser is not null before accessing currentUser.name
<h2 className="welcome-message">
Welcome, {currentUser ? currentUser.name : "Guest"}!
</h2>
):(
<p className="home-description">
Discover amazing original artworks from talented artists. Sign in to explore more and showcase
your own creations.
</p>
)}
<div className="artwork-grid">
{arts.map((art) => (
<ArtCard
key={art._id}
artwork={art}
currentUser={currentUser}
/>
))}
</div>
{!isAuthenticated && (
<button className="sign-in-button" onClick={() => navigate('/login')}>
Sign In to View More Artworks
</button>
38
JWT-Based Authentication with Email OTP Verification:
Two-step registration:
Email/Password
OTP Verification (JWT-signed)
Tokens handled via localStorage + protected routes via isAuth.
Enhances security compared to basic auth flows.
sendMail.js:
import { createTransport } from
"nodemailer"; const sendMail = async
(email, subject, data) => { const transport
= createTransport({
host:
"smtp.gmail.co
m", port: 465,
auth: {
user:
process.env.Gmail,
pass:
process.env.Passwor
d,
},});
const html = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>OTP Verification</title>
<style>
body {
font-family: Arial, sans-serif;
39
margin: 0;
padding: 0; display: flex;
justify-
content:
center; align-
items: center;
height:
100vh;}
.container {
background-
color: #fff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0,
0, 0.1); text-align: center;}
h1 {
col
or:
red;}
p{
margin-
bottom: 20px;
color: #666; }
.otp {
font-size: 36px;
color: #7b68ee; /*
Purple text */ margin-
bottom: 30px; }
</style>
</head><body>
<div class="container">
<h1>OTP Verification</h1>
40
<p>Hello ${data.name} your (One-Time Password) for your account verification is.</p>
<p class="otp">${data.otp}</p>
</div></body></
html>`; await
transport.sendMail(
{ from:
process.env.Gmail,
to: email,
subject, html, });};
export default sendMail;
export const sendForgotMail = async (subject, data)
=> { const transport = createTransport({
host:
"smtp.gmail.co
m", port: 465,
auth: {
user:
process.env.Gmail,
41
<div class="container">
<h1>OTP Verification</h1>
<p>Hello ${data.name} your (One-Time Password) for your account verification is.</p>
<p class="otp">${data.otp}</p>
</div></body></html>`;
await transport.sendMail({
from: process.env.Gmail,
to: email,
subject,
html, });};
export default sendMail;
export const sendForgotMail = async (subject, data) =>
{ const transport = createTransport({
host: "smtp.gmail.com",
port: 465,
auth: {
user: process.env.Gmail,
pass: process.env.Password,
}, });
const html = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Reset Your Password</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f3f3f3;
margin: 0;
padding: 0;}
.container {
background-color: #ffffff;
42
padding: 20px;
margin: 20px auto;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
max-width: 600px;}
h1 {
color: #5a2d82; }
p{
color: #666666; }
.button {
display: inline-
block; padding: 15px
25px; margin: 20px
0;
background-color: #5a2d82;
color: white;
text-decoration: none;
border-radius: 4px;
font-size: 16px; }
.footer {
margin-top: 20px;
color: #999999;
text-align: center; }
.footer a {
color: #5a2d82;
text-decoration: none; }
</style></head><body>
<div class="container">
<h1>Reset Your Password</h1>
<p>Hello,</p>
<p>You have requested to reset your password. Please click the button below to reset your
password.</p>
<a href="${process.env.frontendurl}/reset-password/${data.token}" class="button">Reset
43
Password</a>
44
<p>If you did not request this, please ignore this email.</p>
<div class="footer">
<p>Thank you,<br>Your Website Team</p>
<p><a href="https://yourwebsite.com">yourwebsite.com</a></p>
</div>
</div>
</body>
</html>`;
await transport.sendMail({
from: process.env.Gmail,
to: data.email,
subject, html,
});};
45
setShow(true); }
46
const submitHandler = async (e) => {
e.preventDefault();
await verifyOtp(Number(otp), navigate);};
return (
<div className="auth-page">
<div className="auth-form">
<h2>Verify Account</h2>
<form onSubmit={submitHandler}>
<label htmlFor="otp">Otp</label>
<input
type="number"
value={otp}
onChange={(e) => setOtp(e.target.value)}
required />
<ReCAPTCHA
sitekey="
6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI"
onChange={onChange} /> ,
{show && (
<button disabled={btnLoading} type="submit" className="common-btn">
{btnLoading ? "Please Wait..." : "Verify"}
</button> )}
</form> <p>
Go to <Link to="/login">Login</Link> page
</p>
</div>
</div>);};
export default Verify;
ResetPassword.jsx:
import React, { useState } from "react";
import "./auth.css";
import { useParams } from "react-router-dom";
47
import { useNavigate } from "react-router-dom";
48
import toast from "react-hot-toast";
import axios from "axios";
import { server } from "../../main";
const ResetPassword = () => {
const [password, setPassword] = useState("");
const [btnLoading, setBtnLoading] = useState(false);
const navigate = useNavigate();
const params = useParams();
const handleSubmit = async (e) => {
e.preventDefault();
setBtnLoading(true);
try {
const { data } = await axios.post(
${server}/api/user/reset?token=${params.token},{password,} );
toast.success(data.message);
navigate("/login");
setBtnLoading(false);
} catch (error) {
toast.error(error.response.data.message);
setBtnLoading(false);
}};
return (
<div className="auth-page">
<div className="auth-form">
<h2>Reset Password</h2>
<form onSubmit={handleSubmit}>
<label htmlFor="text">Enter Password</label>
<input
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
required />
<button disabled={btnLoading} className="common-btn">
49
{btnLoading ? "Please Wait..." : "Reset Password"}
</button>
</form>
</div>
</div> );};
export default ResetPassword;
ForgetPassword.jsx:
import React, { useState } from "react";
import "./auth.css";
import { useNavigate } from "react-router-dom";
import toast from "react-hot-toast";
import axios from "axios";
import { server } from "../../main";
const ForgotPassword = () => {
const [email, setEmail] = useState("");
const [btnLoading, setBtnLoading] = useState(false);
const navigate = useNavigate();
const handleSubmit = async (e) => {
e.preventDefault();
setBtnLoading(true);
try {
const { data } = await axios.post(${server}/api/user/forgot, { email });
toast.success(data.message);
navigate("/login");
setBtnLoading(false);
} catch (error) {
toast.error(error.response.data.message);
setBtnLoading(false);} };
return (
<div className="auth-page">
<div className="auth-form">
<h2>Forgot Password</h2>
50
<form onSubmit={handleSubmit}>
<label htmlFor="text">Enter Email</label>
<input
type="email"
value={email}
onChange={(e) =>
setEmail(e.target.value)} required />
<button disabled={btnLoading} className="common-btn">
{btnLoading ? "Please Wait..." : "Forgot Password"}
</button>
</form> </div> </div>
);};export default ForgotPassword;
Register.jsx:
import React, { useState } from "react";
import "./auth.css";
import { Link, useNavigate } from "react-router-dom";
import { UserData } from "../../context/UserContext";
const Register = () => {
const navigate = useNavigate();
const { btnLoading, registerUser } = UserData();
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [name, setName] = useState("");
const submitHandler = async (e) => {
e.preventDefault();
await registerUser(name, email, password, navigate); };
return (
<div className="auth-page">
<div className="auth-form">
<h2>Register</h2>
<form onSubmit={submitHandler}>
<label htmlFor="name">Name</label>
51
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
required />
<label htmlFor="email">Email</label>
<input
type="email"
value={email}
onChange={(e) =>
setEmail(e.target.value)} required />
<label htmlFor="password">Password</label>
<input
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
required />
<button type="submit" disabled={btnLoading} className="common-btn">
{btnLoading ? "Please Wait..." : "Register"}
</button>
</form> <p>
have an account? <Link to="/login">Login</Link>
</p> </div> </div>);};
export default Register;
Login.jsx:
import React, { useState } from "react";
import "./auth.css";
import { Link, useNavigate } from "react-router-dom";
import { UserData } from "../../context/UserContext";
import { CourseData } from "../../context/CourseContext";
const Login = () => {
const navigate = useNavigate();
52
const { btnLoading, loginUser } = UserData();
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const { fetchMyCourse } = CourseData();
const submitHandler = async (e) => {
e.preventDefault();
await loginUser(email, password, navigate, fetchMyCourse); };
return (
<div className="auth-page">
<div className="auth-form">
<h2>Login</h2>
<form onSubmit={submitHandler}>
<label htmlFor="email">Email</label>
<input
type="email"
value={email}
onChange={(e) =>
setEmail(e.target.value)} required />
<label htmlFor="password">Password</label>
<input
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
required />
<button disabled={btnLoading} type="submit" className="common-btn">
{btnLoading ? "Please Wait..." : "Login"}
</button> </form> <p>
Don't have an account? <Link to="/register">Register</Link>
</p> <p>
<Link to="/forgot">Forgot password?</Link>
</p> </div> </div>);};
export default Login;
53
CHAPTER 6: RESULTS
Following the implementation and testing phases, ElevateU successfully met the major
objectives outlined at the beginning of the project:
Secure Authentication: Registration and login systems worked flawlessly with role-
based access implemented for users and admins.
54
55
56
Responsive Design: The platform performed well on desktops, tablets, and
smartphones, providing a seamless user experience across devices.
57
User Dashboard: Users could easily register for courses, view enrolled content, and
update their profiles.
Admin Dashboard: Admins could effectively manage users, courses, and monitor
engagement statistics.
58
Course Management: Uploading and accessing documents and videos was fast and
secure.
59
CONCLUSION
The development of ElevateU represents a significant step toward modernizing educational delivery
through the use of cutting-edge web technologies. In today's fast-paced world, where accessibility,
flexibility, and personalization have become essential components of learning, ElevateU successfully
addresses these critical needs by offering a secure, user-friendly, and highly responsive e-learning
platform.
By leveraging the capabilities of React.js for frontend development and Postman for backend API
testing and validation, the project achieved a seamless integration between user interaction and
system functionality. Secure user authentication, efficient course registration, dynamic content
delivery, user profile management, and robust administrative functionalities are key achievements of
the system. These features collectively provide a complete learning ecosystem that caters not only to
learners but also empowers administrators to manage the platform with ease.
Throughout the course of this project, multiple modern software engineering principles were applied,
including modular design, component-based architecture, API-driven development, and responsive
UI/UX design strategies. Additionally, emphasis on testing, validation, and error handling ensures
that the platform is reliable, scalable, and ready for real-world deployment.
An important highlight of ElevateU is its scalability and adaptability. The platform is built with a
forward-looking approach, ensuring that it can be expanded with additional functionalities like AI-
driven learning recommendations, real-time collaboration features, certification programs, and even
mobile application versions. The structured architecture allows easy integration of emerging
technologies without requiring extensive rework.
Moreover, the project emphasized user-centric design, where usability and simplicity were
prioritized. This ensures that learners of all backgrounds — including those with minimal technical
skills — can comfortably navigate and engage with the platform. The dual-role system (user and
admin) with clear distinctions in access and functionality further enhances the platform's security and
management effectiveness.
In conclusion, ElevateU is not just an academic project but a viable product prototype that reflects the
trends, technologies, and methodologies defining the future of online education. It embodies the
transition from traditional education models to innovative, technology-driven learning experiences
that are accessible anytime, anywhere. The successful completion of this project lays the groundwork
for more sophisticated enhancements, paving the way for ElevateU to grow into a fully-fledged,
competitive e-learning platform capable of making a lasting impact on the educational sector.
60
FUTURE WORK
Though ElevateU has successfully achieved its initial goals, several enhancements and expansions are
envisioned to increase its impact and usability:
61
REFERENCES
62