Project Report PDF
Project Report PDF
Project Report
award of Degree of
Submitted to
DATE:…………………
CERTIFICATE
This is to certify that the work embodies in this project entitled,
“Find Your Job”, being submitted by Ashish Ranjan
(22303310109) in partial fulfillment of the requirement for the
award of “Bachelor of Computer Applications” to
ARYABHATTA KNOWLEDGE UNIVERSITY, PATNA during the academic
year 2022-25 is a record of bonafide piece of work, carried out
by him/her under our/my supervision and guidance in the
“Department of Computer Science & Applications”,
Cimage Professional College.
Page1
|
Cimage Professional College
Session 2022-2025
Date:
APPROVAL CERTIFICATE
The project report entitled “Find Your Job”, being submitted by
Ashish Ranjan(22303310109) has been examined by us and
is hereby approved for the award of degree “Bachelor of
Computer Applications”, for which it has been submitted. It
is understood that by this approval the undersigned do not
necessarily endorse or approve any statement made, the
opinion expressed or conclusion drawn therein, but approve the
project only for the purpose for which it has been submitted.
Date: Date:
Page2
|
Cimage Professional College
Session 2022-2025
Date:
DECLARATION
the joint guidance of Prof. Ravi Kumar Soni Sir and Prof.
Ashish Ranjan
Registration No :
22303310109
Session-2022-2025
Page3
|
ACKNOWLEDGEMENT
“A journey is easier when you travel together. Interdependence is certainly more valuable
than
independence.”
I would like to thanks, Prof. Ravi Kumar Soni Sir and Prof. Niraj Kumar
Singh Sir, for providing regular guidance and insight into my project work. I also thank
them for all advice he has given me in the past year, and for always having time for me,
whenever I needed.
I give special thanks to Prof. Amit Kumar Shukla Sir, Prof. Raju Upadhyay
Sir, and Prof. Anjesh Sir for always being willing to help find solutions to any problems
I had with my work.
I express my gratitude and thanks to all the staff members of Computer Science
departments for their sincere cooperation in furnishing relevant information to complete
this Project well in time successfully.
Lastly but not least I must express my cordial thank to my parent and family
members who gave me the moral support without that it is impossible to complete my
project work. With this note, I thank everyone for the support.
(Ashish Ranjan)
Registration No : 22303310109
BCA 6th
Semester
Session-2022-
2025
Page4
|
CONTENTS
REPORT.............................................................................……………………………………………...
INTRODUCTION......................................................................................................... 8
OBJECTIVE............................................................................................................... 9
ADVANTAGES OF JAVA.........................................................................................11
TOOLS/PLATFORM required....................................................................................13
PROBLEM DEFINITION............................................................................................14
REQUIREMENT SPECIFICATIONS.......................................................................14
GANTT CHART....................................................................................................... 16
PERT CHART.......................................................................................................... 18
SYSTEM ANALYSIS...................................................................................................... 1
IDENTIFICATION OF NEED.....................................................................................1
FEASIBILITY STUDY................................................................................................ 6
TECHNICAL FEASIBILITY:...................................................................................7
ECONOMICAL FEASIBILITY:...............................................................................7
OPERATIONAL FEASIBILITY:..............................................................................8
ANALYSIS................................................................................................................. 10
DFD........................................................................................................................ 10
MODULE DESCRIPTION...........................................................................................16
LIST OF REPORTS.................................................................................................... 22
IMPLEMENTATION METHODOLOGY...................................................................23
TESTING................................................................................................................... 25
Page5
|
LIMITATIONSANDFURTHER ENHANCEMENTS.....................................................28
SECURITY MECHANISM..........................................................................................29
SNAPSHOTS.............................................................................................................. 30
Page6
|
SAMPLE PROJECT
Page7
|
INTRODUCTION
“Find Your Job” is a full-stack web application developed with the goal of bridging
the gap between job-seeking students and recruiters looking for qualified
candidates. In today’s rapidly evolving job market, students often face challenges in
finding job opportunities that match their skills, while recruiters struggle to find the
right talent efficiently. This platform provides a dedicated digital space for both
parties to interact, post opportunities, and apply for jobs—all in a streamlined and
user-friendly environment.
Key Features:
1. Student Panel:
o Profile creation with skills, resume upload, education, and experience details.
o Browse jobs by category, company, domain, or search keywords.
o Apply to jobs directly via the portal.
o View applied jobs and application status.
2. Recruiter Panel:
o Post jobs with detailed requirements (title, location, salary, skills, etc.).
o View applications for each job post.
o Access candidate profiles and resumes.
o Manage and update job postings.
3. Authentication & Authorization:
o Secure login/register system using role-based access.
o Only recruiters can post jobs.
o Only students can apply to jobs.
Page8
|
OBJECTIVE
and efficient platform where students can easily find and apply for
jobs or internships, and recruiters can post job openings and manage
streamlined manner..
Page9
|
PROJECT CATEGORY MERN STACK
Page
10 |
ADVANTAGES OF M E R N
MERN stack allows you to use JavaScript for both frontend and
backend development. From UI ([Link]) to server logic ([Link] +
[Link]) to database operations (MongoDB), everything runs on a
single language, reducing context-switching and boosting developer
productivity.
Page
11 |
• MERN is Developer-Friendly
With a huge community, abundant tutorials, libraries, and tools, the
MERN stack offers a great developer experience. Hot reloading, real-
time debugging tools, and open-source packages speed up
development and reduce boilerplate.
• MERN is Component-Based
Using React’s component-driven approach, you can build reusable UI
components, making your frontend more maintainable, scalable, and
[Link] is hybrid and scalable:
[Link] allows hybrid rendering — combining static generation (SSG)
and server-side rendering (SSR) in the same application. This
flexibility makes it suitable for both small and large-scale
applications, ensuring efficient performance and scalability.
• MERN is Developer-Friendly
With a huge community, abundant tutorials, libraries, and tools, the MERN
stack offers a great developer experience. Hot reloading, real-time
debugging tools, and open-source packages speed up development and
reduce boilerplate.
• MERN is Component-Based
Using React’s component-driven approach, you can build reusable UI
components, making your frontend more maintainable, scalable, and
Page
12 |
[Link] is hybrid and scalable:
[Link] allows hybrid rendering — combining static generation (SSG) and
server-side rendering (SSR) in the same application. This flexibility makes it
suitable for both small and large-scale applications, ensuring efficient
performance and scalability.
Page
13 |
TOOLS/PLATFORM REQUIRED
Operating System
• WINDOW | LINUX | MAC
Hardware Requirements:
• Intel i3
• 512 MB RAM • 10 GB Hard Disk
Software Requirements:
• NODEJS
• MONGODB
• TEXT EDITOR
• BROWSER
Page
14 |
PROBLEM DEFINITION
In today’s competitive job market, students and fresh graduates often
struggle to find suitable job or internship opportunities due to a lack of
centralized, student-focused job platforms. Most existing platforms are
either too broad, complex, or dominated by experienced professionals,
making it difficult for entry-level job seekers to get noticed. At the same time,
recruiters face challenges in filtering relevant applications and reaching
out to fresh talent from academic backgrounds.
There is a clear need for a dedicated system that:
Caters specifically to students and early-career professionals.
Allows recruiters to post job openings and manage applications
efficiently.
Offers a simple and clean user experience tailored to campus-level or
early-stage hiring.
“Find Your Job” is designed to solve these issues by providing a custom
platform that streamlines job searching, applying, and recruiting processes
for both students and recruiters.
REQUIREMENT SPECIFICATIONS
The requirement specification outlines the functional and non-functional requirements of the
project to ensure the system is well-defined and meets user expectations.
1. Functional Requirements
Page
16 |
Project planning is part of project management, which relates
to the use of schedules such as Gantt charts to plan and
subsequently report progress within the project environment.
Page
18 |
GANTT CHART
The bars are drawn against a time line. The length of each bar
is proportional to the length of time planned for the activity.
Gantt chart can take different phase depending on their
intended use. The Gantt chart of Find Your Job is drawn for
the time management. The Gantt chart is drawn below:
Page
19 |
YEAR 2025
Page
20 |
PERT CHART
PERT controls time and cost during the project and also
facilitate finding the right balance between completing a
project on time and completing it within the budget. There are
thus not one but many critical paths, depending on the
permutations of the estimates for each task. This makes
analysis of critical path in PERT charts very complex. The PERT
chart representation of the School Management System is
shown below.
IDENTIFICATION OF NEED
Requirement elicitation.
negotiation. Requirement
specification.
System Modeling.
Requirement
validation.
Requirement
Management.
Page1|
In other words we can say that requirement analysis is
a software task that bridges the gap between system level
requirement engineering and software design.
say or ask; Both are worried that what they do say will be
misinterpreted; both are thinking about where it might lead
(Both likely have radically different expectation here); Both
want to get the think over with, but at the same time, both
want it to be a success.
Page2|
Here according to this principle the analyst starts by
asking context-free-questions. That is a set of question that
will lead to a basic understanding of the problem, the
people who want a solution, the nature of solution that is
desired, and the effectiveness of the first
Page3|
encounter itself. The first set of Context-free question
focuses on the customer, the overall goals, and the benefits.
For example, the analyst might ask: -
Page4|
Are you the right person to answer these questions? Are your answers?
Official”?
anything else?
Preliminary Investigation: -
project.
Page6|
FEASIBILITY STUDY
Technical feasibility.
Operational feasibility.
Economic feasibility.
Social feasibility.
Management feasibility.
Legal feasibility.
Time feasibility.
Page8|
necessary that it should be conducted competently and that
no fundamental errors of judgment are made.
TECHNICAL FEASIBILITY: -
ECONOMICAL FEASIBILITY: -
Page9|
Economic analysis is the most frequently used
technique for evaluation of the effectiveness of a proposed
system. More commonly
P a g e 10
|
known as Cost/Benefit analysis, the procedure is to
determine the benefits and saving that are expected from a
proposed system and compare them with costs. If benefits
outweigh costs, a decision is taken to design and implement
the system. Other weight costs, a decision is taken to design
and implement the system. Otherwise, further justification
or alternative in the proposed system will have to be made if
is to have a chance of being approved. This is an ongoing
effort that improves in accuracy at each phase of the system
life cycle.
P a g e 11
|
For different types of Process or Operation, Reports
or Query and Output also, there is no need of heavy
expenditure.
OPERATIONAL FEASIBILITY: -
P a g e 12
|
My project is also fit in Operational Feasibility Study.
As I have explained before this about Technical Feasibility
and Economical Feasibility, this Software is very easy and
user-friendly.
I have used a very easy menu system and also used some
control buttons in the easy way by which one can choose the
options on his desire.
1. It is User-Friendly.
2. It is having less paperwork.
3. Efficient tractability.
4. Query can be generated.
5. Various Reports and Forms can be generated.
6. Fully protected by Password and User name for
unauthorized access.
P a g e 13
|
ANALYSIS
P a g e 14
|
Level DFD 2: B r e a k d o w n i n t o p r o c e s s e s
(Register/Login, Post Jobs, Apply)
P a g e 15
|
DFD 3: MAINTAIN FEE RECORD
P a g e 16
|
MODULE DESCRIPTION
1. Authentication Module
Purpose:
To handle secure login and registration for both students and recruiters.
Key Features:
Role-based authentication using JWT
Password hashing using bcrypt
Middleware for route protection (isAuthenticated)
Files Involved:
[Link] / [Link]
[Link] middleware
Purpose:
Manage student profiles, resumes, and accounts.
Key Features:
Create and update profiles
Upload resumes using Cloudinary or Multer
View applied jobs
Files Involved:
[Link]
[Link]
Resume handling logic
Purpose:
Enable recruiters to register their company and manage job postings.
P a g e 17
|
Key Features:
Create/edit company profiles
Post job listings
View candidate applications
Files Involved:
[Link]
[Link]
Purpose:
Manages all job listings posted by recruiters and visible to students.
Key Features:
Create/edit/delete job listings
Job listing filtering
Associate jobs with companies and recruiters
Files Involved:
[Link]
[Link]
5. Application Module
Purpose:
Enables students to apply for jobs and recruiters to view applications.
Key Features:
Apply to a job (with resume/profile)
Check application status
Recruiters can view applicants per job
Files Involved:
[Link]
[Link]
P a g e 19
|
DATA STRUCTURE SNAP SHOT
P a g e 20
|
Post Jobs:-
P a g e 21
|
Company Details (Company add):-
Applications:-
P a g e 22
|
P a g e 23
|
LIST OF REPORTS
2. Job Reports
All Posted Jobs Report
Displays jobs with title, type, company, post date, and location.
Job by Company Report
Shows all jobs posted by each recruiter or company.
Expired/Closed Job Report (if implemented)
List of jobs that are no longer active.
3. Application Reports
Application Summary Report
Lists all job applications: applicant name, job title, company, and date applied.
Application per Job Report
Shows how many candidates applied for each job posting.
Student Application History Report
For each student: job titles, companies applied to, and status.
4. Recruiter Reports
Recruiter Job Activity Report
Details how many jobs each recruiter has posted and how many applications received.
Top Recruiters Report
Based on number of jobs posted or total applicants.
Scope
Future Enhancements
IMPLEMENTATION METHODOLOGY
P a g e 25
|
limitation. To implement of this software, the followings are
the necessary:
P a g e 26
|
design section) is to be created in the said user. The
SQL statement CREATE can be used for creating such
tables.
P a g e 27
|
Create Distributable set of files: An installation
package of the software is to be built for
implementation of the project at desired location.
TESTING
b) TESTING STRATEGY:-
c) UNIT TESTING:-
P a g e 28
|
within the boundaries of the module. All
P a g e 29
|
modules must be successful in the unit test before start of
the integration testing. The software developed for e-
banking is tested module wise by giving normal values and
extreme values as input. All the bugs have been identified
and removed. The software designed is tested module wise.
Before using the software, an employee has to give
organization name and password.
INTEGRATION TESTING:-
VALIDATION TESTING:-
P a g e 30
|
developed and studied the software performance and
validated
P a g e 31
|
TEST CASE DESIGN
CONDITION TESTING:-
EQUIVALENCE PARTITIONING:-
P a g e 32
|
Equivalence portioning is a black box testing method
that divides the input domain of a program into classes of
data from which
P a g e 33
|
test cases can be derived. A typical test uncovers a class
errors might otherwise require many more test cases before
the error is observed. Equivalence classes for input
determine the valid and invalid inputs for the program
LIMITATIONS:
1. No Admin Panel
There's no system for managing users, posts, or misuse detection.
2. No Notification System
Users are not notified about job application status or new jobs.
3. No Smart Recommendations
Jobs are not suggested based on user profile or interests.
4. No Mobile App
Platform is web-only, not optimized for mobile devices as a native app.
5. No Direct Messaging
Recruiters and students can't communicate in real-time.
.
Further Enhancements
P a g e 34
|
SECURITY MECHANISM
1.
JWT Authentication (JSON Web Token)
On successful login, a JWT token is issued.
This token is sent with every protected API request in the
Authorization header.
Ensures stateless, secure, and role-based access control.
Implemented in: [Link] middleware
SNAPSHOTS
P a g e 35
|
LOGIN FORM ([Link])
<div className='my-2'>
<Label>Password</Label>
<Input
type="password"
value={[Link]}
name="password"
onChange={changeEventHandler}
/>
</div>
P a g e 38
|
<div className='flex items-center justify-
between'>
<RadioGroup className="flex items-center
gap-4 my-5">
<div className="flex items-center space-x-
2">
<Input
type="radio"
name="role"
value="student"
checked={[Link] === 'student'}
onChange={changeEventHandler}
className="cursor-pointer"
/>
<Label htmlFor="r1">Student</Label>
</div>
<div className="flex items-center space-x-
2">
<Input
type="radio"
name="role"
value="recruiter"
checked={[Link] === 'recruiter'}
onChange={changeEventHandler}
className="cursor-pointer"
/>
<Label htmlFor="r2">Recruiter</Label>
</div>
</RadioGroup>
</div>
{
loading ? <Button className="w-full my-4">
<Loader2 className='mr-2 h-4 w-4 animate-spin' /> Please
wait </Button> : <Button type="submit" className="w-full
P a g e 39
|
my-4">Login</Button>
}
<span className='text-sm'>Don't have an
account? <Link to="/signup" className='text-blue-
600'>Signup</Link></span>
</form>
</div>
</div>
)
}
Signup Form([Link])
try {
dispatch(setLoading(true));
const res = await
[Link](`${USER_API_END_POINT}/register`, formData, {
headers: { "Content-Type": "multipart/form-data" },
withCredentials: true,
});
if ([Link]) {
navigate("/login");
[Link]([Link]);
}
} catch (error) {
[Link](error);
P a g e 42
|
[Link]([Link]);
} finally {
dispatch(setLoading(false));
}
};
useEffect(() => {
if (user) {
navigate("/");
}
}, []);
return (
<div>
<Navbar />
<div className="flex items-center justify-center max-w-
7xl mx-auto">
<form
onSubmit={submitHandler}
className="w-1/2 border border-gray-200 rounded-md
p-4 my-10"
>
<h1 className="font-bold text-xl mb-5">Sign
Up</h1>
<div className="my-2">
<Label>Full Name</Label>
<Input
type="text"
value={[Link]}
name="fullname"
onChange={changeEventHandler}
/>
</div>
<div className="my-2">
<Label>Email</Label>
P a g e 43
|
<Input
type="email"
value={[Link]}
name="email"
onChange={changeEventHandler}
/>
</div>
<div className="my-2">
<Label>Phone Number</Label>
<Input
type="text"
value={[Link]}
name="phoneNumber"
onChange={changeEventHandler}
/>
</div>
<div className="my-2">
<Label>Password</Label>
<Input
type="password"
value={[Link]}
name="password"
onChange={changeEventHandler}
/>
</div>
<div className="flex items-center justify-between">
<RadioGroup className="flex items-center gap-4
my-5">
<div className="flex items-center space-x-2">
<Input
type="radio"
name="role"
value="student"
checked={[Link] === "student"}
P a g e 44
|
onChange={changeEventHandler}
className="cursor-pointer"
/>
<Label htmlFor="r1">Student</Label>
</div>
<div className="flex items-center space-x-2">
<Input
type="radio"
name="role"
value="recruiter"
checked={[Link] === "recruiter"}
onChange={changeEventHandler}
className="cursor-pointer"
/>
<Label htmlFor="r2">Recruiter</Label>
</div>
</RadioGroup>
<div className="flex items-center gap-2">
<Label>Profile</Label>
<Input
accept="image/*"
type="file"
onChange={changeFileHandler}
className="cursor-pointer"
/>
</div>
</div>
{loading ? (
<Button className="w-full my-4">
{" "}
<Loader2 className="mr-2 h-4 w-4 animate-
spin" /> Please wait{" "}
</Button>
):(
P a g e 45
|
<Button type="submit" className="w-full my-4">
Signup
</Button>
)}
<span className="text-sm">
Already have an account?{" "}
<Link to="/login" className="text-blue-600">
Login
</Link>
</span>
</form>
</div>
</div>
);
};
Home Page([Link])
P a g e 46
|
Code For [Link]
NavBar Section:-
</ul>
{
!user ? (
<div className='flex items-center gap-2'>
<Link to="/login"><Button
variant="outline">Login</Button></Link>
<Link to="/signup"><Button
className="bg-[#6A38C2]
hover:bg-[#5b30a6]">Signup</Button></Link>
</div>
):(
<Popover>
<PopoverTrigger asChild>
<Avatar className="cursor-pointer">
<AvatarImage
src={user?.profile?.profilePhoto} alt="@shadcn" />
</Avatar>
</PopoverTrigger>
<PopoverContent className="w-80">
<div className=''>
<div className='flex gap-2 space-y-
2'>
<Avatar className="cursor-
pointer">
<AvatarImage
src={user?.profile?.profilePhoto} alt="@shadcn" />
</Avatar>
<div>
<h4 className='font-
medium'>{user?.fullname}</h4>
<p className='text-sm text-
P a g e 50
|
muted-foreground'>{user?.profile?.bio}</p>
</div>
</div>
<div className='flex flex-col my-2
text-gray-600'>
{
user && [Link] ===
'student' && (
<div className='flex w-fit
items-center gap-2 cursor-pointer'>
<User2 />
<Button variant="link">
<Link to="/profile">View Profile</Link></Button>
</div>
)
}
</div>
</div>
</div>
P a g e 51
|
)
}
Hero Section:-
[Link]:-
const category = [
"Frontend Developer",
"Backend Developer",
"Data Science",
"Graphic Designer",
"FullStack Developer"
]
[Link]:-
P a g e 54
|
// const randomJobs = [1, 2, 3, 4, 5, 6, 7, 8];
return (
<div className='max-w-7xl mx-auto my-20'>
<h1 className='text-4xl font-bold'><span
className='text-[#6A38C2]'>Latest & Top </span> Job
Openings</h1>
<div className='grid grid-cols-3 gap-4 my-5'>
{
[Link] <= 0 ? <span>No Job
Available</span> : allJobs?.slice(0,6).map((job) =>
<LatestJobCards key={job._id} job={job}/>)
}
</div>
</div>
)
}
FooterSection([Link]):-
JobPage:-
P a g e 57
|
Code for jobPage:-
return (
<div className='p-5 rounded-md shadow-xl bg-white
border border-gray-100'>
<div className='flex items-center justify-between'>
<p className='text-sm text-gray-
500'>{daysAgoFunction(job?.createdAt) === 0 ? "Today" : `$
{daysAgoFunction(job?.createdAt)} days ago`}</p>
P a g e 58
|
<Button variant="outline" className="rounded-
full" size="icon"><Bookmark /></Button>
</div>
<div>
<h1 className='font-bold text-lg my-
2'>{job?.title}</h1>
<p className='text-sm text-gray-
600'>{job?.description}</p>
</div>
<div className='flex items-center gap-2 mt-4'>
<Badge className={'text-blue-700 font-bold'}
variant="ghost">{job?.position} Positions</Badge>
<Badge className={'text-[#F83002] font-bold'}
variant="ghost">{job?.jobType}</Badge>
<Badge className={'text-[#7209b7] font-bold'}
variant="ghost">{job?.salary}LPA</Badge>
</div>
<div className='flex items-center gap-4 mt-4'>
P a g e 59
|
<Button onClick={()=> navigate(`/description/$
{job?._id}`)} variant="outline">Details</Button>
<Button className="bg-[#7209b7]">Save For
Later</Button>
</div>
</div>
)
}
BrowsePage UI:-
P a g e 60
|
Code for [Link]:-
</div>
</div>
P a g e 61
|
)
}
const fitlerData = [
{
fitlerType: "Location",
array: ["Delhi NCR", "Bangalore", "Hyderabad", "Pune",
"Mumbai"]
},
{
fitlerType: "Industry",
array: ["Frontend Developer", "Backend Developer",
"FullStack Developer"]
},
{
fitlerType: "Salary",
array: ["0-40k", "42-1lakh", "1lakh to 5lakh"]
},
]
return (
<div className='p-5 rounded-md shadow-xl bg-white border
border-gray-100'>
<div className='flex items-center justify-between'>
<p className='text-sm text-gray-
500'>{daysAgoFunction(job?.createdAt) === 0 ? "Today" : `$
{daysAgoFunction(job?.createdAt)} days ago`}</p>
<Button variant="outline" className="rounded-full"
size="icon"><Bookmark /></Button>
</div>
P a g e 64
|
<div className='flex items-center gap-2 my-2'>
<Button className="p-6" variant="outline"
size="icon">
<Avatar>
<AvatarImage src={job?.company?.logo} />
</Avatar>
</Button>
<div>
<h1 className='font-medium text-
lg'>{job?.company?.name}</h1>
<p className='text-sm text-gray-500'>India</p>
</div>
</div>
<div>
<h1 className='font-bold text-lg
my-2'>{job?.title}</h1>
<p className='text-sm text-gray-
600'>{job?.description}</p>
</div>
<div className='flex items-center gap-2 mt-4'>
<Badge className={'text-blue-700 font-bold'}
variant="ghost">{job?.position} Positions</Badge>
<Badge className={'text-[#F83002] font-bold'}
variant="ghost">{job?.jobType}</Badge>
<Badge className={'text-[#7209b7] font-bold'}
variant="ghost">{job?.salary}LPA</Badge>
</div>
<div className='flex items-center gap-4 mt-4'>
<Button onClick={()=> navigate(`/description/$
{job?._id}`)} variant="outline">Details</Button>
<Button className="bg-[#7209b7]">Save For
Later</Button>
</div>
</div>
P a g e 65
|
)
}
return (
<div>
<Navbar />
<div className='max-w-4xl mx-auto bg-white border
border-gray-200 rounded-2xl my-5 p-8'>
<div className='flex justify-between'>
<div className='flex items-center gap-4'>
<Avatar className="h-24 w-24">
<AvatarImage
P a g e 66
|
src="[Link]
[Link]" alt="profile" />
</Avatar>
<div>
<h1 className='font-medium text-
xl'>{user?.fullname}</h1>
<p>{user?.profile?.bio}</p>
</div>
</div>
<Button onClick={() => setOpen(true)}
className="text-right" variant="outline"><Pen /></Button>
</div>
<div className='my-5'>
<div className='flex items-center gap-3 my-2'>
<Mail />
<span>{user?.email}</span>
</div>
<div className='flex items-center gap-3 my-2'>
<Contact />
<span>{user?.phoneNumber}</span>
</div>
</div>
<div className='my-5'>
<h1>Skills</h1>
<div className='flex items-center gap-1'>
{
user?.profile?.[Link] !== 0 ?
user?.profile?.[Link]((item, index) => <Badge
key={index}>{item}
</Badge>)
: <span>NA</span>
}
</div>
</div>
<div className='grid w-full max-w-sm items-center
P a g e 67
|
gap-1.5'>
<Label className="text-md
font-bold">Resume</Label>
{
isResume ? <a target='blank'
href={user?.profile?.resume} className='text-blue-500 w-full
hover:underline cursor-
pointer'>{user?.profile?.resumeOriginalName}</a> :
<span>NA</span>
}
</div>
</div>
<div className='max-w-4xl mx-auto bg-white rounded-
2xl'>
<h1 className='font-bold text-lg my-5'>Applied
Jobs</h1>
{/* Applied Job Table */}
<AppliedJobTable />
</div>
<UpdateProfileDialog open={open} setOpen={setOpen}/>
</div>
)
}
P a g e 68
|
Code for jobdescription page([Link])
if([Link]){
setIsApplied(true); // Update the local state
const updatedSingleJob = {...singleJob, applications:
[...[Link],{applicant:user?._id}]}
dispatch(setSingleJob(updatedSingleJob)); // helps us to
real time UI update
[Link]([Link]);
}
} catch (error) {
[Link](error);
[Link]([Link]);
}
}
useEffect(()=>{
const fetchSingleJob = async () => {
try {
const res = await
[Link](`${JOB_API_END_POINT}/get/${jobId}`,
{withCredentials:true});
if([Link]){
dispatch(setSingleJob([Link]));
setIsApplied([Link](application=>
[Link] === user?._id)) // Ensure the state is in sync
with
fetched data
}
} catch (error) {
[Link](error);
}
P a g e 70
|
}
fetchSingleJob();
},[jobId,dispatch, user?._id]);
return (
<div className='max-w-7xl mx-auto my-10'>
<div className='flex items-center justify-between'>
<div>
<h1 className='font-bold text-
xl'>{singleJob?.title}</h1>
<div className='flex items-center gap-2 mt-4'>
<Badge className={'text-blue-700 font-bold'}
variant="ghost">{singleJob?.postion} Positions</Badge>
<Badge className={'text-[#F83002] font-bold'}
variant="ghost">{singleJob?.jobType}</Badge>
<Badge className={'text-[#7209b7] font-bold'}
variant="ghost">{singleJob?.salary}LPA</Badge>
</div>
</div>
<Button
onClick={isApplied ? null : applyJobHandler}
disabled={isApplied}
className={`rounded-lg ${isApplied ? 'bg-gray-600
cursor-not-allowed' : 'bg-[#7209b7] hover:bg-[#5f32ad]'}`}>
{isApplied ? 'Already Applied' : 'Apply Now'}
</Button>
</div>
<h1 className='border-b-2 border-b-gray-300 font-
medium py-4'>Job Description</h1>
<div className='my-4'>
<h1 className='font-bold my-1'>Role: <span
className='pl-4 font-normal
text-gray-800'>{singleJob?.title}</span></h1>
<h1 className='font-bold my-1'>Location:
<span className='pl-4 font-normal text-gray-
800'>{singleJob?.location}</span></h1>
P a g e 71
|
<h1 className='font-bold my-1'>Description:
<span className='pl-4 font-normal text-gray-
800'>{singleJob?.description}</span></h1>
<h1 className='font-bold my-1'>Experience:
<span className='pl-4 font-normal text-gray-
800'>{singleJob?.experience} yrs</span></h1>
<h1 className='font-bold my-1'>Salary: <span
className='pl-4 font-normal text-gray-
800'>{singleJob?.salary}LPA</span></h1>
<h1 className='font-bold my-1'>Total Applicants:
<span className='pl-4 font-normal text-gray-
800'>{singleJob?.applications?.length}</span></h1>
<h1 className='font-bold my-1'>Posted Date: <span
className='pl-4 font-normal text-gray-
800'>{singleJob?.[Link]("T")[0]}</span></h1>
</div>
</div>
)
}
P a g e 72
|
import { setUser } from '@/redux/authSlice'
import { toast } from 'sonner'
return (
<div>
<Dialog open={open}>
<DialogContent className="sm:max-w-[425px]"
onInteractOutside={() => setOpen(false)}>
<DialogHeader>
<DialogTitle>Update Profile</DialogTitle>
</DialogHeader>
<form onSubmit={submitHandler}>
<div className='grid gap-4 py-4'>
<div className='grid grid-cols-4 items-center gap-
P a g e 74
|
4'>
<Label htmlFor="name" className="text-
right">Name</Label>
<Input
id="name"
name="name"
type="text"
value={[Link]}
onChange={changeEventHandler}
className="col-span-3"
/>
</div>
<div className='grid grid-cols-4 items-center gap-
4'>
<Label htmlFor="email" className="text-
right">Email</Label>
<Input
id="email"
name="email"
type="email"
value={[Link]}
onChange={changeEventHandler}
className="col-span-3"
/>
</div>
<div className='grid grid-cols-4 items-center gap-
4'>
<Label htmlFor="number" className="text-
right">
Number</Label>
<Input
id="number"
name="number"
value={[Link]}
onChange={changeEventHandler}
className="col-span-3"
P a g e 75
|
/>
</div>
<div className='grid grid-cols-4 items-center gap-
4'>
<Label htmlFor="bio" className="text-
right">Bio</Label>
<Input
id="bio"
name="bio"
value={[Link]}
onChange={changeEventHandler}
className="col-span-3"
/>
</div>
<div className='grid grid-cols-4 items-center gap-
4'>
<Label htmlFor="skills" className="text-
right">Skills</Label>
<Input
id="skills"
name="skills"
value={[Link]}
onChange={changeEventHandler}
className="col-span-3"
/>
</div>
<div className='grid grid-cols-4 items-center gap-
4'>
<Label htmlFor="file" className="text-
right">Resume</Label>
<Input
id="file"
name="file"
type="file"
accept="application/pdf"
onChange={fileChangeHandler}
P a g e 76
|
className="col-span-3"
/>
</div>
</div>
<DialogFooter>
{
loading ? <Button className="w-full my-4">
<Loader2 className='mr-2 h-4 w-4 animate-spin' /> Please wait
</Button> : <Button type="submit" className="w-full my-
4">Update</Button>
}
</DialogFooter>
</form>
</DialogContent>
</Dialog>
</div>
)
}
For [Link]:-
return (
<div className='max-w-7xl mx-auto my-20'>
<h1 className='text-4xl font-bold'><span className='text-
P a g e 77
|
[#6A38C2]'>
Latest & Top </span> Job Openings</h1>
<div className='grid grid-cols-3 gap-4 my-5'>
{
[Link] <= 0 ? <span>No Job Available</span> :
allJobs?.slice(0,6).map((job) => <LatestJobCards key={job._id}
job={job}/>)
}
</div>
</div>
)
}
[Link]:-
P a g e 78
|
const appRouter = createBrowserRouter([
{
path: '/',
element: <Home />
},
{
path: '/login',
element: <Login />
},
{
path: '/signup',
element: <Signup />
},
{
path: "/jobs",
element: <Jobs />
},
{
path: "/description/:id",
element: <JobDescription />
},
{
path: "/browse",
element: <Browse />
},
{
path: "/profile",
element: <Profile />
},
// admin ke liye yha se start hoga
{
path:"/admin/companies",
element: <ProtectedRoute><Companies/></ProtectedRoute>
},
{
path:"/admin/companies/create",
P a g e 79
|
element: <ProtectedRoute><CompanyCreate/></ProtectedRoute>
},
{
path:"/admin/companies/:id",
element:<ProtectedRoute><CompanySetup/></ProtectedRoute>
},
{
path:"/admin/jobs",
element:<ProtectedRoute><AdminJobs/></ProtectedRoute>
},
{
path:"/admin/jobs/create",
element:<ProtectedRoute><PostJob/></ProtectedRoute>
},
{
path:"/admin/jobs/:id/applicants",
element:<ProtectedRoute><Applicants/></ProtectedRoute>
},
])
function App() {
return (
<div>
<RouterProvider router={appRouter} />
</div>
)
}
[Link]:-
[Link]([Link]('root')).render(
<[Link]>
<Provider store={store}>
<PersistGate loading={null} persistor={persistor}>
<App />
<Toaster />
</PersistGate>
</Provider>
</[Link]>,
)
BACKEND CODE
JobPortalBackend:-
Controllers
[Link]
[Link]
[Link]
P a g e 81
|
[Link]
Middlewares
[Link]
[Link]
Models
[Link]
[Link]
[Link]
[Link]
routes
[Link]
[Link]
[Link]
[Link]
utils
[Link]
[Link]
[Link]
[Link]({});
// middleware
[Link]([Link]());
[Link]([Link]({extended:true}));
[Link](cookieParser());
const corsOptions = {
origin:'[Link]
credentials:true
}
[Link](cors(corsOptions));
[Link](PORT,()=>{
connectDB();
[Link](`Server running at port ${PORT}`);
})
[Link]
if (existingApplication) {
return [Link](400).json({
message: "You have already applied for this
jobs",
success: false
});
}
[Link](newApplication._id);
await [Link]();
return [Link](201).json({
message:"Job applied successfully.",
success:true
})
} catch (error) {
[Link](error);
}
};
export const getAppliedJobs = async (req,res) => {
try {
const userId = [Link];
const application = await
[Link]({applicant:userId}).sort({createdAt:-
1}).populate({
path:'job',
options:{sort:{createdAt:-1}},
populate:{
path:'company',
options:{sort:{createdAt:-1}},
}
P a g e 86
|
});
if(!application){
return [Link](404).json({
message:"No Applications",
success:false
})
};
return [Link](200).json({
application,
success:true
})
} catch (error) {
[Link](error);
}
}
// admin dekhega kitna user ne apply kiya hai
export const getApplicants = async (req,res) => {
try {
const jobId = [Link];
const job = await [Link](jobId).populate({
path:'applications',
options:{sort:{createdAt:-1}},
populate:{
path:'applicant'
}
});
if(!job){
P a g e 87
|
return [Link](404).json({
message:'Job not found.',
success:false
})
};
return [Link](200).json({
job,
succees:true
});
} catch (error) {
[Link](error);
}
}
export const updateStatus = async (req,res) => {
try {
const {status} = [Link];
const applicationId = [Link];
if(!status){
return [Link](400).json({
message:'status is required',
success:false
})
};
return [Link](200).json({
message:"Status updated successfully.",
success:true
});
} catch (error) {
[Link](error);
}
}
[Link]:-
return [Link](201).json({
message: "Company registered successfully.",
company,
success: true
P a g e 90
|
})
} catch (error) {
[Link](error);
}
}
export const getCompany = async (req, res) => {
try {
const userId = [Link]; // logged in user id
const companies = await [Link]({ userId });
if (!companies) {
return [Link](404).json({
message: "Companies not found.",
success: false
})
}
return [Link](200).json({
companies,
success:true
})
} catch (error) {
[Link](error);
}
}
// get company by id
export const getCompanyById = async (req, res) => {
try {
const companyId = [Link];
P a g e 91
|
const company = await [Link](companyId);
if (!company) {
return [Link](404).json({
message: "Company not found.",
success: false
})
}
return [Link](200).json({
company,
success: true
})
} catch (error) {
[Link](error);
}
}
export const updateCompany = async (req, res) => {
try {
const { name, description, website, location } =
[Link];
P a g e 92
|
const updateData = { name, description, website,
location, logo };
if (!company) {
return [Link](404).json({
message: "Company not found.",
success: false
})
}
return [Link](200).json({
message:"Company information updated.",
success:true
})
} catch (error) {
[Link](error);
}
}
[Link]:-
P a g e 93
|
import { Job } from "../models/[Link]";
P a g e 96
|
return [Link](200).json({ job, success:
true });
} catch (error) {
[Link](error);
}
}
// admin kitne job create kra hai abhi tk
export const getAdminJobs = async (req, res) => {
try {
const adminId = [Link];
const jobs = await [Link]({ created_by: adminId
}).populate({
path:'company',
createdAt:-1
});
if (!jobs) {
return [Link](404).json({
message: "Jobs not found.",
success: false
})
};
return [Link](200).json({
jobs,
success: true
})
} catch (error) {
[Link](error);
P a g e 97
|
}
}
[Link]:-
return [Link](201).json({
message: "Account created successfully.",
success: true
});
} catch (error) {
[Link](error);
}
};
const tokenData = {
userId: user._id
}
const token = await [Link](tokenData,
[Link].SECRET_KEY, { expiresIn: '1d' });
user = {
_id: user._id,
fullname: [Link],
email: [Link],
phoneNumber: [Link],
role: [Link],
profile: [Link]
}
let skillsArray;
if(skills){
skillsArray = [Link](",");
Page
103 |
}
const userId = [Link]; // middleware authentication
let user = await [Link](userId);
if (!user) {
return [Link](400).json({
message: "User not found.",
success: false
})
}
// updating data
if(fullname) [Link] = fullname
if(email) [Link] = email
if(phoneNumber) [Link] = phoneNumber
if(bio) [Link] = bio
if(skills) [Link] = skillsArray
await [Link]();
Page
104 |
user = {
_id: user._id,
fullname: [Link],
email: [Link],
phoneNumber: [Link],
role: [Link],
profile: [Link]
}
return [Link](200).json({
message:"Profile updated successfully.",
user,
success:true
})
} catch (error) {
[Link](error);
}
}
MIDDLEWARES:-
[Link]:-
Page
105 |
const isAuthenticated = async (req, res, next) => {
try {
const token = [Link];
if (!token) {
return [Link](401).json({
message: "User not authenticated",
success: false,
})
}
const decode = await [Link](token,
[Link].SECRET_KEY);
if(!decode){
return [Link](401).json({
message:"Invalid token",
success:false
})
};
[Link] = [Link];
next();
} catch (error) {
[Link](error);
}
}
export default isAuthenticated;
[Link]:-
Page
106 |
import multer from "multer";
Models:-
[Link]:-
[Link]:-
[Link]:-
[Link]:-
Routes:-
[Link]:-
[Link]("/apply/:id").get(isAuthenticated, applyJob);
[Link]("/get").get(isAuthenticated, getAppliedJobs);
[Link]("/:id/applicants").get(isAuthenticated,
getApplicants);
Page
113 |
[Link]("/status/:id/update").post(isAuthenticated,
updateStatus);
Page
114 |
[Link]:-
[Link]("/
register").post(isAuthenticated,registerCompany);
[Link]("/get").get(isAuthenticated,getCompany);
[Link]("/
get/:id").get(isAuthenticated,getCompanyById);
[Link]("/
update/:id").put(isAuthenticated,singleUpload,
updateCompany);
Page
115 |
[Link]:-
[Link]("/post").post(isAuthenticated, postJob);
[Link]("/get").get(isAuthenticated, getAllJobs);
[Link]("/getadminjobs").get(isAuthenticated,
getAdminJobs);
[Link]("/get/:id").get(isAuthenticated, getJobById);
Page
116 |
[Link]:-
[Link]("/register").post(singleUpload,register);
[Link]("/login").post(login);
[Link]("/logout").get(logout);
[Link]("/profile/
update").post(isAuthenticated,singleUpload,updateProfile);
Page
117 |
utils:-
[Link]:-
[Link]({
cloud_name:[Link].CLOUD_NAME,
api_key:[Link].API_KEY,
api_secret:[Link].API_SECRET
});
export default cloudinary;
Page
118 |
[Link]:-
[Link]:-
Page
120 |
BIBLIOGRAPHY
P a g e 121
|