π Smart Placement Management System
A full-featured placement management backend built with Spring Boot , Hibernate , and MySQL .
Feature
Details
Student Profile Management
CRUD, skills, branch, CGPA, backlogs, 10th/12th
Company Eligibility Checking
Auto-checks CGPA, backlogs, branch, skills, percentages
Resume Verification
PDF upload + admin verify/reject flow
Placement Statistics
Placed %, avg/max/min CTC, branch breakdown, industry breakdown
Interview Scheduling
Multi-round, online/offline, auto-reminders
Email Notifications
Application, status updates, interview, placement congrats
JWT Auth
Roles: STUDENT, TPO, ADMIN
Bonus Feature
Students see exactly which companies they're eligible for and WHY
ποΈ Project Structure
src/main/java/com/placement/
βββ PlacementApplication.java
βββ config/
β βββ SecurityConfig.java # Spring Security + JWT
β βββ JwtUtils.java
β βββ JwtAuthFilter.java
βββ controller/
β βββ AuthController.java # /api/v1/auth
β βββ StudentController.java # /api/v1/students
β βββ CompanyController.java # /api/v1/companies
β βββ ApplicationController.java # /api/v1/applications
β βββ InterviewController.java # /api/v1/interviews
β βββ StatsController.java # /api/v1/stats
βββ service/
β βββ EligibilityService.java # β Core bonus feature logic
β βββ StudentService.java
β βββ CompanyService.java
β βββ ApplicationService.java
β βββ InterviewService.java
β βββ EmailService.java
β βββ StatsService.java
βββ model/
β βββ User.java
β βββ Student.java
β βββ Company.java
β βββ Application.java
β βββ Interview.java
βββ repository/
β βββ UserRepository.java
β βββ StudentRepository.java
β βββ CompanyRepository.java
β βββ ApplicationRepository.java
β βββ InterviewRepository.java
βββ dto/
β βββ AuthDTO.java
β βββ StudentDTO.java # Includes EligibilityResult
β βββ CompanyDTO.java
β βββ PlacementStatsDTO.java
βββ exception/
β βββ ResourceNotFoundException.java
β βββ DuplicateResourceException.java
β βββ GlobalExceptionHandler.java
βββ util/
βββ DataSeeder.java # Seeds sample data on first run
Java 17+
Maven 3.8+
MySQL 8+
CREATE DATABASE placement_db ;
2. Configure application.properties
spring.datasource.url =jdbc:mysql://localhost:3306/placement_db
spring.datasource.username =YOUR_MYSQL_USER
spring.datasource.password =YOUR_MYSQL_PASSWORD
spring.mail.username =YOUR_GMAIL
spring.mail.password =YOUR_APP_PASSWORD # Gmail App Password (not your login password)
The app starts at http://localhost:8080
Swagger UI: http://localhost:8080/swagger-ui.html
4. First Login (seeded by DataSeeder)
username: admin
password: Admin@123
Method
Endpoint
Description
POST
/api/v1/auth/register
Register user
POST
/api/v1/auth/login
Login β get JWT
Method
Endpoint
Access
Description
POST
/api/v1/students
ADMIN/TPO
Create student profile
GET
/api/v1/students
ADMIN/TPO
List all students
GET
/api/v1/students/{id}
All
Get student by ID
GET
/api/v1/students/roll/{rollNo}
All
Get by roll number
GET
/api/v1/students/branch/{branch}
All
Get by branch
PUT
/api/v1/students/{id}
All
Update profile
DELETE
/api/v1/students/{id}
ADMIN/TPO
Delete student
POST
/api/v1/students/{id}/resume
All
Upload PDF resume
PATCH
/api/v1/students/{id}/resume/verify
ADMIN/TPO
Verify resume
GET
/api/v1/students/unverified-resumes
ADMIN/TPO
Unverified resumes
PATCH
/api/v1/students/{id}/place
ADMIN/TPO
Mark as placed
GET
/api/v1/students/{id}/eligible-companies
All
β All companies with eligibility
GET
/api/v1/students/{id}/eligible-companies/only
All
β Only eligible companies
Method
Endpoint
Access
Description
POST
/api/v1/companies
ADMIN/TPO
Add company drive
GET
/api/v1/companies
All
List all companies
GET
/api/v1/companies/{id}
All
Get company details
GET
/api/v1/companies/status/{status}
All
Filter by status
PUT
/api/v1/companies/{id}
ADMIN/TPO
Update company
DELETE
/api/v1/companies/{id}
ADMIN
Delete company
GET
/api/v1/companies/{id}/eligible-students
ADMIN/TPO
Students eligible for this drive
Method
Endpoint
Description
POST
/api/v1/applications
Apply to a company
GET
/api/v1/applications/student/{id}
Student's applications
GET
/api/v1/applications/company/{id}
Applications for a company
PATCH
/api/v1/applications/{id}/status
Update status
PATCH
/api/v1/applications/{id}/withdraw
Withdraw application
Application status flow:
APPLIED β SHORTLISTED β APTITUDE_TEST β GROUP_DISCUSSION
β TECHNICAL_ROUND β HR_ROUND β OFFER_RECEIVED / REJECTED
Method
Endpoint
Description
POST
/api/v1/interviews
Schedule interview
PUT
/api/v1/interviews/{id}
Update / add feedback
GET
/api/v1/interviews/student/{id}
Student's interviews
GET
/api/v1/interviews/company/{id}
Company's interviews
GET
/api/v1/interviews/today
Today's interviews
Method
Endpoint
Description
GET
/api/v1/stats
Full placement dashboard stats
β Bonus Feature β Eligibility Engine
The eligibility engine at EligibilityService checks 7 criteria per student-company pair:
1. CGPA β Must meet minCgpa
2. Active Backlogs β Must be β€ maxBacklogs
3. Historical Backlogs β If company disallows, totalBacklogs must be 0
4. Branch β Must be in eligibleBranches list
5. Skills β Missing skills flagged (advisory, doesn't block eligibility)
6. 10th % β Must meet minTenthPercentage
7. 12th % β Must meet minTwelfthPercentage
8. Placement Status β Already placed students are excluded
[
{
"companyId" : 1 ,
"companyName" : " TechCorp Solutions" ,
"jobRole" : " Software Development Engineer" ,
"ctcOffered" : 12.0 ,
"eligible" : true ,
"reasons" : [
" β CGPA 8.50 meets requirement of 7.50" ,
" β Active backlogs (0) within limit (0)" ,
" β Branch 'CSE' is eligible" ,
" β All required skills present" ,
" β 10th 90% meets requirement" ,
" β 12th 85% meets requirement"
],
"missingSkills" : []
},
{
"companyId" : 2 ,
"companyName" : " DataAI Inc" ,
"jobRole" : " Data Science Analyst" ,
"ctcOffered" : 15.0 ,
"eligible" : false ,
"reasons" : [
" CGPA 8.50 is below required 9.00"
],
"missingSkills" : [" Statistics" ]
}
]
Emails are sent asynchronously for:
β
Application submitted
π Application status changed
π
Interview scheduled / rescheduled
β° Interview reminder (24h before β auto-scheduled)
β Resume verified
π Placement congratulations
Configure Gmail: generate an App Password at https://myaccount.google.com/apppasswords
ποΈ Database Schema (Auto-created by Hibernate)
users β id, username, email, password, enabled
user_roles β user_id, role
students β id, roll_number, first_name, last_name, email, branch,
cgpa, backlog_count, total_backlogs, resume_url,
resume_verified, placement_status, placed_company, ctc_offered ...
student_skills β student_id, skill
companies β id, name, industry, job_role, ctc_offered, min_cgpa,
max_backlogs, drive_status, drive_date ...
company_required_skills β company_id, skill
company_eligible_branches β company_id, branch
applications β id, student_id, company_id, status, remarks, applied_at
interviews β id, student_id, company_id, interview_type, round_number,
scheduled_at, mode, status, feedback, score, email_sent
Tests use H2 in-memory database β no MySQL required.
JWT-based stateless auth
Role-based access: ROLE_STUDENT, ROLE_TPO, ROLE_ADMIN
Passwords BCrypt-hashed
Swagger UI open (disable in production)
Layer
Technology
Framework
Spring Boot 3.2
ORM
Hibernate / Spring Data JPA
Database
MySQL 8
Security
Spring Security + JWT
Email
Spring Mail (SMTP)
Docs
SpringDoc OpenAPI (Swagger UI)
Build
Maven
Java
17