This case study explores the development of a job portal using Django for the backend and Angular 16 for the frontend. The project aims to connect job seekers with employers, providing a platform for posting and applying for jobs.
User Registration and Authentication:
Profile Management:
Job Listings:
Job Applications:
Notifications:
Models:
User:
Handles authentication and profile information.
Job:
Stores job listing details.
Application:
Tracks job applications made by job seekers.
# models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
is_employer = models.BooleanField(default=False)
is_job_seeker = models.BooleanField(default=True)
class Job(models.Model):
title = models.CharField(max_length=255)
description = models.TextField()
company_name = models.CharField(max_length=255)
location = models.CharField(max_length=255)
category = models.CharField(max_length=255)
posted_by = models.ForeignKey(User, on_delete=models.CASCADE)
posted_at = models.DateTimeField(auto_now_add=True)
class Application(models.Model):
job = models.ForeignKey(Job, on_delete=models.CASCADE)
applicant = models.ForeignKey(User, on_delete=models.CASCADE)
applied_at = models.DateTimeField(auto_now_add=True)
status = models.CharField(max_length=50, choices=[('Applied', 'Applied'),
('Reviewed', 'Reviewed'), ('Accepted', 'Accepted'), ('Rejected', 'Rejected')], default='Applied')
Convert model instances to JSON for API responses.
# serializers.py
from rest_framework import serializers
from .models import User, Job, Application
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
class JobSerializer(serializers.ModelSerializer):
class Meta:
model = Job
fields = '__all__'
class ApplicationSerializer(serializers.ModelSerializer):
class Meta:
model = Application
fields = '__all__'
Handle CRUD operations for users, jobs, and applications.
# views.py
from rest_framework import viewsets
from .models import User, Job, Application
from .serializers import UserSerializer, JobSerializer, ApplicationSerializer
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
class JobViewSet(viewsets.ModelViewSet):
queryset = Job.objects.all()
serializer_class = JobSerializer
class ApplicationViewSet(viewsets.ModelViewSet):
queryset = Application.objects.all()
serializer_class = ApplicationSerializer
# urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import UserViewSet, JobViewSet, ApplicationViewSet
router = DefaultRouter()
router.register(r'users', UserViewSet)
router.register(r'jobs', JobViewSet)
router.register(r'applications', ApplicationViewSet)
urlpatterns = [
path('api/', include(router.urls)),
]
// job.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { Job } from '../models/job.model';
@Injectable({
providedIn: 'root'
})
export class JobService {
private apiUrl = 'http://localhost:8000/api/jobs/';
constructor(private http: HttpClient) { }
getJobs(): Observable {
return this.http.get(this.apiUrl);
}
getJob(id: number): Observable {
return this.http.get(`${this.apiUrl}${id}/`);
}
createJob(job: Job): Observable {
return this.http.post(this.apiUrl, job);
}
updateJob(id: number, job: Job): Observable {
return this.http.put(`${this.apiUrl}${id}/`, job);
}
deleteJob(id: number): Observable {
return this.http.delete(`${this.apiUrl}${id}/`);
}
}
// job-list.component.
import { Component, OnInit } from '@angular/core';
import { JobService } from '../services/job.service';
import { Job } from '../models/job.model';
@Component({
selector: 'app-job-list',
templateUrl: './job-list.component.html',
styleUrls: ['./job-list.component.css']
})
export class JobListComponent implements OnInit {
jobs: Job[] = [];
constructor(private jobService: JobService) { }
ngOnInit(): void {
this.jobService.getJobs().subscribe((data: Job[]) => {
this.jobs = data;
});
}
}
// app-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { JobListComponent } from './components/job-list/job-list.component';
import { JobDetailComponent } from './components/job-detail/job-detail.component';
const routes: Routes = [
{ path: '', component: JobListComponent },
{ path: 'job/:id', component: JobDetailComponent }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
Backend Deployment:
Frontend Deployment:
API Integration:
Security:
This case study demonstrates how to develop a job portal using Django and Angular 16, following a structured approach with clear separation of concerns. The combination of Django's robust backend capabilities and Angular's dynamic frontend provides a powerful platform for building scalable and maintainable web applications. By implementing features such as user authentication, job listings, and application management, the JobConnect application serves as a comprehensive example of a modern job portal.