Phone-repair shop platform: public storefront for browsing services/accessories and booking repairs, plus a staff admin console for catalog, appointments, invoices, and enquiries.
Single-shop install — one catalog, one appointment queue, one business.
| Surface | Who | What |
|---|---|---|
Public site (/) |
Customers (no login) | Browse services & accessories, get live estimates, book appointments, send contact messages |
Admin console (/dashboard, /admin/*) |
Staff (auth + verified email) | Manage catalog, process bookings, calendar, invoices, contact inbox |
JSON API (/api/*) |
SPA / clients | Public catalog reads + appointment create/lookup |
Product details: see FEATURES.md.
- PHP 8.4 · Laravel 13 · Livewire 4 · Flux UI 2 · Tailwind CSS 4
- Auth: Laravel Fortify (login, registration, 2FA, email verification)
- Media: Spatie Media Library · SEO:
ralphjsmit/laravel-seo - Default DB: SQLite (MySQL/Postgres also fine)
- PHP 8.4+
- Composer 2
- Node.js 20+ (Vite / Tailwind)
- Laravel Herd (recommended on macOS) or PHP’s built-in server via
composer run dev
This repo is already linked as https://rapidfix-be.test when the folder lives under Herd’s sites.
# 1. Install PHP deps + create .env + key + migrate + storage link + npm build
composer run setup
# 2. Seed demo catalog + staff user
php artisan db:seed
# 3. Frontend watcher (Herd serves PHP; Vite must still run for assets in local dev)
npm run devOpen:
- Public site → https://rapidfix-be.test
- Admin login → https://rapidfix-be.test/login
- Dashboard → https://rapidfix-be.test/dashboard
Seeded staff account
| Field | Value |
|---|---|
test@example.com |
|
| Password | password |
composer run setup
php artisan db:seed
# Starts: `php artisan serve` + queue worker + Pail + Vite
composer run devApp URL defaults to http://localhost:8000 — set APP_URL in .env to match.
Copy happens automatically in composer run setup. Important knobs in .env:
APP_NAME="RapidFix Panel"
APP_URL=https://rapidfix-be.test
DB_CONNECTION=sqlite
# Or MySQL:
# DB_CONNECTION=mysql
# DB_HOST=127.0.0.1
# DB_DATABASE=rapidfix
# DB_USERNAME=root
# DB_PASSWORD=
SITE_PHONE="+1 (555) 123-4567"
SITE_PHONE_TEL=+15551234567
SITE_EMAIL=hello@rapidfix.com
SEO_SITE_NAME="RapidFix Phone Repair"
# API rate limits (per IP / minute)
THROTTLE_PUBLIC_API_PER_MINUTE=1200
THROTTLE_APPOINTMENTS_PER_MINUTE=120After changing DB credentials:
php artisan migrate --seed
php artisan storage:link # public disk for uploaded catalog images| Path | Purpose |
|---|---|
/ |
Services catalog (home) |
/accessories |
Accessories catalog |
/book |
Appointment booking |
/about · /contact |
Marketing / enquiry |
/login · /register |
Staff auth |
/dashboard |
Staff dashboard |
/admin/repairs/appointments |
Appointment queue |
/admin/repairs/appointments/calendar |
Calendar |
/admin/catalog/* |
Categories, brands, services, accessories, time slots |
/admin/messages |
Contact inbox |
/api/services · /api/accessories · … |
Public JSON API |
All under /api, rate-limited.
GET /api/categories?type=service|accessory
GET /api/brands?include_tree=1
GET /api/services?category=&search=
GET /api/accessories?brand=&line=&version=&category=&q=
GET /api/time-slots
POST /api/appointments
GET /api/appointments/{reference} # e.g. RF-XXXXX-XXXX# Assets
npm run dev # Vite HMR
npm run build # production build
# App
php artisan migrate
php artisan db:seed
php artisan queue:listen
php artisan test --compact
# Format
vendor/bin/pint --dirtycomposer run test runs Pint (check) + the full PHPUnit suite.
app/
Http/Controllers/Api/ # JSON API
Http/Controllers/Admin/ # calendar feed, invoices
Models/ · Services/ # domain
resources/views/pages/
site/ # public Livewire pages
admin/ # staff console
routes/
web.php · api.php
database/seeders/ # demo catalog + appointments
FEATURES.md # product feature docs
php artisan test --compact
php artisan test --compact tests/Feature/Api/FEATURES.md— product behaviour (public + admin)IMPLEMENTATION.md— build history / technical notes