Private
Public Access
1
0

发布:版本 0.3.0

- Markdown Mermaid 图表支持(10+ 种图表类型)
- 代码语法高亮(20+ 种常用编程语言)
- 文件列表优化(文件夹优先显示)
- 文件系统模块化重构
- 新增内部更新日志 CHANGELOG.internal.md
- 更新作者邮箱
This commit is contained in:
2026-02-04 11:12:24 +08:00
parent 1708c65c34
commit d7de60b02c
8 changed files with 199 additions and 31 deletions

117
CHANGELOG.internal.md Normal file
View File

@@ -0,0 +1,117 @@
# 内部更新日志
> 本文档记录所有技术细节,包括代码重构、构建优化等内部改动
## [0.3.0] - 2026-02-04
### 新增功能 ✨
- **Markdown 渲染增强**
- 集成 Mermaid.js v11支持流程图、时序图、类图、甘特图等 10+ 种图表类型
- 集成 CodeMirror + Highlight.js支持 27 种常用编程语言语法高亮
- 实现编辑/预览模式切换时的图表自动重渲染机制
- **TypeScript 类型系统**
- 新增 `web/src/types/file-system.ts` 完整类型定义
- 所有 Vue 组件迁移到 TypeScript
- 新增 `vue-tsc` 类型检查
### 代码重构 🔧
- **文件系统模块化**
- 拆分 FileSystem/index.vue (2100+ 行) 为模块化架构
- 提取 6 个 ComposablesuseFileOperations、useFavorites、usePathNavigation、useFilePreview、useFileEdit、useCommonPaths
- 拆分为 5 个子组件Toolbar、Sidebar、FileListPanel、FileEditorPanel、ContextMenu
- **公共函数提取**
- 提取 `sortFileList` 公共函数,统一文件列表排序逻辑
- 应用到 FileSystem/index.vue、index-simple.vue、DeviceTest.vue
- 优化 `fileUtils.js`,新增 8 个工具函数
### 构建优化 📦
- **Source Map 优化**
- 生产环境禁用 source map 生成
- 配置 `sourcemap: false` in vite.config.js
- **依赖优化**
- CodeMirror 语言包按需加载配置
- Vite optimizeDeps 预构建优化
### Bug 修复 🐛
- 修复 Mermaid 图表在编辑/预览切换时不渲染的问题(添加 watch + nextTick
- 修复亮色模式下代码高亮对比度不足(添加自定义 CSS 变量)
- 修复暗色模式下 Mermaid 图表显示异常(样式适配)
### 文件变更统计
- 130 个文件修改
- +11,655 / -12,233 行代码
- 主要变更:`web/src/components/FileSystem/` 目录重构
---
## [0.1.5] - 2026-01-22
### 新增功能 ✨
- **文件管理模块**
- 创建 FileSystem.vue 单体组件559 行)
- 支持文件浏览、编辑、重命名、删除等基础操作
- 智能文件类型图标识别
- **版本更新管理**
- 集成版本检查 API
- 支持自动下载更新包
- 新增 UpdatePanel 更新面板组件427 行)
- **系统信息查询**
- CPU 信息(核心数、使用率、型号)
- 内存信息(总量、可用量、使用率)
- 磁盘信息(分区、使用量、使用率)
### 技术实现 🔧
- 使用 gopsutil/v3 库获取系统信息
- SQLite 存储连接和查询历史
- 文件操作使用 Go runtime/os 包
---
## [0.2.0] - 2026-01-28
### 新增功能 ✨
- **应用配置管理**
- 新增 ConfigAPI 和 ConfigService
- 新增设置面板组件
- 支持自定义显示模块和默认启动页
- **智能更新提醒**
- 新增版本更新通知组件
- 版本检查和下载机制
### 代码重构 🔧
- **模块重命名** - 项目重命名为 u-desk
- **依赖更新** - 所有依赖更新到最新版本
- **代码架构优化** - 提取公共函数,消除重复代码
- **启动流程优化** - 按需加载模块
---
## [0.1.0] - 2026-01-18
### 新增功能 ✨
- **数据库管理**
- 支持 MySQL、MongoDB、Redis 连接
- SQL 查询执行和结果展示
- 连接池管理467 行 sql_exec_service.go
- 多标签页查询结果管理
### 技术实现 🔧
- MySQL使用 go-sql-driver/mysql
- MongoDB使用 mongo-driver
- Redis使用 go-redis/v9
- 连接池自定义实现236 行 pool.go
- SQLite存储查询历史和连接配置
### 文件变更
- 15 个文件新增
- +3,700+ 行代码
---
## 版本规范
版本号格式:`主版本号.次版本号.修订号` (MAJOR.MINOR.PATCH)
- **主版本号** - 不兼容的 API 修改
- **次版本号** - 向下兼容的功能性新增
- **修订号** - 向下兼容的问题修复

View File

@@ -1,24 +1,32 @@
# 更新日志 # 更新日志
## [0.3.0] - 2026-02-04
### 新增 ✨
- **Markdown 图表支持** - 支持 Mermaid 流程图、时序图、类图等多种图表渲染
- **代码语法高亮** - 支持 20+ 种常用编程语言的语法高亮
- **文件列表优化** - 文件夹优先显示,同类型按名称排序
### 修复 🐛
- 修复编辑/预览模式切换时图表不渲染的问题
- 修复不同主题下代码高亮显示问题
---
## [0.2.0] - 2026-01-28 ## [0.2.0] - 2026-01-28
### 新增 ✨ ### 新增 ✨
- **应用配置管理** - 全新设置面板,支持自定义显示模块和默认启动页 - **应用配置管理** - 全新设置面板,支持自定义显示模块和默认启动页
- **智能更新提醒** - 新增版本更新通知组件,第一时间获取新版本信息 - **智能更新提醒** - 新增版本更新通知组件
- **配置服务层** - 新增 ConfigAPI 和 ConfigService 实现统一配置管理 - **模块重命名** - 应用更名为 u-desk
### 优化 ⚡
- **文件系统模块化重构** - 提升代码质量和可维护性
- **代码架构优化** - 提取公共函数,消除重复代码
- **启动流程优化** - 按需加载模块,提升启动性能
--- ---
## [0.1.5] - 2026-01-22 ## [0.1.5] - 2026-01-22
### 新增 ✨ ### 新增 ✨
- **文件管理模块** - 完整的文件浏览、编辑、操作功能 - **文件管理模块** - 文件浏览、编辑、操作功能
- **版本更新管理** - 自动检查和应用更新 - **版本更新管理** - 自动检查和下载更新
- **系统信息查询** - CPU、内存、磁盘等硬件信息 - **系统信息查询** - CPU、内存、磁盘等硬件信息
--- ---

5
app.go
View File

@@ -49,13 +49,16 @@ func (a *App) Startup(ctx context.Context) {
} }
_ = sqliteDB // 全局 DB 已由 InitFast() 设置 _ = sqliteDB // 全局 DB 已由 InitFast() 设置
// 2. 初始化配置服务(必需,用于读取模块启用状态) // 2. 初始化配置服务
configService, err := api.NewConfigAPI() configService, err := api.NewConfigAPI()
if err != nil { if err != nil {
panic(fmt.Sprintf("配置服务初始化失败: %v", err)) panic(fmt.Sprintf("配置服务初始化失败: %v", err))
} }
a.configAPI = configService a.configAPI = configService
// 2.5. 迁移旧配置
_ = a.configAPI.MigrateTabConfig()
// 3. 读取配置,获取可见的 Tabs // 3. 读取配置,获取可见的 Tabs
visibleTabs := a.getVisibleTabs() visibleTabs := a.getVisibleTabs()
fmt.Printf("[启动] 可用的模块: %v\n", visibleTabs) fmt.Printf("[启动] 可用的模块: %v\n", visibleTabs)

View File

@@ -135,3 +135,48 @@ func (api *ConfigAPI) SaveAppConfig(req SaveAppConfigRequest) (map[string]interf
"data": nil, "data": nil,
}, nil }, nil
} }
// MigrateTabConfig 迁移旧配置
func (api *ConfigAPI) MigrateTabConfig() error {
config, _ := api.configService.GetTabConfig()
if config == nil {
return nil
}
// 检查是否包含 device
hasDevice := false
for _, tab := range config.AvailableTabs {
if tab.Key == "device" {
hasDevice = true
break
}
}
if !hasDevice {
return nil
}
// 过滤掉 device
newTabs := make([]service.TabDefinition, 0, len(config.AvailableTabs))
newVisible := make([]string, 0, len(config.VisibleTabs))
for _, tab := range config.AvailableTabs {
if tab.Key != "device" {
newTabs = append(newTabs, tab)
}
}
for _, key := range config.VisibleTabs {
if key != "device" {
newVisible = append(newVisible, key)
}
}
defaultTab := config.DefaultTab
if defaultTab == "device" {
defaultTab = "file-system"
}
return api.configService.SaveTabConfig(&service.TabConfig{
AvailableTabs: newTabs,
VisibleTabs: newVisible,
DefaultTab: defaultTab,
})
}

View File

@@ -41,12 +41,11 @@ type TabConfig struct {
// 默认 Tab 配置 // 默认 Tab 配置
var defaultTabConfig = TabConfig{ var defaultTabConfig = TabConfig{
AvailableTabs: []TabDefinition{ AvailableTabs: []TabDefinition{
{Key: "db-cli", Title: "数据库", Enabled: true},
{Key: "file-system", Title: "文件管理", Enabled: true}, {Key: "file-system", Title: "文件管理", Enabled: true},
{Key: "device", Title: "设备调用测试", Enabled: true}, {Key: "db-cli", Title: "数据库", Enabled: true},
}, },
VisibleTabs: []string{"db-cli", "file-system", "device"}, VisibleTabs: []string{"file-system", "db-cli"},
DefaultTab: "db-cli", DefaultTab: "file-system",
} }
const ( const (

View File

@@ -13,7 +13,7 @@ import (
// ==================== 常量定义 ==================== // ==================== 常量定义 ====================
// AppVersion 应用版本号(发布时直接修改此处) // AppVersion 应用版本号(发布时直接修改此处)
const AppVersion = "0.2.0" const AppVersion = "0.3.0"
// ==================== 类型定义 ==================== // ==================== 类型定义 ====================

View File

@@ -1,12 +1,12 @@
{ {
"name": "u-desk", "name": "u-desk",
"outputfilename": "u-desk", "outputfilename": "u-desk",
"version": "0.2.0", "version": "0.3.0",
"frontend:install": "npm install", "frontend:install": "npm install",
"frontend:build": "npm run build", "frontend:build": "npm run build",
"author": { "author": {
"name": "u-desk", "name": "u-desk",
"email": "info@example.com" "email": "lxy208@126.com"
}, },
"frontend:dir": "web", "frontend:dir": "web",
"wailsjsdir": "./web/src/wailsjs" "wailsjsdir": "./web/src/wailsjs"

View File

@@ -50,7 +50,7 @@
<a-layout-content class="content"> <a-layout-content class="content">
<!-- 动态渲染 Tab 内容 --> <!-- 动态渲染 Tab 内容 -->
<!-- 使用 KeepAlive 缓存组件状态避免切换时重新加载 --> <!-- 使用 KeepAlive 缓存组件状态避免切换时重新加载 -->
<KeepAlive include="FileSystem,DbCli,DeviceTest"> <KeepAlive include="FileSystem,DbCli">
<component :is="getComponent(activeTab)"/> <component :is="getComponent(activeTab)"/>
</KeepAlive> </KeepAlive>
</a-layout-content> </a-layout-content>
@@ -76,7 +76,6 @@
import {computed, onMounted, ref, watch} from 'vue' import {computed, onMounted, ref, watch} from 'vue'
import {IconSettings} from '@arco-design/web-vue/es/icon' import {IconSettings} from '@arco-design/web-vue/es/icon'
import {Message} from '@arco-design/web-vue' import {Message} from '@arco-design/web-vue'
import DeviceTest from './components/DeviceTest.vue'
import DbCli from './views/db-cli/index.vue' import DbCli from './views/db-cli/index.vue'
import ThemeToggle from './components/ThemeToggle.vue' import ThemeToggle from './components/ThemeToggle.vue'
import FileSystem from './components/FileSystem/index.vue' import FileSystem from './components/FileSystem/index.vue'
@@ -86,9 +85,9 @@ import UpdateNotification from './components/UpdateNotification.vue'
// 存储键 // 存储键
const ACTIVE_TAB_STORAGE_KEY = 'app-active-tab' const ACTIVE_TAB_STORAGE_KEY = 'app-active-tab'
// 从 localStorage 恢复上次打开的区域,默认为 'db-cli' // 从 localStorage 恢复上次打开的区域,默认为 'file-system'
const savedTab = localStorage.getItem(ACTIVE_TAB_STORAGE_KEY) const savedTab = localStorage.getItem(ACTIVE_TAB_STORAGE_KEY)
const activeTab = ref((savedTab === 'user' ? 'db-cli' : savedTab) || 'db-cli') const activeTab = ref((savedTab === 'user' ? 'file-system' : savedTab) || 'file-system')
const showSettings = ref(false) const showSettings = ref(false)
const isMaximized = ref(false) const isMaximized = ref(false)
@@ -101,7 +100,7 @@ const checkedUpdate = ref(false)
const appConfig = ref({ const appConfig = ref({
tabs: [], tabs: [],
visibleTabs: [], visibleTabs: [],
defaultTab: 'db-cli' defaultTab: 'file-system'
}) })
// 可见 Tabs根据配置动态生成 // 可见 Tabs根据配置动态生成
@@ -109,9 +108,8 @@ const visibleTabs = computed(() => {
if (!appConfig.value.tabs || appConfig.value.tabs.length === 0) { if (!appConfig.value.tabs || appConfig.value.tabs.length === 0) {
// 默认配置 // 默认配置
return [ return [
{key: 'db-cli', title: '数据库'},
{key: 'file-system', title: '文件管理'}, {key: 'file-system', title: '文件管理'},
{key: 'device', title: '设备调用测试'} {key: 'db-cli', title: '数据库'}
] ]
} }
@@ -148,7 +146,7 @@ const loadConfig = async () => {
appConfig.value = { appConfig.value = {
tabs: syncedTabs, tabs: syncedTabs,
visibleTabs: visibleTabs, visibleTabs: visibleTabs,
defaultTab: result.data.defaultTab || 'db-cli' defaultTab: result.data.defaultTab || 'file-system'
} }
// 设置默认 Tab // 设置默认 Tab
@@ -169,12 +167,11 @@ const loadConfig = async () => {
const useDefaultConfig = () => { const useDefaultConfig = () => {
appConfig.value = { appConfig.value = {
tabs: [ tabs: [
{key: 'db-cli', title: '数据库', visible: true, enabled: true},
{key: 'file-system', title: '文件管理', visible: true, enabled: true}, {key: 'file-system', title: '文件管理', visible: true, enabled: true},
{key: 'device', title: '设备调用测试', visible: true, enabled: true} {key: 'db-cli', title: '数据库', visible: true, enabled: true}
], ],
visibleTabs: ['db-cli', 'file-system', 'device'], visibleTabs: ['file-system', 'db-cli'],
defaultTab: 'db-cli' defaultTab: 'file-system'
} }
} }
@@ -215,9 +212,8 @@ const handleSaveConfig = async (config) => {
// 获取组件 // 获取组件
const getComponent = (key) => { const getComponent = (key) => {
const components = { const components = {
'db-cli': DbCli,
'file-system': FileSystem, 'file-system': FileSystem,
'device': DeviceTest 'db-cli': DbCli
} }
return components[key] || null return components[key] || null
} }