feat: 统一文件上传接口 + 模板图片展示 + 导航页 + 侧边栏调整
This commit is contained in:
16
web/dist/shop2/index.html
vendored
16
web/dist/shop2/index.html
vendored
@@ -1572,7 +1572,8 @@ function renderProducts(products, total) {
|
||||
return `
|
||||
<div class="product-card" onclick="showProductDetail(${p.id})">
|
||||
<div class="product-image">
|
||||
<div class="product-image-gradient" style="background:${getGradient(p.category_id)}">
|
||||
${p.image ? `<img src="${p.image}" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover" onerror="this.style.display='none';this.nextElementSibling.style.display='flex'">` : ''}
|
||||
<div class="product-image-gradient" style="background:${getGradient(p.category_id)};${p.image ? 'display:none' : 'display:flex'}">
|
||||
${productIconSVG(p.category_id)}
|
||||
</div>
|
||||
<div class="product-tags">${tagHtml}</div>
|
||||
@@ -1697,6 +1698,10 @@ async function showProductDetail(id) {
|
||||
const p = await fetchJSON(`/api/v1/shop/products/${id}`);
|
||||
productCache[p.id] = p;
|
||||
const tags = parseTags(p.tags);
|
||||
let imgList = [];
|
||||
try { imgList = JSON.parse(p.images || '[]'); } catch(e) {}
|
||||
if (!Array.isArray(imgList)) imgList = [];
|
||||
if (p.image) imgList = [p.image, ...imgList.filter(img => img !== p.image)];
|
||||
const discount = (p.original_price && p.original_price > p.price) ? Math.round((1 - p.price / p.original_price) * 100) : 0;
|
||||
|
||||
content.innerHTML = `
|
||||
@@ -1705,7 +1710,9 @@ async function showProductDetail(id) {
|
||||
</button>
|
||||
<div class="modal-body">
|
||||
<div class="modal-image" style="background:${getGradient(p.category_id)}">
|
||||
${productIconSVG(p.category_id)}
|
||||
${imgList.length > 0 ? `<img id="modalMainImg" src="${imgList[0]}" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover" onerror="this.style.display='none';this.nextElementSibling.style.display=''">` : ''}
|
||||
<div style="${imgList.length > 0 ? 'display:none' : ''}">${productIconSVG(p.category_id)}</div>
|
||||
${imgList.length > 1 ? `<div style="position:absolute;bottom:8px;left:0;right:0;display:flex;gap:6px;justify-content:center;z-index:5">${imgList.map((img,idx) => `<img src="${img}" onclick="document.getElementById('modalMainImg').src=this.src" style="width:44px;height:44px;border-radius:6px;object-fit:cover;cursor:pointer;border:2px solid ${idx===0?'#fff':'rgba(255,255,255,0.5)'}" onerror="this.remove()">`).join('')}</div>` : ''}
|
||||
${discount > 0 ? `<div class="product-discount">-${discount}%</div>` : ''}
|
||||
</div>
|
||||
<div class="modal-details">
|
||||
@@ -1782,7 +1789,8 @@ async function addToCart(productId, qty) {
|
||||
name: product.name,
|
||||
price: product.price,
|
||||
qty: qty,
|
||||
category_id: product.category_id
|
||||
category_id: product.category_id,
|
||||
image: product.image || ''
|
||||
});
|
||||
}
|
||||
updateCartUI();
|
||||
@@ -1835,7 +1843,7 @@ function updateCartUI() {
|
||||
|
||||
container.innerHTML = cart.map(item => `
|
||||
<div class="cart-item">
|
||||
<div class="cart-item-img" style="background:${getGradient(item.category_id)}">${productIconSVG(item.category_id)}</div>
|
||||
<div class="cart-item-img" style="background:${getGradient(item.category_id)}">${item.image ? `<img src="${item.image}" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover" onerror="this.remove()">` : ''}${productIconSVG(item.category_id)}</div>
|
||||
<div class="cart-item-info">
|
||||
<div class="cart-item-name">${escapeHtml(item.name)}</div>
|
||||
<div class="cart-item-price">$${item.price.toFixed(2)}</div>
|
||||
|
||||
Reference in New Issue
Block a user