# 数据库客户端组件拆分方案 ## 组件架构设计 ### 组件拆分 将 `index.vue` 拆分为以下组件: 1. **ConnectionTree.vue** - 左侧连接树形列表 2. **SqlEditor.vue** - SQL编辑器区域 3. **ResultPanel.vue** - 结果展示区域 4. **index.vue** - 主组件(布局和状态管理) ### 组件职责划分 #### ConnectionTree.vue - **职责**:连接列表管理、树形结构展示、数据库/表展开 - **状态**:connections, treeData, loading, loadingNodes - **方法**:loadConnections, loadDatabases, loadTables - **事件**: - `connection-select`: 连接被选中 - `connection-edit`: 编辑连接 - `connection-delete`: 删除连接 - `connection-refresh`: 需要刷新连接列表 - `table-select`: 表被选中(用于生成SQL) - `new-connection`: 新建连接 #### SqlEditor.vue - **职责**:SQL编辑器、标签页管理、工具栏 - **Props**: - `currentConnection`: 当前选中的连接对象 - **状态**:tabs, activeTab, editorView - **方法**:initEditor, handleAddTab, handleDeleteTab, handleExecute, handleExecuteSelected, handleFormat - **事件**: - `execute`: 执行SQL(完整内容) - `execute-selected`: 执行选中的SQL - `format`: 格式化SQL - `sql-insert`: 插入SQL到编辑器(由表选择触发) - `tab-change`: 标签页切换 - `sql-change`: SQL内容变化 #### ResultPanel.vue - **职责**:结果展示(表格、JSON、消息) - **Props**: - `loading`: 加载状态 - `error`: 错误信息 - `data`: 结果数据 - `mode`: 展示模式(table/json) - `stats`: 执行统计信息 - `messages`: 消息列表 - **状态**:resultTab - **方法**:formatJSON - **事件**:无(纯展示组件) #### index.vue(主组件) - **职责**: - 布局管理(左侧、右侧、底部) - 状态协调(当前连接、执行结果) - 组件通信桥梁 - 连接表单管理 ### 组件通信方式 #### 1. Props 向下传递 - `currentConnection` → SqlEditor - `loading, error, data, mode, stats, messages` → ResultPanel #### 2. Events 向上传递 - ConnectionTree 的事件 → index.vue 处理 - SqlEditor 的事件 → index.vue 处理 #### 3. 数据流向 ``` ConnectionTree └─ connection-select ──→ index.vue ──→ SqlEditor (currentConnection prop) └─→ ResultPanel (clear data) SqlEditor └─ execute ──→ index.vue ──→ ExecuteSQL API ──→ ResultPanel (result props) ConnectionTree └─ table-select ──→ index.vue ──→ SqlEditor (sql-insert event) ``` ### 状态管理 #### 主组件 (index.vue) 管理的状态: - `currentConnection`: 当前选中的连接(需要传递给 SqlEditor) - `resultLoading, resultError, resultData, resultMode, resultStats`: 执行结果(需要传递给 ResultPanel) - `messages`: 消息列表(需要传递给 ResultPanel) - `showConnectionForm, editingConnectionId`: 连接表单状态 #### 子组件自己管理的状态: - ConnectionTree: connections, treeData, loading, loadingNodes - SqlEditor: tabs, activeTab, editorView - ResultPanel: resultTab ### 优势 1. **职责清晰**:每个组件只关注自己的功能 2. **可维护性强**:修改某个功能只需修改对应组件 3. **可复用性**:ResultPanel 可以在其他地方复用 4. **测试友好**:每个组件可以独立测试 5. **性能优化**:可以针对单个组件进行优化 ### 后续扩展 如果功能继续增加,可以考虑: 1. 引入 Pinia/Vuex 进行全局状态管理 2. 使用 provide/inject 传递深层数据 3. 提取公共逻辑到 composables ## 实现步骤 ### 步骤1:创建 ConnectionTree.vue ✅ 已完成,组件位置:`components/ConnectionTree.vue` ### 步骤2:创建 SqlEditor.vue 需要提取的代码: - 编辑器相关:initEditor, editorView, tabs, activeTab - 标签页管理:handleAddTab, handleDeleteTab - 执行方法:handleExecute, handleExecuteSelected(通过emit传递SQL给父组件) - 格式化:handleFormat - SQL插入:insertSQL(用于接收表选择事件) ### 步骤3:创建 ResultPanel.vue 需要提取的代码: - 结果展示:resultLoading, resultError, resultData, resultMode, resultStats, resultColumns - 消息列表:messages - 格式化:formatJSON ### 步骤4:重构 index.vue - 移除已提取的代码 - 引入新组件 - 实现组件通信逻辑: - 监听 ConnectionTree 的事件 - 调用 ExecuteSQL API - 传递数据到 ResultPanel ## 通信示例代码 ### index.vue 中的通信代码 ```vue ```