- 拆分 FileSystem.vue 为模块化组件架构 - 新增 Markdown Mermaid 图表渲染支持 - 新增 180+ 编程语言代码高亮 - 修复编辑/预览模式切换渲染问题 - 优化亮色/暗色模式主题适配 - 新增 TypeScript 类型定义
11 KiB
11 KiB
数据库客户端后端架构设计文档
文档版本:v2.0
维护者:JueChen
更新日期:2026-01-28
源码路径:go-desk/
一、整体架构概览
1.1 分层架构
┌─────────────────────────────────────────────────────────────┐
│ 接口层(API Layer) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ app.go (Wails App 接口) │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 服务层(Service Layer) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ConnectionSvc │ │ SqlExecSvc │ │ ResourceSvc │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ TabSvc │ │ BookmarkSvc │ │
│ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 数据访问层(Data Access Layer) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Storage │ │ DBClient │ │ Models │ │
│ │ (SQLite) │ │ (Pool) │ │ │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 基础设施层(Infrastructure Layer) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Crypto │ │ Filesystem │ │ System │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
1.2 架构设计原则
- 单一职责原则:每个服务只负责一个业务领域
- 依赖倒置原则:接口定义在服务层,实现在数据访问层
- 关注点分离:接口、业务逻辑、数据访问分离
- 可测试性:通过接口抽象,便于单元测试
- 可扩展性:新增功能只需添加新的服务
二、目录结构
go-desk/
├── main.go # 应用入口
├── app.go # Wails App 接口(精简后)
├── internal/
│ ├── api/ # API 接口层(新增)
│ │ ├── connection_api.go # 连接管理接口
│ │ ├── sql_api.go # SQL执行接口
│ │ ├── resource_api.go # 资源管理接口
│ │ └── tab_api.go # 标签页接口
│ │
│ ├── service/ # 服务层(新增)
│ │ ├── connection_service.go # 连接管理服务
│ │ ├── sql_exec_service.go # SQL执行服务
│ │ ├── resource_service.go # 资源管理服务
│ │ └── tab_service.go # 标签页服务
│ │
│ ├── storage/ # 数据访问层
│ │ ├── sqlite.go # SQLite 初始化
│ │ ├── models/ # 数据模型
│ │ │ ├── connection.go
│ │ │ ├── sql_tab.go
│ │ │ ├── bookmark.go
│ │ │ └── template.go
│ │ └── repository/ # 数据仓库(新增)
│ │ ├── connection_repo.go
│ │ ├── tab_repo.go
│ │ ├── bookmark_repo.go
│ │ └── template_repo.go
│ │
│ ├── dbclient/ # 数据库客户端
│ │ ├── pool.go # 连接池管理
│ │ ├── mysql.go # MySQL 客户端
│ │ ├── redis.go # Redis 客户端
│ │ └── mongo.go # MongoDB 客户端
│ │
│ ├── crypto/ # 加密工具
│ ├── filesystem/ # 文件系统
│ └── system/ # 系统信息
三、服务层设计
3.1 ConnectionService
职责:管理数据库连接配置
方法:
SaveConnection(conn *models.DbConnection) errorListConnections() ([]models.DbConnection, error)GetConnection(id uint) (*models.DbConnection, error)DeleteConnection(id uint) errorTestConnection(conn *models.DbConnection) error
依赖:
ConnectionRepository:数据访问接口
3.2 SqlExecService
职责:执行 SQL 语句
方法:
ExecuteSQL(connectionId uint, sqlStr string, database string) (*SqlResult, error)GetDatabases(connectionId uint) ([]string, error)GetTables(connectionId uint, database string) ([]string, error)
依赖:
ConnectionService:获取连接配置ConnectionPool:获取数据库客户端
3.3 ResourceService
职责:管理书签和模板
方法:
SaveBookmark(bookmark *models.Bookmark) errorListBookmarks(connectionId uint) ([]models.Bookmark, error)DeleteBookmark(id uint) errorSaveTemplate(template *models.Template) errorListTemplates() ([]models.Template, error)DeleteTemplate(id uint) error
依赖:
BookmarkRepository:书签数据访问TemplateRepository:模板数据访问
3.4 TabService
职责:管理 SQL 标签页
方法:
SaveTabs(tabs []models.SqlTab) errorListTabs() ([]models.SqlTab, error)DeleteTab(id uint) error
依赖:
TabRepository:标签页数据访问
四、数据访问层设计
4.1 Repository 模式
使用 Repository 模式封装数据访问逻辑,提供统一的接口:
type ConnectionRepository interface {
Save(conn *models.DbConnection) error
FindAll() ([]models.DbConnection, error)
FindByID(id uint) (*models.DbConnection, error)
Delete(id uint) error
}
4.2 实现方式
ConnectionRepository:使用 GORM 实现TabRepository:使用 GORM 实现BookmarkRepository:使用 GORM 实现TemplateRepository:使用 GORM 实现
五、接口层设计
5.1 API 接口
将 app.go 中的方法按功能分组到不同的 API 文件中:
connection_api.go:连接管理相关接口sql_api.go:SQL 执行相关接口resource_api.go:资源管理相关接口tab_api.go:标签页相关接口
5.2 App 结构体
app.go 只负责:
- 初始化服务
- 委托调用到对应的 API 接口
六、重构优势
6.1 代码组织
- 清晰的职责划分:每个服务只负责一个业务领域
- 易于维护:修改某个功能只需修改对应的服务
- 代码复用:服务可以在多个 API 中复用
6.2 可测试性
- 独立测试:每个服务可以独立测试
- Mock 简单:可以轻松 mock Repository
- 测试覆盖:逻辑集中在服务层,测试更容易
6.3 可扩展性
- 新增功能:只需添加新的服务和 API
- 功能组合:可以组合多个服务实现复杂功能
- 向后兼容:不影响现有接口
七、实施步骤
步骤1:创建目录结构 ✅
- 创建
internal/api/目录 - 创建
internal/service/目录 - 创建
internal/storage/repository/目录
步骤2:实现 Repository 层 ✅
- 定义 Repository 接口
- 实现 ConnectionRepository
- 实现 TabRepository
- 实现 BookmarkRepository
- 实现 TemplateRepository
步骤3:实现 Service 层 ✅
- 实现 ConnectionService
- 实现 SqlExecService
- 实现 ResourceService
- 实现 TabService
步骤4:实现 API 层 ✅
- 实现 connection_api.go
- 实现 sql_api.go
- 实现 resource_api.go
- 实现 tab_api.go
步骤5:重构 app.go ✅
- 连接管理方法迁移到 ConnectionAPI ✅
- SQL执行方法迁移到 SqlAPI ✅
- 书签管理方法迁移到 ResourceAPI ✅
- 模板管理方法迁移到 ResourceAPI ✅
- 标签页管理方法迁移到 TabAPI ✅
- 表结构和索引查询方法迁移到 SqlAPI ✅
- 删除重复代码(parseRedisCommand)✅
- 简化 app.go,只保留初始化逻辑 ✅
步骤6:测试和验证 ⚠️
- 功能测试(基本完成)
- 单元测试(待完成)
- 代码审查(已完成)
八、后续优化方向
- 依赖注入:使用依赖注入框架管理服务依赖
- 错误处理:统一错误处理机制
- 日志系统:引入结构化日志
- 配置管理:统一配置管理
- 中间件:添加认证、限流等中间件