架构设计
了解 LTools 的整体架构设计和技术选型。
系统架构
LTools 采用前后端分离的桌面应用架构:
┌─────────────────────────────────────────────────────────────┐
│ 前端层 (React) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 主界面 │ │ 插件视图 │ │ 搜索窗口 │ │ 设置页面 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │ │
│ React Router v6 │
│ │ │
│ @wailsio/runtime │
└───────────────────────────┬─────────────────────────────────┘
│
┌───────────────────────────┼─────────────────────────────────┐
│ Wails Bridge │
│ (IPC 通信层) │
└───────────────────────────┬─────────────────────────────────┘
│
┌───────────────────────────┼─────────────────────────────────┐
│ 后端层 (Go) │
│ ┌────────────────────────────────────────────────────┐ │
│ │ 插件管理器 │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌──────────┐ │ │
│ │ │ 日期时间 │ │ 计算器 │ │剪贴板管理│ │ ... │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └──────────┘ │ │
│ └────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────┐ ┌──────────┐ │ ┌──────────┐ ┌──────────┐ │
│ │ 快捷键服务 │ │ 搜索服务 │ │ │ 代理服务 │ │ 窗口服务 │ │
│ └──────────┘ └──────────┘ │ └──────────┘ └──────────┘ │
└───────────────────────────┬─────────────────────────────────┘
│
┌───────┴───────┐
│ Go 标准库 │
│ gopsutil │
│ screenshot │
└───────────────┘核心模块
1. 插件系统
设计理念:
- 基于接口的插件架构
- 统一的生命周期管理
- 权限控制系统
核心组件:
go
// 插件接口
type Plugin interface {
Metadata() *PluginMetadata
Init(app *application.App) error
ServiceStartup(app *application.App) error
ServiceShutdown(app *application.App) error
Enabled() bool
SetEnabled(enabled bool) error
}
// 插件管理器
type Manager struct {
plugins map[string]Plugin
registry *Registry
mu sync.RWMutex
}2. 服务层
服务注册:
- 每个插件可提供服务
- 服务通过 Wails 暴露给前端
- 自动生成 TypeScript 绑定
示例:
go
// 后端
type MyPluginService struct { /* ... */ }
func (s *MyPluginService) DoSomething() string {
return "result"
}
// 注册
app.RegisterService(application.NewService(service))
// 前端调用
import { MyPluginService } from './bindings'
const result = await MyPluginService.DoSomething()3. 事件系统
事件流:
后端 → app.Event.Emit("event:name", data)
↓
Wails Bridge
↓
前端 → Events.On("event:name", callback)使用场景:
- 状态更新通知
- 后台任务进度
- 用户操作反馈
4. 快捷键系统
两层架构:
┌─────────────────┐
│ ShortcutManager │ ← 持久化存储
└────────┬────────┘
│
┌────────▼────────┐
│ ShortcutService │ ← 运行时注册
└────────┬────────┘
│
┌────▼────┐
│ gohook │ ← 全局热键
└─────────┘数据流
1. 用户操作流程
用户点击按钮
↓
前端组件处理
↓
调用后端服务方法
↓
后端执行业务逻辑
↓
返回结果/发送事件
↓
前端更新 UI2. 全局搜索流程
用户输入关键词
↓
前端调用 SearchWindowService.Search()
↓
后端搜索插件、应用、文件
↓
返回搜索结果
↓
前端显示结果列表
↓
用户选择并打开技术选型
后端技术
| 技术 | 用途 | 原因 |
|---|---|---|
| Go 1.25+ | 核心语言 | 性能、并发、跨平台 |
| Wails v3 | 桌面框架 | 轻量、原生、现代化 |
| gohook | 全局热键 | 跨平台、可靠 |
| gopsutil | 系统信息 | 功能全面、跨平台 |
前端技术
| 技术 | 用途 | 原因 |
|---|---|---|
| React 18.2 | UI 框架 | 生态丰富、组件化 |
| TypeScript 5.2 | 类型系统 | 类型安全、开发体验 |
| Vite 5 | 构建工具 | 快速、现代 |
| TailwindCSS 4 | 样式方案 | 原子化、高效 |
| React Router v6 | 路由管理 | 功能完整、易用 |
设计模式
1. 插件模式
每个插件遵循统一的接口:
- 定义清晰的接口规范
- 支持可选的生命周期方法
- 提供基础实现(BasePlugin)
2. 服务模式
插件通过服务暴露功能:
- 服务与插件分离
- 自动生成绑定
- 类型安全调用
3. 事件驱动
组件间通过事件通信:
- 松耦合
- 异步通知
- 易于扩展
4. 仓储模式
数据持久化:
- Registry 管理插件状态
- JSON 文件存储
- 自动加载和保存
性能优化
1. 前端优化
- 路由懒加载
- 组件代码分割
- 虚拟滚动
- 图片懒加载
2. 后端优化
- Goroutine 并发处理
- 缓存机制
- 索引优化
- 延迟加载
3. 通信优化
- 事件防抖
- 批量请求
- 数据压缩
- 缓存策略
安全考虑
1. 权限系统
- 细粒度权限控制
- 用户授权机制
- 权限持久化
2. 数据安全
- 本地加密存储
- 敏感数据保护
- 不上传用户数据
3. 代码安全
- 输入验证
- 错误处理
- 资源清理
扩展性
1. 插件扩展
- 支持第三方插件
- 插件市场(计划中)
- 插件沙箱隔离
2. 功能扩展
- 自定义主题
- 插件配置
- API 扩展
3. 平台扩展
- 跨平台支持
- 平台特定功能
- 自适应 UI
未来规划
短期
- [ ] 插件热重载
- [ ] 插件市场
- [ ] 云同步
中期
- [ ] 第三方插件支持
- [ ] 自定义主题
- [ ] 脚本支持
长期
- [ ] AI 集成
- [ ] 协作功能
- [ ] 移动端支持