Coffee Drop · QR Catalog

Οδηγός Χρήσης & Εγκατάστασης

Ένας πλήρης οδηγός για να ανεβάσεις τον ψηφιακό κατάλογο online, να φτιάξεις το QR code, και να διαχειρίζεσαι τιμές, προϊόντα και φωτογραφίες — χωρίς προγραμματισμό.

Laravel 11 Βάση SQLite Shared Hosting cPanel / Plesk PHP 8.2+

i Τι είναι αυτό

Είναι μια αυτόνομη, πολύ ελαφριά εφαρμογή που εμφανίζει τον κατάλογο/μενού του καταστήματος σε μια κινητόφιλη σελίδα. Οι πελάτες σκανάρουν ένα QR code και βλέπουν πάντα τις τρέχουσες τιμές και προϊόντα.

🛍️ Δημόσια σελίδα

Στο / — ο κατάλογος που βλέπουν οι πελάτες. Καρτέλες κατηγοριών, δημοφιλέστερα, χάρτης, ωράριο, ένδειξη «Ανοιχτά/Κλειστά».

🔐 Πίνακας διαχείρισης

Στο /admin-login — μπαίνεις με κωδικό και αλλάζεις τιμές, προσθέτεις προϊόντα, ανεβάζεις φωτογραφίες, διαχειρίζεσαι κατηγορίες.

Το βασικό πλεονέκτημα: το QR δείχνει πάντα στο ίδιο URL. Αλλάζεις τιμές μέσα από τον πίνακα και το ίδιο QR εμφανίζει αμέσως τα νέα — δεν χρειάζεται να ξανατυπώσεις τίποτα.

1 Εγκατάσταση βήμα-βήμα

Ο πιο αξιόπιστος τρόπος είναι να ετοιμάσεις τα πάντα τοπικά στον υπολογιστή σου και μετά να ανεβάσεις τον φάκελο. Χρειάζεσαι PHP 8.2+ και Composer τοπικά.

  1. Εγκατάσταση εξαρτήσεων

    Μέσα στον φάκελο του project, τρέξε:

    composer install --optimize-autoloader --no-dev

    Αυτό δημιουργεί τον φάκελο vendor/ (δεν περιλαμβάνεται στο ZIP γιατί είναι μεγάλος).

  2. Ρύθμιση του .env

    Αντίγραψε το .env.example σε .env:

    cp .env.example .env

    Άνοιξε το .env και βάλε το σωστό APP_URL (το domain σου). Το DB_CONNECTION=sqlite είναι ήδη ρυθμισμένο.

  3. Κλειδί εφαρμογής

    php artisan key:generate

    Γεμίζει αυτόματα το APP_KEY στο .env.

  4. Δημιουργία βάσης & αρχικά δεδομένα

    # Το αρχείο database/database.sqlite υπάρχει ήδη άδειο
    php artisan migrate --seed

    Φτιάχνει τους πίνακες και φορτώνει τις κατηγορίες + μερικά προϊόντα-δείγματα.

  5. Δοκιμή τοπικά (προαιρετικό)

    php artisan serve

    Άνοιξε http://localhost:8000. Αν δεις τον κατάλογο, όλα δουλεύουν.

  6. Ανέβασμα στο shared hosting

    Στο cPanel/Plesk, το «web root» είναι συνήθως ο φάκελος public_html. Έχεις δύο επιλογές:

    ✅ Επιλογή Α — Συνιστάται (ασφαλέστερη)

    • Ανέβασε ολόκληρο τον φάκελο της εφαρμογής έξω από το public_html — π.χ. στο /home/χρήστης/coffee-drop/.
    • Μετάφερε τα περιεχόμενα του coffee-drop/public/ μέσα στο public_html/.
    • Άνοιξε το public_html/index.php και διόρθωσε τις δύο διαδρομές ώστε να δείχνουν στον φάκελο της εφαρμογής:
    require __DIR__.'/../coffee-drop/vendor/autoload.php';
    $app = require_once __DIR__.'/../coffee-drop/bootstrap/app.php';

    Επιλογή Β — Subdomain

    Φτιάξε ένα subdomain (π.χ. menu.todomain.gr) και στις ρυθμίσεις «Domains» όρισε ως document root τον φάκελο coffee-drop/public. Δεν χρειάζεται να αγγίξεις το index.php.

  7. Δικαιώματα αρχείων (permissions)

    Μέσω τερματικού (SSH) ή του File Manager, δώσε δικαιώματα εγγραφής:

    chmod -R 775 storage bootstrap/cache
    chmod 775 database
    chmod 664 database/database.sqlite
    chmod -R 775 public/uploads
    Σημαντικό: η SQLite χρειάζεται δικαίωμα εγγραφής και στο αρχείο database.sqlite και στον φάκελο database/ που το περιέχει. Αν λείπει, θα δεις «readonly database» σφάλμα.
  8. Cache για ταχύτητα (production)

    php artisan config:cache
    php artisan route:cache
    php artisan view:cache

2 Κωδικός Admin

Δεν υπάρχει πίνακας χρηστών — ένας μόνο κωδικός προστατεύει τον πίνακα διαχείρισης. Αποθηκεύεται κρυπτογραφημένος (hashed), ποτέ σε απλό κείμενο.

Πώς φτιάχνεις/αλλάζεις τον κωδικό

  1. Τρέξε php artisan tinker
  2. Πληκτρολόγησε (βάζοντας τον δικό σου κωδικό):
echo Hash::make('ο-μυστικός-κωδικός-σου');

Θα βγάλει μια συμβολοσειρά που ξεκινά με $2y$.... Αντίγραψέ την ολόκληρη στο .env:

ADMIN_PASSWORD_HASH=$2y$12$..........................................
Αν αλλάξεις το .env ενώ τρέχει σε production: τρέξε ξανά php artisan config:cache, αλλιώς ο νέος κωδικός δεν θα φορτωθεί.
Αν το hosting σου δεν επιτρέπει tinker, φτιάξε το hash τοπικά στον υπολογιστή σου και απλώς αντίγραψε το αποτέλεσμα στο .env του server.

3 Δημιουργία του QR Code

Το QR code δεν το παράγει η εφαρμογή — και δεν χρειάζεται. Είναι απλό:

  1. Πήγαινε σε μια δωρεάν γεννήτρια

    Π.χ. qr-code-generator.com ή qrcode.tec-it.com.

  2. Βάλε το URL του καταλόγου

    Το domain σου, π.χ. https://menu.todomain.gr. Επίλεξε τύπο «URL / Website».

  3. Κατέβασέ το σε υψηλή ποιότητα

    Προτίμησε SVG ή PNG υψηλής ανάλυσης — δίνει καθαρή εκτύπωση σε κάθε μέγεθος (αυτοκόλλητο, σταντ τραπεζιού, αφίσα).

Επειδή ο κατάλογος είναι δυναμικός, τυπώνεις το QR μία φορά. Όσες αλλαγές κι αν κάνεις σε τιμές/προϊόντα, το ίδιο QR συνεχίζει να δείχνει τα ενημερωμένα.

4 Καθημερινή χρήση (για τον καταστηματάρχη)

Μπες στο https://todomain.gr/admin-login, δώσε τον κωδικό, και βλέπεις τον πίνακα διαχείρισης.

💶 Αλλαγή τιμής (το πιο γρήγορο)

Στη λίστα προϊόντων, κάθε γραμμή έχει ένα πεδίο τιμής. Άλλαξε το νούμερο και πάτα Save. Αποθηκεύεται αμέσως (με ένα ✓) χωρίς να φορτώσει ξανά η σελίδα. Η τιμή δέχεται και κείμενο, π.χ. Από 2,40€.

📷 Αλλαγή / ανέβασμα φωτογραφίας

Κάνε κλικ πάνω στη μικρή εικόνα (ή στο τετράγωνο με το +) αριστερά κάθε προϊόντος, διάλεξε αρχείο από το κινητό/υπολογιστή, και ανεβαίνει αυτόματα. Δεκτά: jpg, png, webp — έως 2 MB.

➕ Προσθήκη νέου προϊόντος

Στη φόρμα «Νέο Προϊόν»: τίτλος, τιμή, περιγραφή, κατηγορία (από λίστα), προαιρετικό «σήμα» (π.χ. 1ο ΣΕ ΠΑΡΑΓΓΕΛΙΕΣ), φωτογραφία και κουτάκι «Δημοφιλές». Πάτα «Προσθήκη Προϊόντος».

✎ Επεξεργασία προϊόντος

Πάτα το εικονίδιο μολυβιού σε μια γραμμή. Ανοίγει παράθυρο όπου αλλάζεις τίτλο, περιγραφή, κατηγορία, σήμα και αν είναι δημοφιλές.

🗂️ Κατηγορίες

Στην ενότητα «Κατηγορίες» προσθέτεις νέα, μετονομάζεις υπάρχουσες (άλλαξε το όνομα → «Αποθήκευση»), ή διαγράφεις με το ✕.

Προσοχή στη διαγραφή κατηγορίας: δεν επιτρέπεται να διαγράψεις κατηγορία που έχει ακόμη προϊόντα — η εφαρμογή θα σε σταματήσει. Μετάφερε πρώτα τα προϊόντα σε άλλη κατηγορία (μέσω ✎) ή διάγραψέ τα.

🟢 Ένδειξη «Ανοιχτά / Κλειστά»

Υπολογίζεται αυτόματα από το ωράριο στη δημόσια σελίδα (Δευ–Παρ 07–21, Σάβ 08–20, Κυρ 08–18). Αν αλλάξει το ωράριο, ζήτησέ μου να το προσαρμόσω — είναι μέσα στο resources/views/catalog.blade.php.

5 Δομή αρχείων

Τα σημεία που πιθανόν να αγγίξεις είναι επισημασμένα.

coffee-drop/ ├─ app/ │ ├─ Http/Controllers/ │ │ ├─ CatalogController.php # δημόσια σελίδα │ │ └─ AdminController.php # όλη η λογική διαχείρισης │ ├─ Http/Middleware/ │ │ └─ AdminAuth.php # προστασία /admin │ └─ Models/ Category.php · Product.php ├─ database/ │ ├─ database.sqlite # Η ΒΑΣΗ — κράτα backup! │ ├─ migrations/ # δομή πινάκων │ └─ seeders/ CatalogSeeder.php # αρχικά προϊόντα ├─ public/ │ ├─ index.php # σημείο εισόδου │ └─ uploads/ # οι φωτογραφίες προϊόντων ├─ resources/views/ │ ├─ catalog.blade.php # εμφάνιση δημόσιας σελίδας │ └─ admin/ login · dashboard # πίνακας διαχείρισης ├─ routes/ web.php # διευθύνσεις URL └─ .env # ρυθμίσεις + κωδικός (μυστικό)
Backup: για να κρατήσεις αντίγραφο όλου του καταλόγου σου αρκεί να κατεβάσεις δύο πράγματα: το αρχείο database/database.sqlite και τον φάκελο public/uploads/. Αυτά περιέχουν όλα τα προϊόντα, τιμές και φωτογραφίες.

? Επίλυση προβλημάτων

ΣύμπτωμαΠιθανή αιτία & λύση
500 / λευκή σελίδαΣυνήθως permissions ή λείπει το APP_KEY. Τρέξε php artisan key:generate και έλεγξε τα δικαιώματα του storage/ (775). Δες το storage/logs/laravel.log.
«readonly database»Η SQLite δεν έχει δικαίωμα εγγραφής. chmod 664 database/database.sqlite και chmod 775 database.
Ο νέος κωδικός δεν δουλεύειΆλλαξες το .env αλλά μένει η cache. Τρέξε php artisan config:cache.
Δεν ανεβαίνουν φωτογραφίεςΟ φάκελος public/uploads/ δεν είναι εγγράψιμος (chmod -R 775 public/uploads) ή το αρχείο > 2MB / λάθος τύπος.
Οι φωτογραφίες δεν φαίνονται στη σελίδαΜε την Επιλογή Α, ο φάκελος uploads πρέπει να βρίσκεται μέσα στο public_html/. Βεβαιώσου ότι το APP_URL στο .env είναι σωστό.
404 σε όλες τις σελίδες εκτός αρχικήςΛείπει το mod_rewrite ή το .htaccess. Βεβαιώσου ότι ανέβηκε το public/.htaccess και ότι ο server επιτρέπει rewrites.
Αλλαγές δεν φαίνονταιΚαθάρισε τις caches: php artisan optimize:clear.
Χρυσός κανόνας: μετά από κάθε αλλαγή σε αρχεία ή στο .env σε production, τρέξε php artisan optimize:clear και μετά ξανά τα config:cache / route:cache / view:cache.