Private
Public Access
1
0

新增:文件系统导航面包屑

功能:
- 新增 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:
2026-02-05 00:17:32 +08:00
parent ce2698f245
commit f7d648ea52
48 changed files with 3930 additions and 1380 deletions

187
web/src/stores/config.ts Normal file
View 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
}
})