113 lines
2.5 KiB
TypeScript
113 lines
2.5 KiB
TypeScript
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<unknown>(null)
|
|
const resultMode = ref<'table' | 'json'>('table')
|
|
const resultStats = ref<ResultStats | null>(null)
|
|
const resultColumns = ref<Column[]>([])
|
|
|
|
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<string, any>).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
|
|
}
|
|
}
|
|
|