diff --git a/backup-before-force-detail-ratio-20260519-121029/ProductDetailView.vue b/backup-before-force-detail-ratio-20260519-121029/ProductDetailView.vue new file mode 100644 index 0000000..090c1d8 --- /dev/null +++ b/backup-before-force-detail-ratio-20260519-121029/ProductDetailView.vue @@ -0,0 +1,144 @@ + + + diff --git a/server/uploads/1779161590265-849421370.jpg b/server/uploads/1779161590265-849421370.jpg deleted file mode 100644 index 39ff011..0000000 Binary files a/server/uploads/1779161590265-849421370.jpg and /dev/null differ diff --git a/server/uploads/1779161590246-513432766.jpg b/server/uploads/1779168099070-562381309.jpg similarity index 100% rename from server/uploads/1779161590246-513432766.jpg rename to server/uploads/1779168099070-562381309.jpg diff --git a/server/uploads/1779161590263-738209266.jpg b/server/uploads/1779168099074-602123892.jpg similarity index 100% rename from server/uploads/1779161590263-738209266.jpg rename to server/uploads/1779168099074-602123892.jpg diff --git a/src/components/Footer.vue b/src/components/Footer.vue index 252d43c..7684a6e 100644 --- a/src/components/Footer.vue +++ b/src/components/Footer.vue @@ -4,9 +4,7 @@

SecondTech Market

-

- Marketplace barang bekas teknologi untuk laptop, PC, monitor, keyboard, perangkat jaringan, dan server. -

+

Marketplace barang bekas teknologi untuk laptop, PC, monitor, keyboard, perangkat jaringan, dan server.

Navigasi

@@ -19,11 +17,12 @@

Catatan Project

- Versi ini memakai backend Express, database MySQL, dan upload foto produk dari file perangkat. + Project ini di buat unutk komunitas jual beli barang bekas teknologi, dengan fokus pada perangkat jaringan dan server. Dibuat menggunakan Vue.js, Tailwind CSS, dan Firebase untuk autentikasi dan database. Fitur utama meliputi + listing produk, dashboard pengguna, dan admin

-

© 2026 SecondTech Market. Dibuat untuk project web.

+

© 2026 SecondTech Market. Dibuat untuk project web.

diff --git a/src/data/products.js b/src/data/products.js index 83db615..611f504 100644 --- a/src/data/products.js +++ b/src/data/products.js @@ -1,101 +1,4 @@ -export const products = [ - { - id: 1, - title: "Laptop Lenovo ThinkPad T480", - category: "Laptop", - price: 3200000, - condition: "Bekas Normal", - location: "Yogyakarta", - seller: "Raka SIJA", - whatsapp: "6281234567890", - image: "https://images.unsplash.com/photo-1496181133206-80ce9b88a853?q=80&w=1200&auto=format&fit=crop", - description: "Laptop bekas cocok untuk belajar coding, jaringan, virtual machine ringan, dan kebutuhan sekolah. RAM 8GB, SSD 256GB, keyboard normal." - }, - { - id: 2, - title: "PC Rakitan i5 Gen 8", - category: "PC", - price: 4100000, - condition: "Bekas Normal", - location: "Bantul", - seller: "Dimas Tech", - whatsapp: "628111222333", - image: "https://images.unsplash.com/photo-1587202372775-e229f172b9d7?q=80&w=1200&auto=format&fit=crop", - description: "PC rakitan untuk lab jaringan, desain ringan, dan multitasking. Intel Core i5, RAM 16GB, SSD 512GB." - }, - { - id: 3, - title: "Monitor LG 24 Inch IPS", - category: "Monitor", - price: 1150000, - condition: "Bekas Mulus", - location: "Sleman", - seller: "Adit Hardware", - whatsapp: "628555666777", - image: "https://images.unsplash.com/photo-1527443224154-c4a3942d3acf?q=80&w=1200&auto=format&fit=crop", - description: "Monitor IPS 24 inch, warna masih bagus, cocok untuk coding dan editing. Include kabel power dan HDMI." - }, - { - id: 4, - title: "Keyboard Mechanical Keychron K2", - category: "Keyboard", - price: 850000, - condition: "Bekas Normal", - location: "Solo", - seller: "Naufal Keys", - whatsapp: "628333444555", - image: "https://images.unsplash.com/photo-1618384887929-16ec33fab9ef?q=80&w=1200&auto=format&fit=crop", - description: "Keyboard mechanical wireless, switch brown, cocok untuk coding. Kondisi normal dan keycap lengkap." - }, - { - id: 5, - title: "MikroTik RB941 hAP Lite", - category: "Router", - price: 180000, - condition: "Bekas Normal", - location: "Kulon Progo", - seller: "Lab Network", - whatsapp: "628777888999", - image: "https://images.unsplash.com/photo-1606904825846-647eb07f5be2?q=80&w=1200&auto=format&fit=crop", - description: "Router MikroTik untuk belajar routing, firewall, DHCP, hotspot, dan konfigurasi dasar jaringan." - }, - { - id: 6, - title: "Switch TP-Link 8 Port Gigabit", - category: "Switch", - price: 250000, - condition: "Bekas Normal", - location: "Magelang", - seller: "Fajar Net", - whatsapp: "628999111222", - image: "https://images.unsplash.com/photo-1558494949-ef010cbdcc31?q=80&w=1200&auto=format&fit=crop", - description: "Switch 8 port gigabit, cocok untuk lab kecil, warnet mini, dan praktik jaringan lokal." - }, - { - id: 7, - title: "Server Dell PowerEdge R620", - category: "Server", - price: 6500000, - condition: "Bekas Server Room", - location: "Jakarta", - seller: "Server Bekas ID", - whatsapp: "628222333444", - image: "https://images.unsplash.com/photo-1558494949-ef010cbdcc31?q=80&w=1200&auto=format&fit=crop", - description: "Server rackmount bekas data center, cocok untuk belajar virtualization, Proxmox, Docker, dan homelab." - }, - { - id: 8, - title: "Access Point TP-Link EAP225", - category: "Access Point", - price: 620000, - condition: "Bekas Mulus", - location: "Semarang", - seller: "WiFi Store", - whatsapp: "6281212121212", - image: "https://images.unsplash.com/photo-1544197150-b99a580bb7a8?q=80&w=1200&auto=format&fit=crop", - description: "Access point ceiling untuk hotspot sekolah, kantor, dan lab jaringan. Kondisi normal." - } -] +export const products = [] export const categories = [ "Semua", diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 58605a8..31ef795 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -14,6 +14,7 @@ :pauseOnHover="true" :yoyo="true" /> +
-

Temukan laptop bekas, PC, monitor, keyboard, router, switch, access point, dan server bekas untuk berbagai kebutuhan.

+ +

+ Temukan laptop bekas, PC, monitor, keyboard, router, switch, access point, dan server bekas untuk berbagai kebutuhan. +

+
Jual Barang Sekarang Lihat Marketplace @@ -35,7 +40,11 @@
- Tech marketplace + Tech marketplace
@@ -46,11 +55,17 @@

Kategori Populer

Fokus ke perangkat teknologi dan jaringan.

- Lihat semua + + Lihat semua +
-
+
@@ -65,32 +80,56 @@

Produk Terbaru

-

Contoh barang bekas teknologi yang tersedia.

+

Barang terbaru yang tersedia di marketplace.

-
- +
+ +
+ +
+

Belum ada produk

+

Produk terbaru akan muncul setelah barang diposting.

+ setSavedProducts(saved.value) +} + +async function loadLatestProducts() { + try { + const data = await fetchProducts() + products.value = data.products?.length ? data.products : defaultProducts + } catch { + products.value = defaultProducts + } +} + +onMounted(loadLatestProducts) + diff --git a/src/views/ProductDetailView.vue b/src/views/ProductDetailView.vue index f50eaa2..cc2cd46 100644 --- a/src/views/ProductDetailView.vue +++ b/src/views/ProductDetailView.vue @@ -1,16 +1,16 @@ @@ -79,17 +103,28 @@ import { computed, onMounted, ref, watch } from "vue" import { useRoute } from "vue-router" import { products as defaultProducts } from "../data/products" -import { fetchProduct, formatRupiah, getProductImageUrl, getSavedProducts, setSavedProducts } from "../utils" +import { + fetchProduct, + formatRupiah, + getProductImageUrl, + getSavedProducts, + setSavedProducts +} from "../utils" const route = useRoute() const id = Number(route.params.id) + const product = ref(null) const loading = ref(true) const selectedImage = ref("") const productImages = computed(() => { if (!product.value) return [] - const images = product.value.images?.length ? product.value.images : [product.value.image] + + const images = product.value.images?.length + ? product.value.images + : [product.value.image] + return [...new Set(images.filter(Boolean))] }) @@ -104,11 +139,18 @@ watch( ) const savedIds = ref(getSavedProducts()) -const saved = computed(() => savedIds.value.includes(id)) + +const saved = computed(() => { + return savedIds.value.includes(id) +}) const waLink = computed(() => { if (!product.value) return "#" - const text = encodeURIComponent(`Halo, saya tertarik dengan ${product.value.title} di SecondTech Market.`) + + const text = encodeURIComponent( + `Halo, saya tertarik dengan ${product.value.title} di SecondTech Market.` + ) + return `https://wa.me/${product.value.whatsapp}?text=${text}` }) @@ -118,17 +160,22 @@ function toggleSave() { } else { savedIds.value.push(id) } + setSavedProducts(savedIds.value) } async function loadProduct() { loading.value = true + try { const data = await fetchProduct(id) product.value = data.product } catch { const fallbackProduct = defaultProducts.find((item) => Number(item.id) === id) || null - product.value = fallbackProduct ? { ...fallbackProduct, images: [fallbackProduct.image] } : null + + product.value = fallbackProduct + ? { ...fallbackProduct, images: [fallbackProduct.image] } + : null } finally { loading.value = false }