Aplicación web construida con Vue 3 + Vite para la gestión interna de la Curaduría Urbana 2 de Cartagena. Incluye autenticación, gestión de publicaciones (listado, creación y edición), transiciones amigables entre vistas, paginación local y carga incremental.
Esta aplicación consume la API del proyecto "API Curaduría 2 Cartagena". Puedes consultar su código y documentación aquí:
- Repositorio: fernastereo/apiCuraduria2ca
Nota: Los nombres de campos de subida de archivo pueden diferir según la versión del backend. Este frontend envía multipart/form-data con datos (JSON string) y archivo (File). Si tu backend espera otro nombre (por ejemplo publicacionFile), ajusta el nombre del campo en usePublicaciones.js para alinearlo con la API del repositorio anterior.
- Node.js 18 o superior (recomendado)
- npm 9 o superior
npm installCrea un archivo .env.local en la raíz del proyecto con la URL base del API:
VITE_BASE_API_URL=https://tu-api.example.com
VITE_BASE_URL=/carpeta-instalacion/
VITE_AWS_URL=https://tu-ruta-al-bucket-de-aws-s3.comEndpoints usados actualmente por la app:
- Autenticación:
POST /login,POST /register - Publicaciones:
GET /publicaciones,GET /publicaciones/:id,POST /publicaciones,PUT /publicaciones/:id,DELETE /publicaciones/:id - Tipos de publicación:
GET /tipos-publicacion
Notas importantes para el backend:
- En creación/edición de publicaciones se envía
multipart/form-datacon:datos: JSON string con el payloadarchivo: File (opcional en edición)
- No establecer manualmente el header
Content-Typepara FormData (el navegador lo define con el boundary correcto).
# Desarrollo (hot reload)
npm run dev
# Compilación producción
npm run build
# Previsualizar build
npm run preview
# Pruebas unitarias (Vitest)
npm run test:unitsrc/main.js: bootstrap de la appsrc/router/index.js: rutas públicas y protegidas, anidadas enhomesrc/views/: vistas de nivel superior (LoginView,RegisterView,HomeView,PublicacionesView)src/components/publicaciones/: componentes de Publicaciones (PublicacionesList.vue,PublicacionesForm.vue)src/composables/: lógica reutilizable (useAuth.js,usePublicaciones.js,useTiposPublicacion.js)src/assets/: recursos estáticos y estilos
GET /→LoginViewGET /register→RegisterViewGET /home→ layout autenticado (contiene rutas hijas)GET /home/publicaciones→PublicacionesList.vueGET /home/publicaciones/nuevo→PublicacionesForm.vue(creación)GET /home/publicaciones/editar/:id→PublicacionesForm.vue(edición)
La vista PublicacionesView.vue envuelve al <RouterView> con una transición suave para mejorar la UX al cambiar entre lista y formulario.
Composable en src/composables/useAuth.js que maneja:
login({ username, password })logout()checkAuth()register({ username, password, email, nombre })→ el login se realiza automáticamente tras un registro exitosotoken,user,authError,isAuthenticated
Uso básico en RegisterView.vue:
const { register } = useAuth()
await register({ username, password, email, nombre })Composable en src/composables/usePublicaciones.js que expone:
- Estado:
publicaciones(paginadas localmente),publicacionesFiltradas,filtros,loading,loadingBackground,paginacion,totalPaginas,apiError - Métodos:
getPublicacionesIniciales()→ carga 10 primeras y dispara carga en background del resto del año actualgetPublicacionById(id)createPublicacion(payload)updatePublicacion(id, payload)deletePublicacion(id)actualizarFiltros(partial)/limpiarFiltros()cambiarPagina(n)/cambiarPorPagina(n)
Payload para crear/editar publicaciones (campo datos dentro de FormData):
{
"fecha": "2024-03-21",
"fechapublicacion": "2024-03-22",
"referencia": "PUB-2024-001",
"archivo": "documentos/resolucion_123_2024.pdf",
"estado": 1,
"tipopublicacion_id": 1
}Respuesta esperada del API:
{
"status": "success",
"data": [
{
"id": 1,
"fecha": "2024-03-21",
"fechapublicacion": "2024-03-22",
"referencia": "PUB-2024-001",
"archivo": "documentos/resolucion_123_2024.pdf",
"estado": 1,
"tipopublicacion_id": 1,
"tipo_descripcion": "COMUNICACION A VECINOS"
}
]
}Características clave implementadas:
- Carga inicial rápida: 10 publicaciones al primer render
- Carga incremental en background: resto del año actual sin bloquear UI
- Filtros locales: búsqueda por
referencia,tipopublicacion_id,estado - Paginación local: selector de tamaño de página y navegación (primera, anterior, siguiente, última)
- Formato de fecha en tabla:
DD-MM-YYYY
Composable en src/composables/useTiposPublicacion.js:
tiposPublicacion,loading,apiErrorgetTiposPublicacion()
Se usa en PublicacionesForm.vue y PublicacionesList.vue para poblar selects dinámicos desde el API GET /tipos-publicacion.
PublicacionesList.vue- Lista con filtros, paginación local, botón "Nueva Publicación"
- Indicador de carga incremental en background
- Acciones: ver, editar, eliminar (con confirmación)
PublicacionesForm.vue- Creación y edición
- Subida de archivo con drag & drop
- En edición, selector de
estado - Notificaciones de éxito/error y redirección tras guardar
- Tailwind CSS
- Heroicons
- Transiciones entre vistas en
PublicacionesView.vue
- Vitest + Vue Test Utils (
npm run test:unit)
- Configura variables de entorno a usar en el servidor
- Genera build de producción:
npm run build- Sirve la carpeta
dist/con tu servidor estático preferido o integra con tu plataforma de hosting.
- CORS: asegúrate de permitir el origen del front en el API
- Subida de archivos: no fuerces
Content-Type; usaFormData - Tokens:
useAuthpersiste token/usuario enlocalStorage
- Vue 3 Composition API y
<script setup> - Composables centralizan llamadas a API y estados
- Filtros y paginación se manejan en cliente para respuesta inmediata
Si necesitas ampliar esta documentación (p. ej., modelos de datos, roles/permisos, o pipeline CI/CD), avísame y lo integramos.