| 410 | }).join('') || `<tr><td colspan="6" class="muted" style="text-align:center;padding:1rem;">无证书数据</td></tr>`; |
| 411 | } |
| 412 | function renderSSLCards(){ |
| 413 | const wrap = $('sslCards'); |
| 414 | if(window.innerWidth > 700){ wrap.innerHTML = ''; return; } |
| 415 | wrap.innerHTML = S.ssl.map(c => { |
| 416 | const cls = c.mismatch || c.expire_days <= 0 ? 'err' : c.expire_days <= 7 ? 'warn' : 'ok'; |
| 417 | const status = c.mismatch ? '域名不匹配' : c.expire_days <= 0 ? '已过期' : c.expire_days <= 7 ? '将到期' : '正常'; |
| 418 | const dt = c.expire_ts ? new Date(c.expire_ts * 1000).toISOString().slice(0,10) : '-'; |
| 419 | const alertClass = cls === 'err' ? ' alert-critical' : cls === 'warn' ? ' alert-warning' : ''; |
| 420 | return `<div class="card${alertClass}"><div class="card-header"><div class="card-title">${esc(c.name || '-')}</div><span class="status-pill ${cls === 'err' ? 'off' : 'on'}">${status}</span></div><div class="kvlist"><div><span class="key">域名</span><span>${esc(String(c.domain || '').replace(/^https?:\/\//,''))}</span></div><div><span class="key">端口</span><span>${esc(c.port || 443)}</span></div><div><span class="key">剩余</span><span>${esc(c.expire_days ?? '-')} 天</span></div><div><span class="key">到期</span><span>${dt}</span></div></div></div>`; |
| 421 | }).join('') || '<div class="empty-state">无证书数据</div>'; |
| 422 | } |
| 423 | |
| 424 | function openDetail(key){ |
| 425 | S.openDetailKey = key; |