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

@@ -1245,7 +1245,6 @@ function escapeHtml(str){
/* 根据歌曲标题哈希生成渐变封面 */
function coverGradient(song){
if(song && song.cover) return null; // 有真实封面URL时返回null
const str = (song && (song.title||song.artist||'music'))+'';
let hash = 0;
for(let i=0;i<str.length;i++){
@@ -1376,7 +1375,7 @@ function renderHotList(songs){
<span class="play-icon">&#9654;</span>
</div>
<div class="track-info">
<div class="track-cover" style="background:${grad||'#333'}">${coverIcon(s)}</div>
<div class="track-cover" style="background:${grad||'#333'}">${s.cover?`<img src="${escapeHtml(s.cover)}" alt="" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover" onerror="this.style.display='none'">`:''}${coverIcon(s)}</div>
<div class="track-meta">
<div class="track-title">${escapeHtml(s.title)}</div>
<div class="track-artist">${escapeHtml(s.artist)}</div>
@@ -1407,7 +1406,7 @@ function renderNewGrid(songs){
return `
<div class="new-card" data-id="${s.id}">
<div class="cover-wrap">
<div class="card-cover" style="background:${grad||'#333'}">${coverIcon(s)}</div>
<div class="card-cover" style="background:${grad||'#333'}">${s.cover?`<img src="${escapeHtml(s.cover)}" alt="" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover" onerror="this.style.display='none'">`:''}${coverIcon(s)}</div>
${s.is_new?'<span class="badge-new">NEW</span>':''}
<div class="play-overlay">&#9654;</div>
</div>
@@ -1450,7 +1449,7 @@ function renderLibrary(data){
<span class="play-icon">&#9654;</span>
</div>
<div class="track-info">
<div class="track-cover" style="background:${grad||'#333'}">${coverIcon(s)}</div>
<div class="track-cover" style="background:${grad||'#333'}">${s.cover?`<img src="${escapeHtml(s.cover)}" alt="" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover" onerror="this.style.display='none'">`:''}${coverIcon(s)}</div>
<div class="track-meta">
<div class="track-title">${escapeHtml(s.title)}</div>
<div class="track-artist">${escapeHtml(s.artist)}</div>
@@ -1683,7 +1682,7 @@ function playSong(song){
const grad = coverGradient(song);
const cover = document.getElementById('playerCover');
cover.style.background = grad||'linear-gradient(135deg,#535353,#1a1a1a)';
cover.innerHTML = coverIcon(song);
cover.innerHTML = (song.cover?`<img src="${escapeHtml(song.cover)}" alt="" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover" onerror="this.style.display='none'">`:'') + coverIcon(song);
document.getElementById('playerTitle').textContent = song.title;
document.getElementById('playerArtist').textContent = song.artist;
document.getElementById('totalTime').textContent = formatDuration(song.duration);
@@ -1829,6 +1828,7 @@ async function openSongModal(song){
document.getElementById('modalHeader').innerHTML = `
<div class="modal-cover" style="background:${grad||'#333'}">
<div class="cover-glow"></div>
${detail.cover?`<img src="${escapeHtml(detail.cover)}" alt="" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover" onerror="this.style.display='none'">`:''}
${coverIcon(detail)}
</div>
<div class="modal-header-info">