Sistema integral de gestión y monitoreo de calidad de agua. Plataforma web moderna para administrar datos de análisis, puntos de muestreo, infraestructuras y visualización geoespacial.
- ✅ Carga y gestión de datos - Importar análisis desde Excel
- ✅ Panel de administración - Gestión de:
- Personal (operarios)
- Unidades operativas
- Zonas geográficas
- Infraestructuras
- Puntos de muestreo
- ✅ Visualización en mapas - Mapa interactivo de puntos de muestreo con Leaflet
- ✅ Tablas analíticas - Visualización y análisis de datos
- ✅ Autenticación - Integración con Azure AD (MSAL)
- ✅ Tema oscuro/claro - Soporte completo de dark mode
- ✅ Seguridad de sesión - Timeout automático y renovación de sesión
- ✅ Control de roles - Sistema de permisos basado en roles de usuario
- Frontend: Vue 3 (Composition API +
<script setup>) - Build Tool: Vite
- Estilos: Tailwind CSS 3
- Ruteo: Vue Router 4 (hash-based)
- Estado: Pinia
- UI Components: PrimeVue 4
- Formularios: FormKit + Vueform
- Base de datos: Supabase
- Autenticación: Azure AD (MSAL)
- Mapas: Leaflet + Vue Leaflet
- Exportación: jsPDF + xlsx
- Gráficos: Chart.js
- Node.js 16+
- npm o yarn
- Doppler CLI (para gestión de variables de entorno)
# Clonar repositorio
git clone <repo-url>
cd sinaq
# Instalar dependencias
npm install
# Configurar variables de entorno con Doppler
doppler setup# Desarrollo
npm run dev
# Build staging
npm run build:staging
# Build producción
npm run build
# Preview build
npm run preview
# Lint + autofix
npm run lintLa aplicación se ejecutará en http://localhost:3000 (o el puerto configurado en VITE_DEV_PORT).
Variables requeridas en Doppler:
VITE_SUPABASE_URL- URL del proyecto SupabaseVITE_SUPABASE_ANON_KEY- Clave anónima de SupabaseVITE_MICROSOFT_CLIENT_ID- Client ID de Azure ADVITE_MICROSOFT_TENANT_ID- Tenant ID de Azure ADVITE_BASE_URL- Base path de deployment (default:/sinaq/)VITE_DEV_PORT- Puerto de desarrollo (default: 3000)
src/
├── components/ # Componentes reutilizables
├── composables/ # Lógica compartida (hooks)
├── constants/ # Constantes globales
├── helpers/ # Funciones auxiliares
├── layouts/ # Layouts principales
├── router/ # Configuración de ruteo
├── services/ # Servicios (API, autenticación, BD)
├── stores/ # Estado global (Pinia)
├── views/ # Páginas/Vistas
├── assets/ # Recursos estáticos
├── App.vue # Componente raíz
└── main.js # Punto de entrada
- Método: Azure AD (Microsoft Entra)
- Librería: MSAL (@azure/msal-browser)
- Tipo de login: Popup en desktop, redirect en mobile
- Session timeout: 30 minutos de inactividad
- Auto-logout: Se ejecuta automáticamente tras expiración
- Admin - Rol '99', 99 o 'admin' (acceso a panel de administración)
- Usuario estándar - Acceso a visualización y formularios
- Rutas protegidas - Verificadas en guardias de Router
/- Home (Excel uploader)/login- Autenticación/mapa- Visualización de puntos en mapa/tablaAnaliticas- Tabla de datos analíticos/forms- Formulario de análitica/admin/operarios- Gestión de personal/admin/unidadesOperativas- Gestión de unidades/admin/zonas- Gestión de zonas/admin/infraestructuras- Gestión de infraestructuras/admin/puntosMuestreo- Gestión de puntos de muestreo
Controlado por Pinia store darkMode. Usa clases CSS dark: de Tailwind.
Ver src/colors.js para paleta de colores personalizada.
src/menuAside.js- Menú lateralsrc/menuNavBar.js- Barra superior
npm run buildSube el contenido de dist/ a tu servidor:
# Ejemplo: servidor Apache
scp -r dist/* user@server:/var/www/apps.aqlara.com/sinaq/mod_rewrite- Para Vue Routermod_headers- Para CORS y headers de seguridad.htaccessconfigurado (se copia automáticamente desdepublic/.htaccess)
- Verificar que
.htaccessexiste en el directorio de despliegue - Revisar permisos:
644para archivos,755para directorios - Confirmar que
mod_rewriteymod_headersestán habilitados en Apache
- Session timeout: 30 minutos de inactividad
- Se renueva automáticamente con cada actividad del usuario
- Check:
src/stores/login.js
MIT
Alejandro Mínguez Escriba
Para reportar issues o sugerencias, contactar al equipo de desarrollo de AQLARA (alejandro.minguez@aqlara.com)