This project is a campus placement portal built to make the entire placement process smooth and organized. It handles everything—from company registrations and drive management to student applications and final selections. The application is developed as a full-stack system using Flask for the backend and Vue.js for the frontend.
- The platform supports three main users:
-- Admin: Manages the whole system—approves/rejects companies, controls drives, views reports, and can blacklist users if required.
- Companies: Can register, create placement drives, shortlist students, and schedule interviews.
- Students: Can sign up, browse available drives, apply for jobs, track their status, and export their application history as a CSV file.
- Backend: Flask (Python)
- Frontend: Vue.js 3
- Styling: Bootstrap 5
- Database: SQLite
- Caching: Redis
- Background Jobs: Celery + Redis
- Email: Flask-Mail (SMTP)
- Authentication: JWT
- Project Structure
The project is divided into backend and frontend parts. The backend handles APIs, database models, background jobs, and configurations, while the frontend manages the UI using Vue components. There’s also a script to run everything together and test background jobs.
placement_portal_WepApp/
├── backend/
│ ├── main.py # flask app factory and entry point
│ ├── config.py # all configuration and env loading
│ ├── models.py # database models (User, Company, Student, etc.)
│ ├── cache.py # redis caching helper functions
│ ├── celery_config.py # celery setup with beat schedule
│ ├── tasks.py # background tasks (reminders, reports, csv export)
│ ├── requirements.txt # python dependencies
│ ├── routes/
│ │ ├── auth.py # login and registration endpoints
│ │ ├── admin.py # admin dashboard and management endpoints
│ │ ├── company.py # company profile and drive management
│ │ └── student.py # student dashboard, applications, reminders
│ ├── instance/ # sqlite database lives here (auto-created)
│ └── uploads/ # uploaded resumes, csv exports, reports
├── frontend/
│ ├── templates/
│ │ └── index.html # single page that loads vue app
│ └── static/
│ ├── css/style.css # custom styles
│ └── js/
│ ├── app.js # vue app setup and routing
│ └── components/ # all vue components (one per page/feature)
├── scripts/
│ └── test_smtp_jobs.py # script to test if email and jobs work
├── run.py # starts everything (redis, celery, flask)
├── .env # environment variables (not in git)
└── .gitignore
- Install dependencies
- python3 -m venv venv
- source venv/bin/activate
- pip install -r backend/requirements.txt
- Create .env file
- In the project root, create a .env file and add:
SECRET_KEY="your-secret-key"
JWT_SECRET_KEY="your-jwt-secret"
ADMIN_USERNAME="admin"
ADMIN_PASSWORD="admin123"
ADMIN_EMAIL="aditya2003iitm@gmail.com"
EMAIL_USER="aditya2003iitm@gmail.com"
EMAIL_PASS="dystbiyaghwexgsb"
MAIL_SERVER="smtp.gmail.com"
MAIL_PORT="587"
MAIL_USE_TLS="true"
```
# To run the full application
-- python3 run.py
- This will automatically start:
Flask server
Redis (if not already running)
Celery worker
Celery beat scheduler
# App will run at:
-- http://localhost:5000
# Run only backend (without background jobs)
- python3 main.py
## Test background jobs
-- python3 scripts/test_smtp_jobs.py
- This checks:
Email sending
Daily reminders
Monthly reports
CSV export
## Caching
- Redis is used to cache frequently accessed data like dashboard stats, approved drives, company lists etc. Cache keys have a TTL (time to live) so they auto-expire. When data changes (like approving a company), the relevant cache is cleared immediately.
## Database
- SQLite is used. The database file is at `backend/instance/placement_portal.db`. It gets created automatically when you first run the app - no manual setup needed. The admin user is also seeded automatically.
# Notes
- Redis caching improves performance
- SQLite database is auto-created (no manual setup needed)
- JWT ensures secure authentication
- Students can’t apply twice for the same drive
- Eligibility checks (CGPA, branch, year) are enforced
- Resume uploads are limited (PDF, max 5MB)