📚 Aplicación web para registrar y reseñar libros, inspirada en Letterboxd pero orientada a lecturas.
Proyecto personal de portfolio, construido con un stack sencillo y mantenible.
- Backend: Laravel 11 + Blade
- Base de datos: PostgreSQL (vía DDEV)
- Frontend: SCSS compilado con Vite (sin Tailwind ni Bootstrap)
- Tooling: Node.js 20 (Vite para assets)
- Entorno: DDEV (Docker), PHP 8.2, nginx-fpm
Requisitos: DDEV → https://ddev.readthedocs.io/en/stable/
# Clonar repositorio
git clone git@github.com:CristianSG2/ReadOn.git
cd ReadOn
# Iniciar entorno
ddev start
# Dependencias PHP
ddev composer install
# Dependencias JS
ddev npm install
# Clave de aplicación
ddev artisan key:generate
# Migraciones (users, sessions, etc.)
ddev artisan migrate
# Compilar assets (producción) — o usa `ddev npm run dev` para desarrollo
ddev npm run build
# Abrir
ddev launch # https://readon.ddev.siteNotas
- Ajusta
APP_URLahttps://readon.ddev.site(o tu host DDEV). public/build/*está ignorado en.gitignore(assets generados por Vite).
- Rutas:
GET /login,POST /login,GET /register,POST /register,
POST /logout,GET /me(protegida) - Seguridad:
- CSRF en formularios.
session()->regenerate()tras login.logout:invalidate()+regenerateToken().- Throttle de login: 5 intentos/min por email+IP.
- Redirecciones:
- Con sesión,
/loginy/register→ /me. - Sin sesión,
/me→ /login.
- Con sesión,
GET /login → Auth\LoginController@showLoginForm
POST /login → Auth\LoginController@login (throttle:login)
GET /register → Auth\RegisterController@showRegisterForm
POST /register → Auth\RegisterController@register
POST /logout → Auth\LoginController@logout
GET /me → (auth) vista de perfil
resources/views/layouts/app.blade.php— layout principal (cabecera/nav)resources/views/welcome.blade.php— landing mínima (tema oscuro)resources/views/auth/login.blade.php— formulario de loginresources/views/auth/register.blade.php— formulario de registroresources/views/me.blade.php— perfil protegidoresources/scss/app.scss— estilos (paleta en variables CSS)resources/js/app.js— entrada JS para Vite
- ✔️ Laravel 11 + PostgreSQL (DDEV) funcionando
- ✔️ Vite para SCSS/JS configurado
- ✔️ Auth manual: login/registro/logout +
/meprotegida - ✔️ Tema oscuro base (sin frameworks CSS)
- Google Books API → servicio PHP, búsqueda de libros, ficha detalle.
- Logs de lectura → modelo
logs, migración y CRUD básico (estado/rating/reseña por usuario). - Perfil de usuario → página “Mi perfil” con lecturas guardadas y estadísticas simples.
- Estilos con Sass → organización en partials (variables, layout, componentes: cards, botones, inputs).
- Mejoras de UX → paginación en búsqueda, mensajes flash, validaciones en frontend.
- Deploy → Koyeb / Render,
.envde producción,artisan config:cache,route:cache, etc. - Documentación → README final, capturas de pantalla e instrucciones para portfolio.
# Desarrollo (watch)
ddev npm run dev
# Build de producción
ddev npm run build
# Limpiar cachés de Laravel (rutas/config/views)
ddev artisan optimize:clear-
Vite: “Unable to locate file in Vite manifest: resources/css/app.css”
→ Usa@vite(['resources/scss/app.scss','resources/js/app.js'])y ejecutaddev npm run build. -
/login y /register no redirigen a /me con sesión
→ Enbootstrap/app.php, alias:
guest => App\Http\Middleware\RedirectIfAuthenticated::class.
Limpia cachés:ddev artisan optimize:clear. -
/me no protege sin sesión
→ Enbootstrap/app.php, alias:
auth => App\Http\Middleware\Authenticate::class.
EnAuthenticate::redirectTo(), devuelveroute('login'). -
Throttle no aplica
→ DefineRateLimiter::for('login', ...)enAppServiceProvider::boot()
y aplica->middleware('throttle:login')aPOST /login.
Este proyecto se distribuye bajo la MIT License.
Consulta el archivo LICENSE para más detalles.