Restaurant Point-of-Sale & Management System Academic Capstone Project
- Project Overview
- Objectives
- System Architecture
- Technology Stack
- Project Structure
- System Roles
- Core Modules
- Authentication & Authorization
- Order Management
- Menu Management
- Dashboard & Analytics
- Database
- Application Flow
- Installation & Setup
- Configuration
- Security
- Development Guidelines
- Troubleshooting
- Known Limitations
- Future Development
- Contributing
- Project Status
Resto-POS is a web-based Restaurant Point-of-Sale and Management System developed as an academic capstone project.
The system is designed to assist restaurant staff and administrators in managing daily restaurant operations, including:
- Menu management
- Customer orders
- Order status tracking
- Payment status management
- Staff account management
- Sales monitoring
- Dashboard analytics
- Customer-facing ordering workflows
The application uses a traditional server-side PHP architecture with a JavaScript-powered frontend and MySQL as its primary data store.
Project Classification: Academic / Educational Primary Environment: XAMPP Architecture: PHP-based web application
The primary objectives of Resto-POS are to:
- Digitize common restaurant ordering and management processes.
- Reduce reliance on manual order tracking.
- Provide centralized menu and order management.
- Allow authorized staff to monitor and update orders.
- Provide administrators with sales and operational insights.
- Establish a foundation for future online ordering and payment integrations.
- Demonstrate practical implementation of database-driven web application development.
Resto-POS follows a traditional web application architecture.
┌──────────────────────────────┐
│ Client │
│ │
│ HTML / CSS / JavaScript │
└──────────────┬───────────────┘
│ HTTP
▼
┌──────────────────────────────┐
│ PHP Application │
│ │
│ Authentication │
│ Business Logic │
│ CRUD Operations │
│ Order Processing │
│ Dashboard Services │
└──────────────┬───────────────┘
│ MySQLi
▼
┌──────────────────────────────┐
│ MySQL │
│ │
│ Users │
│ Menu │
│ Orders │
│ Order Items │
│ Related Data │
└──────────────────────────────┘
| Layer | Responsibility |
|---|---|
| Presentation | HTML, CSS and JavaScript interfaces |
| Application | PHP business logic and request processing |
| Authentication | Session management and role validation |
| Data Access | MySQLi database queries |
| Database | Persistent application data |
| Server | Apache through XAMPP |
| Category | Technology |
|---|---|
| Frontend | HTML5 |
| Styling | CSS3 |
| Client-side Logic | JavaScript |
| Backend | PHP |
| Programming Style | Procedural PHP |
| Database | MySQL |
| Database Driver | MySQLi |
| Local Server | Apache |
| Development Environment | XAMPP |
| Icons | Font Awesome |
| Version Control | Git |
| Repository Hosting | GitHub |
The current repository identifies PHP, MySQL, HTML, CSS, JavaScript, XAMPP, and Font Awesome as its primary technologies.
The repository currently organizes the main application under the admin/ directory.
Resto-POS/
│
├── admin/
│ │
│ ├── assets/
│ │ ├── css/
│ │ ├── js/
│ │ └── ...
│ │
│ ├── auth/
│ │ ├── login.php
│ │ ├── logout.php
│ │ └── unauthorized.php
│ │
│ ├── db/
│ │ └── database-related files
│ │
│ ├── src/
│ │ ├── accounts/
│ │ ├── dashboard/
│ │ ├── include/
│ │ ├── manage/
│ │ ├── menu/
│ │ ├── order/
│ │ └── users/
│ │
│ └── dashboard.php
│
├── .gitignore
├── CONTRIBUTING.md
├── DOCUMENTATION.md
├── LICENSE
├── README.md
├── SECURITY.md
├── TODO.md
└── function.md
Contains the primary administrative application.
Contains frontend resources such as:
- CSS stylesheets
- JavaScript files
- Images
- UI resources
Handles authentication-related functionality.
Typical responsibilities include:
- Login
- Logout
- Unauthorized access handling
- Session-related operations
Contains database-related scripts and data access services.
Responsible for staff account management.
Contains dashboard-related services and data endpoints used for analytics.
Contains reusable interface components such as navigation and sidebar elements.
Contains administrative management functionality, particularly menu-related CRUD operations.
Contains menu browsing, item selection, search and ordering functionality.
Handles the order management lifecycle, including:
- Order listing
- Order details
- Order status
- Payment status
- Order searching/filtering
Contains customer/user-facing functionality.
Resto-POS uses role-based access control to separate administrative and staff functionality.
Administrators are responsible for managing the system and its configuration.
Typical responsibilities include:
- Managing menu items
- Managing staff accounts
- Viewing dashboard analytics
- Monitoring orders
- Managing operational data
Staff members primarily interact with operational functionality.
Typical responsibilities include:
- Viewing orders
- Processing orders
- Updating order statuses
- Managing customer orders
- Updating payment-related information
Access to specific functionality should always be enforced on the server side rather than relying solely on frontend navigation.
The authentication module provides:
- Login
- Logout
- Session management
- Role validation
- Unauthorized access handling
Authentication is required before users can access protected administrative functionality.
Administrators can manage restaurant menu items.
Supported operations include:
- Create menu items
- View menu items
- Update menu items
- Delete menu items
- Organize menu categories
- Manage menu images
- Maintain item pricing
This module provides the primary source of menu information used by the ordering system.
The order module manages the lifecycle of customer orders.
Typical operations include:
Customer Order
│
▼
Pending
│
▼
Preparing
│
▼
Ready
│
▼
Completed
Orders may also be cancelled depending on the applicable workflow.
The system also maintains payment-related states separately from food/order processing.
Payment information is associated with customer orders.
Supported payment states include:
| Status | Meaning |
|---|---|
Pending |
Payment has not yet been completed |
Paid |
Payment has been completed |
Refunded |
Previously completed payment has been refunded |
Payment processing should be treated separately from order fulfillment.
The dashboard provides operational and sales information.
Possible dashboard metrics include:
- Total sales
- Total orders
- Total customers
- Total items sold
- Recent orders
- Weekly sales
- Monthly sales
Chart-oriented PHP endpoints provide JSON data that can be consumed by JavaScript visualization components.
The application uses PHP sessions to maintain authenticated user state.
A typical protected page follows this flow:
Request
│
▼
Load Configuration
│
▼
Start / Resume Session
│
▼
Check Authentication
│
├── Not Authenticated ──► Login
│
▼
Check User Role
│
├── Unauthorized ──► Unauthorized Page
│
▼
Execute Application Logic
Protected pages should:
- Load the central configuration.
- Start or resume the session.
- Verify that the user is authenticated.
- Validate the user's role when required.
- Only then execute protected operations.
The order system is responsible for maintaining the complete lifecycle of an order.
An order may contain:
- Customer information
- Order identifier
- Ordered menu items
- Quantity
- Item price
- Order status
- Payment status
- Order date/time
- Delivery or fulfillment information
The order workflow uses status values representing the current state of food preparation and fulfillment.
Pending
↓
Preparing
↓
Ready
↓
Completed
Orders may transition to:
Cancelled
when an order is cancelled before completion.
Menu management provides administrators with CRUD functionality.
Administrators can add new menu items and define relevant information such as:
- Item name
- Category
- Description
- Image
- Pricing
- Availability
Menu data can be displayed through administrative and customer-facing interfaces.
Existing menu items can be modified when prices, descriptions, images or other information change.
Menu items can be removed when they are no longer available.
The dashboard acts as an operational overview for authorized users.
Analytics endpoints can provide structured JSON data for frontend charts.
Example response structure:
{
"month": "January",
"paid_total": 15000,
"pending_total": 2500,
"refunded_total": 500,
"total": 18000
}The exact response structure may vary depending on the endpoint.
- Weekly sales
- Monthly sales
- Recent orders
- Payment-based sales summaries
Resto-POS uses MySQL for persistent storage.
The database stores information required for:
- Users
- Staff accounts
- Menu items
- Orders
- Order items
- Customer information
- Payment status
- Order status
The database should be treated as the authoritative source for transactional information.
Users
│
└──────────────┐
│
▼
Orders
│
│ 1:N
▼
Order Items
│
│ N:1
▼
Menu Items
An order can contain multiple order items, while each order item references a menu item.
Open Menu
│
▼
Browse / Search Items
│
▼
Select Item
│
▼
Add to Cart
│
▼
Review Order
│
▼
Checkout
│
▼
Create Order
│
▼
Track Order
Login
│
▼
Dashboard
│
▼
View Orders
│
▼
Review Order
│
▼
Update Status
│
▼
Complete / Cancel
Login
│
▼
Dashboard
│
├──► Menu Management
│
├──► Order Management
│
├──► Staff Accounts
│
└──► Sales Analytics
Before running the system, install:
- XAMPP
- Apache
- MySQL
- PHP
- Git
- A modern web browser
git clone https://github.com/devstygian/Resto-POS.gitMove into the project directory:
cd Resto-POSMove the project into the XAMPP web root:
C:\xampp\htdocs\Resto-POS
Start the following services from XAMPP:
Apache
MySQL
Open:
http://localhost/phpmyadmin
Create the required database and import the project's SQL schema.
Example:
CREATE DATABASE ordering_system;Use the database name and schema expected by the current application configuration.
Locate the application's database configuration file and update the connection values according to the local environment.
Typical local configuration:
Host: localhost
Username: root
Password: [your local MySQL password]
Database: ordering_system
Do not commit production credentials or secrets to the repository.
After Apache and MySQL are running, open:
http://localhost/Resto-POS/
If the application is installed under a different directory, update the configured base URL accordingly.
Centralized configuration should contain environment-specific values such as:
- Database host
- Database username
- Database password
- Database name
- Application base URL
- Session configuration
Example:
$host = "localhost";
$username = "root";
$password = "";
$database = "ordering_system";Configuration values should be separated from application logic whenever possible.
For production deployments, sensitive credentials should be stored using environment variables or a secure configuration mechanism rather than hard-coded values.
Security is an important consideration because the application processes authentication credentials and customer/order information.
The project uses password hashing through PHP's password hashing functionality.
The repository also documents protection against SQL injection as a security goal.
Passwords should never be stored in plaintext.
Use:
password_hash()for password storage and:
password_verify()for authentication.
Use prepared statements instead of directly concatenating user input into SQL queries.
Preferred:
$stmt = $conn->prepare(
"SELECT * FROM users WHERE username = ?"
);
$stmt->bind_param("s", $username);
$stmt->execute();Avoid:
$query = "SELECT * FROM users WHERE username = '$username'";State-changing requests should include CSRF protection.
Recommended for:
- Creating records
- Updating records
- Deleting records
- Changing order status
- Changing payment status
Validate all data received through:
$_GET
$_POST
$_FILES
Validation should occur server-side even when frontend validation is present.
Authenticated sessions should use secure session practices, including:
- Session regeneration after login
- Secure cookies
- Appropriate session expiration
- Server-side authorization checks
Use descriptive names for:
- Variables
- Functions
- Files
- Database columns
- Endpoints
Keep database operations and business logic organized by module.
Avoid duplicating:
- Database connections
- Authentication checks
- Common UI components
- Validation logic
Keep frontend behavior separated into dedicated JavaScript files when practical.
Use JavaScript primarily for:
- UI interactions
- AJAX/fetch requests
- Form behavior
- Dynamic content
- Charts
Keep reusable styles centralized instead of duplicating styles throughout PHP files.
Check the browser's developer tools:
F12 → Network
Look for:
404 Not Found
Verify that asset paths correctly match the current application URL.
For example:
http://localhost/Resto-POS/admin/assets/...
rather than an outdated project path.
Check:
- Application base URL
- PHP redirect paths
- Session authentication logic
- Relative versus absolute URLs
.htaccessrules if applicable
A hard-coded path referencing an old project directory can cause unexpected redirects.
Verify:
- MySQL is running.
- Database name is correct.
- Username is correct.
- Password is correct.
- Host is correct.
- PHP MySQLi support is enabled.
Check:
- Database user exists.
- Password hash is valid.
password_verify()is being used correctly.- PHP sessions are enabled.
- Authentication redirects are correct.
- The user's role matches the required permissions.
Resto-POS is currently an academic project and should not be considered production-ready without additional security, testing, scalability and deployment work.
Potential limitations include:
- Procedural PHP architecture
- Limited automated testing
- Environment-specific configuration
- Local XAMPP dependency during development
- Additional security hardening required for production
- Limited API standardization
- No dedicated production deployment architecture
- Additional validation and error handling required
These limitations are consistent with the repository's stated academic-project scope.
Potential future improvements include:
Develop a dedicated landing page and online ordering interface.
Support external payment providers for online transactions.
Provide optional third-party authentication for customer accounts.
Introduce a structured API layer to separate frontend and backend responsibilities.
Potentially migrate selected interfaces toward a modern frontend framework such as Vue.js or React.
Implement:
- CSRF protection
- Prepared statements throughout the system
- Strict input validation
- Rate limiting
- Secure session configuration
- Environment-based secrets
Introduce:
- Unit tests
- Integration tests
- Authentication tests
- Database tests
- End-to-end tests
Move beyond local XAMPP development toward a structured deployment environment.
Contributions should follow the project's established Git workflow.
git checkout -b feature/your-feature-nameImplement and test the requested change.
Use the project's conventional commit format:
git add .
git commit -m "feat: add new feature"git push origin feature/your-feature-nameOpen a Pull Request describing:
- What changed
- Why it changed
- How it was tested
- Any known limitations
Before contributing, review:
CONTRIBUTING.mdSECURITY.md
Current Status: Active Academic Development
Resto-POS has evolved from a basic restaurant ordering/POS concept into a broader restaurant management platform. The repository currently contains administrative functionality covering authentication, menu management, orders, accounts and dashboard-related functionality.
Future development is expected to expand the platform toward customer-facing online ordering and external service integrations.
GitHub: https://github.com/devstygian/Resto-POS
This project is distributed under the repository's MIT License.
Resto-POS is developed for academic and educational purposes.
It is not intended for production deployment without appropriate security auditing, testing, infrastructure configuration, data protection measures and operational hardening.
Resto-POS Restaurant Point-of-Sale & Management System
© 2026 DevStygian