sartUP - Riepilogo Sviluppo

sartUP - Riepilogo Sviluppo

πŸ“‹ Panoramica Progetto

Nome: sartUP Framework: Laravel 11 PHP: 8.2+ Database: MySQL/MariaDB (capera_sartupDB) Autenticazione: Native Laravel Auth RBAC: Spatie/laravel-permission Frontend: Tailwind CSS (via CDN)

---

🎯 Obiettivi Completati

1. Setup Iniziale

  • βœ… Installazione Laravel 11 su cPanel VPS
  • βœ… Configurazione PHP 8.2, Composer 2.7+, Node 20+
  • βœ… Database MySQL configurato (utente: capera_sartup, db: capera_sartupDB)
  • βœ… Rimozione completa SQLite, migrazione a MySQL/MariaDB
  • 2. Sistema di Autenticazione

  • βœ… Login/Logout nativo Laravel
  • βœ… Password reset
  • βœ… Selezione ruolo attivo al login
  • βœ… Middleware EnsureActiveRole per gestione ruolo attivo in sessione
  • 3. Sistema RBAC con Spatie

    Ruoli implementati:
  • super-admin (bypass completo gates, accesso a tutto)
  • admin
  • operator
  • maintenance
  • viewer
  • Utente di test:

  • Email: root@sartup.local
  • Password: ChangeMe!
  • Ruoli: super-admin, admin
  • 4. Menu Dinamico Multi-livello

    Tabelle Database:

  • menus - Contenitori menu
  • menu_items - Voci di menu con supporto gerarchia (parent_id)
  • Caratteristiche:

  • 4 livelli di profonditΓ  (L1: topbar, L2/L3/L4: sidebar)
  • Filtri per ruoli (required_roles JSON)
  • Filtri per permessi (required_permissions JSON)
  • Ordinamento personalizzabile (order_index)
  • Icone, route, URL custom
  • Service Layer:

  • MenuService - Costruisce albero menu filtrato per utente
  • 5. UI/UX Admin Area

    Layout (resources/views/layouts/admin.blade.php):

  • Topbar:
  • - Logo sartUP - Menu L1 (Dashboard, Industria 4.0, Menu [solo super-admin]) - Badge ruolo attivo - Dropdown utente (Cambia ruolo, Logout)
  • Sidebar (collassabile):
  • - Menu L2/L3/L4 organizzati gerarchicamente - Stato collassato persistente in sessionStorage - Evidenziazione voce attiva (match esatto route) - Icone chevron per submenu
  • Main Content:
  • - Breadcrumb dinamico - Titolo modulo - Alert successo (toast-like) - Area contenuto

    Tailwind CSS:

  • Caricato via CDN
  • Responsive design
  • Classi utility per layout moderno
  • ---

    πŸ—‚οΈ Struttura File Progetto

    Routes

    `` routes/ β”œβ”€β”€ auth.php # Login, logout, reset password, selezione ruolo └── admin.php # Area admin (dashboard, i40, menu management) `

    Controllers

    ` app/Http/Controllers/ β”œβ”€β”€ Auth/ β”‚ β”œβ”€β”€ LoginController.php β”‚ └── RoleSelectorController.php β”œβ”€β”€ Admin/ β”‚ β”œβ”€β”€ Dashboard/DashboardController.php β”‚ β”œβ”€β”€ I40/Machines/MachinesController.php β”‚ └── Systems/Menu/MenuController.php (CRUD menu, reorder) `

    Models

    ` app/Models/ β”œβ”€β”€ User.php # HasRoles trait β”œβ”€β”€ Menu.php └── MenuItem.php `

    Services

    ` app/Services/ └── MenuService.php # Logica albero menu `

    Middleware

    ` app/Http/Middleware/ └── EnsureActiveRole.php `

    Views

    ` resources/views/ β”œβ”€β”€ layouts/ β”‚ β”œβ”€β”€ auth.blade.php # Layout login (1/3 - 2/3) β”‚ └── admin.blade.php # Layout admin area β”œβ”€β”€ auth/ β”‚ β”œβ”€β”€ login.blade.php β”‚ └── select-role.blade.php └── admin/ β”œβ”€β”€ dashboard/index.blade.php β”œβ”€β”€ i40/machines/connected.blade.php └── systems/menu/ β”œβ”€β”€ index.blade.php # Gestione menu β”œβ”€β”€ create.blade.php └── edit.blade.php `

    Database

    ` database/ β”œβ”€β”€ migrations/ β”‚ β”œβ”€β”€ 2025_10_16_152934_create_menus_table.php β”‚ └── 2025_10_16_152940_create_menu_items_table.php └── seeders/ β”œβ”€β”€ RolesSeeder.php β”œβ”€β”€ SuperAdminSeeder.php └── MenuSeeder.php `

    ---

    πŸ”§ Configurazione

    .env (chiavi importanti)

    `env APP_URL=https://sartup.it/sartup/public SESSION_PATH=/sartup/public

    DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=capera_sartupDB DB_USERNAME=capera_sartup DB_PASSWORD=EpuggA2025-! `

    Service Provider

  • app/Providers/AppServiceProvider.php:
  • - Gate::before() per super-admin bypass

    bootstrap/app.php

  • Registrato middleware EnsureActiveRole
  • ---

    πŸ› Problemi Risolti

    1. Composer Installation

    Errore: allow_url_fopen = Off, ext-fileinfo mancante Fix: Abilitato allow_url_fopen in php.ini, usato --ignore-platform-req=ext-fileinfo

    2. Login 500 Error

    Causa:
    auth()->user()->hasRole() su utente null Fix: Usato direttiva Blade @role() di Spatie

    3. in_array() Argument #2 Error

    Causa: required_roles in DB era doppio-encoded JSON Fix: Corretto JSON in DB, aggiornato MenuSeeder per usare casting Eloquent

    4. Redirect Loop Login

    Causa:
    route_name NULL per "Industria 4.0", APP_URL e SESSION_PATH errati Fix: Aggiornato DB con route corretta, corretto .env

    5. Dropdown Utente non Cliccabile

    UX: Area cliccabile troppo piccola Fix: Aumentato padding, migliorato stile
    <details>

    6. Menu "Servizio" Visibile Sempre

    Causa: Check
    @role('super-admin') invece di session('active_role') Fix: Controllo esplicito su session('active_role') === 'super-admin'

    7. MenuController::middleware() Undefined

    Causa:
    Controller base troppo minimale Fix: Ripristinato AuthorizesRequests e ValidatesRequests traits

    8. Drag&Drop Reorder 500

    Causa: Metodo
    reorder() mancante Fix: Implementato con transazione DB e helper ricorsivo applyOrder()

    9. Sidebar data-node Array Error

    Causa: Sintassi errata {{ ['id'] }} invece di {{ $l2['id'] }} Fix: Corretto attributi data-node

    10. htmlspecialchars() Array Given

    Causa: Placeholder {{ ['label'] }} residui dopo sed Fix: Sostituiti con {{ $l3['label'] }}, {{ $l4['label'] }}

    11. Syntax Error "unexpected token ="

    Causa: Blocco
    @php corrotto con variabili senza nome Fix: Ripristinato header completo con tutte le variabili

    12. UIkit Migration Rollback

    Richiesta: Tornare a Tailwind dopo test UIkit Fix: Ripristinata versione precedente Tailwind funzionante

    ---

    🎨 Features UI

  • Elementi <details> per L2/L3
  • Stato persistente in sessionStorage (scope: path-based)
  • Icone chevron ruotabili (CSS group-open:rotate-180)
  • Evidenziazione Voce Attiva

  • Match esatto route: request()->routeIs($routeName)
  • Classi: text-blue-600 font-medium bg-blue-50
  • Tabella con icone, badge, hover effects
  • CRUD completo (create, edit, delete)
  • Ordinamento gerarchico
  • Colonna "URL" nascosta per UX pulita
  • ---

    πŸ“¦ Dipendenze Principali

    `json { "require": { "php": "^8.2", "laravel/framework": "^11.0", "spatie/laravel-permission": "^6.0" } } `

    Frontend:

  • Tailwind CSS 3.x (CDN)
  • ---

    πŸš€ Prossimi Step Suggeriti

    1. Industria 4.0 - Macchine Collegate: - Implementare controller/model per gestione macchine - CRUD completo - Dashboard con statistiche real-time

    2. Placeholder Views: - admin/dashboard/index.blade.php β†’ Dashboard con widget - admin/i40/machines/connected.blade.php β†’ Lista macchine

    3. Permessi Granulari: - Definire permissions specifiche (es. machines.view, machines.edit) - Assegnare a ruoli

    4. Form Validation: - Request classes per CRUD menu - Validazione lato server

    5. Testing: - Feature tests per auth flow - Unit tests per MenuService

    6. Performance: - Cache menu tree - Eager loading relazioni

    7. Security Hardening: - Rate limiting login - CSRF token refresh - Input sanitization

    ---

    πŸ“ Note Importanti

  • Super-admin bypassa tutti i gate tramite Gate::before()
  • Ruolo attivo gestito in sessione, non in DB
  • Menu supporta JSON per required_roles e required_permissions
  • Sidebar usa sessionStorage per persistenza stato (non cookie)
  • Route naming: pattern admin.area.resource.action
  • ---

  • URL Produzione: https://sartup.it/sartup/public
  • Login: https://sartup.it/sartup/public/login
  • Dashboard: https://sartup.it/sartup/public/admin/dashboard
  • Menu Management: https://sartup.it/sartup/public/admin/systems/menu

---

πŸ‘€ Credenziali Test

` Email: root@sartup.local Password: ChangeMe! Ruoli: super-admin, admin ``

---

Documento generato: 16 Ottobre 2025 Versione Laravel: 11.46.1 PHP: 8.2.29

Analisi Codice

Blocco 1
routes/
β”œβ”€β”€ auth.php          # Login, logout, reset password, selezione ruolo
└── admin.php         # Area admin (dashboard, i40, menu management)
Blocco 2
app/Http/Controllers/
β”œβ”€β”€ Auth/
β”‚   β”œβ”€β”€ LoginController.php
β”‚   └── RoleSelectorController.php
β”œβ”€β”€ Admin/
β”‚   β”œβ”€β”€ Dashboard/DashboardController.php
β”‚   β”œβ”€β”€ I40/Machines/MachinesController.php
β”‚   └── Systems/Menu/MenuController.php (CRUD menu, reorder)
Blocco 3
app/Models/
β”œβ”€β”€ User.php          # HasRoles trait
β”œβ”€β”€ Menu.php
└── MenuItem.php
Blocco 4
app/Services/
└── MenuService.php   # Logica albero menu
Blocco 5
app/Http/Middleware/
└── EnsureActiveRole.php
Blocco 6
resources/views/
β”œβ”€β”€ layouts/
β”‚   β”œβ”€β”€ auth.blade.php       # Layout login (1/3 - 2/3)
β”‚   └── admin.blade.php      # Layout admin area
β”œβ”€β”€ auth/
β”‚   β”œβ”€β”€ login.blade.php
β”‚   └── select-role.blade.php
└── admin/
    β”œβ”€β”€ dashboard/index.blade.php
    β”œβ”€β”€ i40/machines/connected.blade.php
    └── systems/menu/
        β”œβ”€β”€ index.blade.php  # Gestione menu
        β”œβ”€β”€ create.blade.php
        └── edit.blade.php
Blocco 7
database/
β”œβ”€β”€ migrations/
β”‚   β”œβ”€β”€ 2025_10_16_152934_create_menus_table.php
β”‚   └── 2025_10_16_152940_create_menu_items_table.php
└── seeders/
    β”œβ”€β”€ RolesSeeder.php
    β”œβ”€β”€ SuperAdminSeeder.php
    └── MenuSeeder.php
Blocco 8 env
APP_URL=https://sartup.it/sartup/public
SESSION_PATH=/sartup/public

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=capera_sartupDB
DB_USERNAME=capera_sartup
DB_PASSWORD=EpuggA2025-!
Blocco 9 json
{
  "require": {
    "php": "^8.2",
    "laravel/framework": "^11.0",
    "spatie/laravel-permission": "^6.0"
  }
}
Blocco 10
Email: root@sartup.local
Password: ChangeMe!
Ruoli: super-admin, admin