// CRM Backend Starter for Clothing & Electronics Shops
// Using Node.js + Express + MongoDB + JWT (enterprise-structured, clean)
1️⃣ 1 Project Structure:
1//
// - /src
// - /config (db, jwt)
// - /controllers (business logic)
// - /models (Mongoose schemas)
// - /routes (API endpoints)
// - /middlewares (auth, error handler)
// - /utils (helpers)
// - server.js (entry point)
2️⃣ Dependencies:
//
// npm install express mongoose dotenv bcryptjs jsonwebtoken cors morgan express-
validator
3️⃣ server.js
//
const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');
const morgan = require('morgan');
require('dotenv').config();
const app = express();
app.use(express.json());
app.use(cors());
app.use(morgan('dev'));
// Import routes
const authRoutes = require('./routes/authRoutes');
const customerRoutes = require('./routes/customerRoutes');
const productRoutes = require('./routes/productRoutes');
const purchaseRoutes = require('./routes/purchaseRoutes');
const leadRoutes = require('./routes/leadRoutes');
const reportRoutes = require('./routes/reportRoutes');
// Use routes
app.use('/api/auth', authRoutes);
app.use('/api/customers', customerRoutes);
app.use('/api/products', productRoutes);
app.use('/api/purchases', purchaseRoutes);
app.use('/api/leads', leadRoutes);
app.use('/api/reports', reportRoutes);
// DB Connection
mongoose.connect(process.env.MONGO_URI, {
useNewUrlParser: true,
useUnifiedTopology: true
}).then(() => console.log('MongoDB connected'))
.catch(err => console.error(err));
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
4️⃣ Example Model (models/Customer.js)
//
const mongoose = require('mongoose');
const customerSchema = new mongoose.Schema({
name: { type: String, required: true },
phone: { type: String, required: true, unique: true },
email: { type: String },
address: { type: String },
birthday: { type: Date },
customerType: { type: String, enum: ['Walk-in', 'Regular', 'VIP'], default:
'Walk-in' },
notes: { type: String }
}, { timestamps: true });
module.exports = mongoose.model('Customer', customerSchema);
5️⃣ Example Controller (controllers/customerController.js)
//
const Customer = require('../models/Customer');
exports.createCustomer = async (req, res) => {
try {
const customer = new Customer(req.body);
await customer.save();
res.status(201).json(customer);
} catch (err) {
res.status(400).json({ error: err.message });
}
};
exports.getCustomers = async (req, res) => {
try {
const customers = await Customer.find().sort({ createdAt: -1 });
res.json(customers);
} catch (err) {
res.status(500).json({ error: err.message });
}
};
6️⃣ Example Route (routes/customerRoutes.js)
//
const express = require('express');
const router = express.Router();
const customerController = require('../controllers/customerController');
const { protect } = require('../middlewares/authMiddleware');
router.post('/', protect, customerController.createCustomer);
router.get('/', protect, customerController.getCustomers);
module.exports = router;
7️⃣ Authentication (middlewares/authMiddleware.js)
//
const jwt = require('jsonwebtoken');
const User = require('../models/User');
exports.protect = async (req, res, next) => {
let token;
if (req.headers.authorization &&
req.headers.authorization.startsWith('Bearer')) {
try {
token = req.headers.authorization.split(' ')[1];
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = await User.findById(decoded.id).select('-password');
next();
} catch (err) {
res.status(401).json({ error: 'Not authorized' });
}
} else {
res.status(401).json({ error: 'No token provided' });
}
};
// Repeat similar structure for Product, Purchase, Lead, Reports with CRUD
operations.
// Integrate sales tracking, lead stages, purchase logging, and reporting APIs
aligned with your UI flows.
// This backend structure will align cleanly with your attractive React frontend,
ensuring enterprise readiness, scalability, and clear API separation for CRM
deployment and sales.