Mustkim Project Report
Mustkim Project Report
The Report submitted is my own work and has not been duplicated from any
other source. I shall be responsible for any unpleasant moment/situation.
Place: Panipat
Date: 30-04-2025
Mustkim Khan
2|Pa ge
Acknowledgement
A successful Project Report is the result of team work and co-ordination that
includes not only the group of developers who put forth the ideas, logic and
efforts but also those who guide them. So, at the completion of the Summer
Training Report, I feel obliged to extent my gratitude towards all those who
made valuable contributions throughout my training period.
I am thankful for all the knowledge, guidance and support imparted by Dr.
Prateek Mishra (Director) to me who gave me invaluable knowledge during
the IT period.
At the end just as significantly, I would like to express my sincere thanks to,
Asst. Prof. Geeta Jain and all the other staff members who have provided me
excellent knowledge and support throughout my Graduation.
I am very much thankful to my parents and friends for their continuous support.
Place: Panipat
Date: 30-04-2025
MUSTKIM KHAN
4|Page
INDEX
1. Introduction 7
7. Conclusion 99-100
9. References 104
5|Page
SCREENSHOT’S INDEX
1. Home page 92
2. Book Section 93
3. Quiz Section 94
4. Review Section 95
5. Blog Section 96
6. Exam Section 97
7. Login Section 98
6|Page
INTRODUCTION
7|Page
OBJECTIVE OF PROJECT
The main objectives behind developing the Educational Website project are
manifold. With a student-centric approach, the project sets out clear goals to
enhance the academic journey of users and leverage technology to simplify
access to educational materials.
1. Centralized Educational Resources
To offer a single platform where students can access previous year papers, well-
organized notes, important books, quizzes, and blogs without the need to search
across multiple sources.
2. Promote Self-Study and Preparation
By providing readily available study materials and quizzes, students can engage
in self-assessment and independent study, allowing them to identify their
strengths and areas for improvement.
3. Enhance User Experience
Introduction of light and dark themes gives users the flexibility to customize
their viewing preferences, improving usability for different lighting
environments and increasing overall accessibility.
6. Real-time Data Management
8|Page
Using Firebase Firestore, the website ensures that all educational materials are
updated in real-time. Students and teachers can access the latest content without
unnecessary delays or data syncing issues.
7. Mobile-First Approach
With increasing mobile usage, the website has been developed with a responsive
design philosophy, ensuring full functionality and optimal display across all
devices including mobiles, tablets, and desktops.
8. Encourage Knowledge Sharing
Through the blog section, educators, and students can exchange knowledge,
share academic insights, and build a collaborative learning community.
In conclusion, the project aims to harness modern technology to create a robust,
user-friendly educational platform that empowers students, improves
accessibility to learning resources, and supports academic excellence.
9|Page
DESIGN AND IMPLIMENTATION
The design and implementation of the Educational Website have been carried
out using modern development practices, focusing on both functionality and
user experience.
1. Frontend Design
10 | P a g e
Previous Year Papers: Uploaded as PDFs and viewed through
integrated PDF viewers.
Notes Section: Categorized notes made available for different subjects
and classes.
Books Repository: List of important academic books accessible with
detailed descriptions.
Quiz Section: Interactive quizzes built with MCQs and immediate
scoring mechanisms.
Blogs: Educational blogs posted dynamically from Firestore, providing
tips, insights, and motivational content.
Authentication: Full user authentication system with password
recovery and email verification features.
Theme Toggle: React Context API and Tailwind’s dark: variants allow
seamless theme switching.
4. Implementation Methodology
11 | P a g e
TOOLS AND TECHNOLOGY USED
The success of the Educational Website project was largely driven by the
effective use of modern tools and technologies. Each tool selected played a vital
role in ensuring the platform was efficient, secure, scalable, and user-friendly.
Below is a detailed overview of the major technologies and tools used during
the development of the project.
1. React.js
Component-Based Architecture:
React promotes breaking down the UI into small, reusable components.
In the project, each section like Quizzes, Previous Year Papers, Notes,
and Blogs was built using separate, modular components. This made
development organized and maintenance simpler.
Virtual DOM:
React’s Virtual DOM ensures that only parts of the page that need
updates are re-rendered, leading to faster performance and smoother
user experience — essential for an educational platform where users
switch between resources frequently.
Hooks:
Hooks like useState, useEffect, and useContext allowed efficient
management of state and side effects, supporting features like theme
switching (light/dark mode) and dynamic loading of content.
Seamless Updates:
React’s declarative approach made it easy to keep the UI in sync with
the application’s data, ensuring consistent user experience throughout
the website.
12 | P a g e
React’s flexibility, performance, and strong community support made it the
ideal choice for building a modern, scalable educational platform.
2. Tailwind CSS
3. Firebase
13 | P a g e
Firebase Authentication:
Secure sign-in and user management were handled through Firebase
Authentication. Students and teachers could register, log in, and access
personalized content securely.
Cloud Firestore:
All the educational content like notes, previous year papers, quizzes, and
blog posts were stored and managed in Firestore, a real-time NoSQL
database. This ensured fast data access and live updates without needing
manual refresh.
Firebase Hosting:
The final website was deployed on Firebase Hosting, benefiting from its
fast delivery network, automatic SSL certification for security, and easy
continuous deployment.
Extension Marketplace:
Extensions like Prettier, ESLint, Tailwind IntelliSense, and React
snippets enhanced productivity, improved code quality, and accelerated
development.
14 | P a g e
Integrated Terminal:
With VS Code’s terminal, running commands like npm start, Firebase
deployments, and Git operations became seamless.
Git Integration:
Built-in Git support allowed version control operations like commits,
pushes, and branch switching without leaving the editor.
Version control is a crucial part of modern software development, and Git with
GitHub were used to manage and host the project code.
15 | P a g e
6. React Router (react-router-dom)
React Router is the standard library for routing in React applications, allowing
users to navigate between different pages seamlessly without refreshing the
browser.
How React Router Was Used:
Multiple Routes:
The website includes multiple sections — Notes, Quizzes, Previous Year
Papers, Blogs, and Authentication pages — all handled efficiently
through React Router.
Nested and Dynamic Routing:
Nested routes were implemented for pages like individual blog posts and
category-specific quizzes, providing a better navigation structure.
Protected Routes:
Authentication checks were implemented on certain routes, ensuring
only logged-in users could access restricted content such as uploading
notes or writing blogs.
Benefits:
React Router played a vital role in building a seamless and dynamic user
experience, making the platform feel like a native application.
16 | P a g e
Source code
App.tsx
17 | P a g e
import BlogDetail from "./pages/blog/BlogDetail";
// Configure the query client with error handling to prevent blank screens
defaultOptions: {
queries: {
retry: 1,
refetchOnWindowFocus: false,
meta: {
18 | P a g e
},
mutations: {
meta: {
},
});
<AuthProvider>
<ThemeProvider defaultTheme="light">
<HelmetProvider>
<Helmet>
<TooltipProvider>
<Toaster />
<Sonner />
<BrowserRouter>
19 | P a g e
<Routes>
<Route path="/syllabus/:sectorId/:categoryId"
element={<SyllabusDetail />} />
<Route path="/syllabus/:sectorId/:categoryId/:boardId"
element={<SyllabusDetail />} />
<Route path="/syllabus/topic/:topicId" element={<TopicDetail />} />
<ProtectedRoute requiredRole="user">
<UserProfile />
20 | P a g e
</ProtectedRoute>
} />
<Route path="/papers/sector/:sector/class/:classId"
element={<ClassBoardSelection />} />
<Route path="/papers/sector/:sector/class/:classId/board/:boardId"
element={<BoardResourcesPage />} />
<Route
path="/papers/sector/:sector/class/:classId/board/:boardId/year/:year/subject/:s
ubject" element={<PaperViewer />} />
<Route
path="/papers/sector/:sector/class/:classId/board/:boardId/previous-papers"
element={<YearSubjectSelection />} />
<Route path="/papers/view/:paperId" element={<PaperViewerPage
/>} />
21 | P a g e
<Route path="/register" element={<Navigate to="/signup" />} />
</Routes>
</BrowserRouter>
</TooltipProvider>
</HelmetProvider>
</ThemeProvider>
</AuthProvider>
</QueryClientProvider>
);
index.css
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
--background: 0 0% 100%;
--card: 0 0% 100%;
22 | P a g e
--popover: 0 0% 100%;
--radius: 0.5rem;
.dark {
23 | P a g e
--background: 222.2 84% 4.9%;
24 | P a g e
--ring: 224.3 76.3% 48%;
@layer base {
*{
@apply border-border;
body {
/* Custom Animations */
@keyframes border-pulse {
0%, 100% {
}
50% {
border-color: rgba(37, 99, 235, 0.4);
@keyframes glow {
0%, 100% {
opacity: 0.5;
25 | P a g e
box-shadow: 0 0 5px theme('colors.blue.500');
50% {
opacity: 1;
box-shadow: 0 0 20px theme('colors.blue.400');
@keyframes float {
0%, 100% {
transform: translateY(0);
}
50% {
transform: translateY(-10px);
@keyframes gradient-shift {
0% {
background-position: 0% 50%;
50% {
100% {
background-position: 0% 50%;
26 | P a g e
}
.shadow-glow {
box-shadow: 0 0 8px currentColor;
.animation-delay-300 {
animation-delay: 300ms;
.animation-delay-500 {
animation-delay: 500ms;
}
.animation-delay-700 {
animation-delay: 700ms;
.dark-theme-toggle {
.light-theme-toggle {
27 | P a g e
}
/* Border Animations */
.animate-border {
@apply relative;
.animate-border::before {
content: '';
-webkit-mask:
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
}
.latex-container {
@apply overflow-x-auto;
28 | P a g e
.dark .latex-container .MathJax {
/* Quiz animations */
.quiz-card-enter {
transform: translateY(20px);
opacity: 0;
}
.quiz-card-enter-active {
transform: translateY(0);
opacity: 1;
.quiz-card-exit {
transform: translateY(0);
opacity: 1;
.quiz-card-exit-active {
transform: translateY(-20px);
opacity: 0;
transition: all 300ms ease-out;
29 | P a g e
}
.btn-glow {
position: relative;
overflow: hidden;
.btn-glow::after {
content: '';
position: absolute;
inset: -2px;
background: linear-gradient(
60deg,
hsl(224, 85%, 66%),
);
30 | P a g e
animation: gradient-shift 4s linear infinite;
border-radius: 0.5rem;
z-index: -1;
.highlight-on-hover {
.highlight-on-hover:hover {
background-image: linear-gradient(
120deg,
transparent 0%,
transparent 40%,
transparent 60%,
transparent 100%
);
background-position: 100% 0;
.tool-card {
31 | P a g e
@apply transition-all duration-300 ease-out;
.tool-card:hover {
@apply shadow-lg;
transform: translateY(-5px);
.dark .card-3d {
background: linear-gradient(45deg, rgba(30, 41, 59, 0.8) 0%, rgba(15, 23, 42,
0.8) 100%);
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.5),
backdrop-filter: blur(4px);
}
.dark .glow-text {
text-shadow: 0 0 8px rgba(88, 180, 255, 0.4);
.syllabus-tab-active {
32 | P a g e
position: relative;
overflow: hidden;
}
.syllabus-tab-active::after {
content: "";
position: absolute;
bottom: 0;
left: 25%;
width: 50%;
height: 2px;
background-color: currentColor;
transform: scaleX(1);
.syllabus-tab-inactive::after {
transform: scaleX(0);
}
AboutUs.tsx
33 | P a g e
import { Button } from '@/components/ui/button';
const timeline = [
{
year: "2010",
{
year: "2013",
description: "Opened our first physical learning center with dedicated labs
and classrooms."
},
year: "2015",
},
34 | P a g e
{
year: "2018",
{
year: "2022",
year: "2023",
];
// Team members
const team = [
35 | P a g e
image: "https://images.unsplash.com/photo-1507003211169-
0a1dd7228f2d?w=400&h=400&fit=crop"
},
image: "https://images.unsplash.com/photo-1494790108377-
be9c29b29330?w=400&h=400&fit=crop"
},
{
name: "Rajesh Kumar",
image: "https://images.unsplash.com/photo-1580489944761-
15a19d654956?w=400&h=400&fit=crop"
}
];
36 | P a g e
// Values
const values = [
{
title: "Excellence",
},
title: "Inclusivity",
},
{
title: "Innovation",
},
37 | P a g e
];
return (
<main className="flex-grow">
</p>
</Button>
</Button>
</div>
</div>
38 | P a g e
</div>
</section>
<div>
<div className="space-y-6">
<div>
</div>
<div>
<h3 className="text-xl font-semibold mb-2 text-primary">Our
Vision</h3>
</div>
39 | P a g e
<div className="space-y-3">
{[
))}
</div>
</div>
</div>
<div className="relative">
<img
src="https://images.unsplash.com/photo-1522202176988-
66273c2fd55f?ixlib=rb-4.0.3"
alt="Students collaborating"
40 | P a g e
className="w-full h-full object-cover"
/>
</div>
<div>
<p className="text-3xl font-bold text-primary">10k+</p>
</div>
<div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
41 | P a g e
<h2 className="text-3xl font-bold dark:text-white">Our Core
Values</h2>
</p>
</div>
<CardContent className="pt-6">
<div className="flex flex-col items-center text-center">
{value.icon}
</div>
</div>
</CardContent>
</Card>
))}
</div>
</div>
</section>
42 | P a g e
{/* Our Timeline */}
</div>
<div className="relative">
<div className="space-y-12">
43 | P a g e
<p className="text-gray-600 dark:text-gray-
400">{event.description}</p>
</div>
</div>
</div>
<div className="md:w-1/2"></div>
</div>
))}
</div>
</div>
</div>
</section>
44 | P a g e
<p className="mt-4 text-gray-600 dark:text-gray-400 max-w-2xl mx-
auto">
</p>
</div>
<img
src={member.image}
alt={member.name}
</div>
<div className="p-6">
<h3 className="text-xl font-bold mb-1 dark:text-
white">{member.name}</h3>
<p className="text-primary font-medium mb-
3">{member.role}</p>
45 | P a g e
</div>
</div>
))}
</div>
</Button>
</div>
</div>
</section>
</p>
46 | P a g e
</Button>
</Button>
</div>
</div>
</section>
</main>
<Footer />
</div>
);
};
login.tsx
47 | P a g e
import Contact from '@/components/Contact';
const structuredData = {
"@context": "https://schema.org",
"@type": "EducationalOrganization",
"name": "Pathshala",
"logo": "https://www.pathshala.edu/logo.png",
"sameAs": [
"https://www.facebook.com/pathshala",
"https://www.twitter.com/pathshala",
"https://www.linkedin.com/company/pathshala",
"https://www.instagram.com/pathshala"
],
"contactPoint": {
"@type": "ContactPoint",
48 | P a g e
"telephone": "+91-123-456-7890",
"offers": {
"@type": "Offer",
};
return (
/>
<Navbar />
<ScrollArea className="flex-grow">
<main>
<Hero />
<Courses />
<BoardAndEntranceExams />
49 | P a g e
<BooksSection />
<QuizSection />
<BlogSection />
<Reviews />
<Testimonials />
<About />
<Contact />
</main>
</ScrollArea>
<Footer />
</div>
);
};
signUp,tsx
50 | P a g e
Form,
FormControl,
FormField,
FormItem,
FormLabel,
FormMessage,
} from "@/components/ui/form";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
51 | P a g e
name: z.string().min(2, { message: "Name must be at least 2 characters" }),
}),
});
52 | P a g e
const [loading, setLoading] = useState(false);
name: "",
email: "",
phone: "",
password: "",
confirmPassword: "",
district: "",
state: "",
academicStream: "",
gender: "",
termsAccepted: false,
},
});
try {
const userData = {
name: data.name,
email: data.email,
mobile: data.phone,
district: data.district,
53 | P a g e
country: data.state,
academicStream: data.academicStream,
gender: data.gender,
};
if (user) {
toast({
title: "Success!",
});
navigate("/profile");
}
toast({
variant: "destructive",
title: "Registration failed",
description: error.message || "Something went wrong. Please try again.",
});
} finally {
setLoading(false);
}
};
54 | P a g e
const handleGoogleSignIn = async () => {
setLoading(true);
try {
title: "Success!",
});
navigate("/profile");
variant: "destructive",
});
} finally {
setLoading(false);
}
};
const academicStreams = [
"Science",
"Commerce",
"Arts",
55 | P a g e
"Engineering",
"Medical",
"Law",
"Other"
];
const genders = [
"Male",
"Female",
"Other"
];
return (
<Navbar />
<CardHeader className="space-y-1">
src="/lovable-uploads/99159b03-6a51-4215-830d-
9ff354ec2d1b.png"
alt="Logo"
className="h-16 w-auto"
/>
56 | P a g e
</div>
</CardHeader>
<CardContent>
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)}
className="space-y-4">
<FormField
control={form.control}
name="name"
<FormLabel>Full Name</FormLabel>
<FormControl>
<div className="relative">
</span>
<Input
placeholder="John Doe"
className="pl-10"
57 | P a g e
{...field}
disabled={loading}
/>
</div>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="email"
<FormLabel>Email</FormLabel>
<FormControl>
<div className="relative">
<span className="absolute left-3 top-2.5 text-gray-400">
</span>
<Input
type="email"
placeholder="[email protected]"
className="pl-10"
58 | P a g e
{...field}
disabled={loading}
/>
</div>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="phone"
<FormLabel>Phone Number</FormLabel>
<FormControl>
<div className="relative">
<span className="absolute left-3 top-2.5 text-gray-400">
</span>
<Input
placeholder="1234567890"
className="pl-10"
{...field}
59 | P a g e
disabled={loading}
/>
</div>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="district"
<FormLabel>District</FormLabel>
<FormControl>
<div className="relative">
</span>
<Input
placeholder="Your district"
className="pl-10"
{...field}
disabled={loading}
60 | P a g e
/>
</div>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="state"
<FormLabel>State</FormLabel>
<FormControl>
<div className="relative">
<Input
placeholder="Your state"
className="pl-10"
{...field}
disabled={loading}
/>
61 | P a g e
</div>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="academicStream"
<FormLabel>Academic Stream</FormLabel>
<Select
disabled={loading}
onValueChange={field.onChange}
value={field.value}
defaultValue={field.value}
>
<FormControl>
<SelectTrigger className="pl-10">
</span>
62 | P a g e
</SelectTrigger>
</FormControl>
<SelectContent>
{academicStreams.map((stream) => (
<SelectItem key={stream} value={stream}>
{stream}
</SelectItem>
))}
</SelectContent>
</Select>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="gender"
<FormLabel>Gender</FormLabel>
<Select
disabled={loading}
onValueChange={field.onChange}
value={field.value}
63 | P a g e
defaultValue={field.value}
>
<FormControl>
<SelectTrigger>
<SelectValue placeholder="Select your gender" />
</SelectTrigger>
</FormControl>
<SelectContent>
{genders.map((gender) => (
{gender}
</SelectItem>
))}
</SelectContent>
</Select>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="password"
64 | P a g e
<FormLabel>Password</FormLabel>
<FormControl>
<div className="relative">
</span>
<Input
type="password"
placeholder="••••••••"
className="pl-10"
{...field}
disabled={loading}
/>
</div>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="confirmPassword"
65 | P a g e
<FormLabel>Confirm Password</FormLabel>
<FormControl>
<div className="relative">
</span>
<Input
type="password"
placeholder="••••••••"
className="pl-10"
{...field}
disabled={loading}
/>
</div>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</div>
<FormField
control={form.control}
name="termsAccepted"
66 | P a g e
<FormItem className="flex flex-row items-start space-x-3 space-
y-0 p-2">
<FormControl>
<Checkbox
checked={field.value}
onCheckedChange={field.onChange}
disabled={loading}
/>
</FormControl>
and{" "}
privacy policy
</Link>
</FormLabel>
<FormMessage />
</div>
</FormItem>
)}
/>
67 | P a g e
{/* Submit button */}
<Button
type="submit"
className="w-full"
disabled={loading}
>
</Button>
</form>
</Form>
</div>
Or continue with
</span>
</div>
</div>
<Button
variant="outline"
68 | P a g e
className="w-full"
onClick={handleGoogleSignIn}
disabled={loading}
>
<img
src="https://www.gstatic.com/firebasejs/ui/2.0.0/images/auth/google.svg"
alt="Google" className="mr-2 h-4 w-4" />
</Button>
</CardContent>
</Link>
</p>
</CardFooter>
</Card>
</div>
</main>
<Footer />
</div>
);
};
69 | P a g e
BlogDetail.tsx
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle
} from '@/components/ui/card';
const blogs = {
blog1: {
title: "Understanding JavaScript Promises",
70 | P a g e
date: "2023-06-15",
category: "Programming",
coverImage: "https://images.unsplash.com/photo-1587620962725-
abab7fe55159?q=80&w=1000",
content: [
type: "text",
content: "JavaScript promises are objects representing the eventual
completion or failure of an asynchronous operation. They allow you to write
cleaner asynchronous code by chaining methods instead of nesting callbacks."
},
{
type: "code",
language: "javascript",
content: `// Creating a promise
// Asynchronous operation
setTimeout(() => {
const success = true;
if (success) {
resolve("Operation completed!");
} else {
reject("Operation failed!");
}, 1000);
});
71 | P a g e
// Using the promise
myPromise
.then(result => {
})
.catch(error => {
console.error(error);
});`
},
type: "text",
content: "Promises can be in one of three states: pending, fulfilled, or
rejected. A promise is initially in the pending state and can change to either
fulfilled (resolved) or rejected."
},
{
type: "heading",
},
type: "text",
{
type: "code",
72 | P a g e
language: "javascript",
fetchUserData(userId)
.then(userData => {
return fetchUserPosts(userData.username);
})
.then(posts => {
console.log(posts);
return fetchPostComments(posts[0].id);
})
.then(comments => {
console.log(comments);
})
.catch(error => {
});`
},
type: "heading",
content: "Try It Yourself"
},
type: "text",
content: "Use the code compiler below to practice working with promises:"
},
73 | P a g e
type: "compiler",
language: "javascript",
resolve("Hello, world!");
}, 2000);
});
console.log("Promise is pending...");
delayedGreeting
.then(message => {
console.log("Promise resolved!");
console.log("Message:", message);
})
.catch(error => {
});`
}
},
blog2: {
74 | P a g e
category: "Web Design",
coverImage: "https://images.unsplash.com/photo-1507721999472-
8ed4421c4af2?q=80&w=1000",
content: [
type: "text",
content: "CSS Grid Layout is a powerful system that allows for two-
dimensional layouts on the web. It makes complex layouts much easier to create
and maintain."
},
type: "code",
language: "css",
content: `.grid-container {
display: grid;
}`
}
};
75 | P a g e
// Get blog data based on blogId
if (!blog) {
return (
<Navbar />
<div className="text-center">
</div>
<Footer />
</div>
);
return (
<SEO
76 | P a g e
/>
<Navbar />
<img
src={blog.coverImage}
alt={blog.title}
className="w-full h-full object-cover"
/>
</div>
<div className="mb-8">
<span className="mr-4">|</span>
<span className="mr-4">{blog.date}</span>
<span className="mr-4">|</span>
<span>{blog.category}</span>
</div>
77 | P a g e
</div>
<Card className="mb-8">
<CardContent className="p-6">
return (
{section.content}
</p>
);
} else if (section.type === "heading") {
return (
</h2>
);
return (
<CodePreview
key={index}
code={section.content}
language={section.language}
78 | P a g e
/>
);
return (
<CodeCompiler
key={index}
defaultCode={section.defaultCode}
language={section.language}
);
}
return null;
})}
</CardContent>
</Card>
<div className="mb-8">
<h3 className="text-xl font-bold mb-4 dark:text-white">Related
Articles</h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
{Object.keys(blogs)
.slice(0, 2)
.map(id => {
79 | P a g e
const relatedBlog = blogs[id as keyof typeof blogs];
return (
<img
src={relatedBlog.coverImage}
alt={relatedBlog.title}
className="w-full h-full object-cover"
/>
</div>
<CardContent className="p-4">
</CardContent>
</Card>
);
})}
</div>
</div>
</div>
</div>
</main>
<Footer />
80 | P a g e
</div>
);
};
BookDetail.tsx
interface BookDetail {
id: string;
title: string;
author: string;
subject: string;
grade: string;
coverImage: string;
description: string;
81 | P a g e
pdfUrl: string;
category: string;
publisher: string;
language: string;
publicationYear: string;
isbn: string;
pages: number;
};
// Mock data for the specific book - in a real app, you'd fetch from Firebase
author: "NCERT",
subject: "Mathematics",
82 | P a g e
chapters: [
additionalDetails: {
language: "English",
publicationYear: "2023",
isbn: "978-81-7450-630-6",
pages: 320,
},
});
83 | P a g e
const { category = "ncert", bookId = "" } = useParams<{ category: string;
bookId: string }>();
const [bookmarked, setBookmarked] = React.useState(false);
setBookmarked(!bookmarked);
};
return (
<Navbar />
<main className="flex-grow py-8 bg-gray-50 dark:bg-gray-900">
<div className="mb-6">
<Link
to={`/books/${category}`}
</Link>
84 | P a g e
</div>
alt={book.title}
className="w-full h-auto object-cover"
/>
</div>
</div>
<div className="md:col-span-2">
{book.title}
</h1>
{book.author}
</p>
85 | P a g e
{book.subject}
</span>
</span>
</div>
{book.description}
</p>
</div>
Download PDF
</Button>
Share
</Button>
<Button
variant="outline"
86 | P a g e
className={`flex items-center gap-2 ${bookmarked ? 'bg-
primary/10 text-primary dark:bg-blue-900/20 dark:text-blue-400' : ''}`}
onClick={toggleBookmark}
>
{bookmarked ? (
<>
):(
<>
)}
</Button>
</div>
</div>
</div>
</TabsTrigger>
87 | P a g e
<TabsTrigger value="chapters" className="data-[state=active]:bg-
blue-50 dark:data-[state=active]:bg-blue-900/20">
Chapters
</TabsTrigger>
</TabsTrigger>
</TabsList>
<AdobePDFViewer
pdfUrl={book.pdfUrl}
/>
</div>
</TabsContent>
<ul className="space-y-3">
<li key={idx}>
<Link
88 | P a g e
to="#"
>
</Link>
</li>
))}
</ul>
</div>
</TabsContent>
<div className="space-y-2">
89 | P a g e
</div>
</div>
<div className="space-y-2">
</div>
90 | P a g e
</div>
</div>
</div>
</div>
</TabsContent>
</Tabs>
</div>
</div>
</main>
<Footer />
</div>
);
};
91 | P a g e
SCREENSHOTS OF PROJECT
Home Page
92 | P a g e
Book Section
93 | P a g e
Quiz Section
94 | P a g e
Review Section
95 | P a g e
Blog Section
96 | P a g e
Exam Section
97 | P a g e
Login Section
98 | P a g e
CONCLUSION
99 | P a g e
Furthermore, the platform was designed to be fully responsive, providing an
equally rich experience across devices — from desktops to tablets to
smartphones. This ensures that students and teachers can access educational
resources anytime, anywhere, thereby promoting continuous learning beyond
traditional classroom environments.
In conclusion, this project not only fulfilled its initial objectives but also
provided valuable learning experiences in full-stack development, UI/UX
design, cloud database management, and security implementation. It
demonstrated how modern web technologies can be combined effectively to
solve real-world problems in the education sector. The Educational Website
stands as a foundation for future expansion possibilities, such as adding video
tutorials, online tests, leaderboards, and discussion forums.
Overall, the project showcases the importance of a well-thought-out design, the
right choice of technology stack, and user-centric features in building a
successful educational platform. With continuous updates and community
engagement, this platform holds the potential to become a major resource hub
for students and educators alike.
100 | P a g e
FUTURE SCOPE
While the Educational Website project has successfully achieved its initial
objectives, there is significant potential for further enhancement and expansion.
The growing demand for digital education resources and the increasing reliance
on online learning platforms open up numerous possibilities for this project to
evolve into a more comprehensive and impactful educational solution. Below
are several important areas where the project can be expanded and improved in
the future:
1. Integration of Video Lectures and Tutorials
Currently, the platform provides access to notes, previous year papers, books,
and blogs. A logical next step would be to integrate video content, such as
recorded lectures, tutorial videos, and live classes. Video-based learning has
proven highly effective in improving students' understanding of complex topics.
By partnering with educators or creating original content, the platform can offer
interactive video series categorized by subject, grade, and difficulty level. Live
webinar sessions with teachers could also foster real-time interaction between
students and instructors.
2. Addition of Online Test Series and Mock Exams
101 | P a g e
The current blog section provides valuable educational content. In the future,
students and educators could be allowed to contribute their own articles and
study tips after a moderation process. This would encourage community
participation and increase the diversity of content available on the website. A
commenting and rating system for blog posts could also foster more interaction
among users.
5. Advanced User Profiles and Progress Tracking
A more detailed user profile system could be developed where students can
track their learning progress, quiz scores, saved notes, bookmarked papers, and
completed courses. Progress dashboards with graphs and milestones would give
users insights into their academic journey, helping them set and achieve learning
goals more efficiently.
6. Mobile Application Development
9. Multilingual Support
102 | P a g e
the platform accessible to students from diverse linguistic backgrounds, greatly
increasing its impact and inclusivity.
10. Monetization and Scholarship Programs
While the basic resources can remain free, premium content like special courses,
mock exams, and exclusive study materials could be offered through
subscription models. In addition, scholarship programs and competitions could
be organized, rewarding top-performing students with recognition and prizes,
further promoting excellence in learning.
103 | P a g e
REFRENCES
5. GitHub Documentation
GitHub – Where the world builds software.
Retrieved from: https://docs.github.com/en
6. Visual Studio Code Documentation
Visual Studio Code – Code editing. Redefined.
Retrieved from: https://code.visualstudio.com/docs
7. MDN Web Docs
MDN Web Docs – Resources for developers, by developers.
Retrieved from: https://developer.mozilla.org/
8. W3Schools Online Web Tutorials
W3Schools – Web development tutorials for HTML, CSS, JavaScript,
and more.
Retrieved from: https://www.w3schools.com/
104 | P a g e