Build your ride hailing platform with Lovable. Discover step-by-step guidance, essential tips, and best practices for launching a successful on-demand business.
Book a call with an Expert
Starting a new venture? Need to upgrade your web app? RapidDev builds application with your growth in mind.
Creating a New Lovable Project
Adding Dependencies in Lovable Configuration
lovable.json
in the root of your project.lovable.json
so Lovable knows which dependencies to load (this example uses Express for the server and Mongoose for database integration):
{
"dependencies": {
"express": "^4.18.2",
"mongoose": "^6.0.12"
}
}
Creating the Main Application File
app.js
in the root directory.
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
app.use(express.json());
// Home endpoint
app.get('/', (req, res) => {
res.send('Welcome to the Ride Hailing Platform');
});
app.listen(port, () => {
console.log(Server running on port ${port}
);
});
Setting Up the Database Connection
db.js
in the root directory. This file will manage your MongoDB connection using Mongoose.db.js
:
const mongoose = require('mongoose');
mongoose.connect('mongodb://yourMongoDBURL', {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => {
console.log('MongoDB connected');
})
.catch(err => {
console.error('MongoDB connection error:', err);
});
module.exports = mongoose;
mongodb://yourMongoDBURL
with your actual MongoDB connection string.
Creating the Ride Model
models
in your project.models
folder, create a file named Ride.js
.
const mongoose = require('../db');
const RideSchema = new mongoose.Schema({
customerName: { type: String, required: true },
pickupLocation: { type: String, required: true },
dropoffLocation: { type: String, required: true },
status: { type: String, default: 'pending' },
driver: { type: String } // You can later extend this to reference a driver model
});
module.exports = mongoose.model('Ride', RideSchema);
Creating API Endpoints for Ride Requests
app.js
file and add endpoints for creating and updating ride requests.app.js
):
const Ride = require('./models/Ride');
// Endpoint to create a ride request
app.post('/ride', async (req, res) => {
try {
const newRide = new Ride(req.body);
const ride = await newRide.save();
res.status(201).json(ride);
} catch (error) {
res.status(400).json({ message: error.message });
}
});
// Endpoint to update ride status (for example, assigning a driver or updating status)
app.put('/ride/:id', async (req, res) => {
try {
const updatedRide = await Ride.findByIdAndUpdate(req.params.id, req.body, { new: true });
res.json(updatedRide);
} catch (error) {
res.status(400).json({ message: error.message });
}
});
Creating the Driver Model and Endpoints
models
folder, create a new file named Driver.js
.
const mongoose = require('../db');
const DriverSchema = new mongoose.Schema({
name: { type: String, required: true },
currentLocation: { type: String },
available: { type: Boolean, default: true }
});
module.exports = mongoose.model('Driver', DriverSchema);
app.js
file, add endpoints for registering and updating driver information. Insert the following code:
const Driver = require('./models/Driver');
// Endpoint to register a new driver
app.post('/driver', async (req, res) => {
try {
const newDriver = new Driver(req.body);
const driver = await newDriver.save();
res.status(201).json(driver);
} catch (error) {
res.status(400).json({ message: error.message });
}
});
// Endpoint to update a driver's details (location, availability, etc.)
app.put('/driver/:id', async (req, res) => {
try {
const updatedDriver = await Driver.findByIdAndUpdate(req.params.id, req.body, { new: true });
res.json(updatedDriver);
} catch (error) {
res.status(400).json({ message: error.message });
}
});
Implementing the User Interface for Ride Requests
index.html
file at the root level to build a simple interface for customers.index.html
:
Ride Hailing Platform
Welcome to Our Ride Hailing Platform
/ride
endpoint.
Testing and Deploying Your Ride Hailing Platform
index.html
page and test the ride request functionality.
const express = require('express');
const app = express();
app.use(express.json());
let rides = {};
app.post('/api/rides', (req, res) => {
const { userId, pickupLocation, dropoffLocation } = req.body;
const rideId = generateId();
rides[rideId] = {
rideId,
userId,
pickupLocation,
dropoffLocation,
status: 'requested',
createdAt: new Date(),
history: [{
status: 'requested',
timestamp: new Date()
}]
};
res.status(201).json({ rideId, status: 'requested' });
});
app.put('/api/rides/:rideId/status', (req, res) => {
const ride = rides[req.params.rideId];
if (!ride) {
return res.status(404).json({ error: 'Ride not found' });
}
const { status } = req.body;
ride.status = status;
ride.history.push({
status,
timestamp: new Date()
});
res.json(ride);
});
app.get('/api/rides/:rideId', (req, res) => {
const ride = rides[req.params.rideId];
if (!ride) {
return res.status(404).json({ error: 'Ride not found' });
}
res.json(ride);
});
function generateId() {
return 'ride-' + Math.random().toString(36).substr(2, 9);
}
app.listen(3000, () => {
console.log('Ride hailing platform API running on port 3000');
});
const express = require('express');
const axios = require('axios');
const app = express();
app.use(express.json());
app.post('/api/rides/geocode', async (req, res) => {
const { pickupAddress, dropoffAddress } = req.body;
try {
const pickupResponse = await axios.get('https://maps.googleapis.com/maps/api/geocode/json', {
params: {
address: pickupAddress,
key: process.env.GOOGLE_API_KEY
}
});
const dropoffResponse = await axios.get('https://maps.googleapis.com/maps/api/geocode/json', {
params: {
address: dropoffAddress,
key: process.env.GOOGLE_API_KEY
}
});
if (pickupResponse.data.status !== 'OK' || dropoffResponse.data.status !== 'OK') {
return res.status(400).json({ error: 'Failed to geocode one or both addresses.' });
}
const pickupLocation = pickupResponse.data.results[0].geometry.location;
const dropoffLocation = dropoffResponse.data.results[0].geometry.location;
// Prepare ride details including geocoded coordinates
const ride = {
rideId: 'ride-' + Math.random().toString(36).substr(2, 9),
pickupAddress,
dropoffAddress,
pickupLocation,
dropoffLocation,
status: 'pending',
requestedAt: new Date()
};
// Here, you could integrate further with Lovable's backend services
res.status(201).json(ride);
} catch (error) {
console.error('Error during geocoding:', error);
res.status(500).json({ error: 'Internal Server Error' });
}
});
app.listen(3001, () => {
console.log('Ride geocoding API running on port 3001');
});
const express = require('express');
const http = require('http');
const { Server } = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = new Server(server);
app.use(express.json());
let drivers = {
'driver1': { id: 'driver1', name: 'Alice', location: { lat: 40.7128, lng: -74.0060 }, available: true },
'driver2': { id: 'driver2', name: 'Bob', location: { lat: 40.7138, lng: -74.0050 }, available: true },
'driver3': { id: 'driver3', name: 'Charlie', location: { lat: 40.7115, lng: -74.0075 }, available: true }
};
let rides = {};
function calculateDistance(loc1, loc2) {
return Math.abs(loc1.lat - loc2.lat) + Math.abs(loc1.lng - loc2.lng);
}
function findNearestDriver(rideLocation) {
let nearestDriver = null;
let minDistance = Infinity;
Object.values(drivers).forEach(driver => {
if (driver.available) {
const distance = calculateDistance(driver.location, rideLocation);
if (distance < minDistance) {
minDistance = distance;
nearestDriver = driver;
}
}
});
return nearestDriver;
}
app.post('/api/rides/:rideId/assign-driver', (req, res) => {
const { rideId } = req.params;
const { rideLocation } = req.body;
if (!rideId || !rideLocation || !rideLocation.lat || !rideLocation.lng) {
return res.status(400).json({ error: 'Missing rideId or valid rideLocation' });
}
const ride = rides[rideId] || { rideId, status: 'pending', rideLocation };
rides[rideId] = ride;
const driver = findNearestDriver(rideLocation);
if (!driver) {
return res.status(404).json({ error: 'No available driver found' });
}
driver.available = false;
ride.driverId = driver.id;
ride.status = 'driver\_assigned';
ride.assignedAt = new Date();
io.to(driver.id).emit('rideAssigned', { rideId, ride });
res.json({ rideId, driverId: driver.id, status: ride.status });
});
io.on('connection', (socket) => {
socket.on('driverAuth', (driverId) => {
socket.join(driverId);
});
});
server.listen(4000, () => {
console.log('Ride hailing platform server running on port 4000');
});
Book a call with an Expert
Starting a new venture? Need to upgrade your web app? RapidDev builds application with your growth in mind.
Understanding the Ride Hailing Platform Concepts
Defining Project Requirements and Scope
Choosing a Robust Technology Stack
Setting Up the Development Environment
Leveraging AI Code Generators for Rapid Prototyping
// Example: Python Flask endpoint generated by AI
from flask import Flask, request, jsonify
app = Flask(**name**)
@app.route('/book-ride', methods=['POST'])
def book_ride():
ride_data = request.get_json()
# Validate and process ride_data here
return jsonify({'status': 'ride booked', 'ride_details': ride_data})
if name == 'main':
app.run(host='0.0.0.0', port=8080)
Developing the Backend Services and API
from flask import Flask, request, jsonify
app = Flask(**name**)
@app.route('/login', methods=['POST'])
def login():
credentials = request.get_json()
# Authenticate user here
if credentials.get('username') == 'demo' and credentials.get('password') == 'demo':
return jsonify({'status': 'logged in', 'user': credentials.get('username')})
return jsonify({'status': 'error', 'message': 'Invalid credentials'}), 401
Designing the Frontend Interface
Implementing Database and Data Management
CREATE TABLE rides (
ride\_id SERIAL PRIMARY KEY,
user\_id INTEGER NOT NULL,
driver\_id INTEGER,
pickup\_location VARCHAR(255),
dropoff\_location VARCHAR(255),
status VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Integrating Real-Time Tracking and Geolocation
When it comes to serving you, we sweat the little things. That’s why our work makes a big impact.