Private
Public Access
1
0
Files
u-desk/web/src/views/db-cli/composables/useStructureStore.ts

124 lines
3.3 KiB
TypeScript

import { ref } from 'vue'
import { useEventBus } from './useEventBus'
import type { StructureInfo } from './useEventBus'
import { STORAGE_KEYS } from '../constants/storage'
import { getTableStructure } from '@/api'
class StructureStore {
public readonly loading = ref(false)
public readonly error = ref('')
public readonly data = ref<any>(null)
public readonly info = ref<StructureInfo | null>(null)
private eventBus = useEventBus()
setLoading(loading: boolean): void {
this.loading.value = loading
this.eventBus.emit('structure:loading', { loading })
}
setError(error: string): void {
this.error.value = error
this.eventBus.emit('structure:error', { error })
}
setData(data: any, info: StructureInfo): void {
this.data.value = data
this.info.value = info
this.error.value = ''
this.loading.value = false
try {
localStorage.setItem(STORAGE_KEYS.STRUCTURE_INFO, JSON.stringify(info))
} catch {}
this.eventBus.emit('structure:data', { data, info })
}
clear(): void {
this.data.value = null
this.info.value = null
this.error.value = ''
this.loading.value = false
try {
localStorage.removeItem(STORAGE_KEYS.STRUCTURE_INFO)
} catch {}
this.eventBus.emit('structure:clear', {})
}
restoreStructureInfo(): StructureInfo | null {
try {
const saved = localStorage.getItem(STORAGE_KEYS.STRUCTURE_INFO)
return saved ? JSON.parse(saved) as StructureInfo : null
} catch {
return null
}
}
async loadStructure(
connectionId: number,
database: string,
tableName: string,
dbType: 'mysql' | 'mongo' | 'redis',
nodeType: string
): Promise<void> {
// 跳过非表节点
if (nodeType === 'connection' || nodeType === 'database' || !tableName) {
this.info.value = { connectionId, database, tableName: '', dbType, nodeType }
this.data.value = null
return
}
// 检查是否切换到不同的表
const currentInfo = this.info.value
const isDifferentTable = !currentInfo ||
currentInfo.connectionId !== connectionId ||
currentInfo.database !== database ||
currentInfo.tableName !== tableName
if (isDifferentTable) {
this.data.value = null
this.error.value = ''
}
try {
this.setLoading(true)
const result = await getTableStructure(
connectionId,
database,
tableName
)
this.setData(result, { connectionId, database, tableName, dbType, nodeType })
} catch (error: unknown) {
const errorMsg = error instanceof Error ? error.message : '加载表结构失败'
this.setError(errorMsg)
this.data.value = null
this.info.value = null
} finally {
this.setLoading(false)
}
}
async refreshStructure(): Promise<void> {
if (!this.info.value) return
await this.loadStructure(
this.info.value.connectionId,
this.info.value.database,
this.info.value.tableName,
this.info.value.dbType,
this.info.value.nodeType
)
}
}
let structureStoreInstance: StructureStore | null = null
export function useStructureStore(): StructureStore {
if (!structureStoreInstance) {
structureStoreInstance = new StructureStore()
}
return structureStoreInstance
}
export type { StructureInfo }