feat: add traffic analytics configuration (Umami/GA/Custom)

Add traffic analytics support to the admin panel with three provider
options:
- Umami (open-source, self-hosted) — script URL + website ID
- Google Analytics 4 — Measurement ID (G-XXXXXXXXXX)
- Custom — any third-party analytics script (百度统计, Plausible, 51la, etc.)

Changes:
- admin.types.ts: Add AnalyticsEnabled, AnalyticsProvider,
  AnalyticsScriptUrl, AnalyticsWebsiteId, AnalyticsCustomScript to
  SiteConfig interface
- config.ts: Add default values in getInitConfig() and configSelfCheck()
- api/admin/site/route.ts: Add analytics fields to destructuring, type
  validation, and SiteConfig update
- admin/page.tsx: Add SiteConfig interface fields, state initialization,
  config sync, and analytics configuration UI with provider-specific
  input fields
- layout.tsx: Inject analytics scripts into <head> based on provider
  type (Umami: async script with data-website-id; GA: gtag.js + config;
  Custom: dangerouslySetInnerHTML)
This commit is contained in:
mtvpls-turso
2026-07-11 18:47:11 +00:00
parent e624ffb087
commit d98f5082a5
5 changed files with 269 additions and 1 deletions
+22
View File
@@ -328,6 +328,12 @@ async function getInitConfig(
TurnstileSiteKey: '',
TurnstileSecretKey: '',
DefaultUserTags: [],
// 流量统计配置
AnalyticsEnabled: false,
AnalyticsProvider: 'umami',
AnalyticsScriptUrl: '',
AnalyticsWebsiteId: '',
AnalyticsCustomScript: '',
},
UserConfig: {
Users: [],
@@ -588,6 +594,22 @@ export function configSelfCheck(adminConfig: AdminConfig): AdminConfig {
if (adminConfig.SiteConfig.DefaultUserTags === undefined) {
adminConfig.SiteConfig.DefaultUserTags = [];
}
// 流量统计配置补全
if (adminConfig.SiteConfig.AnalyticsEnabled === undefined) {
adminConfig.SiteConfig.AnalyticsEnabled = false;
}
if (adminConfig.SiteConfig.AnalyticsProvider === undefined) {
adminConfig.SiteConfig.AnalyticsProvider = 'umami';
}
if (adminConfig.SiteConfig.AnalyticsScriptUrl === undefined) {
adminConfig.SiteConfig.AnalyticsScriptUrl = '';
}
if (adminConfig.SiteConfig.AnalyticsWebsiteId === undefined) {
adminConfig.SiteConfig.AnalyticsWebsiteId = '';
}
if (adminConfig.SiteConfig.AnalyticsCustomScript === undefined) {
adminConfig.SiteConfig.AnalyticsCustomScript = '';
}
if (!adminConfig.TelegramConfig) {
adminConfig.TelegramConfig = {
enabled: process.env.TELEGRAM_BOT_ENABLED === 'true' || Boolean(process.env.TELEGRAM_BOT_TOKEN),