Initial commit: Sistema Autoparts DB

- Base de datos SQLite con información de vehículos
- Dashboard web con Flask y Bootstrap
- Scripts de web scraping para RockAuto
- Interfaz CLI para consultas
- Documentación completa del proyecto

Incluye:
- 12 marcas de vehículos
- 10,923 modelos
- 10,919 especificaciones de motores
- 12,075 combinaciones modelo-año-motor
This commit is contained in:
2026-01-19 08:45:03 +00:00
commit f395d67136
59 changed files with 10881 additions and 0 deletions

367
dashboard/index.html Normal file
View File

@@ -0,0 +1,367 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Base de Datos de Vehículos</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<style>
:root {
--primary-color: #2c3e50;
--secondary-color: #3498db;
--accent-color: #e74c3c;
--bg-color: #ecf0f1;
}
body {
background-color: var(--bg-color);
min-height: 100vh;
}
.dashboard-header {
background: linear-gradient(135deg, var(--primary-color), #1a252f);
color: white;
padding: 2rem 0;
margin-bottom: 2rem;
}
.breadcrumb-nav {
background: white;
padding: 1rem 1.5rem;
border-radius: 10px;
margin-bottom: 1.5rem;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.breadcrumb-nav .breadcrumb {
margin-bottom: 0;
}
.breadcrumb-nav .breadcrumb-item a {
color: var(--secondary-color);
text-decoration: none;
font-weight: 500;
}
.breadcrumb-nav .breadcrumb-item a:hover {
color: var(--primary-color);
}
.breadcrumb-nav .breadcrumb-item.active {
color: var(--primary-color);
font-weight: 600;
}
/* Tarjetas de marcas */
.brand-card {
background: white;
border-radius: 15px;
padding: 2rem;
text-align: center;
transition: all 0.3s ease;
cursor: pointer;
border: 2px solid transparent;
height: 100%;
}
.brand-card:hover {
transform: translateY(-10px);
box-shadow: 0 15px 30px rgba(0,0,0,0.15);
border-color: var(--secondary-color);
}
.brand-card .brand-icon {
width: 80px;
height: 80px;
background: linear-gradient(135deg, var(--secondary-color), #2980b9);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto 1rem;
font-size: 2rem;
color: white;
}
.brand-card .brand-name {
font-size: 1.3rem;
font-weight: 700;
color: var(--primary-color);
margin-bottom: 0.5rem;
}
.brand-card .brand-count {
color: #7f8c8d;
font-size: 0.9rem;
}
.brand-card .brand-country {
font-size: 0.85rem;
color: #95a5a6;
margin-top: 0.5rem;
}
/* Tarjetas de modelos */
.model-card {
background: white;
border-radius: 12px;
padding: 1.5rem;
transition: all 0.3s ease;
cursor: pointer;
border: 2px solid transparent;
height: 100%;
}
.model-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 25px rgba(0,0,0,0.12);
border-color: var(--secondary-color);
}
.model-card .model-name {
font-size: 1.2rem;
font-weight: 600;
color: var(--primary-color);
margin-bottom: 0.5rem;
}
.model-card .model-info {
color: #7f8c8d;
font-size: 0.9rem;
}
/* Tarjetas de vehículos */
.vehicle-card {
background: white;
border-radius: 12px;
overflow: hidden;
transition: all 0.3s ease;
height: 100%;
}
.vehicle-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 25px rgba(0,0,0,0.12);
}
.vehicle-header {
background: linear-gradient(135deg, var(--primary-color), #1a252f);
color: white;
padding: 1.2rem;
}
.vehicle-header .vehicle-title {
font-size: 1.1rem;
font-weight: 600;
margin-bottom: 0.3rem;
}
.vehicle-header .vehicle-engine {
font-size: 0.9rem;
opacity: 0.9;
}
.vehicle-body {
padding: 1rem;
}
.vehicle-specs {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 0.8rem;
}
.spec-item {
background: var(--bg-color);
padding: 0.6rem;
border-radius: 8px;
text-align: center;
font-size: 0.85rem;
}
.spec-item i {
color: var(--secondary-color);
margin-bottom: 0.3rem;
display: block;
}
.spec-item .spec-value {
font-weight: 600;
color: var(--primary-color);
}
/* Filtros en vista de vehículos */
.filters-bar {
background: white;
padding: 1rem 1.5rem;
border-radius: 10px;
margin-bottom: 1.5rem;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.filters-bar .form-select {
border-radius: 8px;
}
/* Grid de contenido */
.content-grid {
display: grid;
gap: 1.5rem;
}
.content-grid.brands-grid {
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
}
.content-grid.models-grid {
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
}
.content-grid.vehicles-grid {
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
}
/* Estados */
.loading-state, .empty-state {
text-align: center;
padding: 4rem 2rem;
color: #7f8c8d;
}
.loading-state i, .empty-state i {
font-size: 4rem;
margin-bottom: 1rem;
color: #bdc3c7;
}
/* Botón volver */
.btn-back {
background: var(--secondary-color);
color: white;
border: none;
padding: 0.5rem 1.5rem;
border-radius: 8px;
font-weight: 500;
transition: all 0.3s;
}
.btn-back:hover {
background: #2980b9;
color: white;
}
/* Estadísticas */
.stats-bar {
display: flex;
gap: 2rem;
flex-wrap: wrap;
}
.stat-item {
text-align: center;
}
.stat-item .stat-number {
font-size: 2rem;
font-weight: 700;
color: white;
}
.stat-item .stat-label {
font-size: 0.9rem;
opacity: 0.8;
}
@media (max-width: 768px) {
.content-grid.brands-grid {
grid-template-columns: repeat(2, 1fr);
}
.stats-bar {
justify-content: center;
}
}
@media (max-width: 480px) {
.content-grid.brands-grid {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<div class="dashboard-header">
<div class="container">
<div class="row align-items-center">
<div class="col-md-6">
<h1><i class="fas fa-car-side"></i> Base de Datos de Vehículos</h1>
<p class="lead mb-0">Explora vehículos por marca, modelo y especificaciones</p>
</div>
<div class="col-md-6">
<div class="stats-bar justify-content-md-end">
<div class="stat-item">
<div class="stat-number" id="totalBrands">0</div>
<div class="stat-label">Marcas</div>
</div>
<div class="stat-item">
<div class="stat-number" id="totalModels">0</div>
<div class="stat-label">Modelos</div>
</div>
<div class="stat-item">
<div class="stat-number" id="totalVehicles">0</div>
<div class="stat-label">Vehículos</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<!-- Breadcrumb navegación -->
<div class="breadcrumb-nav" id="breadcrumbNav">
<nav aria-label="breadcrumb">
<ol class="breadcrumb" id="breadcrumb">
<li class="breadcrumb-item active">
<i class="fas fa-home"></i> Marcas
</li>
</ol>
</nav>
</div>
<!-- Barra de filtros (solo visible en vista de vehículos) -->
<div class="filters-bar" id="filtersBar" style="display: none;">
<div class="row g-3 align-items-center">
<div class="col-auto">
<label class="col-form-label fw-bold">Filtrar por:</label>
</div>
<div class="col-md-3">
<select id="yearFilter" class="form-select">
<option value="">Todos los años</option>
</select>
</div>
<div class="col-md-3">
<select id="engineFilter" class="form-select">
<option value="">Todos los motores</option>
</select>
</div>
<div class="col-auto">
<span id="resultCount" class="badge bg-secondary fs-6">0 resultados</span>
</div>
</div>
</div>
<!-- Contenedor principal -->
<div id="mainContent">
<div class="loading-state">
<i class="fas fa-spinner fa-spin"></i>
<h4>Cargando...</h4>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="dashboard.js"></script>
</body>
</html>