Vincentran's picture
Upload E-Commerce Product Intelligence Dashboard (frontend + backend)
67c9653
<template>
<div class="container">
<header>
<h1>🛍️ E-Commerce Product Intelligence</h1>
<p>Browse, search, and analyze thousands of products</p>
</header>
<Insights />
<Charts />
<SearchFilter @search="handleSearch" />
<Table
:products="products"
:currentPage="currentPage"
:totalPages="totalPages"
@page-change="changePage"
/>
</div>
</template>
<script>
import { defineComponent } from 'vue'
import Insights from './components/Insights.vue'
import Charts from './components/Charts.vue'
import SearchFilter from './components/SearchFilter.vue'
import Table from './components/Table.vue'
export default defineComponent({
name: 'App',
components: { Insights, Charts, SearchFilter, Table },
data() {
return {
products: [],
currentPage: 1,
totalPages: 1,
filters: {}
}
},
methods: {
async loadProducts() {
try {
const params = new URLSearchParams({
page: this.currentPage,
limit: 50
})
if (this.filters.category) params.append('category', this.filters.category)
if (this.filters.minPrice) params.append('min_price', this.filters.minPrice)
if (this.filters.maxPrice) params.append('max_price', this.filters.maxPrice)
if (this.filters.minRating) params.append('min_rating', this.filters.minRating)
const res = await fetch(`/filter?${params}`)
const data = await res.json()
this.products = data.data
this.totalPages = data.total_pages
} catch (error) {
console.error('Failed to load products:', error)
}
},
changePage(page) {
this.currentPage = page
this.loadProducts()
},
handleSearch(filters) {
this.filters = filters
this.currentPage = 1
this.loadProducts()
}
},
mounted() {
this.loadProducts()
}
})
</script>
<style>
.container {
max-width: 1400px;
margin: 0 auto;
padding: 20px;
}
header {
background: white;
padding: 30px;
text-align: center;
border-radius: 15px;
margin-bottom: 30px;
box-shadow: 0 10px 30px rgba(0,0,0,0.2);
}
header h1 {
color: #667eea;
font-size: 2.5em;
margin-bottom: 10px;
}
header p {
color: #666;
font-size: 1.2em;
}
</style>