image_crawler/public/script.js

132 lines
5.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// script.js
const searchBtn = document.getElementById("searchBtn");
const queryInput = document.getElementById("query");
const resultsDiv = document.getElementById("results");
// تابع دانلود عکس از URL
function downloadImage(url, filename = 'product.jpg') {
// اطمینان از اینکه URL معتبر است
if (!url || url.startsWith('data:') || url.startsWith('blob:')) {
// اگر URL دیتای داخلی است، مستقیم دانلود می‌شود
const a = document.createElement('a');
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
return;
}
// برای URLهای خارجی: با fetch دانلود و به عنوان blob دانلود
fetch(url)
.then(response => {
if (!response.ok) throw new Error('Network response was not ok');
return response.blob();
})
.then(blob => {
const blobUrl = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = blobUrl;
a.download = filename;
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(blobUrl);
document.body.removeChild(a);
})
.catch(err => {
console.error('Failed to download image:', err);
alert('در حال حاضر امکان دانلود این تصویر وجود ندارد.');
});
}
searchBtn.addEventListener("click", async () => {
const q = queryInput.value.trim();
if (!q) return alert("لطفاً یک نام محصول وارد کنید");
resultsDiv.innerHTML = "<p class='text-center'>در حال بارگذاری...</p>";
try {
const res = await fetch(`/api/search?q=${encodeURIComponent(q)}`);
const data = await res.json();
const hasResults = data.basalam?.length > 0 ||
data.torob?.length > 0 ||
data.digikala?.length > 0;
if (!hasResults) {
resultsDiv.innerHTML = "<p class='text-center'>هیچ نتیجه‌ای یافت نشد</p>";
return;
}
resultsDiv.innerHTML = "";
const allItems = [
...data.basalam.map(item => ({...item, source: 'باسلام'})),
...data.torob.map(item => ({...item, source: 'ترب'})),
...data.digikala.map(item => ({...item, source: 'دیجی‌کالا'}))
];
if (allItems.length === 0) {
resultsDiv.innerHTML = "<p class='text-center'>هیچ نتیجه‌ای یافت نشد</p>";
return;
}
allItems.forEach(item => {
const col = document.createElement("div");
col.className = "col";
const card = document.createElement("div");
card.className = "card h-100";
const title = item.title || item.name || "بدون عنوان";
const price = item.price !== undefined && item.price !== null ?
(typeof item.price === 'object' ?
(item.price.value || JSON.stringify(item.price)) :
item.price) :
"—";
const image = (item.image || "https://via.placeholder.com/150").trim();
card.innerHTML = `
<img src="${image}" class="card-img-top product-image" alt="${title}" data-url="${image}">
<div class="card-body d-flex flex-column">
<h5 class="card-title name">${title}</h5>
<p class="card-text price">${price}</p>
<small class="source">منبع: ${item.source}</small>
</div>
`;
// روی بقیه کارت (نه عکس) کلیک = باز کردن لینک
card.addEventListener('click', (e) => {
// اگر کلیک روی عکس بود، جلوی انتشار event را بگیر
if (e.target.closest('.product-image')) {
return;
}
if (item.link) {
window.open(item.link, '_blank');
}
});
// روی عکس کلیک = دانلود
const imgElement = card.querySelector('.product-image');
imgElement.addEventListener('click', (e) => {
e.stopPropagation(); // جلوگیری از باز شدن لینک
const cleanUrl = imgElement.src;
const filename = `product_${item.source}_${Date.now()}.jpg`;
downloadImage(cleanUrl, filename);
});
col.appendChild(card);
resultsDiv.appendChild(col);
});
} catch (err) {
console.error(err);
resultsDiv.innerHTML = "<p class='text-center text-danger'>خطا در دریافت داده‌ها</p>";
}
});
// Allow Enter key
queryInput.addEventListener('keypress', (e) => {
if (e.key === 'Enter') {
searchBtn.click();
}
});