import { ref } from 'vue' interface ResultStats { rowsAffected: number executionTime: number } interface Column { title: string dataIndex: string width: number tooltip?: boolean } /** * 结果状态管理 Composable */ export function useResultState() { const resultLoading = ref(false) const resultError = ref('') const resultData = ref(null) const resultMode = ref<'table' | 'json'>('table') const resultStats = ref(null) const resultColumns = ref([]) const buildColumn = (key: string): Column => ({ title: key, dataIndex: key, width: 120, tooltip: true }) const clearResults = () => { resultData.value = null resultError.value = '' resultStats.value = null resultColumns.value = [] } const setQueryResult = (data: unknown[], stats: ResultStats, columns?: string[]) => { const dataArray = data ?? [] resultData.value = dataArray resultMode.value = 'table' resultStats.value = stats if (columns?.length) { resultColumns.value = columns.map(buildColumn) } else if (dataArray.length) { resultColumns.value = Object.keys(dataArray[0] as Record).map(buildColumn) } else { resultColumns.value = [] } } const setUpdateResult = (stats: ResultStats) => { resultData.value = null resultMode.value = 'table' resultStats.value = stats resultColumns.value = [] } const setCommandResult = (data: unknown, stats: ResultStats) => { resultData.value = data resultMode.value = 'json' resultStats.value = stats resultColumns.value = [] } const setError = (error: string) => { resultError.value = error resultData.value = null resultStats.value = null resultColumns.value = [] } // 开始加载(清空数据,用于新查询) const startLoading = () => { resultLoading.value = true resultError.value = '' resultData.value = null resultStats.value = null resultColumns.value = [] } // 开始加载但保留数据(用于翻页,避免闪烁) const startLoadingKeepData = () => { resultLoading.value = true resultError.value = '' } const stopLoading = () => { resultLoading.value = false } return { resultLoading, resultError, resultData, resultMode, resultStats, resultColumns, clearResults, setQueryResult, setUpdateResult, setCommandResult, setError, startLoading, startLoadingKeepData, stopLoading } }