feat: system logs - email log + system log with admin UI

- db: email_logs (sent/failed) + system_logs (info/warn/error) tables,
  auto-migrated for existing installs
- backend/logger.js: logEmail/logSystem with try/catch (never breaks flow)
- mailer: log send result (SMTP unconfigured/sent/failed + error msg)
- webhook: log blocked-internal, non-2xx response, send failure
- server: error middleware records 500 errors to system_logs
- routes/logs.js: GET /logs/emails + /logs/system (admin/owner, filters)
- UI: 系统日志 page (owner/admin) with system/email tabs + filters
- API docs updated
This commit is contained in:
2026-08-17 05:14:41 +08:00
parent 8d6c3c4a8d
commit a11df22600
10 changed files with 241 additions and 8 deletions

View File

@@ -11,6 +11,7 @@ const App = {
{ id: 'notifications', label: '通知配置', icon: 'fa-bell', roles: ['owner'] },
{ id: 'templates', label: '邮件模板', icon: 'fa-envelope', roles: ['owner'] },
{ id: 'settings', label: '系统设置', icon: 'fa-cog', roles: ['owner'] },
{ id: 'logs', label: '系统日志', icon: 'fa-clipboard-list', roles: ['owner','admin'] },
{ id: 'export', label: '数据导出', icon: 'fa-download', roles: ['owner'] },
],
@@ -99,6 +100,7 @@ const App = {
case 'feature': this.renderMain('更新详情', FeatureDetail, param); break;
case 'servers': this.renderMain('服务器管理', ServersPage, param); break;
case 'bans': this.renderMain('封禁列表', BansPage, param); break;
case 'logs': this.renderMain('系统日志', LogsPage, param); break;
default: this.renderMain('控制台', Dashboard, param);
}
},
@@ -178,6 +180,7 @@ window.FeaturesPage = FeaturesPage;
window.FeatureDetail = FeatureDetail;
window.ServersPage = ServersPage;
window.BansPage = BansPage;
window.LogsPage = LogsPage;
window.LoginPage = LoginPage;
window.RegisterPage = RegisterPage;
window.HomePage = HomePage;