diff --git a/packages/backend/src/repositories/appearance.repository.ts b/packages/backend/src/repositories/appearance.repository.ts index b64f243..0a17803 100644 --- a/packages/backend/src/repositories/appearance.repository.ts +++ b/packages/backend/src/repositories/appearance.repository.ts @@ -61,6 +61,9 @@ const mapRowsToAppearanceSettings = (rows: DbAppearanceSettingsRow[]): Appearanc case 'editorFontFamily': settings.editorFontFamily = row.value || null; // 如果为空字符串,则视为 null break; + case 'terminal_custom_html': + settings.terminal_custom_html = row.value; + break; } } @@ -75,15 +78,16 @@ const mapRowsToAppearanceSettings = (rows: DbAppearanceSettingsRow[]): Appearanc editorFontFamily: settings.editorFontFamily ?? defaults.editorFontFamily, terminalBackgroundImage: settings.terminalBackgroundImage ?? defaults.terminalBackgroundImage, pageBackgroundImage: settings.pageBackgroundImage ?? defaults.pageBackgroundImage, - // 修改:只有当数据库中未找到记录时才使用默认值 + // 只有当数据库中未找到记录时才使用默认值 terminalBackgroundEnabled: terminalBackgroundEnabledFound ? settings.terminalBackgroundEnabled // 使用数据库找到的值 (true 或 false) : defaults.terminalBackgroundEnabled, // 否则使用默认值 (true) terminalBackgroundOverlayOpacity: terminalBackgroundOverlayOpacityFound ? settings.terminalBackgroundOverlayOpacity // 使用数据库找到的值 : defaults.terminalBackgroundOverlayOpacity, // 否则使用默认值 - updatedAt: latestUpdatedAt || defaults.updatedAt, // 使用最新的更新时间,否则使用默认时间戳 - }; + terminal_custom_html: settings.terminal_custom_html ?? defaults.terminal_custom_html, + updatedAt: latestUpdatedAt || defaults.updatedAt, // 使用最新的更新时间,否则使用默认时间戳 + }; }; @@ -100,8 +104,9 @@ const getDefaultAppearanceSettings = (): Omit => { pageBackgroundImage: undefined, terminalBackgroundEnabled: true, // 默认启用 terminalBackgroundOverlayOpacity: 0.5, // 默认蒙版透明度 - updatedAt: Date.now(), // 提供默认时间戳 - }; + terminal_custom_html: '', // 默认自定义 HTML 为空字符串 + updatedAt: Date.now(), // 提供默认时间戳 + }; }; @@ -126,7 +131,8 @@ export const ensureDefaultSettingsExist = async (db: sqlite3.Database): Promise< { key: 'terminalBackgroundImage', value: defaults.terminalBackgroundImage ?? '' }, // 数据库中使用空字符串 { key: 'pageBackgroundImage', value: defaults.pageBackgroundImage ?? '' }, // 数据库中使用空字符串 { key: 'terminalBackgroundEnabled', value: defaults.terminalBackgroundEnabled }, - { key: 'terminalBackgroundOverlayOpacity', value: defaults.terminalBackgroundOverlayOpacity }, + { key: 'terminalBackgroundOverlayOpacity', value: defaults.terminalBackgroundOverlayOpacity }, + { key: 'terminal_custom_html', value: defaults.terminal_custom_html }, ]; try { diff --git a/packages/backend/src/services/appearance.service.ts b/packages/backend/src/services/appearance.service.ts index a56279c..4efaee0 100644 --- a/packages/backend/src/services/appearance.service.ts +++ b/packages/backend/src/services/appearance.service.ts @@ -100,7 +100,19 @@ export const updateSettings = async (settingsDto: UpdateAppearanceDto): Promise< settingsDto.terminalBackgroundOverlayOpacity = opacity; // 确保类型正确 } - // TODO: 如果实现了背景图片上传,这里需要处理文件路径或 URL 的验证/保存逻辑 + + + // 验证 terminal_custom_html (如果提供了) + if (settingsDto.hasOwnProperty('terminal_custom_html')) { + if (settingsDto.terminal_custom_html === null || settingsDto.terminal_custom_html === undefined || typeof settingsDto.terminal_custom_html === 'string') { + // 允许为空字符串、null 或 undefined (将被视为空) + if (typeof settingsDto.terminal_custom_html === 'string' && settingsDto.terminal_custom_html.length > 10240) { // 10KB 限制 + throw new Error('自定义终端 HTML 过长,最多允许 10240 个字符。'); + } + } else { + throw new Error('无效的自定义终端 HTML 类型,应为字符串。'); + } + } return appearanceRepository.updateAppearanceSettings(settingsDto); }; diff --git a/packages/backend/src/types/appearance.types.ts b/packages/backend/src/types/appearance.types.ts index 7c42984..33fa71f 100644 --- a/packages/backend/src/types/appearance.types.ts +++ b/packages/backend/src/types/appearance.types.ts @@ -19,6 +19,7 @@ export interface AppearanceSettings { editorFontFamily?: string | null; // Monaco Editor 字体偏好 terminalBackgroundEnabled?: boolean; // 终端背景是否启用 terminalBackgroundOverlayOpacity?: number; // 终端背景蒙版透明度 (0-1) + terminal_custom_html?: string; // 用户自定义终端背景 HTML updatedAt?: number; } diff --git a/packages/frontend/src/components/StyleCustomizer.vue b/packages/frontend/src/components/StyleCustomizer.vue index 204120c..e22cc14 100644 --- a/packages/frontend/src/components/StyleCustomizer.vue +++ b/packages/frontend/src/components/StyleCustomizer.vue @@ -1,5 +1,5 @@