feat: 统一文件上传接口 + 模板图片展示 + 导航页 + 侧边栏调整

This commit is contained in:
admin
2026-07-10 20:43:02 +08:00
parent cbd0430452
commit ce6823e282
25 changed files with 933 additions and 166 deletions

View File

@@ -656,8 +656,9 @@ function renderFeatured(){
const tags=parseTags(r.tags).slice(0,2);
return `<div class="feature-card" onclick="openDetail(${r.id})">
<div class="feature-cover" style="background:${restGrad(r.id)}">
${r.cover?`<img src="${esc(r.cover)}" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover" onerror="this.style.display='none';this.parentNode.querySelector('svg').style.display=''">`:''}
<div class="feature-rank ${i<3?'top'+(i+1):''}">${i+1}</div>
<svg viewBox="0 0 24 24">${restSvg(r.id)}</svg>
<svg viewBox="0 0 24 24" style="${r.cover?'display:none':''}">${restSvg(r.id)}</svg>
</div>
<div class="feature-body">
<div class="feature-name">${esc(r.name)}</div>
@@ -734,7 +735,8 @@ function renderRestaurantList(){
const open=r.status===1;
return `<div class="rest-card" onclick="openDetail(${r.id})">
<div class="rest-logo" style="background:${restGrad(r.id)}">
<svg viewBox="0 0 24 24">${restSvg(r.id)}</svg>
${r.logo?`<img src="${esc(r.logo)}" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover" onerror="this.style.display='none';this.parentNode.querySelector('svg').style.display=''">`:''}
<svg viewBox="0 0 24 24" style="${r.logo?'display:none':''}">${restSvg(r.id)}</svg>
<div class="status-badge ${open?'':'closed'}">${open?'营业中':'休息中'}</div>
</div>
<div class="rest-info">
@@ -808,6 +810,7 @@ async function openDetail(id){
document.body.style.overflow='hidden';
// loading 占位
$('detailHeaderBg').style.background=restGrad(id);
$('detailHeaderBg').innerHTML='';
$('detailHeaderContent').innerHTML='<div style="color:#fff;font-size:16px">加载中...</div>';
$('detailInfoRow').innerHTML='';
$('menuSidebar').innerHTML='<div style="padding:20px;color:#999;text-align:center">加载中</div>';
@@ -833,6 +836,7 @@ function renderDetail(){
const r=state.currentRestaurant;
const tags=parseTags(r.tags);
$('detailHeaderBg').style.background=restGrad(r.id);
$('detailHeaderBg').innerHTML=r.cover?`<img src="${esc(r.cover)}" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover" onerror="this.style.display='none'">`:'';
$('detailHeaderContent').innerHTML=`
<div class="detail-name">${esc(r.name)}</div>
<div class="detail-tags">${tags.map(t=>`<span class="detail-tag">${esc(t)}</span>`).join('')}<span class="detail-tag">${esc(r.category_name)}</span></div>
@@ -867,8 +871,9 @@ function renderMenu(){
const qty=getQty(it.id);
html+=`<div class="menu-item">
<div class="menu-item-img" style="background:${itemGrad(it.id)}">
${it.image?`<img src="${esc(it.image)}" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover" onerror="this.style.display='none';this.parentNode.querySelector('svg').style.display=''">`:''}
${hasOld?'<span class="discount">折</span>':''}
<svg viewBox="0 0 24 24">${itemSvg(it.id)}</svg>
<svg viewBox="0 0 24 24" style="${it.image?'display:none':''}">${itemSvg(it.id)}</svg>
</div>
<div class="menu-item-info">
<div class="menu-item-name">${esc(it.name)}</div>
@@ -1026,8 +1031,9 @@ function renderCartDetail(){
const html=Object.values(state.cart.items).map(v=>{
const it=v.item;
return `<div class="cart-detail-item">
<div style="width:44px;height:44px;border-radius:10px;background:${itemGrad(it.id)};display:flex;align-items:center;justify-content:center;flex-shrink:0">
<svg viewBox="0 0 24 24" style="width:22px;height:22px;fill:rgba(255,255,255,.92)">${itemSvg(it.id)}</svg>
<div style="width:44px;height:44px;border-radius:10px;background:${itemGrad(it.id)};display:flex;align-items:center;justify-content:center;flex-shrink:0;position:relative;overflow:hidden">
${it.image?`<img src="${esc(it.image)}" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover" onerror="this.style.display='none';this.parentNode.querySelector('svg').style.display=''">`:''}
<svg viewBox="0 0 24 24" style="width:22px;height:22px;fill:rgba(255,255,255,.92);${it.image?'display:none':''}">${itemSvg(it.id)}</svg>
</div>
<span class="name">${esc(it.name)}</span>
<span class="price">¥${money(it.price)}</span>