From b5e7627e18bfa964695f7d8838fd300854081962 Mon Sep 17 00:00:00 2001 From: Baobhan Sith <80159437+Heavrnl@users.noreply.github.com> Date: Tue, 22 Apr 2025 01:39:51 +0800 Subject: [PATCH] update --- .../backend/src/services/settings.service.ts | 63 ++++++++++++------- .../src/settings/settings.controller.ts | 22 ++++--- .../src/stores/focusSwitcher.store.ts | 10 +-- 3 files changed, 58 insertions(+), 37 deletions(-) diff --git a/packages/backend/src/services/settings.service.ts b/packages/backend/src/services/settings.service.ts index 6abeede..acbb3f6 100644 --- a/packages/backend/src/services/settings.service.ts +++ b/packages/backend/src/services/settings.service.ts @@ -1,8 +1,14 @@ import { settingsRepository, Setting, getSidebarConfig as getSidebarConfigFromRepo, setSidebarConfig as setSidebarConfigInRepo } from '../repositories/settings.repository'; // Import specific repo functions -import { SidebarConfig, PaneName, UpdateSidebarConfigDto } from '../types/settings.types'; // <-- Correct import path +import { SidebarConfig, PaneName, UpdateSidebarConfigDto } from '../types/settings.types'; -// +++ 定义默认的焦点切换顺序 +++ -const DEFAULT_FOCUS_SEQUENCE = ["quickCommandsSearch", "commandHistorySearch", "fileManagerSearch", "commandInput", "terminalSearch"]; +// +++ 定义焦点切换配置项接口 (与前端 store 保持一致) +++ +interface ConfigurableFocusableItem { + id: string; + shortcut?: string; +} + +// --- 移除旧的默认字符串数组 --- +// const DEFAULT_FOCUS_SEQUENCE = ["quickCommandsSearch", "commandHistorySearch", "fileManagerSearch", "commandInput", "terminalSearch"]; const FOCUS_SEQUENCE_KEY = 'focusSwitcherSequence'; // 焦点切换顺序设置键 const NAV_BAR_VISIBLE_KEY = 'navBarVisible'; // 导航栏可见性设置键 const LAYOUT_TREE_KEY = 'layoutTree'; // 布局树设置键 @@ -91,43 +97,52 @@ export const settingsService = { * 获取焦点切换顺序 * @returns 返回存储的焦点切换顺序数组,如果未设置或无效则返回默认顺序 */ - async getFocusSwitcherSequence(): Promise { + async getFocusSwitcherSequence(): Promise { // +++ 更新返回类型 +++ console.log(`[Service] Attempting to get setting for key: ${FOCUS_SEQUENCE_KEY}`); try { - const sequenceJson = await settingsRepository.getSetting(FOCUS_SEQUENCE_KEY); - console.log(`[Service] Raw value from repository for ${FOCUS_SEQUENCE_KEY}:`, sequenceJson); - if (sequenceJson) { - const sequence = JSON.parse(sequenceJson); - if (Array.isArray(sequence) && sequence.every(item => typeof item === 'string')) { - console.log('[Service] Fetched and validated focus switcher sequence:', JSON.stringify(sequence)); - return sequence; + const configJson = await settingsRepository.getSetting(FOCUS_SEQUENCE_KEY); + console.log(`[Service] Raw value from repository for ${FOCUS_SEQUENCE_KEY}:`, configJson); + if (configJson) { + const config = JSON.parse(configJson); + // +++ 验证新的数据结构 +++ + if (Array.isArray(config) && config.every(item => + typeof item === 'object' && item !== null && typeof item.id === 'string' && + (item.shortcut === undefined || typeof item.shortcut === 'string') + )) { + console.log('[Service] Fetched and validated focus switcher config:', JSON.stringify(config)); + return config as ConfigurableFocusableItem[]; } else { - console.warn('[Service] Invalid focus switcher sequence format found in settings. Returning default.'); + console.warn('[Service] Invalid focus switcher config format found in settings. Returning empty array.'); } } else { - console.log('[Service] No focus switcher sequence found in settings. Returning default.'); + console.log('[Service] No focus switcher config found in settings. Returning empty array.'); } } catch (error) { - console.error(`[Service] Error parsing focus switcher sequence from settings (key: ${FOCUS_SEQUENCE_KEY}):`, error); + console.error(`[Service] Error parsing focus switcher config from settings (key: ${FOCUS_SEQUENCE_KEY}):`, error); } - console.log('[Service] Returning default focus sequence:', JSON.stringify(DEFAULT_FOCUS_SEQUENCE)); - return [...DEFAULT_FOCUS_SEQUENCE]; + // +++ 返回空数组作为默认值 +++ + console.log('[Service] Returning empty array as default focus config.'); + return []; }, /** * 设置焦点切换顺序 * @param sequence 要保存的焦点切换顺序数组 */ - async setFocusSwitcherSequence(sequence: string[]): Promise { - console.log('[Service] setFocusSwitcherSequence called with:', JSON.stringify(sequence)); - if (!Array.isArray(sequence) || !sequence.every(item => typeof item === 'string')) { - console.error('[Service] Attempted to save invalid focus switcher sequence format:', sequence); - throw new Error('Invalid sequence format provided.'); + async setFocusSwitcherSequence(config: ConfigurableFocusableItem[]): Promise { // +++ 更新参数类型 +++ + console.log('[Service] setFocusSwitcherSequence called with new config format:', JSON.stringify(config)); + // +++ 验证新的数据结构 (虽然控制器层已验证,服务层再次验证更健壮) +++ + if (!Array.isArray(config) || !config.every(item => + typeof item === 'object' && item !== null && typeof item.id === 'string' && + (item.shortcut === undefined || typeof item.shortcut === 'string') + )) { + console.error('[Service] Attempted to save invalid focus switcher config format:', config); + throw new Error('Invalid config format provided.'); } try { - const sequenceJson = JSON.stringify(sequence); - console.log(`[Service] Attempting to save setting. Key: ${FOCUS_SEQUENCE_KEY}, Value: ${sequenceJson}`); - await settingsRepository.setSetting(FOCUS_SEQUENCE_KEY, sequenceJson); + const configJson = JSON.stringify(config); // +++ 序列化新的结构 +++ + console.log(`[Service] Attempting to save setting. Key: ${FOCUS_SEQUENCE_KEY}, Value: ${configJson}`); + await settingsRepository.setSetting(FOCUS_SEQUENCE_KEY, configJson); console.log(`[Service] Successfully saved setting for key: ${FOCUS_SEQUENCE_KEY}`); } catch (error) { console.error(`[Service] Error calling settingsRepository.setSetting for key ${FOCUS_SEQUENCE_KEY}:`, error); diff --git a/packages/backend/src/settings/settings.controller.ts b/packages/backend/src/settings/settings.controller.ts index b47fb4c..1285a1a 100644 --- a/packages/backend/src/settings/settings.controller.ts +++ b/packages/backend/src/settings/settings.controller.ts @@ -87,21 +87,27 @@ export const settingsController = { async setFocusSwitcherSequence(req: Request, res: Response): Promise { console.log('[Controller] Received request to set focus switcher sequence.'); try { - const { sequence } = req.body; - console.log('[Controller] Request body sequence:', JSON.stringify(sequence)); + // +++ 修改:直接获取请求体作为配置数组 +++ + const focusConfig = req.body; + console.log('[Controller] Request body focusConfig:', JSON.stringify(focusConfig)); - if (!Array.isArray(sequence) || !sequence.every(item => typeof item === 'string')) { - console.warn('[Controller] Invalid sequence format received:', sequence); - res.status(400).json({ message: '无效的请求体,"sequence" 必须是一个字符串数组' }); + // +++ 修改:验证新的数据结构 (ConfigurableFocusableItem[]) +++ + if (!Array.isArray(focusConfig) || !focusConfig.every(item => + typeof item === 'object' && item !== null && typeof item.id === 'string' && + (item.shortcut === undefined || typeof item.shortcut === 'string') + )) { + console.warn('[Controller] Invalid focus config format received:', focusConfig); + res.status(400).json({ message: '无效的请求体,必须是包含 id (string) 和可选 shortcut (string) 的对象数组' }); return; } - console.log('[Controller] Calling settingsService.setFocusSwitcherSequence...'); - await settingsService.setFocusSwitcherSequence(sequence); + console.log('[Controller] Calling settingsService.setFocusSwitcherSequence with new config format...'); + // +++ 修改:传递完整的配置数组给服务层 +++ + await settingsService.setFocusSwitcherSequence(focusConfig); console.log('[Controller] settingsService.setFocusSwitcherSequence completed successfully.'); console.log('[Controller] Logging audit action: FOCUS_SWITCHER_SEQUENCE_UPDATED'); - auditLogService.logAction('FOCUS_SWITCHER_SEQUENCE_UPDATED', { sequence }); + auditLogService.logAction('FOCUS_SWITCHER_SEQUENCE_UPDATED', { config: focusConfig }); // +++ 修改审计日志内容 +++ console.log('[Controller] Sending success response.'); res.status(200).json({ message: '焦点切换顺序已成功更新' }); diff --git a/packages/frontend/src/stores/focusSwitcher.store.ts b/packages/frontend/src/stores/focusSwitcher.store.ts index 2a66da2..8509c93 100644 --- a/packages/frontend/src/stores/focusSwitcher.store.ts +++ b/packages/frontend/src/stores/focusSwitcher.store.ts @@ -126,17 +126,17 @@ export const useFocusSwitcherStore = defineStore('focusSwitcher', () => { const apiUrl = '/api/v1/settings/focus-switcher-sequence'; // 假设 API 端点不变 console.log(`[FocusSwitcherStore] Attempting to save configuration (sequence & shortcuts) to backend via PUT: ${apiUrl}`); try { - // *** 构造后端期望的请求体:{ sequence: string[] } *** - const sequenceIds = configuredItems.value.map(item => item.id); - const requestBody = { sequence: sequenceIds }; - console.log('[FocusSwitcherStore] Configuration data to save (backend format):', JSON.stringify(requestBody)); + // *** 发送 configuredItems 结构到后端 (包含快捷键) *** + // !!! 注意:这需要后端 API 支持接收此结构 !!! + const configToSave = configuredItems.value; + console.log('[FocusSwitcherStore] Configuration data to save (including shortcuts):', JSON.stringify(configToSave)); const response = await fetch(apiUrl, { method: 'PUT', headers: { 'Content-Type': 'application/json', // Auth headers if needed }, - body: JSON.stringify(requestBody), // *** 发送符合后端格式的请求体 *** + body: JSON.stringify(configToSave), // *** 发送完整的配置对象数组 *** }); console.log(`[FocusSwitcherStore] Received response from PUT ${apiUrl}. Status: ${response.status}`);