Back to All Projects
Problem Statement
Small restaurants need a simple way to show their menu and keep track of customer orders and table bookings without a full enterprise system. This project explores how that workflow can be built end to end with a lightweight stack, keeping menu, order, and reservation data in one database.
Proposed Solution
A Flask application serves the menu and forms, records orders with automatically calculated totals, and stores reservations in SQLite. Jinja2 templates and Bootstrap provide a simple management interface, and the database is initialized and seeded with menu items on first run.
Key Features
- Menu browsing grouped by category.
- Order creation with customer name, item selection, quantity, and an automatically calculated total.
- Order list with the option to delete any order.
- Table reservations by table and date, with a list view and cancellation.
- Input validation for orders and reservations.
- Custom 404 error page.
System Architecture Flow
Browser (Jinja2 templates with Bootstrap) -> Flask routes (app.py) -> SQLite database (menu, orders, and reservations tables) -> Menu seeded on first run (database.py)
Engineering Challenges
- Database setup was centralized in one module that creates the tables and seeds the menu once, so the app starts from a clean, consistent state.
- Bad input such as empty names, missing items, invalid quantities, or incomplete reservations is rejected in the routes before anything is stored.
- The management workflow was kept simple, with direct SQL queries and clear delete and cancel actions, which limited complexity.
Lessons Learned
- Combining Flask routes, Jinja templates, and SQLite into a working full-stack app.
- Implementing form validation and CRUD actions for orders and reservations.
- Structuring a project so interface, styling, and database setup stay separate.
Results
Built as a self-learning project to practice full-stack fundamentals with Flask, SQLite, and Jinja2.