A taxi, outstation cab, and tour package booking platform with a full admin CMS, built on Laravel 12. Every piece of frontend content (vehicles, services, tour packages, testimonials, FAQs, pages, menus, SEO, contact details, site settings) is managed from the admin panel — nothing on the public site is hardcoded.
- Backend: Laravel 12, PHP 8.2+, MySQL
- Frontend: Blade, Bootstrap 5, jQuery, Font Awesome, Poppins font — all loaded via CDN, no Node/npm/Vite build step anywhere
- Admin panel: AdminLTE 3 (
jeroennoten/laravel-adminlte) — note this bundles Bootstrap 4, isolated from the public site's Bootstrap 5 - Auth: Laravel Breeze (blade stack, restyled to Bootstrap 5)
- Authorization: Spatie Laravel Permission (roles: Admin, Sub Admin, Helpliner)
- Images: Laravel Storage + Intervention Image (resize/optimize on upload)
- Activity logging: Spatie Activitylog
- Sitemap: Spatie Laravel Sitemap
- Architecture: Repository + Service layer, Form Request validation, one controller per resource
composer install
cp .env.example .env
php artisan key:generate
# Point DB_* in .env at a MySQL database, then:
php artisan migrate --seed
php artisan storage:link
php artisan serveSeeded admin login: admin@mnutravels.com / Password@123 (change this immediately after first login in production).
No npm install or build step is required at any point — all frontend assets (Bootstrap, Font Awesome, jQuery, Poppins) are CDN-hosted, and the small amount of custom CSS/JS lives directly in public/assets/.
- Upload the code. Either
git clonevia cPanel's Git Version Control feature, or zip and upload everything exceptvendor/and upload that separately (or runcomposer installvia cPanel's Terminal/SSH if available). - Point the domain at
public/. Either set the subdomain/addon domain's document root directly to thepublic/folder, or — if you can't change the document root — copypublic/index.phpto your home directory'spublic_html, and edit the tworequire/__DIR__paths in it to point at the realbootstrap/app.phpandpublic/locations of the uploaded project. - Create the MySQL database and a database user via cPanel's MySQL Databases tool, and grant that user all privileges on the database.
- Set up
.env. Copy.env.exampleto.env, fill inDB_*with the cPanel database credentials, setAPP_URLto the real domain,APP_ENV=production,APP_DEBUG=false, and configureMAIL_*with your SMTP provider (cPanel's own mail service or an external one). SetADMIN_NOTIFICATION_EMAILandWHATSAPP_NUMBERto real values. - Install dependencies and generate the key (via SSH/Terminal if available):
composer install --no-dev --optimize-autoloader php artisan key:generate
- Run migrations and seed:
php artisan migrate --force --seed
- Link storage.
php artisan storage:linkcreates a symlink frompublic/storagetostorage/app/public. Most cPanel hosts support symlinks; if yours doesn't, manually create the equivalent directory alias or copy uploaded files intopublic/storageafter each upload as a fallback. - Cache for production:
Re-run these three after any subsequent code deploy (
php artisan config:cache php artisan route:cache php artisan view:cache
config:clear/route:clear/view:clearfirst if you need to debug something live). - Set folder permissions.
storage/andbootstrap/cache/need to be writable by the web server user (typically755or775depending on the host, never777). - Update the admin password for
admin@mnutravels.comimmediately after first login, and review Website Settings (logo, WhatsApp number, contact details, social links) in the admin panel.
Intervention Image needs the GD (or Imagick) PHP extension for image uploads to work. Most cPanel hosts have GD enabled by default; if uploads fail with a driver error, enable gd via cPanel's "Select PHP Version" → extensions screen.
- URL:
/login, then any authenticated user lands on/admin/dashboard - Roles: Admin (full access), Sub Admin (everything except Settings/Users/Roles), Helpliner (Bookings/Enquiries/Customers only)
- Every CMS module (Bookings, Enquiries, Customers, Vehicles, Vehicle Categories, Services, Tour Packages, Testimonials, FAQ, Gallery, Hero Sliders, Pages, Menu Manager, Footer Manager, SEO Manager, Contact Details, Website Settings, Users, Roles & Permissions, Activity Log, Error Log) is reachable from the sidebar, gated by permission