From 660b2557002af11c07fd19126157ac86f1960736 Mon Sep 17 00:00:00 2001 From: limitcool Date: Wed, 1 Apr 2026 00:05:16 +0800 Subject: [PATCH] Fix admin login and add subscription popup settings --- admin/src/lib/api.ts | 11 +- admin/src/lib/types.ts | 8 + admin/src/pages/site-settings-page.tsx | 68 ++ admin/src/pages/subscriptions-page.tsx | 2 +- backend/Dockerfile | 2 +- backend/migration/src/lib.rs | 2 + ...ription_popup_settings_to_site_settings.rs | 111 +++ backend/src/app.rs | 70 +- backend/src/controllers/admin_api.rs | 60 +- backend/src/controllers/site_settings.rs | 62 +- backend/src/models/_entities/site_settings.rs | 5 + frontend/package.json | 1 + frontend/pnpm-lock.yaml | 3 + .../src/components/SubscriptionPopup.astro | 678 ++++++++++++++++++ frontend/src/layouts/BaseLayout.astro | 2 + frontend/src/lib/api/client.ts | 22 + frontend/src/lib/types/index.ts | 6 + frontend/src/pages/index.astro | 11 +- frontend/src/pages/subscriptions/manage.astro | 4 +- 19 files changed, 1096 insertions(+), 32 deletions(-) create mode 100644 backend/migration/src/m20260331_000029_add_subscription_popup_settings_to_site_settings.rs create mode 100644 frontend/src/components/SubscriptionPopup.astro diff --git a/admin/src/lib/api.ts b/admin/src/lib/api.ts index 22a25fe..7c80e5d 100644 --- a/admin/src/lib/api.ts +++ b/admin/src/lib/api.ts @@ -53,8 +53,8 @@ import type { import { getRuntimeAdminBaseUrl, normalizeAdminBaseUrl } from '@/lib/runtime-config' const envApiBase = normalizeAdminBaseUrl(import.meta.env.VITE_API_BASE) -const DEV_API_BASE = 'http://localhost:5150' const PROD_DEFAULT_API_PORT = '5150' +const DEV_DEFAULT_API_HOST = '127.0.0.1' function getApiBase() { const runtimeApiBase = getRuntimeAdminBaseUrl('apiBaseUrl') @@ -67,11 +67,12 @@ function getApiBase() { } if (import.meta.env.DEV) { - return DEV_API_BASE - } + if (typeof window !== 'undefined') { + const { protocol, hostname } = window.location + return `${protocol}//${hostname}:${PROD_DEFAULT_API_PORT}` + } - if (typeof window === 'undefined') { - return DEV_API_BASE + return `http://${DEV_DEFAULT_API_HOST}:${PROD_DEFAULT_API_PORT}` } const { protocol, hostname } = window.location diff --git a/admin/src/lib/types.ts b/admin/src/lib/types.ts index 2b7a1ae..ac372f6 100644 --- a/admin/src/lib/types.ts +++ b/admin/src/lib/types.ts @@ -329,6 +329,10 @@ export interface AdminSiteSettingsResponse { notification_webhook_url: string | null notification_comment_enabled: boolean notification_friend_link_enabled: boolean + subscription_popup_enabled: boolean + subscription_popup_title: string + subscription_popup_description: string + subscription_popup_delay_seconds: number search_synonyms: string[] } @@ -387,6 +391,10 @@ export interface SiteSettingsPayload { notificationWebhookUrl?: string | null notificationCommentEnabled?: boolean notificationFriendLinkEnabled?: boolean + subscriptionPopupEnabled?: boolean + subscriptionPopupTitle?: string | null + subscriptionPopupDescription?: string | null + subscriptionPopupDelaySeconds?: number | null searchSynonyms?: string[] } diff --git a/admin/src/pages/site-settings-page.tsx b/admin/src/pages/site-settings-page.tsx index 90c73ef..31d409f 100644 --- a/admin/src/pages/site-settings-page.tsx +++ b/admin/src/pages/site-settings-page.tsx @@ -158,6 +158,10 @@ function toPayload(form: AdminSiteSettingsResponse): SiteSettingsPayload { notificationWebhookUrl: form.notification_webhook_url, notificationCommentEnabled: form.notification_comment_enabled, notificationFriendLinkEnabled: form.notification_friend_link_enabled, + subscriptionPopupEnabled: form.subscription_popup_enabled, + subscriptionPopupTitle: form.subscription_popup_title, + subscriptionPopupDescription: form.subscription_popup_description, + subscriptionPopupDelaySeconds: form.subscription_popup_delay_seconds, searchSynonyms: form.search_synonyms, } } @@ -595,6 +599,70 @@ export function SiteSettingsPage() { + + + 订阅弹窗 + + 前台会在用户停留一段时间并有滚动/交互后,再延迟弹出订阅窗口;这里统一控制开关和文案。 + + + + + +
+ + + updateField('subscription_popup_title', event.target.value) + } + /> + + + + updateField( + 'subscription_popup_delay_seconds', + event.target.value ? Number(event.target.value) : 18, + ) + } + /> + +
+ + +