管理员登录

所有操作记录到审计日志(含操作者 IP),双重验证后才可查看商家隐私字段

账号密码
Token + Secret

首次部署默认账号:admin / admin123,登录后请立即改密

// ====== AI 工具封面管理 ====== const COVER_API = '/api/market/admin-cover'; function coverReq(path, opts = {}) { return fetch(COVER_API + path, { method: opts.method || 'GET', headers: { 'Content-Type': 'application/json', 'x-admin-token': sessionStorage.getItem('m_admin_token') || '' }, body: opts.body ? JSON.stringify(opts.body) : undefined, }).then(r => r.json()).then(d => { if (d.success === false) throw new Error(d.error || '请求失败'); return d; }); } function renderCovers() { return `
AI 工具封面管理
基于 DB 字段调 autocover.py 重新合成 800×800 主图
加载中…
`; } window.loadCovers = async () => { const box = document.getElementById('cvBox'); try { const r = await coverReq('/products/list?limit=100'); const items = r.data || []; if (!items.length) { box.innerHTML = '
暂无 AI 工具
'; return; } box.innerHTML = `${items.map(p => ` `).join('')}
ID名称分类封面预览封面链接操作
${p.id} ${M.fmt.esc(p.name || '')} ${M.fmt.esc(p.category || '')} ${p.image_url ? `` : '-'} ${M.fmt.esc(p.image_url || '(空)')}
`; } catch (e) { box.innerHTML = `
${M.fmt.esc(e.message)}
`; } }; window.regenCover = async (id, btn) => { if (!confirm('确认重新生成 #' + id + ' 的封面?')) return; const orig = btn.textContent; btn.textContent = '生成中…'; btn.disabled = true; try { const r = await coverReq('/products/' + id + '/regen-cover', { method: 'POST' }); M.toast('已重生成: ' + r.data.cover, 'success', 3000); await loadCovers(); } catch (e) { M.toast(e.message, 'error'); btn.textContent = orig; btn.disabled = false; } }; window.regenAllCovers = async () => { if (!confirm('批量重生成最近 50 条?约需 1-2 分钟。')) return; M.toast('开始批量生成…', 'info'); try { const r = await coverReq('/regen-all-covers?limit=50', { method: 'POST' }); M.toast('完成:' + r.ok + '/' + r.total + ' 成功', 'success', 5000); await loadCovers(); } catch (e) { M.toast(e.message, 'error'); } };