A full-stack Restaurant Point-of-Sale system built as a university lab course project. Features a dark Wolt-style UI, real-time kitchen display, order management, reservations, and an admin analytics dashboard.
| Layer | Technology |
|---|---|
| Frontend | React 18, Vite, Tailwind CSS |
| Backend | ASP.NET Core 8 Web API |
| Database | SQL Server + Entity Framework Core |
| Real-time | SignalR |
| Auth | JWT + Refresh Tokens, Role-based (Admin / User) |
- Menu & Cart — Browse products by category, add to cart, place orders
- Kitchen Display — Real-time order queue for kitchen staff via SignalR
- Cashier View — Manage and update order statuses
- Reservations — Table booking system with status tracking
- Admin Panel — Full CRUD for products, categories, tables, users
- Analytics — Sales and order statistics dashboard
- Dark Theme — Wolt-inspired dark UI with responsive layout
- PDF Invoices — Downloadable invoice per order
Restaurant-POS-LabCourse/
├── RestaurantAPI/ # ASP.NET Core backend
│ ├── Controllers/ # Auth, Orders, Products, Categories, Tables, Reservations, Analytics
│ ├── Models/ # EF Core entities
│ ├── DTOs/ # Request/response contracts
│ ├── Hubs/ # SignalR OrderHub
│ ├── Middleware/ # Global exception handling
│ └── Migrations/ # EF Core database migrations
└── restaurant-frontend/ # React + Vite frontend
└── src/
├── pages/ # All route pages
├── components/ # Navbar, Sidebar, Modals
├── context/ # Auth, Cart, Theme, Toast
├── hooks/ # useSignalR
└── services/ # API client, auth storage
- .NET 8 SDK
- SQL Server (local or Docker)
- Node.js 18+
cd RestaurantAPI
# Set your connection string in appsettings.Development.json
dotnet restore
dotnet ef database update
dotnet runSwagger UI: https://localhost:7226/swagger
cd restaurant-frontend
cp .env.example .env # set VITE_API_URL to your backend URL
npm install
npm run dev- Register:
POST /api/Auth/register - Login:
POST /api/Auth/login— returnsaccessToken+refreshToken - Use
Authorization: Bearer <accessToken>on protected routes - Refresh:
POST /api/Auth/refresh-token - Bootstrap first admin:
POST /api/Auth/bootstrap-admin(only works when no Admin exists)
| Resource | Methods |
|---|---|
| Auth | register, login, logout, refresh-token, bootstrap-admin |
| Categories | GET, GET/:id, POST, PUT, DELETE (Admin) |
| Products | GET, GET/:id, POST, PUT, DELETE (Admin) |
| Orders | POST, GET my-orders, GET all-orders (Admin), PUT status (Admin) |
| Tables | GET, POST, PUT, DELETE (Admin) |
| Reservations | POST, GET, PUT status (Admin) |
| Analytics | GET sales stats (Admin) |
- Validation enforced via DataAnnotations in DTOs
- Global error handling via custom middleware
- SignalR hub (
/hubs/order) pushes order updates to Kitchen Display in real time - Initial seed data created for roles, categories, and products