# 模块10:模式切换功能 --- ## 🎨 UI设计系统概览 > **完整设计系统文档请参考:** `UI设计系统.md` ### 核心设计原则 - **现代简约**:界面清晰,层次分明 - **专业高效**:减少操作步骤,提升工作效率 - **一致性**:统一的视觉语言和交互模式 - **可访问性**:符合WCAG 2.1 AA标准 ### 关键设计令牌 **颜色系统:** - 主色:`#0d6efd`(操作按钮、选中状态) - 成功:`#198754`(连接成功状态) - 危险:`#dc3545`(删除操作、错误提示) - 深灰:`#212529`(导航栏背景) - 浅灰:`#e9ecef`(工具栏背景) **字体系统:** - 字体族:系统字体栈(-apple-system, Segoe UI, Roboto等) - 正文:14px,行高1.5 - 标题:20-32px,行高1.2-1.4 - 小号文字:12px(文件大小、日期等) **间距系统:** - 基础单位:8px - 标准间距:16px(1rem) - 组件内边距:8px-16px **组件规范:** - 导航栏:高度48px,深色背景 - 工具栏:浅灰背景,按钮间距8px - 文件项:最小高度44px,悬停效果150ms - 按钮:圆角4px,过渡150ms **交互规范:** - 悬停效果:150ms过渡 - 触摸目标:最小44x44px - 键盘导航:Tab、Enter、Delete、F2、F5、Esc - 焦点状态:2px蓝色轮廓 **响应式断点:** - 移动端:< 768px(双面板垂直排列) - 平板:768px - 1024px - 桌面:> 1024px(标准布局) --- ## 10.1 功能概述 实现左侧和右侧面板在"本地文件"和"SFTP服务器"模式之间切换,支持同时连接多个SFTP服务器。 ## 10.2 模式状态管理 ### 10.2.1 JavaScript状态管理 ```javascript // 面板状态管理 const panelState = { left: { mode: 'local', // 'local' 或 'sftp' sessionId: 'local', // 'local' 或 SFTP会话ID currentPath: '', // 当前路径 selectedFiles: [] // 选中的文件 }, right: { mode: 'local', sessionId: 'local', currentPath: '', selectedFiles: [] } }; // 活跃连接映射 const activeConnections = {}; // 已保存的连接列表 let savedConnections = []; ``` ### 10.2.2 模式切换逻辑 ```javascript // 模式切换 function onModeChange(panelId) { const mode = $(`#${panelId}-mode`).val(); panelState[panelId].mode = mode; if (mode === 'local') { switchToLocalMode(panelId); } else { switchToSftpMode(panelId); } } // 切换到本地模式 function switchToLocalMode(panelId) { updateStatus(`正在切换到本地模式...`); // 隐藏SFTP连接选择器 $(`#${panelId}-connection`).hide(); // 更新会话ID panelState[panelId].sessionId = 'local'; // 设置默认路径 panelState[panelId].currentPath = getDefaultLocalPath(); // 加载本地文件列表 loadFiles(panelId); updateStatus('已切换到本地模式'); } // 切换到SFTP模式 function switchToSftpMode(panelId) { updateStatus(`正在切换到SFTP模式...`); // 显示SFTP连接选择器 $(`#${panelId}-connection`).show(); // 加载已保存的连接列表 loadSavedConnections(panelId); // 检查是否有活跃的SFTP连接 const activeSessionId = findActiveSftpSession(panelId); if (activeSessionId) { // 使用已有连接 panelState[panelId].sessionId = activeSessionId; $(`#${panelId}-connection`).val(activeSessionId); loadSftpCurrentPath(panelId, activeSessionId); } else { // 提示用户选择或创建连接 alert('请选择一个SFTP连接或创建新连接'); } updateStatus('已切换到SFTP模式'); } // 获取默认本地路径 function getDefaultLocalPath() { return System.getProperty('user.home'); } // 查找活跃的SFTP会话 function findActiveSftpSession(panelId) { const connectionSelect = $(`#${panelId}-connection`); const sessionId = connectionSelect.val(); if (sessionId && sessionId !== 'local') { return sessionId; } return null; } // 加载SFTP当前路径 function loadSftpCurrentPath(panelId, sessionId) { $.ajax({ url: '/api/files/path', method: 'GET', data: {sessionId: sessionId}, success: function(response) { if (response.success) { panelState[panelId].currentPath = response.data.path; loadFiles(panelId); } else { alert('获取路径失败: ' + response.message); } }, error: handleError }); } ``` ## 10.3 连接管理UI ### 10.3.1 连接列表加载 ```javascript // 加载已保存的连接列表 function loadSavedConnections(panelId) { $.ajax({ url: '/api/connection/list', method: 'GET', success: function(response) { if (response.success) { savedConnections = response.data; updateConnectionSelect(panelId, savedConnections); } else { alert('加载连接列表失败: ' + response.message); } }, error: handleError }); } // 更新连接选择器 function updateConnectionSelect(panelId, connections) { const select = $(`#${panelId}-connection`); select.empty(); // 添加选项 if (connections.length === 0) { select.append(''); } else { connections.forEach(conn => { const option = $(''); } else { Object.entries(activeConnections).forEach(([sessionId, conn]) => { const option = $('