const LogsPage = {
tab: 'system',
async render() { return '
'; },
async mount() {
document.getElementById('page-title').textContent = '系统日志';
document.getElementById('page-actions').innerHTML = ``;
const ct = document.getElementById('page-content');
ct.innerHTML = `
`;
document.querySelectorAll('#logs-tabs button').forEach(b => {
b.onclick = () => {
document.querySelectorAll('#logs-tabs button').forEach(x => x.classList.remove('active'));
b.classList.add('active');
this.tab = b.dataset.tab;
this.load();
};
});
await this.load();
},
refresh() { this.load(); },
async applyFilter() {
this.load();
},
async load() {
const list = document.getElementById('logs-list');
U.loading(list);
const level = document.getElementById('lg-level')?.value || '';
const src = document.getElementById('lg-source')?.value.trim() || '';
const isEmail = this.tab === 'email';
try {
const params = new URLSearchParams();
if (level) params.set('level', level);
if (src) params.set(isEmail ? 'email' : 'source', src);
const qs = params.toString();
const rows = await API.get('/logs/' + (isEmail ? 'emails' : 'system') + (qs ? '?' + qs : ''));
this.renderList(list, rows, isEmail);
} catch (e) { list.innerHTML = `${e.message}
`; }
},
renderList(ct, rows, isEmail) {
if (isEmail) {
ct.innerHTML = rows.length === 0
? ''
: `| # | 收件人 | 模板 | 主题 | 状态 | 错误 | 时间 |
${rows.map(r => `
| ${r.id} |
${U.esc(r.to_email)} |
${U.esc(r.template_code||'-')} |
${U.esc(r.subject||'')} |
${r.status==='sent'?'成功':'失败'} |
${U.esc(r.error||'-')} |
${U.date(r.created_at)} |
`).join('')}
`;
} else {
const lv = { info:'信息', warn:'警告', error:'错误' };
ct.innerHTML = rows.length === 0
? ''
: `| # | 级别 | 来源 | 消息 | 详情 | 时间 |
${rows.map(r => `
| ${r.id} |
${lv[r.level]||r.level} |
${U.esc(r.source)} |
${U.esc(r.message)} |
${U.esc(r.details||'-')} |
${U.date(r.created_at)} |
`).join('')}
`;
}
}
};