diff --git a/frontend/src/pages/QueriesPage.tsx b/frontend/src/pages/QueriesPage.tsx index 4a12421..606c54f 100644 --- a/frontend/src/pages/QueriesPage.tsx +++ b/frontend/src/pages/QueriesPage.tsx @@ -126,6 +126,7 @@ export default function QueriesPage() { const [templateSearch, setTemplateSearch] = useState(''); const [templateCategory, setTemplateCategory] = useState('all'); const [showSidebar, setShowSidebar] = useState(true); + const [showResult, setShowResult] = useState(true); const [showHistory, setShowHistory] = useState(false); const [sortState, setSortState] = useState({ column: null, direction: null }); const [rowHeight] = useState(36); @@ -328,134 +329,140 @@ export default function QueriesPage() { return (
{/* ====== 主区域 ====== */} -
+
{/* -- 顶栏: 实例+库选择 -- */} -
-
- {selectedInstance && dbTypeIcon[dbType] && ( - - )} - - - {dbType === 'redis' ? ( - setInstanceId(e.target.value)} + className="px-3 py-2 bg-[var(--dg-bg-tertiary)] border border-[var(--dg-border)] rounded-lg text-sm focus:border-blue-400 focus:outline-none min-w-[200px]"> + + {instances.map(inst => ( + + ))} - ) : ( - - )} -
- {/* 右侧工具按钮组 */} -
- {instanceId && ( -
+ + {/* 右侧工具按钮组 */} +
+ {instanceId && ( + + )} + - )} - - - + + +
{/* -- 模板选择器 -- */} {showTemplates && ( -
-
- {templateCategories.map(cat => ( - - ))} -
-
- - setTemplateSearch(e.target.value)} - className="pl-7 pr-3 py-1 bg-[var(--dg-bg-primary)] border border-[var(--dg-border)] rounded-md text-xs focus:border-blue-400 focus:outline-none w-40" - placeholder="搜索模板..." /> -
-
- {filteredTemplates.length === 0 ? ( -
无匹配模板
- ) : ( -
- {filteredTemplates.map(tpl => ( - ))} +
+
+ + setTemplateSearch(e.target.value)} + className="pl-7 pr-3 py-1 bg-[var(--dg-bg-primary)] border border-[var(--dg-border)] rounded-md text-xs focus:border-blue-400 focus:outline-none w-40" + placeholder="搜索模板..." /> +
- )} + {filteredTemplates.length === 0 ? ( +
无匹配模板
+ ) : ( +
+ {filteredTemplates.map(tpl => ( + + ))} +
+ )} +
)} - {/* -- 编辑器 + 侧边栏 -- */} -
- {/* Schema 侧边栏 */} - {showSidebar && instanceId && ( -
- { - const sep = dbType === 'redis' ? (sql.trim() ? '\n' : '') : (sql.trim() ? ' ' : ''); - setSql(prev => prev + sep + text + (dbType === 'redis' ? '' : ' ')); - }} - onDatabaseChange={setDatabase} - singleDb={!!database} /> -
- )} + {/* -- 编辑器 + 侧边栏 (上半区,不随结果滚动) -- */} +
+
+ {/* Schema 侧边栏 */} + {showSidebar && instanceId && ( +
+ { + const sep = dbType === 'redis' ? (sql.trim() ? '\n' : '') : (sql.trim() ? ' ' : ''); + setSql(prev => prev + sep + text + (dbType === 'redis' ? '' : ' ')); + }} + onDatabaseChange={setDatabase} + singleDb={!!database} /> +
+ )} - {/* SQL 编辑器 */} -
-
- -
- - {dbTypeIcon[dbType] && } - {dbTypeLabel[dbType]} 模式 · {sql.length} 字符 - -
- Ctrl+Enter 执行 - Ctrl+Shift+F 格式化 + {/* SQL 编辑器 */} +
+
+ +
+ + {dbTypeIcon[dbType] && } + {dbTypeLabel[dbType]} 模式 · {sql.length} 字符 + +
+ Ctrl+Enter 执行 + Ctrl+Shift+F 格式化 +
@@ -464,41 +471,55 @@ export default function QueriesPage() { {/* -- 错误提示 -- */} {error && ( -
- {error} +
+
+ {error} +
)} - {/* -- 查询结果 -- */} + {/* -- 查询结果 (下半区,独立滚动) -- */} {result && ( -
-
-
- - - 查询结果 - -
- {result.execution_time_ms || result.cost_ms || 0}ms - {result.raw_text !== undefined ? ( - {result.raw_value ? 'JSON' : 'String'} - ) : ( - <> - {result.total || result.rows?.length || 0} 总行 - {result.rows?.length || 0} 行/页 - {result.columns?.length || 0} 列 - - )} - {result.rows?.length > 0 && ( - - )} +
+
+ {/* 结果标题栏 + 折叠按钮 */} +
setShowResult(!showResult)} + > +
+ + + 查询结果 + {showResult + ? + : + } + +
+ {result.execution_time_ms || result.cost_ms || 0}ms + {result.raw_text !== undefined ? ( + {result.raw_value ? 'JSON' : 'String'} + ) : ( + <> + {result.total || result.rows?.length || 0} 总行 + {result.rows?.length || 0} 行/页 + {result.columns?.length || 0} 列 + + )} + {result.rows?.length > 0 && ( + + )} +
-
-
+ + {/* 结果内容(可折叠) */} + {showResult && ( +
{result.raw_text !== undefined ? ( /* Raw value display (Redis GET/HGET/TTL etc.) */
@@ -517,7 +538,7 @@ export default function QueriesPage() {
) : result.columns && result.columns.length > 0 ? ( -
+
@@ -601,14 +622,18 @@ export default function QueriesPage() { {result.affected_rows > 0 && 影响行数: {result.affected_rows}} )} + + )} )} {/* -- 安全提示 -- */} -
- - 查询结果中的敏感字段将自动脱敏。MySQL/PG 仅支持 SELECT 查询,Redis/MongoDB 支持只读命令。 +
+
+ + 查询结果中的敏感字段将自动脱敏。MySQL/PG 仅支持 SELECT 查询,Redis/MongoDB 支持只读命令。 +