diff --git a/apps/web/src/api/themes.ts b/apps/web/src/api/themes.ts index 3e02595..4ab075e 100644 --- a/apps/web/src/api/themes.ts +++ b/apps/web/src/api/themes.ts @@ -4,6 +4,10 @@ export interface ThemeConfig { primary_color?: string; logo_url?: string; sidebar_style?: 'light' | 'dark'; + brand_name?: string; + brand_slogan?: string; + brand_features?: string; + brand_copyright?: string; } export async function getTheme() { @@ -20,3 +24,26 @@ export async function updateTheme(theme: ThemeConfig) { ); return data.data; } + +export interface BrandConfig { + brand_name: string; + brand_slogan: string; + brand_features: string; + brand_copyright: string; +} + +const BRAND_DEFAULTS: BrandConfig = { + brand_name: 'HMS 健康管理平台', + brand_slogan: '新一代健康管理平台', + brand_features: '患者管理 · 健康监测 · 随访管理 · AI 智能分析', + brand_copyright: 'HMS 健康管理平台 · ©汕头市智界科技有限公司', +}; + +export async function getPublicBrand(): Promise { + try { + const res = await fetch('/api/v1/public/brand'); + const json = await res.json(); + if (json?.success && json?.data) return json.data; + } catch {} + return BRAND_DEFAULTS; +} diff --git a/apps/web/src/pages/settings/ThemeSettings.tsx b/apps/web/src/pages/settings/ThemeSettings.tsx index 8219f1e..d4795a7 100644 --- a/apps/web/src/pages/settings/ThemeSettings.tsx +++ b/apps/web/src/pages/settings/ThemeSettings.tsx @@ -1,12 +1,10 @@ import { useEffect, useState, useCallback } from 'react'; -import { Form, Input, Select, Button, ColorPicker, message, Typography } from 'antd'; +import { Form, Input, Select, Button, ColorPicker, message, Typography, Divider } from 'antd'; import { getTheme, updateTheme, } from '../../api/themes'; -// --- Component --- - export default function ThemeSettings() { const [form] = Form.useForm(); const [, setLoading] = useState(false); @@ -20,13 +18,20 @@ export default function ThemeSettings() { primary_color: theme.primary_color || '#1677ff', logo_url: theme.logo_url || '', sidebar_style: theme.sidebar_style || 'light', + brand_name: theme.brand_name || '', + brand_slogan: theme.brand_slogan || '', + brand_features: theme.brand_features || '', + brand_copyright: theme.brand_copyright || '', }); } catch { - // Theme may not exist yet; use defaults form.setFieldsValue({ primary_color: '#1677ff', logo_url: '', sidebar_style: 'light', + brand_name: '', + brand_slogan: '', + brand_features: '', + brand_copyright: '', }); } setLoading(false); @@ -40,6 +45,10 @@ export default function ThemeSettings() { primary_color: string; logo_url: string; sidebar_style: 'light' | 'dark'; + brand_name: string; + brand_slogan: string; + brand_features: string; + brand_copyright: string; }) => { setSaving(true); try { @@ -50,6 +59,10 @@ export default function ThemeSettings() { : (values.primary_color as { toHexString?: () => string }).toHexString?.() ?? String(values.primary_color), logo_url: values.logo_url, sidebar_style: values.sidebar_style, + brand_name: values.brand_name || undefined, + brand_slogan: values.brand_slogan || undefined, + brand_features: values.brand_features || undefined, + brand_copyright: values.brand_copyright || undefined, }); message.success('主题设置已保存'); } catch (err: unknown) { @@ -87,6 +100,22 @@ export default function ThemeSettings() { ]} /> + + 品牌设置 + + + + + + + + + + + + + +