Plataforma web interactiva para explorar y compartir información sobre el océano profundo y sus misterios.
- Sobre el Proyecto
- Características
- Tecnologías
- Requisitos Previos
- Instalación
- Configuración
- Scripts Disponibles
- Estructura del Proyecto
- Rutas de la Aplicación
- Sistema de Autenticación
- Gestión de Estado
- Componentes Principales
- Despliegue
- Equipo
Código Abisal es una aplicación web educativa y colaborativa que permite a los usuarios explorar, crear y compartir artículos sobre el fascinante mundo del océano profundo.
La plataforma ofrece una experiencia visual inmersiva con un fondo animado de fluidos que simula las corrientes marinas, proporcionando una interfaz única y atractiva para descubrir contenido sobre fauna abisal, ecosistemas, exploración y conservación marina.
Contexto: Este proyecto fue desarrollado como parte del Bootcamp Fullstack de Femcoders (Factoría F5), con fines educativos y de divulgación científica.
- 🔍 Búsqueda y Filtrado: Encuentra artículos por categoría o término de búsqueda
- 📱 Diseño Responsivo: Experiencia óptima en dispositivos móviles, tablets y escritorio
- 🎨 Interfaz Visual Única: Fondo animado con efectos de fluido líquido
- 📖 Lectura de Artículos: Acceso completo a todos los artículos publicados
- ✍️ Crear Artículos: Publica tu propio contenido con editor enriquecido
- 📝 Editar Artículos: Modifica tus propias publicaciones
- 🖼️ Subida de Imágenes: Carga imágenes desde tu dispositivo o usa URLs
- 😀 Editor de Texto Rico: Formato avanzado con soporte para emojis
- ❤️ Sistema de Likes: Interactúa con el contenido
- 👥 Gestión de Usuarios: Administra roles y permisos
- 📊 Panel de Control: Vista general de artículos y usuarios
- ✏️ Edición Global: Modifica cualquier artículo de la plataforma
- 🗑️ Eliminación de Contenido: Control total sobre artículos y usuarios
- React 19.1.1 - Biblioteca de interfaz de usuario
- Vite 7.1.7 - Build tool y servidor de desarrollo
- React Router DOM 7.9.2 - Navegación y enrutamiento
- Zustand 5.0.8 - Gestión de estado global
- Axios 1.12.2 - Cliente HTTP para peticiones API
- TipTap 3.6.5 - Editor de texto enriquecido
- Emoji Picker React 4.14.0 - Selector de emojis
- Lucide React 0.545.0 - Iconos modernos
- React Multi Carousel 2.8.6 - Carrusel de artículos
- Three.js 0.180.0 - Animaciones 3D y efectos visuales
- DOMPurify 3.2.7 - Sanitización de HTML
- Headless UI 2.2.9 - Componentes UI accesibles
- ESLint 9.36.0 - Linter para calidad de código
- SWC - Compilador super rápido de JavaScript/TypeScript
Antes de comenzar, asegúrate de tener instalado:
- Node.js (versión 18.0 o superior)
- npm o yarn (gestor de paquetes)
- Backend de Código Abisal => ver repositorio backend
git clone https://github.com/Codigo-Inmersion/codigo-abisal-client.git
cd codigo-abisal-clientnpm installCrea un archivo .env en la raíz del proyecto:
cp .env.example .envEdita el archivo .env y configura la URL del backend:
VITE_API_URL=http://localhost:8000
⚠️ Importante: Asegúrate de que el backend esté corriendo en el puerto especificado.
Si deseas usar la función de subida de imágenes, configura Cloudinary:
- Crea una cuenta en Cloudinary
- Crea un preset de subida sin autenticación
- Actualiza la configuración en
src/components/common/ArticleForm/ArticleForm.jsx:
data.append('upload_preset', 'tu_preset_aqui');
// ...
'https://api.cloudinary.com/v1_1/tu_cloud_name/image/upload'# Iniciar servidor de desarrollo
npm run dev
# Compilar para producción
npm run build
# Previsualizar build de producción
npm run preview
# Ejecutar linter
npm run lintLa aplicación estará disponible en: http://localhost:5174
src/
├── api/ # Configuración de cliente HTTP
│ └── client.js # Cliente Axios con interceptores
├── assets/ # Recursos estáticos
│ ├── icons/
│ └── images/
├── components/ # Componentes React
│ ├── admin/ # Componentes de administración
│ │ ├── ArticlesTable/
│ │ └── UsersTable/
│ ├── common/ # Componentes reutilizables
│ │ ├── ArticleForm/
│ │ ├── ArticleList/
│ │ ├── Button/
│ │ ├── Carousel/
│ │ ├── DetailArticle/
│ │ ├── Footer/
│ │ ├── Forms/
│ │ ├── Modal/
│ │ ├── NavBar/
│ │ ├── ProtectedRoute/
│ │ └── RichTextEditor/
│ └── layout/ # Layouts de la aplicación
│ ├── Background/
│ ├── Layout_Admin/
│ ├── Layout_Intro/
│ ├── Layout_User/
│ └── LiquidEther/
├── hooks/ # Custom Hooks
│ ├── useArticles.js
│ └── useAuth.js
├── pages/ # Páginas de la aplicación
│ ├── admin/
│ │ ├── dashboardPage/
│ │ ├── CreateArticlePage.jsx
│ │ └── EditArticlePage.jsx
│ └── user/
│ ├── categoryPage/
│ ├── forbiddenPage/
│ ├── homePage/
│ ├── DetailPage.jsx
│ ├── LoginPage.jsx
│ └── RegisterPage.jsx
├── router/ # Configuración de rutas
│ └── AbisalRoutes.jsx
├── services/ # Servicios de API
│ ├── AbisalServices.jsx
│ ├── AuthServices.jsx
│ └── UserServices.jsx
├── stores/ # Gestión de estado global
│ └── authStore.js
├── styles/ # Estilos globales
│ └── index.css
└── main.jsx # Punto de entrada
| Ruta | Componente | Descripción |
|---|---|---|
/ |
HomePage | Página principal con carrusel de artículos |
/article/:id |
DetailPage | Vista detallada de un artículo |
/category/:categoryName |
CategoryPage | Artículos filtrados por categoría |
/login |
LoginPage | Inicio de sesión |
/register |
RegisterPage | Registro de nuevos usuarios |
| Ruta | Componente | Rol Requerido | Descripción |
|---|---|---|---|
/article/create |
CreateArticlePage | Usuario/Admin | Crear nuevo artículo |
/article/edit/:id |
EditArticlePage | Autor/Admin | Editar artículo existente |
| Ruta | Componente | Descripción |
|---|---|---|
/admin/dashboard |
DashboardPage | Panel de control con gestión de artículos y usuarios |
| Ruta | Componente | Descripción |
|---|---|---|
/403 |
ForbiddenPage | Acceso denegado |
- Login/Register → El usuario envía credenciales al backend
- Token JWT → El backend devuelve un token JWT
- Decodificación → El frontend decodifica el token para extraer datos del usuario
- Almacenamiento → Token y datos se guardan en localStorage y Zustand
- Interceptor → Todas las peticiones incluyen automáticamente el token
// Usuario Regular
{
role: "user"
// Puede: ver, crear y editar sus propios artículos
}
// Administrador
{
role: "admin"
// Puede: todo lo anterior + gestionar usuarios + editar/eliminar cualquier contenido
}// Estado global de autenticación
{
token: string | null, // Token JWT
user: { // Datos del usuario
id: number,
email: string,
role: 'user' | 'admin',
exp: number,
iat: number
} | null,
isLoading: boolean
}
// Acciones disponibles
- login(token) // Guardar sesión
- logout() // Cerrar sesión
- isAuthenticated() // Verificar si hay sesión activa
- hasRole(role) // Verificar rol del usuarioimport useAuthStore from '../stores/authStore';
function MyComponent() {
const { user, token, logout } = useAuthStore();
return (
{user && Bienvenido, {user.email}}
Cerrar sesión
);
}Editor completo de artículos con:
- Campo de título y descripción
- Editor de texto enriquecido (TipTap)
- Selector de categoría
- Subida de imágenes (archivo o URL)
- Validaciones en tiempo real
Carrusel responsivo de artículos con:
- Navegación táctil y por flechas
- Diseño adaptable
- Vista previa de imagen, título y descripción
Componente modal reutilizable con:
- Animaciones de entrada/salida
- Fondo con blur
- Cierre por clic fuera o botón X
Guardia de seguridad para rutas que:
- Verifica autenticación (token)
- Valida roles de usuario
- Redirige según permisos
Simulación de fluidos líquidos usando Three.js:
- Modo automático cuando no hay interacción
- Optimizado para rendimiento
Efecto de cristal esmerilado en tarjetas:
background: rgba(255, 255, 255, 0.05);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.1);// Configuración base
baseURL: import.meta.env.VITE_API_URL || "http://localhost:8000"
// Interceptores
Request: Agrega token JWT automáticamente
Response: Maneja errores 401 (no autorizado)getAbisalArticles()- Obtener todos los artículosgetArticleById(id)- Obtener artículo por IDcreateArticle(data)- Crear nuevo artículoupdateArticle(id, data)- Actualizar artículodeleteArticle(id)- Eliminar artículolikeArticle(id)- Dar like a artículounlikeArticle(id)- Quitar like de artículo
login(email, password)- Iniciar sesiónregister(userData)- Registrar usuario
getAllUsers()- Obtener todos los usuariosupdateUserRole(id, role)- Cambiar rol de usuariodeleteUser(id)- Eliminar usuario
# Generar build optimizado
npm run build
# Los archivos se generarán en la carpeta 'dist/'Asegúrate de configurar:
VITE_API_URL=https://codigo-abisal-server-api-dev.onrender.com/O para local:
VITE_API_URL=http://localhost:8000Este proyecto fue desarrollado por:
| Desarrolladora | GitHub | |
|---|---|---|
| Camila Arenas | GitHub | |
| Gema Yébenes | GitHub | |
| Mariana Moreno | GitHub | |
| Olga Ramírez | GitHub | |
| Rocio Coronel | GitHub |
Bootcamp: Fullstack Web Development
Organización: Femcoders - Factoría F5
Año: 2025
- El frontend espera respuestas en formato:
{ ok: boolean, data: any, error?: string } - Todos los endpoints protegidos deben validar el token JWT en el header
Authorization: Bearer <token> - El token debe incluir:
{ userId, email, role, iat, exp }
- Nunca commitear el archivo
.env - Las contraseñas deben tener mínimo 6 caracteres
- El token se almacena en localStorage
- El editor de texto no soporta pegar imágenes directamente
- En iOS, el tipo de float para texturas puede causar problemas de rendimiento
Este proyecto es con fines educativos y no tiene licencia comercial.
¿Preguntas o sugerencias?
Este proyecto está en desarrollo activo. Si encuentras algún bug o tienes ideas para mejorar, no dudes en abrir un issue o contactar al equipo.
Desarrollado con 💙 por el equipo de Código Abisal
