From d17c20c579be35dcebd5b846c4ade5d791227f6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com> Date: Sat, 16 May 2026 17:55:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=20OSS=E6=94=B6=E8=97=8F?= =?UTF-8?q?=E6=89=93=E5=BC=80+=E8=BF=9E=E6=8E=A5=E6=8C=87=E7=A4=BA?= =?UTF-8?q?=E5=99=A8=E6=A0=B9=E7=9B=AE=E5=BD=95+=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E6=98=A0=E5=B0=84+=E4=BE=A7=E8=BE=B9=E6=A0=8F=E9=87=8D?= =?UTF-8?q?=E6=9E=84+=E6=96=87=E4=BB=B6=E7=9B=91=E5=90=AC+=E9=A6=96?= =?UTF-8?q?=E5=B1=8F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.go | 57 +-- build/windows/Taskfile.yml | 2 +- build/windows/info.json | 12 +- cmd/dbread/main.go | 53 +++ devtools.go | 16 + devtools_prod.go | 7 + docs/代码改进清单.md | 23 ++ frontend/bindings/u-desk/app.ts | 14 + frontend/src/App.vue | 3 + frontend/src/api/connection-manager.ts | 45 +- frontend/src/api/system.ts | 17 + frontend/src/assets/logo.png | Bin 0 -> 36195 bytes .../components/ConnectionIndicator.vue | 32 +- .../FileSystem/components/FileEditorPanel.vue | 49 ++- .../FileSystem/components/PathBreadcrumb.vue | 37 +- .../FileSystem/components/Sidebar.vue | 289 +++++++------ .../FileSystem/components/Toolbar.vue | 6 +- frontend/src/components/FileSystem/index.vue | 178 +++++--- frontend/src/components/MarkdownPreview.vue | 22 +- .../src/components/UpdateNotification.vue | 4 +- frontend/src/components/UpdatePanel.vue | 4 +- frontend/src/utils/markedExtensions.ts | 347 ++++++++-------- frontend/src/utils/resize.ts | 58 +-- .../src/wailsjs/v3-bindings/u-desk/app.ts | 387 ++++++++++++++++-- .../src/wailsjs/v3-bindings/u-desk/index.ts | 7 + .../src/wailsjs/v3-bindings/u-desk/models.ts | 286 +++++++++++++ frontend/src/wailsjs/wailsjs/go/main/App.d.ts | 98 ----- frontend/src/wailsjs/wailsjs/go/main/App.js | 191 --------- frontend/src/wailsjs/wailsjs/go/models.ts | 137 ------- .../src/wailsjs/wailsjs/runtime/package.json | 24 -- .../src/wailsjs/wailsjs/runtime/runtime.d.ts | 330 --------------- .../src/wailsjs/wailsjs/runtime/runtime.js | 298 -------------- go.mod | 1 + go.sum | 2 + internal/filesystem/service.go | 24 ++ internal/filewatch/watcher.go | 138 +++++++ main.go | 35 +- 37 files changed, 1667 insertions(+), 1566 deletions(-) create mode 100644 cmd/dbread/main.go create mode 100644 devtools.go create mode 100644 devtools_prod.go create mode 100644 docs/代码改进清单.md create mode 100644 frontend/src/assets/logo.png delete mode 100644 frontend/src/wailsjs/wailsjs/go/main/App.d.ts delete mode 100644 frontend/src/wailsjs/wailsjs/go/main/App.js delete mode 100644 frontend/src/wailsjs/wailsjs/go/models.ts delete mode 100644 frontend/src/wailsjs/wailsjs/runtime/package.json delete mode 100644 frontend/src/wailsjs/wailsjs/runtime/runtime.d.ts delete mode 100644 frontend/src/wailsjs/wailsjs/runtime/runtime.js create mode 100644 internal/filewatch/watcher.go diff --git a/app.go b/app.go index f307971..005eea1 100644 --- a/app.go +++ b/app.go @@ -5,6 +5,7 @@ package main import ( "context" + "encoding/json" "fmt" "os" "path/filepath" @@ -16,6 +17,7 @@ import ( "u-desk/internal/api" "u-desk/internal/common" + "u-desk/internal/filewatch" "u-desk/internal/filesystem" "u-desk/internal/hotkey" osssvc "u-desk/internal/ossdrv" @@ -44,6 +46,7 @@ type App struct { sftpService *sftp.Service ossService *osssvc.Service profileSvc *service.ProfileService + fileWatcher *filewatch.Watcher isAlwaysOnTop bool mu sync.Mutex unregisterHotkey func() @@ -61,6 +64,11 @@ func NewApp() *App { // SetMainWindow 设置主窗口引用(由 main.go 在创建窗口后调用) func (a *App) SetMainWindow(w *application.WebviewWindow) { a.mainWindow = w + a.fileWatcher = filewatch.NewWatcher(func(name string, data ...any) { + if a.mainWindow != nil { + a.mainWindow.EmitEvent(name, data...) + } + }) } // RegisterGlobalHotkey 注册 Ctrl+Shift+B 全局热键(需在窗口创建后调用) @@ -69,11 +77,10 @@ func (a *App) RegisterGlobalHotkey() { return } a.mu.Lock() + defer a.mu.Unlock() if a.unregisterHotkey != nil { - a.mu.Unlock() return } - a.mu.Unlock() hwnd := uintptr(a.mainWindow.NativeWindow()) if hwnd == 0 { fmt.Println("[全局热键] HWND 为 0,注册跳过") @@ -85,9 +92,7 @@ func (a *App) RegisterGlobalHotkey() { return } fmt.Println("[全局热键] Ctrl+Shift+B 已注册") - a.mu.Lock() a.unregisterHotkey = func() { hotkey.Unregister(hwnd, id) } - a.mu.Unlock() } // HandleHotkey 处理全局热键回调:切换 BgmBar 显示/隐藏 @@ -102,6 +107,9 @@ func (a *App) HandleHotkey() { func (a *App) ServiceStartup(ctx context.Context, _ application.ServiceOptions) error { a.ctx = ctx + // dev 模式打开 DevTools + openDevTools(a.mainWindow) + // 1. 核心初始化:SQLite(必须同步,很快) if _, err := storage.InitFast(); err != nil { return fmt.Errorf("SQLite 初始化失败,应用无法启动: %w", err) @@ -310,6 +318,21 @@ func (a *App) ReadFile(path string) (string, error) { return a.filesystem.ReadFile(path) } +// WatchFile 开始监听指定文件的变化,变化时发送 file-changed 事件 +func (a *App) WatchFile(path string) error { + if a.fileWatcher == nil { + return fmt.Errorf("文件监听器未初始化") + } + return a.fileWatcher.WatchFile(path) +} + +// UnwatchFile 停止监听文件变化 +func (a *App) UnwatchFile() { + if a.fileWatcher != nil { + a.fileWatcher.UnwatchFile() + } +} + // WriteFileRequest 写入文件请求结构体 type WriteFileRequest struct { Path string `json:"path"` @@ -435,6 +458,7 @@ func (a *App) ResolveShortcut(lnkPath string) (map[string]interface{}, error) { }, nil } + // getWindowsSpecialFolder 从注册表读取 Windows 特殊文件夹的真实路径 func getWindowsSpecialFolder(guid string, fallbackName string) string { key, err := registry.OpenKey(registry.CURRENT_USER, @@ -1194,28 +1218,9 @@ func (a *App) LoadConnectionProfiles() ([]map[string]interface{}, error) { if err != nil { return nil, err } - result := make([]map[string]interface{}, len(list)) - for i, p := range list { - result[i] = map[string]interface{}{ - "id": float64(p.ID), - "name": p.Name, - "host": p.Host, - "port": p.Port, - "username": p.Username, - "password": p.Password, - "keyPath": p.KeyPath, - "type": p.Type, - "provider": p.Provider, - "token": p.Token, - "accessKey": p.AccessKey, - "secretKey": p.SecretKey, - "bucket": p.Bucket, - "region": p.Region, - "endpoint": p.Endpoint, - "lastConnected": p.LastConnected, - "sortOrder": float64(p.SortOrder), - } - } + var result []map[string]interface{} + data, _ := json.Marshal(list) + json.Unmarshal(data, &result) return result, nil } diff --git a/build/windows/Taskfile.yml b/build/windows/Taskfile.yml index 99c603a..d94318b 100644 --- a/build/windows/Taskfile.yml +++ b/build/windows/Taskfile.yml @@ -48,7 +48,7 @@ tasks: - cmd: rm -f *.syso platforms: [linux, darwin] vars: - BUILD_FLAGS: '{{if eq .DEV "true"}}{{if .EXTRA_TAGS}}-tags {{.EXTRA_TAGS}} {{end}}-buildvcs=false -gcflags=all="-l"{{else}}-tags production,devtools -trimpath -buildvcs=false -ldflags="-w -s -H windowsgui"{{end}}' + BUILD_FLAGS: '{{if eq .DEV "true"}}{{if .EXTRA_TAGS}}-tags {{.EXTRA_TAGS}} {{end}}-buildvcs=false -gcflags=all="-l"{{else}}-tags production -trimpath -buildvcs=false -ldflags="-w -s -H windowsgui"{{end}}' env: GOOS: windows CGO_ENABLED: '{{.CGO_ENABLED | default "0"}}' diff --git a/build/windows/info.json b/build/windows/info.json index 09b3af3..83a1c0d 100644 --- a/build/windows/info.json +++ b/build/windows/info.json @@ -1,15 +1,15 @@ { "fixed": { - "file_version": "0.1.0" + "file_version": "0.4.0" }, "info": { "0000": { - "ProductVersion": "0.1.0", - "CompanyName": "My Company", - "FileDescription": "A u-desk application", - "LegalCopyright": "© 2026, My Company", + "ProductVersion": "0.4.0", + "CompanyName": "1216.top", + "FileDescription": "U-Desk 桌面文件管理器", + "LegalCopyright": "© 2026, 1216.top", "ProductName": "U-Desk", - "Comments": "This is a comment" + "Comments": "桌面文件管理器" } } } \ No newline at end of file diff --git a/cmd/dbread/main.go b/cmd/dbread/main.go new file mode 100644 index 0000000..4cdcdda --- /dev/null +++ b/cmd/dbread/main.go @@ -0,0 +1,53 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + + "github.com/glebarez/sqlite" + "gorm.io/gorm" +) + +func main() { + home, _ := os.UserHomeDir() + dbPath := filepath.Join(home, ".u-desk", "app.db") + + db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{}) + if err != nil { + fmt.Fprintln(os.Stderr, "open db:", err) + os.Exit(1) + } + + // 所有列 + type Profile struct { + ID uint `gorm:"primaryKey"` + Name string `gorm:"column:name"` + Type string `gorm:"column:type"` + Host string `gorm:"column:host"` + Port int `gorm:"column:port"` + Username string `gorm:"column:username"` + Provider string `gorm:"column:provider"` + Token string `gorm:"column:token"` + AccessKey string `gorm:"column:access_key"` + SecretKey string `gorm:"column:secret_key"` + Bucket string `gorm:"column:bucket"` + Region string `gorm:"column:region"` + Endpoint string `gorm:"column:endpoint"` + } + + var profiles []Profile + db.Table("connection_profiles").Find(&profiles) + + // 脱敏 secret_key + for i := range profiles { + if len(profiles[i].SecretKey) > 8 { + profiles[i].SecretKey = profiles[i].SecretKey[:4] + "****" + } + } + + b, _ := json.MarshalIndent(profiles, "", " ") + fmt.Println("=== Connection Profiles ===") + fmt.Println(string(b)) +} diff --git a/devtools.go b/devtools.go new file mode 100644 index 0000000..ca8db88 --- /dev/null +++ b/devtools.go @@ -0,0 +1,16 @@ +//go:build !production + +package main + +import ( + "time" + + "github.com/wailsapp/wails/v3/pkg/application" +) + +func openDevTools(window *application.WebviewWindow) { + go func() { + time.Sleep(2 * time.Second) + window.OpenDevTools() + }() +} diff --git a/devtools_prod.go b/devtools_prod.go new file mode 100644 index 0000000..dd588b7 --- /dev/null +++ b/devtools_prod.go @@ -0,0 +1,7 @@ +//go:build production + +package main + +import "github.com/wailsapp/wails/v3/pkg/application" + +func openDevTools(window *application.WebviewWindow) {} diff --git a/docs/代码改进清单.md b/docs/代码改进清单.md new file mode 100644 index 0000000..12406cb --- /dev/null +++ b/docs/代码改进清单.md @@ -0,0 +1,23 @@ +# 代码改进清单 + +> 基于 Wails 开发文档 vs 项目现状审查,2026-05-16 + +## 已完成 + +- [x] 🔴① `main.go` 添加 `SingleInstance` 单实例锁(`top.1216.udesk`) +- [x] 🔴② `app.go:74-97` RegisterGlobalHotkey 竞态修复(合并为单一 `defer mu.Unlock()`) +- [x] 🔴③ `build/windows/info.json` 版本号 0.1.0→0.4.0,公司名→1216.top +- [x] 🟡⑤ 删除 `frontend/src/wailsjs/wailsjs/` v2 遗留绑定目录 +- [x] 🟡⑥ `LoadConnectionProfiles` 手动 map 转换改用 `json.Marshal/Unmarshal` +- [x] 🟡⑨ `App.vue` onMounted 添加 `contextmenu` 事件拦截(禁用浏览器默认右键菜单) +- [x] 🟡⑫ `main.go` Run() 错误输出改用 `fmt.Fprintf(os.Stderr, ...)` +- [x] Sidebar 设置按钮 `···` 点击无响应修复:移除 `.stop` + Teleport 重构 + 增大点击区域 + +## 待处理 + +- [ ] ④ App 结构体拆分 — 1344 行,应拆为 FilesystemService / ProfileService / BgmService / UpdateService 等 v3 Service +- [ ] ⑦ `internal/api/pdf_api.go:371` SelectDirectory 改用 Wails 原生对话框 `application.Get().Dialog.OpenFile()` +- [ ] ⑧ `app.go:176-189` HWND 轮询改事件驱动 — v3 alpha 暂无对应 API,后续跟进 +- [ ] ⑩ `app.go:29` Windows 专用导入 `golang.org/x/sys/windows/registry` 加构建标签拆到 `*_windows.go` +- [ ] ⑪ 全局结构化日志 — `fmt.Println` 替换为 `log/slog`,按优先级分批替换 +- [ ] ⑬ `app.go:158` 更新检查 URL `https://c.1216.top/last-version.json` 移入配置 diff --git a/frontend/bindings/u-desk/app.ts b/frontend/bindings/u-desk/app.ts index f0189eb..edbdcd5 100644 --- a/frontend/bindings/u-desk/app.ts +++ b/frontend/bindings/u-desk/app.ts @@ -674,6 +674,13 @@ export function SftpWriteFile(req: $models.SftpWriteFileRequest): $CancellablePr return $Call.ByID(2401472593, req); } +/** + * UnwatchFile 停止监听文件变化 + */ +export function UnwatchFile(): $CancellablePromise { + return $Call.ByID(3006906623); +} + /** * VerifyUpdateFile 验证更新文件哈希值 */ @@ -683,6 +690,13 @@ export function VerifyUpdateFile(filePath: string, expectedHash: string, hashTyp }); } +/** + * WatchFile 开始监听指定文件的变化,变化时发送 file-changed 事件 + */ +export function WatchFile(path: string): $CancellablePromise { + return $Call.ByID(325055910, path); +} + /** * WindowClose 关闭窗口 */ diff --git a/frontend/src/App.vue b/frontend/src/App.vue index b32aad0..2061310 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -176,6 +176,9 @@ onMounted(() => { // 禁止 Ctrl+滚轮缩放 document.addEventListener('wheel', preventZoom, { passive: false }) + // 禁用浏览器默认右键菜单(桌面应用体验) + document.addEventListener('contextmenu', e => e.preventDefault()) + // 延迟检查更新(启动后 3 秒,静默模式) setTimeout(() => { updateStore.checkForUpdates(true) diff --git a/frontend/src/api/connection-manager.ts b/frontend/src/api/connection-manager.ts index cdf4da9..584ad64 100644 --- a/frontend/src/api/connection-manager.ts +++ b/frontend/src/api/connection-manager.ts @@ -91,11 +91,14 @@ class ConnectionManagerImpl { try { const list = await LoadConnectionProfiles() if (list && list.length > 0) { - this._profiles = list.map((p: any) => ({ - ...p, - id: String(p.id), - lastConnected: p.lastConnected || p.last_connected ? new Date(p.lastConnected || p.last_connected).getTime() : undefined, - })) + this._profiles = list.map((p: any) => { + const camel = snakeToCamel(p) + return { + ...camel, + id: String(p.id), + lastConnected: camel.lastConnected ? new Date(camel.lastConnected).getTime() : undefined, + } + }) const hasLocal = this._profiles.some(p => p.type === 'local') if (!hasLocal) { this._profiles.unshift({ @@ -105,17 +108,20 @@ class ConnectionManagerImpl { } } catch { /* 首次使用 */ } this.notifyChange() - this._profiles.forEach(p => { - if (p.type === 'local') { this.fetchSystemInfo(p.id).catch(() => {}) } - }) - const autoConnect = localStorage.getItem('desk:autoConnect') - if (autoConnect !== 'false') { - for (const p of this._profiles) { - if (p.type !== 'local') { - this.buildAndPool(String(p.id), p).catch(() => {}) + // 延迟执行系统信息采集和自动连接,不阻塞首屏渲染 + setTimeout(() => { + this._profiles.forEach(p => { + if (p.type === 'local') { this.fetchSystemInfo(p.id).catch(() => {}) } + }) + const autoConnect = localStorage.getItem('desk:autoConnect') + if (autoConnect !== 'false') { + for (const p of this._profiles) { + if (p.type !== 'local') { + this.buildAndPool(String(p.id), p).catch(() => {}) + } } } - } + }, 500) } /** 保存/更新单个 profile 到 SQLite */ @@ -269,9 +275,16 @@ class ConnectionManagerImpl { return } - // 新建连接并入池(成功后再设 activeId) - await this.buildAndPool(profileId, profile) + // 先设 activeId(确保回调读到正确的 activeProfile),失败时回退 + const prevActiveId = this._activeId this._activeId = profileId + try { + await this.buildAndPool(profileId, profile) + } catch (err) { + this._activeId = prevActiveId + this.notifyChange() + throw err + } } /** 断开指定 profile 并从池移除 */ diff --git a/frontend/src/api/system.ts b/frontend/src/api/system.ts index 648e5ec..38933c2 100644 --- a/frontend/src/api/system.ts +++ b/frontend/src/api/system.ts @@ -108,3 +108,20 @@ export async function detectFileTypeByContent(path: string) { export async function getCommonPaths() { return t().getCommonPaths() } + +// 文件监听(仅本地模式,直接调用 Wails 绑定) +export async function watchFile(path: string): Promise { + if (connectionManager.isRemote()) return + try { + const { WatchFile } = await import('../wailsjs/v3-bindings/u-desk/app') + await WatchFile(path) + } catch { /* 忽略绑定未生成的场景 */ } +} + +export async function unwatchFile(): Promise { + if (connectionManager.isRemote()) return + try { + const { UnwatchFile } = await import('../wailsjs/v3-bindings/u-desk/app') + await UnwatchFile() + } catch { /* 忽略 */ } +} diff --git a/frontend/src/assets/logo.png b/frontend/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3e081d98def6e4e301e2bcda81d7af9d893c6eef GIT binary patch literal 36195 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 diff --git a/frontend/src/components/FileSystem/components/Sidebar.vue b/frontend/src/components/FileSystem/components/Sidebar.vue index 2adffb4..bf3d1f2 100644 --- a/frontend/src/components/FileSystem/components/Sidebar.vue +++ b/frontend/src/components/FileSystem/components/Sidebar.vue @@ -3,7 +3,7 @@ + + + + +