From aec9baa160e6a41fac37c098ddf29f1197730f58 Mon Sep 17 00:00:00 2001 From: zaunist Date: Mon, 23 Jun 2025 17:16:38 +0800 Subject: [PATCH] fix: env --- frontend/src/components/Header.tsx | 29 +++++++++++++++---- frontend/src/config.ts | 45 +++++++++++++++++++++++++++--- worker/src/index.ts | 4 +-- worker/src/routes.ts | 22 +++++++++++++++ worker/src/types.ts | 3 +- 5 files changed, 91 insertions(+), 12 deletions(-) diff --git a/frontend/src/components/Header.tsx b/frontend/src/components/Header.tsx index 27c0f8a..9a25ee9 100644 --- a/frontend/src/components/Header.tsx +++ b/frontend/src/components/Header.tsx @@ -1,10 +1,10 @@ -import React from 'react'; +import React, { useState, useEffect } from 'react'; import { Link } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import LanguageSwitcher from './LanguageSwitcher'; import HeaderMailbox from './HeaderMailbox'; import Container from './Container'; -import { EMAIL_DOMAINS, DEFAULT_EMAIL_DOMAIN } from '../config'; +import { getEmailDomains, getDefaultEmailDomain, EMAIL_DOMAINS, DEFAULT_EMAIL_DOMAIN } from '../config'; interface HeaderProps { mailbox: Mailbox | null; @@ -18,6 +18,25 @@ const Header: React.FC = ({ isLoading = false }) => { const { t } = useTranslation(); + const [emailDomains, setEmailDomains] = useState(EMAIL_DOMAINS); + const [defaultDomain, setDefaultDomain] = useState(DEFAULT_EMAIL_DOMAIN); + + // 异步获取邮箱域名配置 + useEffect(() => { + const loadConfig = async () => { + try { + const domains = await getEmailDomains(); + const defaultDom = await getDefaultEmailDomain(); + setEmailDomains(domains); + setDefaultDomain(defaultDom); + } catch (error) { + console.error('加载邮箱域名配置失败:', error); + // 保持使用默认值 + } + }; + + loadConfig(); + }, []); return (
@@ -32,8 +51,8 @@ const Header: React.FC = ({
@@ -57,4 +76,4 @@ const Header: React.FC = ({ ); }; -export default Header; \ No newline at end of file +export default Header; \ No newline at end of file diff --git a/frontend/src/config.ts b/frontend/src/config.ts index 62a9dbb..fdfa374 100644 --- a/frontend/src/config.ts +++ b/frontend/src/config.ts @@ -1,12 +1,49 @@ // 配置文件,用于管理域名和API地址设置 -// 邮箱域名配置 -export const EMAIL_DOMAINS = (import.meta.env.VITE_EMAIL_DOMAIN || '').split(',').map(domain => domain.trim()); -export const DEFAULT_EMAIL_DOMAIN = EMAIL_DOMAINS[0] || ''; +// 邮箱域名配置 - 从 API 动态获取 +let cachedEmailDomains: string[] | null = null; +let configLoaded = false; + +// 从 API 获取邮箱域名配置 +export async function getEmailDomains(): Promise { + if (cachedEmailDomains && configLoaded) { + return cachedEmailDomains; + } + + try { + const response = await fetch('/api/config'); + if (response.ok) { + const data = await response.json(); + if (data.success && data.config.emailDomains) { + cachedEmailDomains = data.config.emailDomains; + configLoaded = true; + return cachedEmailDomains!; + } + } + } catch (error) { + console.error('获取邮箱域名配置失败:', error); + } + + // 如果 API 获取失败,使用环境变量作为后备 + const fallbackDomains = (import.meta.env.VITE_EMAIL_DOMAIN || '').split(',').map(domain => domain.trim()).filter(domain => domain); + cachedEmailDomains = fallbackDomains.length > 0 ? fallbackDomains : ['example.com']; + configLoaded = true; + return cachedEmailDomains!; +} + +// 获取默认邮箱域名 +export async function getDefaultEmailDomain(): Promise { + const domains = await getEmailDomains(); + return domains[0] || 'example.com'; +} + +// 同步版本的邮箱域名配置(用于向后兼容) +export const EMAIL_DOMAINS = (import.meta.env.VITE_EMAIL_DOMAIN || '').split(',').map(domain => domain.trim()).filter(domain => domain) || ['example.com']; +export const DEFAULT_EMAIL_DOMAIN = EMAIL_DOMAINS[0] || 'example.com'; // API地址配置 export const API_BASE_URL = import.meta.env.VITE_API_BASE_URL || ''; // 其他配置 export const DEFAULT_AUTO_REFRESH = false; -export const AUTO_REFRESH_INTERVAL = 10000; // 10秒 \ No newline at end of file +export const AUTO_REFRESH_INTERVAL = 10000; // 10秒 \ No newline at end of file diff --git a/worker/src/index.ts b/worker/src/index.ts index db6323a..7eb25d7 100644 --- a/worker/src/index.ts +++ b/worker/src/index.ts @@ -41,7 +41,7 @@ export default { }, // 处理邮件 - async email(message: any, env: Env, ctx: ExecutionContext): Promise { + async email(message: any, env: Env, _ctx: ExecutionContext): Promise { try { await handleEmail(message, env); } catch (error) { @@ -51,7 +51,7 @@ export default { }, // 定时任务 - 每小时清理过期邮箱以及过期邮件和已被阅读的邮件 - async scheduled(event: ScheduledEvent, env: Env, ctx: ExecutionContext): Promise { + async scheduled(_event: ScheduledEvent, env: Env, _ctx: ExecutionContext): Promise { try { const deleted = await cleanupExpiredMailboxes(env.DB); console.log(`已清理 ${deleted} 个过期邮箱`); diff --git a/worker/src/routes.ts b/worker/src/routes.ts index 5be43b4..63f49aa 100644 --- a/worker/src/routes.ts +++ b/worker/src/routes.ts @@ -29,6 +29,28 @@ app.get('/', (c) => { return c.json({ status: 'ok', message: '临时邮箱系统API正常运行' }); }); +// 获取系统配置 +app.get('/api/config', (c) => { + try { + const emailDomains = c.env.VITE_EMAIL_DOMAIN || ''; + const domains = emailDomains.split(',').map((domain: string) => domain.trim()).filter((domain: string) => domain); + + return c.json({ + success: true, + config: { + emailDomains: domains + } + }); + } catch (error) { + console.error('获取配置失败:', error); + return c.json({ + success: false, + error: '获取配置失败', + message: error instanceof Error ? error.message : String(error) + }, 500); + } +}); + // 创建邮箱 app.post('/api/mailboxes', async (c) => { diff --git a/worker/src/types.ts b/worker/src/types.ts index 72ec9fe..f69f9a8 100644 --- a/worker/src/types.ts +++ b/worker/src/types.ts @@ -3,6 +3,7 @@ import { D1Database } from '@cloudflare/workers-types'; // 环境变量类型 export interface Env { DB: D1Database; + VITE_EMAIL_DOMAIN?: string; } // 邮箱类型 @@ -105,7 +106,7 @@ export interface SaveAttachmentParams { } // API 响应类型 -export interface ApiResponse { +export interface ApiResponse { success: boolean; error?: string; message?: string;