From 11462a3e9fcc87d6ee0ee245fe38223503ee203a Mon Sep 17 00:00:00 2001 From: benjamin Date: Wed, 20 May 2026 11:07:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(frontend):=20=E6=B7=BB=E5=8A=A0=E9=82=AE?= =?UTF-8?q?=E4=BB=B6=E6=A8=A1=E6=9D=BF=E7=BC=96=E8=BE=91=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- frontend/src/api/admin/settings.ts | 104 +++++ frontend/src/views/admin/SettingsView.vue | 4 + .../admin/settings/EmailTemplateEditor.vue | 438 ++++++++++++++++++ 3 files changed, 546 insertions(+) create mode 100644 frontend/src/views/admin/settings/EmailTemplateEditor.vue diff --git a/frontend/src/api/admin/settings.ts b/frontend/src/api/admin/settings.ts index 4fc49de6..84848cd0 100644 --- a/frontend/src/api/admin/settings.ts +++ b/frontend/src/api/admin/settings.ts @@ -850,6 +850,105 @@ export async function sendTestEmail( return data; } +// ==================== Email Template Settings ==================== + +export interface EmailTemplateOption { + value: string; + label?: string; + description?: string; +} + +export type EmailTemplateEventOption = string | EmailTemplateOption; + +export interface EmailTemplateSummary { + event: string; + locale: string; + subject: string; + is_custom?: boolean; + updated_at?: string; +} + +export interface EmailTemplateListResponse { + events: EmailTemplateEventOption[]; + locales: string[]; + templates?: EmailTemplateSummary[]; + placeholders?: string[]; +} + +export interface EmailTemplateDetail { + event: string; + locale: string; + subject: string; + html: string; + is_custom?: boolean; + updated_at?: string; + placeholders?: string[]; +} + +export interface UpdateEmailTemplateRequest { + subject: string; + html: string; +} + +export interface PreviewEmailTemplateRequest extends UpdateEmailTemplateRequest { + event: string; + locale: string; +} + +export interface EmailTemplatePreviewResponse { + subject: string; + html: string; +} + +export async function getEmailTemplates(): Promise { + const { data } = await apiClient.get( + "/admin/settings/email-templates", + ); + return data; +} + +export async function getEmailTemplate( + event: string, + locale: string, +): Promise { + const { data } = await apiClient.get( + `/admin/settings/email-templates/${encodeURIComponent(event)}/${encodeURIComponent(locale)}`, + ); + return data; +} + +export async function updateEmailTemplate( + event: string, + locale: string, + request: UpdateEmailTemplateRequest, +): Promise { + const { data } = await apiClient.put( + `/admin/settings/email-templates/${encodeURIComponent(event)}/${encodeURIComponent(locale)}`, + request, + ); + return data; +} + +export async function restoreOfficialEmailTemplate( + event: string, + locale: string, +): Promise { + const { data } = await apiClient.post( + `/admin/settings/email-templates/${encodeURIComponent(event)}/${encodeURIComponent(locale)}/restore-official`, + ); + return data; +} + +export async function previewEmailTemplate( + request: PreviewEmailTemplateRequest, +): Promise { + const { data } = await apiClient.post( + "/admin/settings/email-template-preview", + request, + ); + return data; +} + /** * Admin API Key status response */ @@ -1156,6 +1255,11 @@ export const settingsAPI = { updateSettings, testSmtpConnection, sendTestEmail, + getEmailTemplates, + getEmailTemplate, + updateEmailTemplate, + restoreOfficialEmailTemplate, + previewEmailTemplate, getAdminApiKey, regenerateAdminApiKey, deleteAdminApiKey, diff --git a/frontend/src/views/admin/SettingsView.vue b/frontend/src/views/admin/SettingsView.vue index 3f44a474..5da2d2e3 100644 --- a/frontend/src/views/admin/SettingsView.vue +++ b/frontend/src/views/admin/SettingsView.vue @@ -6193,6 +6193,9 @@ + + +
+
+
+
+

+ {{ t("admin.settings.emailTemplates.title") }} +

+

+ {{ t("admin.settings.emailTemplates.description") }} +

+
+
+ + + +
+
+ +
+
+ + {{ t("common.loading") }} +
+ + +
+
+ + +