pages/auth/Login.jsx
function Login() {
return (
<div>
<h2>Admin Login</h2>
<input placeholder="Email" />
<input placeholder="Password" type="password" />
<button>Login</button>
</div>
);
}
export default Login;components/layout/AdminLayout.jsx
import Sidebar from "./Sidebar";
import Header from "./Header";
import { Outlet } from "react-router-dom";
function AdminLayout() {
return (
<div style={{ display: "flex" }}>
{/* Sidebar */}
<Sidebar />
<div style={{ flex: 1 }}>
{/* Header */}
<Header />
{/* Page Content */}
<div style={{ padding: "20px" }}>
<Outlet />
</div>
</div>
</div>
);
}
export default AdminLayout;pages/dashboard/Dashboard.jsx
function Dashboard() {
return <h2>Admin Dashboard</h2>;
}
export default Dashboard;pages/users/Users.jsx
routes/AppRoutes.jsx
import { BrowserRouter, Routes, Route } from "react-router-dom";
import Login from "../pages/auth/Login";
import Dashboard from "../pages/dashboard/Dashboard";
import Users from "../pages/users/Users";
import AdminLayout from "../components/layout/AdminLayout";
import ProtectedRoute from "../components/common/ProtectedRoute";
function AppRoutes() {
return (
<BrowserRouter>
<Routes>
{/* Public Route */}
<Route path="/login" element={<Login />} />
{/* Protected Admin Routes */}
<Route element={<ProtectedRoute />}>
<Route element={<AdminLayout />}>
<Route path="/" element={<Dashboard />} />
<Route path="/users" element={<Users />} />
</Route>
</Route>
</Routes>
</BrowserRouter>
);
}
export default AppRoutes;Security Layer components/common/ProtectedRoute.jsx
import { Navigate, Outlet } from "react-router-dom";
function ProtectedRoute() {
const isLoggedIn = localStorage.getItem("token");
return isLoggedIn ? <Outlet /> : <Navigate to="/login" />;
}
export default ProtectedRoute;App.js
import AppRoutes from "./routes/AppRoutes";
function App() {
return <AppRoutes />;
}
export default App;Login Form Submit:
pages/auth/Login.jsx
import { useState } from "react";
import axios from "axios";
import { useNavigate } from "react-router-dom";
function Login() {
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const navigate = useNavigate();
// 👉 FORM SUBMIT
const handleLogin = async (e) => {
e.preventDefault(); // stop page reload
try {
// 🔥 API CALL HAPPENS HERE
const response = await axios.post(
"http://localhost:5000/api/login",
{
email,
password,
}
);
// ✔ SUCCESS RESPONSE
const token = response.data.token;
// store token
localStorage.setItem("token", token);
// redirect to dashboard
navigate("/");
} catch (error) {
console.log("Login failed:", error.response.data.message);
}
};
return (
<div>
<h2>Admin Login</h2>
<form onSubmit={handleLogin}>
<input
type="email"
placeholder="Email"
onChange={(e) => setEmail(e.target.value)}
/>
<input
type="password"
placeholder="Password"
onChange={(e) => setPassword(e.target.value)}
/>
<button type="submit">Login</button>
</form>
</div>
);
}
export default Login;API SERVICE (Reusable)
services/userService.js
import axios from "axios";
const API_URL = "http://localhost:5000/api/users";
// Get all users
export const getUsers = () => {
return axios.get(API_URL);
};pages/users/Users.jsx
import { useEffect, useState } from "react";
import { getUsers } from "../../services/userService";
function Users() {
const [users, setUsers] = useState([]);
useEffect(() => {
fetchUsers();
}, []);
const fetchUsers = async () => {
const res = await getUsers();
setUsers(res.data);
};
return (
<div>
<h2>All Users</h2>
<table border="1" cellPadding="10">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Mobile</th>
</tr>
</thead>
<tbody>
{users.map((u) => (
<tr key={u.id}>
<td>{u.name}</td>
<td>{u.email}</td>
<td>{u.mobile}</td>
</tr>
))}
</tbody>
</table>
</div>
);
}
export default Users;pages/dashboard/Dashboard.jsx
import { useEffect, useState } from "react";
import { getUsers } from "../../services/userService";
function Dashboard() {
const [users, setUsers] = useState([]);
useEffect(() => {
loadUsers();
}, []);
const loadUsers = async () => {
const res = await getUsers();
setUsers(res.data);
};
return (
<div>
<h2>Admin Dashboard</h2>
{/* 🔥 Summary */}
<div style={{ marginBottom: "20px" }}>
<h3>Total Users: {users.length}</h3>
</div>
{/* 🔥 Recent 5 Users */}
<h3>Recent Users</h3>
<ul>
{users.slice(0, 5).map((u) => (
<li key={u.id}>
{u.name} - {u.email}
</li>
))}
</ul>
</div>
);
}
export default Dashboard;