新增:文件系统导航面包屑
功能: - 新增 PathBreadcrumb 组件,支持路径快速跳转 - 新增 DropdownItem 通用下拉菜单组件 优化: - 版本升级流程优化(Pinia 状态管理、进度节流、完整下载验证) - 模块延迟初始化(数据库、文件系统按需启动) - API 数据格式统一(蛇形转驼峰) - CodeMirror 语言包按需动态加载 - Markdown 渲染增强(支持锚点跳转) 重构: - 迁移到 Pinia 状态管理(stores/config.ts、stores/theme.ts、stores/update.ts) - 简化 UpdatePanel、UpdateNotification、ThemeToggle 逻辑 - 优化表结构加载逻辑 清理: - 删除测试组件 index-simple.vue - 删除旧的 useTheme.ts
This commit is contained in:
187
web/src/stores/config.ts
Normal file
187
web/src/stores/config.ts
Normal file
@@ -0,0 +1,187 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref, computed } from 'vue'
|
||||
import { Message } from '@arco-design/web-vue'
|
||||
|
||||
/**
|
||||
* Tab 配置类型
|
||||
*/
|
||||
interface TabConfig {
|
||||
key: string
|
||||
title: string
|
||||
visible: boolean
|
||||
enabled: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* 应用配置类型
|
||||
*/
|
||||
interface AppConfig {
|
||||
tabs: TabConfig[]
|
||||
visibleTabs: string[]
|
||||
defaultTab: string
|
||||
}
|
||||
|
||||
/**
|
||||
* 应用配置管理 Store
|
||||
* 统一管理应用配置(标签页、默认页等)
|
||||
*/
|
||||
export const useConfigStore = defineStore('config', () => {
|
||||
// ==================== 状态 ====================
|
||||
const appConfig = ref<AppConfig>({
|
||||
tabs: [],
|
||||
visibleTabs: [],
|
||||
defaultTab: 'file-system'
|
||||
})
|
||||
|
||||
const loading = ref(false)
|
||||
|
||||
// ==================== 计算属性 ====================
|
||||
/**
|
||||
* 可见 Tabs(根据配置动态生成)
|
||||
*/
|
||||
const visibleTabs = computed(() => {
|
||||
const tabs = appConfig.value.tabs
|
||||
|
||||
if (!tabs?.length) {
|
||||
return [
|
||||
{ key: 'file-system', title: '文件管理' },
|
||||
{ key: 'db-cli', title: '数据库' }
|
||||
]
|
||||
}
|
||||
|
||||
const { visibleTabs: order } = appConfig.value
|
||||
return tabs
|
||||
.filter(tab => tab.visible)
|
||||
.sort((a, b) => order.indexOf(a.key) - order.indexOf(b.key))
|
||||
})
|
||||
|
||||
/**
|
||||
* 所有可用 Tabs
|
||||
*/
|
||||
const allTabs = computed(() => appConfig.value.tabs)
|
||||
|
||||
/**
|
||||
* 默认 Tab
|
||||
*/
|
||||
const defaultTab = computed(() => appConfig.value.defaultTab)
|
||||
|
||||
// ==================== 核心方法 ====================
|
||||
/**
|
||||
* 加载配置
|
||||
*/
|
||||
const loadConfig = async () => {
|
||||
if (!window.go?.main?.App) {
|
||||
console.warn('Wails 绑定未准备好,1秒后重试')
|
||||
setTimeout(loadConfig, 1000)
|
||||
return
|
||||
}
|
||||
|
||||
loading.value = true
|
||||
|
||||
try {
|
||||
const result = await window.go.main.App.GetAppConfig()
|
||||
if (!result.success) throw new Error(result.message)
|
||||
|
||||
const { tabs = [], visibleTabs = [], defaultTab = 'file-system' } = result.data
|
||||
|
||||
appConfig.value = {
|
||||
tabs: tabs.map(tab => ({ ...tab, visible: visibleTabs.includes(tab.key) })),
|
||||
visibleTabs,
|
||||
defaultTab
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('加载配置失败:', error)
|
||||
useDefaultConfig()
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用默认配置
|
||||
*/
|
||||
const useDefaultConfig = () => {
|
||||
appConfig.value = {
|
||||
tabs: [
|
||||
{ key: 'file-system', title: '文件管理', visible: true, enabled: true },
|
||||
{ key: 'db-cli', title: '数据库', visible: true, enabled: true }
|
||||
],
|
||||
visibleTabs: ['file-system', 'db-cli'],
|
||||
defaultTab: 'file-system'
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存配置
|
||||
*/
|
||||
const saveConfig = async (config: AppConfig) => {
|
||||
if (!window.go?.main?.App) {
|
||||
Message.error('Wails 绑定未准备好')
|
||||
throw new Error('Wails binding not ready')
|
||||
}
|
||||
|
||||
loading.value = true
|
||||
|
||||
try {
|
||||
const result = await window.go.main.App.SaveAppConfig({
|
||||
tabs: config.tabs,
|
||||
visibleTabs: config.visibleTabs,
|
||||
defaultTab: config.defaultTab
|
||||
})
|
||||
|
||||
if (!result.success) {
|
||||
Message.error(result.message || '保存配置失败')
|
||||
throw new Error(result.message)
|
||||
}
|
||||
|
||||
// 更新本地配置
|
||||
appConfig.value = {
|
||||
tabs: [...config.tabs],
|
||||
visibleTabs: [...config.visibleTabs],
|
||||
defaultTab: config.defaultTab
|
||||
}
|
||||
|
||||
Message.success('配置保存成功')
|
||||
return true
|
||||
} catch (error) {
|
||||
console.error('保存配置失败:', error)
|
||||
const message = error instanceof Error ? error.message : '保存配置失败'
|
||||
Message.error('保存配置失败:' + message)
|
||||
throw error
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查 Tab 是否可见
|
||||
*/
|
||||
const isTabVisible = (tabKey: string) => {
|
||||
return appConfig.value.visibleTabs.includes(tabKey)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 Tab 配置
|
||||
*/
|
||||
const getTab = (tabKey: string) => {
|
||||
return appConfig.value.tabs.find(tab => tab.key === tabKey)
|
||||
}
|
||||
|
||||
// ==================== 返回 ====================
|
||||
return {
|
||||
// 状态
|
||||
appConfig,
|
||||
loading,
|
||||
|
||||
// 计算属性
|
||||
visibleTabs,
|
||||
allTabs,
|
||||
defaultTab,
|
||||
|
||||
// 方法
|
||||
loadConfig,
|
||||
saveConfig,
|
||||
isTabVisible,
|
||||
getTab
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user