发布:版本 0.3.0
- Markdown Mermaid 图表支持(10+ 种图表类型) - 代码语法高亮(20+ 种常用编程语言) - 文件列表优化(文件夹优先显示) - 文件系统模块化重构 - 新增内部更新日志 CHANGELOG.internal.md - 更新作者邮箱
This commit is contained in:
117
CHANGELOG.internal.md
Normal file
117
CHANGELOG.internal.md
Normal 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 个 Composables:useFileOperations、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 修改
|
||||||
|
- **次版本号** - 向下兼容的功能性新增
|
||||||
|
- **修订号** - 向下兼容的问题修复
|
||||||
26
CHANGELOG.md
26
CHANGELOG.md
@@ -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
5
app.go
@@ -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)
|
||||||
|
|||||||
@@ -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,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import (
|
|||||||
// ==================== 常量定义 ====================
|
// ==================== 常量定义 ====================
|
||||||
|
|
||||||
// AppVersion 应用版本号(发布时直接修改此处)
|
// AppVersion 应用版本号(发布时直接修改此处)
|
||||||
const AppVersion = "0.2.0"
|
const AppVersion = "0.3.0"
|
||||||
|
|
||||||
// ==================== 类型定义 ====================
|
// ==================== 类型定义 ====================
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user