JobFlow is a modern, high-performance job board application built with the MERN Stack (MongoDB, Express, React, Node.js). It features a stunning Dark Glassmorphism UI, secure authentication, and a seamless user experience for both job seekers and employers.
- π¨ Modern Dark Glass UI: A premium, futuristic interface with glassmorphism effects, neon glows, and smooth animations using Tailwind CSS.
- π Secure Authentication: JWT-based authentication with secure login and registration for Job Seekers and Employers.
- πΌ Job Management:
- Browse Jobs: Interactive job board with rich job cards.
- Post Jobs: Easy-to-use job posting interface.
- π’ Company Insights: Dedicated section to explore top companies hiring now.
- π° Salary Intelligence: Data-driven salary insights by role and location.
- π€ User Profiles: comprehensive profile management with photo upload capabilities.
- π± Fully Responsive: Optimized for mobile, tablet, and desktop devices.
- Framework: React.js (Vite)
- Styling: Tailwind CSS (v4), PostCSS
- Icons: Lucide React
- Routing: React Router DOM v6
- HTTP Client: Axios
- Runtime: Node.js
- Framework: Express.js
- Database: MongoDB (Mongoose ODM)
- Authentication: JSON Web Tokens (JWT), Bcrypt.js
- File Handling: Multer
A simplified view of how data flows through the JobFlow application:
graph LR
User[π€ User] -->|HTTPS Request| React[βοΈ React Client]
React -->|REST API Calls| Node[π’ Node/Express API]
Node -->|Queries/Updates| Mongo[π MongoDB Database]
Mongo -->|Data| Node
Node -->|JSON Response| React
React -->|Render UI| User
Our backend implements a robust filtering system to help users find the perfect job. Here's a glimpse of the logic used in our getJobs controller:
// server/controllers/jobController.js
exports.getJobs = async (req, res) => {
try {
const { search, type, location, salary } = req.query; // Destructure query params
let query = {};
// 1. Search by Job Title (Case-Insensitive Regex)
if (search) {
query.title = { $regex: search, $options: 'i' };
}
// 2. Filter by Job Type (Full-time, Part-time, etc.)
if (type) {
query.type = type;
}
// 3. Filter by Location (City/Remote)
if (location) {
query.location = { $regex: location, $options: 'i' };
}
// 4. Execute Query & Populate Company Data
const jobs = await Job.find(query)
.populate('postedBy', 'name profilePhoto')
.sort({ createdAt: -1 }); // Newest first
res.json(jobs);
} catch (err) {
// Error handling...
}
};During development, we encountered several interesting technical challenges:
Challenge: Users could accidentally spam the "Apply" button, sending multiple requests for the same job. Solution: We implemented a check in the backend to verify if a user has already applied for a specific job before creating a new application record.
const existingApplication = await Application.findOne({
job: req.params.id,
applicant: req.user.id
});
if (existingApplication) {
return res.status(400).json({ message: 'Already applied for this job' });
}Challenge: allowing users to upload resumes while preventing malicious file uploads.
Solution: integrated Multer with strict file type validation (PDF, DOC,DOCX only) to ensure only safe documents are stored on the server.
Follow these steps to set up the project locally.
- Node.js (v14 or higher)
- MongoDB (Local or Atlas URI)
- Git
git clone https://github.com/yourusername/job-portal.git
cd job-portalNavigate to the server directory and install dependencies:
cd server
npm installCreate a .env file in the server directory:
PORT=5001
MONGO_URI=your_mongodb_connection_string
JWT_SECRET=your_jwt_secret_key
CLIENT_URL=http://localhost:5173Start the backend server:
npm startOpen a new terminal, navigate to the client directory, and install dependencies:
cd client
npm installCreate a .env file in the client directory (optional if using defaults):
VITE_API_URL=http://localhost:5001/apiStart the React development server:
npm run devJob Portal/
βββ client/ # React Frontend
β βββ src/
β β βββ components/ # Reusable UI components (Navbar, etc.)
β β βββ pages/ # Page components (Home, Jobs, Profile, etc.)
β β βββ services/ # API integration service
β β βββ App.jsx # Main App component with Routes
β β βββ index.css # Global styles (Tailwind imports)
β βββ ...
βββ server/ # Node.js Backend
β βββ controllers/ # Request handlers
β βββ models/ # Mongoose schemas
β βββ routes/ # API route definitions
β βββ middleware/ # Auth & Error handling middleware
β βββ server.js # Server entry point
βββ README.md # Project Documentation
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the project
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
