ThaimeUp is a full-stack Thai food ordering web application built with Flask and MySQL.
The application simulates a real-world restaurant ordering system, allowing customers to browse menu items, manage a shopping basket, and place orders, while providing administrators with tools to manage items, categories, and orders.
This project was originally developed as a university coursework project and has been refactored and prepared as a portfolio project, with a focus on usability, system design, and iterative improvement based on academic feedback.
- Browse menu items by category
- Add items to a shopping basket
- Update item quantities and remove items
- Place orders after authentication
- Session-based basket management
- Admin-only access control
- Manage menu items and categories
- View customer orders
- Soft-delete items and categories (data preserved for order history)
- Flask Blueprint architecture
- MySQL database integration
- Session-based authentication
- Custom 404 and 500 error pages (intentionally implemented for testing)
- Soft delete implementation using
is_deletedflags
- Backend: Python, Flask
- Frontend: HTML, CSS, Bootstrap 5
- Database: MySQL
- Environment Management: python-dotenv
- Version Control: Git & GitHub
Ensure Python 3.10+ and MySQL are installed on your system.
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt This project uses environment variables to manage sensitive configuration. Create a .env file in the project root based on .env.example:
SECRET_KEY=your_secret_key MYSQL_USER=your_mysql_user MYSQL_PASSWORD=your_mysql_password MYSQL_DB=thaimeup MYSQL_HOST=localhost
Create and seed the database using the provided SQL file: mysql -u -p -e "CREATE DATABASE thaimeup;" mysql -u -p thaimeup < thaimeup.sql
python3 run.py Open the application in your browser: http://127.0.0.1:8888
The database includes pre-populated users for testing purposes: 4 regular users 2 admin users
All test accounts share the same password: 123456
The Offers and Contact Us pages are intentionally designed to trigger: 404 – Page Not Found 500 – Internal Server Error
These pages are included for error handling simulation and testing and do not represent real system issues.
Instead of permanently deleting records, this project uses a soft delete strategy via an is_deleted column in the items and categories tables.
Deleted items remain visible in past orders Deleted items are hidden from the landing page
This approach preserves data integrity and order history
Based on academic feedback, the following areas were identified for improvement:
- Responsive design across medium and large screen sizes
- Shopping cart usability (avoiding unnecessary page reloads)
- Product detail page information density
- Authentication flow and UX consistency
This repository currently represents the original functional version.
Future iterations will focus on:
- Enhancing responsiveness with additional breakpoints
- Improving cart interactions (e.g. quantity updates without page reload)
- Enriching detail pages with clearer information hierarchy
- Refining UI/UX based on usability principles
These improvements will be tracked through separate commits and branches to clearly demonstrate before / after progression.
This project is intended for:
- Academic demonstration
- Portfolio showcasing
- Learning and experimentation with Flask-based full-stack applications